c#使用System.Net.Mail发送大量的邮件

本文关键字:使用 System Net Mail | 更新日期: 2023-09-27 18:05:13

我们有一个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();
 }

c#使用System.Net.Mail发送大量的邮件

我们已经看到一些邮件没有收到的问题发送。

比起其中一些邮件没有发送,更大(也更可能)的问题是其中许多邮件没有被发送。

…有没有更好的方法?

在大多数情况下。杰夫·阿特伍德在这篇博文中列举了许多发送电子邮件的问题。那篇帖子是三年前的事了,即使在那时,第一条评论还是建议使用邮戳。我用的是邮戳,它可靠地处理了通过代码以优惠价格发送邮件的问题。也就是说,现在市场上有更好的解决方案,我的公司目前非常想换成山魈。稍微好一点的定价,很棒的分析。

因为这是一个ASP。. NET MVC应用程序,您需要了解您的应用程序池。创建多个线程会很快耗尽你的应用程序池,并且IIS可能会做一些奇怪的事情来防止在发送电子邮件时事情陷入停顿。我可以使用线程在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();