我正在研究一种使用C#中的邮件服务器安排电子邮件的工具。我一直在使用System.Net.Mail类发送邮件。
最近我遇到了有关RFC违规和其他问题的各种问题,例如SmtpClient没有根据协议结束SMTP会话。这些问题中的每一个都在计入高垃圾邮件分数并影响电子邮件传递,因此我需要解决这些问题。
我想知道其他人为了解决这些问题而采取了什么措施。让人们开始使用第三方组件,如果是这样的话?
编辑:作为支持证据,请参阅:http://www.codeproject.com/KB/IP/MailMergeLib.aspx
答案 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及其网络类型设计不佳,我们强烈建议您使用documentation和https://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)
披露:我参与了这个图书馆的开发。
答案 4 :(得分:0)
答案 5 :(得分:0)
我对这些组件感到满意:QuikSoft
答案 6 :(得分:0)
对于符合标准和广泛的邮件工具套件(以及其他IETF标准),我有几次/ n软件的 IP * Works 是一个很好的API。我在传入和传出的场景中都使用过它。对于传出方案,我将其用于大型邮件支持,而在我当前的项目中,我将其用于大规模IMAP邮件检索,以便大量使用传入的客户支持邮箱。我从来没有遇到任何合规问题(到目前为止一直很好)。
该套件不仅仅支持IMAP和SMTP。它可以找到here,而且我发现考虑到你的钱可以让你付出相当大的代价。
答案 7 :(得分:-1)
我曾使用SQL Server在客户端桌面无法发送邮件的情况下(通常出于安全原因)发送电子邮件,但服务器可以。