2009-10-23 28 views
14

Tôi đang làm việc trên một công cụ lên lịch gửi email với máy chủ thư của chúng tôi trong C#. Tôi đã sử dụng các lớp System.Net.Mail để gửi thư.Thay thế System.Net.Mail

Gần đây tôi đã gặp nhiều vấn đề liên quan đến vi phạm RFC và các vấn đề khác, chẳng hạn như SmtpClient không kết thúc phiên SMTP theo giao thức. Mỗi vấn đề trong số này đều tính đến số điểm spam cao và ảnh hưởng đến việc gửi email, vì vậy tôi cần giải pháp cho những vấn đề này.

Tôi tự hỏi những gì người khác đã sử dụng để giải quyết những vấn đề này. Có người bắt đầu sử dụng một phần thứ ba, nếu có cái nào?

EDIT: Như các bằng chứng, vui lòng xem: http://www.codeproject.com/KB/IP/MailMergeLib.aspx

+0

Bạn nên liên kết với bằng chứng hỗ trợ mà bạn tham chiếu trong đoạn thứ hai của mình. –

+1

Tốt golly: http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/879f13d7-24e6-4a0f-b396-627e9da25fc1/ Rõ ràng không phải là ưu tiên cao, sau đó. –

+0

Trên thực tế nó là một ưu tiên cao cho chúng tôi để sửa chữa cho .NET 4.0 và chúng tôi đã thực hiện những cải tiến đáng kể cụ thể trong lĩnh vực này của System.Net.Mail. Xem câu trả lời của tôi dưới đây –

Trả lời

-1

Tôi đã sử dụng SQL Server để gửi e-mail trong trường hợp máy tính để bàn của khách hàng đã không thể gửi thư (thường là vì lý do an ninh) nhưng máy chủ có thể.

+1

Tại sao lại là downvote? Đối với các cửa hàng Microsoft, DBMail trong SQL Server _is_ là một lựa chọn khả thi cho System.Net.Mail. –

+0

Tôi nghĩ câu hỏi rõ ràng có thể được hiểu là "một thay thế .NET cho SmtpClient" - ông nói rằng ông đang sử dụng C# – PandaWood

+0

Martin hỏi: "Mọi người đã bắt đầu sử dụng thành phần thứ ba chưa, nếu có thì sao?" Tôi giải thích "thành phần thứ ba" để cho phép nhiều lựa chọn hơn một giải pháp C# thuần túy. Trong khi không thuần túy C#, SQL DBMail là một giải pháp thay thế. –

0

tôi đã hài lòng với những thành phần: QuikSoft

2

Nếu bạn có một máy chủ Microsoft Exchange email 2007 thì có thể có một tùy chọn để sử dụng nó web service hướng để gửi email. Bản thân dịch vụ web hơi kỳ lạ nhưng chúng tôi có thể gói gọn sự kỳ quặc và làm cho nó hoạt động giống như lớp SMTP của chúng tôi.

Trước tiên, bạn sẽ cần phải thực hiện một tham chiếu đến các dịch vụ trao đổi web như thế này: https://mail.yourwebserver.com/EWS/Services.wsdl

Dưới đây là một ví dụ:

public bool Send(string From, MailAddress[] To, string Subject, string Body, MailPriority Priority, bool IsBodyHTML, NameValueCollection Headers) 
{ 
    // Create a new message. 
    var message = new MessageType { ToRecipients = new EmailAddressType[To.Length] }; 

    for (int i = 0; i < To.Length; i++) 
    { 
     message.ToRecipients[i] = new EmailAddressType { EmailAddress = To[i].Address }; 
    } 

    // Set the subject and sensitivity properties. 
    message.Subject = Subject; 
    message.Sensitivity = SensitivityChoicesType.Normal; 
    switch (Priority) 
    { 
     case MailPriority.High: 
      message.Importance = ImportanceChoicesType.High; 
      break; 

     case MailPriority.Normal: 
      message.Importance = ImportanceChoicesType.Normal; 
      break; 

     case MailPriority.Low: 
      message.Importance = ImportanceChoicesType.Low; 
      break; 
    } 

    // Set the body property. 
    message.Body = new BodyType 
        { 
         BodyType1 = (IsBodyHTML ? BodyTypeType.HTML : BodyTypeType.Text), 
         Value = Body 
        }; 

    var items = new List<ItemType>(); 
    items.Add(message); 

    // Create a CreateItem request. 
    var createItem = new CreateItemType() 
        { 
         MessageDisposition = MessageDispositionType.SendOnly, 
         MessageDispositionSpecified = true, 
         Items = new NonEmptyArrayOfAllItemsType 
           { 
            Items = items.ToArray() 
           } 
        }; 


    var imp = new ExchangeImpersonationType 
       { 
        ConnectingSID = new ConnectingSIDType { PrimarySmtpAddress = From } 
       }; 
    esb.ExchangeImpersonation = imp; 

    // Call the CreateItem method and get its response. 
    CreateItemResponseType response = esb.CreateItem(createItem); 

    // Get the items returned by CreateItem. 
    ResponseMessageType[] itemsResp = response.ResponseMessages.Items; 
    foreach (ResponseMessageType type in itemsResp) 
    { 
     if (type.ResponseClass != ResponseClassType.Success) 
      return false; 
    } 

    return true; 
} 
0

Đối với một tiêu chuẩn bộ tuân thủ và rộng của các công cụ mail (và các tiêu chuẩn IETF khác) Tôi có vài lần tìm thấy/n phần mềm IP * Hoạt động để trở thành một API tốt. Tôi đã sử dụng nó trong cả hai kịch bản đến và đi. Đối với kịch bản gửi đi, tôi đã sử dụng nó để hỗ trợ gửi thư lớn và trên dự án hiện tại của tôi, tôi sử dụng nó để truy xuất thư IMAP quy mô lớn để sử dụng hộp thư hỗ trợ khách hàng đến sử dụng nặng. Tôi chưa bao giờ có bất kỳ vấn đề tuân thủ nào (cho đến nay rất tốt).

Bộ phần mềm hỗ trợ nhiều hơn chỉ IMAP và SMTP. Nó có thể được tìm thấy here, và tôi đã tìm thấy chi phí để được khá bearable xem xét những gì bạn nhận được cho tiền của bạn.

1

SmtpClient đã được sửa đổi trong .NET 4.0 sao cho nó đóng kết nối đúng cách bằng cách gửi tin nhắn QUIT. Ngoài ra, những cải tiến đáng kể đã được thực hiện theo các tiêu chuẩn tuân thủ đối với mã hóa unicode và xếp các độ dài dòng dài, do đó bạn sẽ thấy rằng điểm spam của bạn giảm xuống nếu bạn chuyển sang .NET 4.0. Các bản sửa lỗi gấp và mã hóa được xuất xưởng trong .NET 4.0 Beta 2 nhưng bạn sẽ phải đợi cho đến khi .NET 4.0 RC nhận được bản sửa lỗi tin nhắn QUIT. Ngoài ra, SmtpClient bây giờ sẽ thực hiện IDisposable để bạn có thể xác định đóng kết nối smtp của bạn khi bạn kết thúc việc gửi tin nhắn. Bài đăng trên blog này nêu chi tiết một số cải tiến đã được thực hiện mặc dù nó không nói về IDisposable trên SmtpClient (phải là một bài đăng blog khác trên blog đó tại một số điểm mô tả thay đổi đó): http://blogs.msdn.com/ncl/archive/2009/08/06/what-s-new-in-system-net-mail.aspx

+1

Các đối tượng dài vẫn được mã hóa không chính xác trong .NET 4.0. Nhóm System.Net.Mail không thể sửa chữa nó trong nhiều năm! Thật kinh khủng và nhóm làm việc rất nhiều. – nightcoder

+0

Chỉ vì tò mò, những gì không được mã hóa chính xác? Tôi không làm việc ở đó nữa nhưng tôi quan tâm đến những gì bạn đang mong đợi. Một điều tôi nhớ là có những tiêu chuẩn về mã hóa mà bạn nên chọn và chúng hầu như bị bỏ qua (mặc định nó là mã hóa Q, tôi nghĩ thay vì Base64, nên dùng cho một số ngôn ngữ) nhưng mã hóa thực chính xác. –

+0

Jeff, nếu tôi gửi email có chủ đề dài bằng tiếng Nga (mã hóa cyrillic) thì người nhận nhận được email có ký hiệu sai (được hiển thị dưới dạng dấu hỏi) ở giữa chủ đề, chẳng hạn như "A long long long long long long long long l ?? ng dài dài dài chủ đề "(nhưng trong tiếng Nga tất nhiên). Tôi không nhớ nguyên nhân chính xác, nhưng như tôi nhớ nó là do một mã hóa sai của một chủ đề (họ không làm theo tiêu chuẩn trong mã hóa chủ đề tôi nghĩ). – nightcoder

1

Điều gì về Rebex Secure Mail?

Tiết lộ: Tôi tham gia vào việc phát triển thư viện này.

1

Một giải pháp thay thế là MailKit. Có rất nhiều tính năng, việc gửi có thể được hủy một cách đáng tin cậy qua một số CancellationToken, do đó, không có the problem trong số SmtpClient rằng nó không tuân theo thời gian chờ đã chỉ định. Có rất nhiều lượt tải xuống trên NuGet.

Thậm chí gần đây documentation khuyến cáo nó:

[System.Obsolete ("SmtpClient và mạng lưới của các loại được thiết kế kém, chúng tôi khuyên bạn sử dụng https://github.com/jstedfast/MailKithttps://github.com/jstedfast/MimeKit thay vì")] public class SmtpClient: IDisposable

Các vấn đề liên quan