Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一次使用MvcMailer发送多封电子邮件_C#_Asp.net Mvc 3_Iis_Mvcmailer - Fatal编程技术网

C# 一次使用MvcMailer发送多封电子邮件

C# 一次使用MvcMailer发送多封电子邮件,c#,asp.net-mvc-3,iis,mvcmailer,C#,Asp.net Mvc 3,Iis,Mvcmailer,我有一个MVC3 web应用程序,我正在使用MvcMailer发送电子邮件(可能一次发送数千封)。如果我只是将每个收件人密件抄送到同一封电子邮件中,这是很好的,但是如果我尝试循环通过他们向他们发送单独的电子邮件,速度会非常慢,我猜这是因为每次它都再次连接到smtp服务器 我们有自己的smtp服务器,它正在连接,我目前正在尝试发送如下电子邮件: foreach(Person x in names) { var mail = Mailer.Example_Mail() mail.To

我有一个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接收并发送它们,但不幸的是,我不知道如何

如果有人能让我知道做这件事的最好方法是什么,那就太棒了!提前谢谢大家

更新

我曾尝试使用@Mike建议的
SendAsync()
方法,这确实大大加快了速度,但现在它丢失了约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);
}
List errors=newlist();
var mail=Mailer.Example_mail();
mail.To.Add(“some@address.com");
对于(int i=0;i<100;i++)
{
var client=new-SmtpClientWrapper();
client.SendCompleted+=(发件人,e)=>
{
如果(e.Error!=null | | e.Cancelled)
{
添加(e);
}
};
sendaync(“用户状态对象”,客户端);
}

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

这实际上会为迭代中的每个项目产生多个线程。但是,请谨慎使用以下方法:


基本上,进行一些测试->这可能对您很有效,并加快过程,也可能不会,这取决于您的设置和代码配置。

您是否尝试过SendAsync方法?它至少会将控制权返回到主线程,然后Exchange可以处理负载。我还没有,但我明天会研究它。读了更多的内容后,我想我还是希望将它们保存到服务器上,让IIS来处理,因为这样我就不必担心发送时smtp连接是否成功,如何处理smtp服务器暂时关闭的问题?如何使用
SendAsync
?只需将其交换为
Send
?如果您对IIS服务器有那么多访问权限,那么这就是方法。我稍后会尝试发布一些代码。是的,我是唯一的管理员(但这并不意味着我知道我在做什么!)。谢谢,迈克,我期待着看