SmtpClient.SendAsync()没有收到我发送的所有邮件

时间:2012-10-09 21:07:22

标签: c# smtpclient

我刚刚编写了一些测试代码,查看System.Net.Mail.SmtpClient向我发送相同的消息。

int numClients = 10;
List<SmtpClient> mailClients = new List<SmtpClient>();
for (int i = 0; i < numClients; i++) {
    mailClients.Add(new SmtpClient(smtpHost));
}

MailMessage msg = new MailMessage("myAddress@eg.com", "myAddress@eg.com", "test message", "" );
foreach (SmtpClient c in mailClients) {
    c.SendAsync(msg, null);
}

这一切都很好并且执行没有任何问题,只是我只收到'n - 1'消息。 即如果我发送10条消息,我只收到收件箱中的9条消息。如果我发送50我只收到49等。

注意:如果我更改代码以使用阻止发送,那么我将始终收到正确数量的消息。 e.g。

foreach (SmtpClient c in mailClients) {
    c.Send(msg);
} 

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

以下是一些可能有所帮助的观察结果:

  • 只创建一个SmtpClient。
  • 改为创建多条消息。
  • SmtpClient实现IDisposable。使用将其包装在中。
  • MailMessage还实现了IDisposable。

我怀疑您可能遇到多个SmtpClient实例的错误/问题,这些实例都包装了相同的SMTP服务器。使用单个实例可以解决问题。

<强>更新

每个MSDN:

  

调用SendAsync后,您必须等待电子邮件传输完成,然后再尝试使用Send或SendAsync发送其他电子邮件。

http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

因此,根据您的情况,使用SendAsync over Send几乎没有任何好处。你的循环可能正在踩东西,因为你不等待以前的SendAsync完成。

以下是一些想法:

  • 如果您要发送大量电子邮件,SendAsync的执行功能几乎与Send相同。只需使用发送。
  • 如果您需要并行发送,请使用生产者/消费者模式。一个(或多个)生成线程将内容转储到队列中以发送,并且多个消费线程各自使用一个SmtpClient来发送消息。使用BlockingCollection实现这种模式非常简单。请参阅MSDN中的示例http://msdn.microsoft.com/en-us/library/dd267312.aspx
  • 如果使用足够的线程,则SMTP服务器将成为瓶颈。请注意何时超载。