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

时间:2013-03-21 15:33:40

标签: 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");

    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();
 }

2 个答案:

答案 0 :(得分:1)

  

我们一直在看到许多电子邮件没有得到的问题   发送。

比其中一些人没有被发送的更大(也更可能)的问题是他们中的许多人没有得到交付。

  

......有更好的方法吗?

在大多数情况下。 Jeff Atwood在this blog post发送电子邮件时遇到了许多问题。该帖子差不多3年前,即便如此,第一条评论建议使用邮戳。我使用过邮戳,它可靠地处理了以合理的价格通过代码发送电子邮件的问题。也就是说,现在市场上有更好的解决方案,我的公司目前很想切换到mandrill。定价稍微好一点,分析很棒。

答案 1 :(得分:0)

因为这是一个ASP.NET MVC应用程序,所以您需要了解您的应用程序池。创建多个线程会快速耗尽您的应用程序池,IIS可能会做一些时髦的事情,以防止在发送电子邮件时停止工作。如果您对了解更多信息感兴趣,我会看一下Can I use threads to carry out long-running jobs on 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();