gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:01:56 25 4
gpt4 key购买 nike

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

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

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

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

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

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

关于c# - SmtpClient 非常慢 - 发送一封非常小的电子邮件大约需要 2 秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5705241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com