我使用SmtpClient发送简单的电子邮件。
电子邮件大约有25个字符(明文),所以很小。
然而,它需要SmtpClient大约2000毫秒才能发送其中一个。我没有为每个发送创建SmtpClient - 这是在程序启动时创建的,所以唯一要做的就是:
DateTime start = DateTime.Now;
MailMessage oMsg = new MailMessage();
// TODO: Replace with sender e-mail address.
oMsg.From = new MailAddress(settings._Username);
oMsg.To.Add(new MailAddress(emailEvent._ContactItemToUse.Data));
oMsg.Subject = emo._Subject;
oMsg.BodyEncoding = Encoding.UTF8;
oMsg.IsBodyHtml = emo._IsHtmlText;
oMsg.Body = emo._Text;
client.Send(oMsg);
TimeSpan timeWasted = DateTime.Now.Subtract(start); // between 1000-2000 ms
这当然非常糟糕,我无法弄清楚原因。你能? =)
答案 0 :(得分:8)
我相信SmtpClient类不会为每个发送的邮件重用相同的连接(编辑:显然现在可以在.NET 4.0中使用,请参阅SmtpClient的文档差异)。打开新连接很昂贵,这可能需要时间。有商业SMTP组件可以提供更高的性能。根据SMTP服务器和邮件大小,可以实现至少50个/秒的速度。
但是,如果稍微更改架构,这对您来说可能不是问题。我在我的应用程序中做的是,SmtpClient通过使用smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory并将PickupDirectoryLocation设置为所需目录,将邮件传递到文件夹。这样做,它不是通过网络发送邮件,而是将它们作为标准的mime消息(.eml格式)写入指定的文件夹。
在这里,您可以使用IIS SMTP服务器,也可以只创建另一个后台线程/进程来使用创建的.eml文件,并将它们传递给收件人或其他SMTP服务器。
我认为这种方法更优越,仅仅因为:
作为一种更简单的方法,您可以使用SendAsync而不是Send,但它不会提供PickupDirectory方法将提供的所有直接方法。
答案 1 :(得分:3)
有些事情会浮现在脑海中。
首先,一些网站会故意减慢连接速度,以免垃圾邮件发送者向其系统发送邮件的利润降低。这称为Tarpitting。
有趣的是,您的网站用于广播的邮件服务器甚至可能已启用此功能。 (http://winzenz.blogspot.com/2005/12/enabling-smtp-tarpitting-in-windows.html)
其他可能导致问题的是接收邮件服务器的DNS设置短TTL和/或您的网络服务器在其IP设置中有一些不良(例如死机或超载)DNS服务器。
答案 2 :(得分:3)
SmtpClient类的速度主要取决于您连接到的SMTP服务器&你的互联网连接速度。使用SmtpClient.SendAsync
优化直通输出并创建最多10个或更多到smtp服务器的简化连接的最佳方法。毕竟,这与所有现代网络浏览器采用相同的策略来加快浏览速度。
答案 3 :(得分:0)
也许这不是你的问题。要发送,服务器必须接收,。取决于您的服务器可能需要一些时间。你也验证了那部分吗?
答案 4 :(得分:0)
尝试telnet并将协议模拟到有问题的smtp-server,看看哪个命令实际上会延迟您的通信。
我的猜测是RCPT TO命令进行某种验证需要一些时间。
答案 5 :(得分:0)
有同样的问题。每封电子邮件约2秒。
对我们来说这是固定的:
c:\windows\system32\set-receiveconnector "External - TLS Exempt" -MaxAcknowledgeDelay 0