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

我使用SmtpClient发送简单的电子邮件.

电子邮件constist大约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秒发送一封非常小的电子邮件 - 代码日志