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

本文关键字:非常 一个 电子邮件 大约 2秒 SmtpClient | 更新日期: 2023-09-27 17:50:23

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

这当然很糟糕,我不知道为什么。我能改进它吗?

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

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

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

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

我认为这种方法优越得多,原因很简单:

  • 发送邮件的客户端代码不必等待实际邮件被发送,这可能需要一段时间,具体取决于连接速度,延迟等。
  • 如果邮件发送不成功,客户端代码不受影响。邮件可以在其他时间在后台发送。
  • 邮件队列是持久的,如果应用程序停止并重新启动,队列中的邮件将不会丢失。
  • 便于测试。

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

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

我想到了几件事。

首先,一些网站会故意减慢连接速度,以减少垃圾邮件发送者向他们的系统发送邮件的利润。

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

其他可能导致问题的事情是,如果接收邮件服务器有一个短的TTL为它的DNS设置和/或你的web服务器有一些坏的(例如死亡或过载)DNS服务器在它的IP设置。

也许这不是你的问题。要发送,服务器必须接收。这取决于您的服务器,可能需要一些时间。那部分你也验证过了吗?

尝试telnet并模拟该协议到所讨论的smtp-server,看看哪个命令实际上延迟了您的通信。

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

也有同样的问题。~每封邮件2秒。

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

配置接收连接器属性

在2021年,我得到大约580…620在Powershell内核中使用net.mail.SmtpClient时,邮件/分钟通过。

如果我让脚本的2个实例在同一台服务器上运行(当然有不同的电子邮件地址列表),我得到第一个大约350..400封/分钟,第二次大约500封…550封/分钟

在我的例子中,邮件是html格式的邮件,每个邮件中有4个图像,每个邮件都必须单独生成。

所以net.mail.SmtpClient本身肯定是而不是慢。

当然,这在很大程度上取决于您的SMTP服务器的性能-以及您的发送客户端和SMTP服务器之间的连接。

我们有一个企业级的SMTP解决方案,在生成电子邮件的服务器和我们的SMTP服务器之间有GBit/s局域网。

这是使用smtp.send(),而不是smtp.sendAsync()。因此,每封邮件都是顺序生成的,并等待SMTP服务器接受它。

在我看来,net.mail.SmtpClient确实可以用于群发邮件,而且它非常易于使用。

来自艰难经验的免费提示:只要绝对确保在发送每封邮件后处理Net.Mail.MailMessage对象-否则会出现"to"邮件地址确实会累积起来,你最终会向同一个收件人多次发送邮件,收件人会在"收件人"栏中看到彼此。场。