1

我有一个 MVC3 Web 应用程序,我正在使用 MvcMailer 发送电子邮件(一次可能有数千个)。如果我只是将每个收件人密件抄送到同一封电子邮件中,这很好用,但是如果我尝试循环通过他们向他们发送单独的电子邮件,它会非常慢,我猜这是因为它每次都再次连接到 smtp 服务器?

我们有自己的 smtp 服务器,它正在连接,我目前正在尝试发送这样的电子邮件:

foreach(Person x in names)
{
    var mail = Mailer.Example_Mail()
    mail.To.Add(x.Email_Address);
    mail.Send();
}

我从教程中知道,您可以将电子邮件保存到文件中,而不是连接到 smtp 服务器并立即发送它们,而且我还从这篇文章中接受的答案中知道,您可以让 IIS 接收它们并发送它们,但是不幸的是,我不知道怎么做。

如果有人可以让我知道这样做的最佳方法是什么,那就太棒了!谢谢大家!

更新

我已经尝试使用SendAsync()@Mike 建议的方法,这确实大大加快了速度,但它现在丢失了约 40% 的电子邮件。在没有抛出任何错误的情况下,每 100 封电子邮件中只有大约 65 封可以通过。我尝试按照“处理异步电子邮件的事件”部分中的建议捕获任何错误但似乎根本没有抛出任何错误。下面的代码:

List<object> errors = new List<object>();
var mail = Mailer.Example_Mail();
mail.To.Add("some@address.com");
for (int i = 0; i < 100; i++)
{
    var client = new SmtpClientWrapper();
    client.SendCompleted += (sender, e) =>
    {
        if (e.Error != null || e.Cancelled)
        {
            errors.Add(e);
        }
    };
    mail.SendAsync("user state object", client);
}
4

1 回答 1

0

如果您没有修改数据并且在您的机器上有相当数量的处理能力(例如,多个核心),您可以尝试使用并行 foreach 循环。

http://msdn.microsoft.com/en-us/library/dd460720.aspx

这实质上会为迭代中的每个项目生成多个线程。但是,请谨慎使用该方法:http: //msdn.microsoft.com/en-us/library/dd997392.aspx

基本上,做一些测试 - > 这可能对你有用并加快进程,或者它可能不会,真的取决于你的设置和代码配置。

于 2012-08-02T04:33:11.637 回答