0

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

2 回答 2

1

我们一直看到一些电子邮件没有被发送的问题。

比其中一些没有被发送的更大(并且更有可能)的问题是其中许多没有被发送。

...有更好的方法吗?

在大多数情况下。Jeff Atwood 在这篇博文中讨论了发送电子邮件的许多问题。那篇文章差不多是 3 年前的事了,即便如此,第一条评论还是建议使用邮戳。我使用了邮戳,它可靠地处理了通过代码以合理的价格发送电子邮件的问题。也就是说,现在市场上有更好的解决方案,我的公司目前非常想改用mandrill。稍微好一点的定价,很棒的分析。

于 2013-03-21T15:39:59.270 回答
0

因为这是一个 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();
于 2013-03-21T15:47:33.597 回答