System.Net.Mail替代方案

时间:2009-10-23 15:07:12

标签: .net smtp smtpclient

我正在研究一种使用C#中的邮件服务器安排电子邮件的工具。我一直在使用System.Net.Mail类发送邮件。

最近我遇到了有关RFC违规和其他问题的各种问题,例如SmtpClient没有根据协议结束SMTP会话。这些问题中的每一个都在计入高垃圾邮件分数并影响电子邮件传递,因此我需要解决这些问题。

我想知道其他人为了解决这些问题而采取了什么措施。让人们开始使用第三方组件,如果是这样的话?

编辑:作为支持证据,请参阅:http://www.codeproject.com/KB/IP/MailMergeLib.aspx

8 个答案:

答案 0 :(得分:2)

如果您有Microsoft Exchange 2007电子邮件服务器,则可以选择使用它web service方向发送电子邮件。 Web服务本身有点奇怪,但我们能够封装这种怪异并使其像我们的SMTP类一样工作。

首先,您需要像这样引用交换网络服务: https://mail.yourwebserver.com/EWS/Services.wsdl

以下是一个例子:

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;
}

答案 1 :(得分:2)

另一种选择是MailKit。有大量功能,可以通过CancellationToken可靠地取消发送,因此它没有SmtpClient New不尊重指定的超时。 在NuGet上也有很多下载。

即使是最近的the problem推荐它:

  

[System.Obsolete(“SmtpClient及其网络类型设计不佳,我们强烈建议您使用documentationhttps://github.com/jstedfast/MailKit代替”)]   公共类SmtpClient:IDisposable

答案 2 :(得分:1)

在.NET 4.0中修改了SmtpClient,以便通过发送QUIT消息正确关闭连接。此外,对于unicode编码和长行折叠的标准符合性进行了重大改进,因此如果切换到.NET 4.0,您应该发现垃圾邮件分数会下降。 .NET 4.0 Beta 2中提供了折叠和编码修复,但您必须等到.NET 4.0 RC才能获得QUIT消息修复。此外,SmtpClient现在将实现IDisposable,以便您在完成发送消息后可以确定性地关闭smtp连接。这篇博文详细介绍了一些已经做过的改进,虽然它没有谈到SmtpClient上的IDisposable(应该是该博客上描述该变化的另一篇博客帖子):http://blogs.msdn.com/ncl/archive/2009/08/06/what-s-new-in-system-net-mail.aspx

答案 3 :(得分:1)

Rebex Secure Mail怎么办?

披露:我参与了这个图书馆的开发。

答案 4 :(得分:0)

答案 5 :(得分:0)

我对这些组件感到满意:QuikSoft

答案 6 :(得分:0)

对于符合标准和广泛的邮件工具套件(以及其他IETF标准),我有几次/ n软件的 IP * Works 是一个很好的API。我在传入和传出的场景中都使用过它。对于传出方案,我将其用于大型邮件支持,而在我当前的项目中,我将其用于大规模IMAP邮件检索,以便大量使用传入的客户支持邮箱。我从来没有遇到任何合规问题(到目前为止一直很好)。

该套件不仅仅支持IMAP和SMTP。它可以找到here,而且我发现考虑到你的钱可以让你付出相当大的代价。

答案 7 :(得分:-1)

我曾使用SQL Server在客户端桌面无法发送邮件的情况下(通常出于安全原因)发送电子邮件,但服务器可以。