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();
}
我们已经看到一些邮件没有收到的问题发送。
比起其中一些邮件没有发送,更大(也更可能)的问题是其中许多邮件没有被发送。
…有没有更好的方法?
在大多数情况下。杰夫·阿特伍德在这篇博文中列举了许多发送电子邮件的问题。那篇帖子是三年前的事了,即使在那时,第一条评论还是建议使用邮戳。我用的是邮戳,它可靠地处理了通过代码以优惠价格发送邮件的问题。也就是说,现在市场上有更好的解决方案,我的公司目前非常想换成山魈。稍微好一点的定价,很棒的分析。
因为这是一个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();