C#使用System.Net.Mail发送大量电子邮件

C#使用System.Net.Mail发送大量电子邮件,c#,asp.net-mvc,email,system.net.mail,C#,Asp.net Mvc,Email,System.net.mail,我们有一个ASP.NET MVC应用程序,它每月通过电子邮件向客户发送大量报告。每封电子邮件都附有一份月结单。目前我们有大约70个客户,但随着时间的推移,这一数字有望增加。我们已经看到许多电子邮件无法发送的问题。我们使用System.Net.Mail API 这是我们正在使用的代码,有更好的方法吗 foreach(string client in clients){ SmtpClient client = new SmtpClient("server.com"); Back

我们有一个ASP.NET MVC应用程序,它每月通过电子邮件向客户发送大量报告。每封电子邮件都附有一份月结单。目前我们有大约70个客户,但随着时间的推移,这一数字有望增加。我们已经看到许多电子邮件无法发送的问题。我们使用System.Net.Mail API

这是我们正在使用的代码,有更好的方法吗

 foreach(string client in clients){

    SmtpClient client = new SmtpClient("server.com");

    BackgroundWorker emailInvoker = new BackgroundWorker();
    emailInvoker.DoWork += delegate
    {
      // Delay to prevent flow control, try later Relay error
      Thread.Sleep(TimeSpan.FromSeconds(2));
      client.Send(message);
    }

   emailInvoker.RunWorkerAsync();
 }
我们已经看到许多电子邮件没有收到的问题 发送

比他们中的一些人没有收到邮件更大(也更有可能)的问题是,他们中的许多人没有收到邮件

…有更好的方法吗

 foreach(string client in clients){

    SmtpClient client = new SmtpClient("server.com");

    BackgroundWorker emailInvoker = new BackgroundWorker();
    emailInvoker.DoWork += delegate
    {
      // Delay to prevent flow control, try later Relay error
      Thread.Sleep(TimeSpan.FromSeconds(2));
      client.Send(message);
    }

   emailInvoker.RunWorkerAsync();
 }

在大多数情况下。杰夫·阿特伍德(Jeff Atwood)回顾了发送电子邮件的许多问题。那篇帖子差不多是3年前的事了,即使在那时,第一条评论建议使用邮戳。我使用了邮戳,它可靠地处理了通过代码以很好的价格发送电子邮件的问题。也就是说,现在市场上有更好的解决方案,我的公司目前很想转向的是。稍微好一点的定价,很棒的分析。

因为这是一个ASP.NET MVC应用程序,所以您需要了解您的应用程序池。创建多个线程会很快耗尽你的应用程序池,IIS可能会做一些古怪的事情,以防止邮件发送过程中出现问题。如果你有兴趣了解更多,我会看一看

若我要重写它,我会用
foreach
和电子邮件发送创建一个线程,而不是为每个客户创建一个线程

 BackgroundWorker emailInvoker = new BackgroundWorker();

 emailInvoker.DoWork += delegate
 {
     // get your clients here somehow

     foreach(string client in clients){

         SmtpClient client = new SmtpClient("server.com");

         // Delay to prevent flow control, try later Relay error
         Thread.Sleep(TimeSpan.FromSeconds(2));
         client.Send(message);
     }
 }

 emailInvoker.RunWorkerAsync();

老实说,我知道这是离题的,我更关心的是被列入黑名单或在你的邮件服务器上涂油。无论如何,您都没有给出消息未被发送的任何指示(任何错误消息/崩溃等)
BackgroundWorker
可能是多余的,因为您可以使用
SmtpClient.sendsync
异步发送电子邮件。您在事件日志等中看到了什么样的错误?使用第三方服务(如SendGrid)发送电子邮件会更容易、更轻松、更可靠、更便宜。这将让你专注于你的核心业务,而不是发送电子邮件这一平凡的任务。我给我们的电子邮件服务提供商打了电话,但电子邮件没有发送到中继。