SmtpClient非常慢-发送一封很小的电子邮件大约需要2秒

问题描述 投票:7回答:6

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

这当然很糟糕,我不知道为什么。我可以改善它吗?

c# .net email smtpclient
6个回答
8
投票

我相信SmtpClient类不会为发送的每个邮件重用相同的连接(编辑:显然,现在在.NET 4.0中是可能的,请参见SmtpClient的文档差异)。打开新连接非常昂贵,这可能需要花费时间。有一些商用SMTP组件可以提供更高的性能。根据SMTP服务器和邮件大小的不同,可以达到至少50邮件/秒的速度。

但是,如果稍微更改体系结构,这可能对您来说不是问题。我在应用程序中所做的是,通过使用smtpClient.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory并将PickupDirectoryLocation设置为所需的目录,SmtpClient将邮件传递到文件夹。这是做什么的,而不是通过网络发送邮件,而是将它们作为标准的mime邮件(.eml格式)写到指定的文件夹中。

在这里,您可以使用IIS SMTP服务器,也可以简单地使另一个后台线程/进程使用创建的.eml文件,并将它们传递给收件人或另一个SMTP服务器。

我认为这种方法优越得多,原因仅在于:

  • 发送邮件的客户端代码不必等待实际的邮件发送,这取决于连接速度,等待时间等,可能会很公平。
  • 如果发送的邮件未成功,则客户端代码不受影响。该邮件可以在后台发送其他时间。
  • 邮件队列是持久的,如果应用程序停止并再次启动,则队列中的邮件将不会丢失。
  • 更易于测试。

作为一种更简单的方法,您可以使用SendAsync代替Send,但是它并不能提供PickupDirectory方法将提供的所有直接方法。


3
投票

有几件事想到。

首先,某些站点会故意减慢连接速度,以使垃圾邮件发送者将邮件发送到其系统的利润降低。这就是所谓的Tarpitting。

有趣的是,您的站点用于广播的邮件服务器甚至可能已将其打开。 (http://winzenz.blogspot.com/2005/12/enabling-smtp-tarpitting-in-windows.html

其他可能引起问题的情况是,接收邮件服务器的DNS设置是否具有短的TTL和/或您的Web服务器的IP设置中有一些不良(例如,无效或过载)DNS服务器。


3
投票

SmtpClient类的速度主要取决于您要连接的SMTP服务器和Internet连接速度。使用SmtpClient.SendAsync优化直通输出并创建多达10个或更多个与smtp服务器的简化连接的最佳方法。毕竟,这与所有现代网络浏览器都采用相同的策略来加快浏览速度。


0
投票

也许这不是您的问题。要发送,服务器必须接收。根据您的服务器,这可能需要一些时间。您也验证了该部分吗?


0
投票

尝试进行远程登录并模拟到所讨论的smtp服务器的协议,并查看哪个命令实际上延迟了您的通信。

我的猜测是RCPT TO命令进行某种验证需要一些时间。


0
投票

具有相同的确切问题。每封电子邮件约2秒。

对我们来说,这已解决:

c:\windows\system32\set-receiveconnector "External - TLS Exempt" -MaxAcknowledgeDelay 0

Configure Receive Connector Properties

© www.soinside.com 2019 - 2024. All rights reserved.