SmtpClient非常慢 - 大约2秒发送一个非常小的电子邮件

时间:2011-04-18 15:29:54

标签: c# .net email smtpclient

我使用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

这当然非常糟糕,我无法弄清楚原因。你能? =)

6 个答案:

答案 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

Configure Receive Connector Properties