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