System.Net.Mail替代方案

20

我正在使用C#开发一个工具,用于与我们的邮件服务器安排发送邮件。我之前一直在使用System.Net.Mail类来发送邮件。

近来,我遇到了各种与RFC规范违反相关的问题,以及其他问题,例如SmtpClient没有按照协议结束SMTP会话。这些问题都会导致高垃圾邮件评分并影响电子邮件投递,因此我需要解决这些问题的方法。

我想知道其他人是如何解决这些问题的。人们是否开始使用第三方组件?如果是,使用的是哪一个?

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


你应该在第二段引用的支持证据上添加链接。 - Austin Salonen
1
好吧:http://social.msdn.microsoft.com/forums/en-US/netfxnetcom/thread/879f13d7-24e6-4a0f-b396-627e9da25fc1/ 显然不是一个高优先级的事情。 - T.J. Crowder
实际上,对于.NET 4.0来说,这对我们来说是一个非常重要的优先事项,我们在System.Net.Mail的这个特定领域进行了显着的改进。请参见下面我的答案。 - Jeff Tucker
即使使用.NET4的SmtpClient,基本上也无法与当前版本的MailSlurper正常工作 - 导致连接终止和队列超载 - 如此糟糕以至于基本上无法使用。有人可能会试图责怪MailSlurper,但这似乎相当不可能 - https://github.com/mailslurper/mailslurper/issues/49 - PandaWood
8个回答

5
一种替代方案是MailKit。它具有大量功能,可以通过CancellationToken可靠地取消发送,因此它没有SmtpClient问题,即不遵守指定的超时。在NuGet上也有很多下载量。
即使是最近的文档也推荐使用它:

[System.Obsolete("SmtpClient和相关类型设计不良,我们强烈建议您改用https://github.com/jstedfast/MailKithttps://github.com/jstedfast/MimeKit")] public class SmtpClient : IDisposable


2
如果您有一个Microsoft Exchange 2007邮件服务器,那么您可以使用它的网络服务功能来发送电子邮件。这个网络服务本身有点奇怪,但我们能够封装这种奇怪并使其像我们的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

SmtpClient在.NET 4.0中进行了修改,以便通过发送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


1
.NET 4.0 中仍然存在长标题编码不正确的问题。System.Net.Mail 团队多年来都无法解决它!这太糟糕了,团队工作表现也很糟糕。 - nightcoder
只是出于好奇,哪些内容没有被正确编码?虽然我已经不在那里工作了,但我对你的期望很感兴趣。我记得有一个事情,就是在选择编码时有一些标准,但这些标准大多被忽略了(它默认使用Q-编码,而某些语言应该使用Base64),但实际的编码应该是正确的。 - Jeff Tucker
Jeff,如果我发送一个有着很长俄语主题(使用西里尔编码)的电子邮件给收件人,那么收件人会在主题中间看到错误的符号(显示为问号),就像“一个非常长的长长长长长长长长的l??ng长长长长长长的主题”(当然是用俄语)。我不记得具体原因了,但据我记得,这是因为主题的编码出现错误(他们没有按照标准来编码主题)。 - nightcoder
如果我没记错的话,您可以手动设置编码,尽管我忘记了调用该方法的方式。我记得俄语有两种不兼容的编码,但这是很久以前我处理它时的情况了。 - Jeff Tucker
2
由于在.NET 4.0的SmtpClient中,当主题被分成两个编码单词时,长的非ASCII主题会因为多字节字符的字节可能被分割在两个编码单词之间而被错误地编码。RFC 2047规定编码单词应该是自包含的,因此生成的标题是无效的。 - Alex
顺便提一下,我们尝试了QuikSoft.EasyMail组件,但是同样的问题仍然存在——多字节编码中的长主题被错误地编码。之后,我们尝试了MailBee.NET Objects(http://www.afterlogic.com/mailbee-net/email-components),它似乎可以正常工作。 - nightcoder

1

1

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


1
为什么要踩?对于微软商店而言,SQL Server中的DBMail是System.Net.Mail的可行替代方案。 - Roy Tinker
我认为这个问题可以清楚地理解为“SmtpClient的.NET替代品”- 他说他正在使用C#。 - PandaWood
1
Martin问道:“人们开始使用第三方组件了吗?如果是,那么是哪一个?”我理解“第三方组件”是为了提供比纯粹的C#解决方案更多的选项。虽然不是纯粹的C#,但SQL DBMail是一种解决方法。 - Doug L.

0

1
这似乎只是System.Net.Mail的一个包装器。 - jwwishart

0

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


0

对于符合标准且广泛的邮件工具套件(以及其他IETF标准),我已经多次发现/n软件的IP*Works是一个很好的API。我在传入和传出场景中都使用过它。对于传出场景,我用它来支持大规模邮件发送,在我的当前项目中,我用它来进行大规模IMAP邮件检索,以处理大量传入的客户支持邮件。到目前为止,我从未遇到任何符合性问题。

该套件支持的不仅仅是IMAP和SMTP。您可以在这里找到它,考虑到您所获得的内容,我发现其成本相当可承受。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接