2013-03-27 39 views
2

CODE: -与任务并行库发送邮件抛出错误

List<Task> tasks = new List<Task>(); 
foreach (var item in arr)//arr contains 1000+ mailids 
      { 
       tasks.Add(Task.Factory.StartNew(() => 
       { 
        using (MailMessage msg = new MailMessage()) 
         { 
          msg=getmsg();//p-shadow code no erorr here 
          SmtpClient smtp = new SmtpClient(); 
          smtp.Host = smtpServer; 
          smtp.Port = smtpPort; 
          smtp.EnableSsl = isSmtpSsl != 0 ? true : false; 
          smtp.Credentials = new NetworkCredential(smtpUName,smtpPass); 
          smtp.Timeout = int.MaxValue; 
          smtp.Send(msg);//---throws error.... 
          //sql code to insert db that mail is send 
         } 
       }, TaskCreationOptions.LongRunning)); 
      } 
      Task.WaitAll(tasks.ToArray<Task>()); 

ERROR- “发送邮件失败。”

INTERNAL ERROR-“无法从传输连接读取数据:net_io_connectionclosed。”

+0

难道你打开太多的连接到SMTP服务器,或者打它太快,它的节流吗?如果每秒钟执行一次或每五秒执行一次,会发生什么情况? – 2013-03-27 15:32:13

+0

我不认为SmtpClient(或服务器)同时支持到同一台服务器的多个连接。想想你要做的事情:你要求多个'SmtpClient'对象连接到* same *服务器并发送电子邮件。 'SmtpClient'将重新使用连接到同一台服务器,所以你可能处于竞争状态。您是否尝试过使用'SendAsync'而不是使用'Task'? – 2013-03-27 15:56:33

+0

至少,我希望你会想要使用一个'SmtpClient'对象 – 2013-03-27 15:57:26

回答

2

关于“net_io_connectionclosed”异常,请查看此链接,因为它可能会指示您为何正在关闭连接。这可能是身份验证问题,防火墙等

Enabling Tracing for System.Net

请找我会在你的情况,而不是产卵1000个任务这是不是很有效的使用下面的代码。

Sending bulk emails with Tasks Parallel.ForEach

+0

谢谢你的解决方案..我想问你如何决定const int _clientcount = 15? 是clientcount取决于运行硬件或每台机器的smtp数量受限于.net/iis – 2013-03-28 07:17:00

+0

这仅仅适用于我的环境。取决于每个环境和SMTP服务器的设置。它可能只允许说每个IP 5连接。也许使用配置设置,以便您可以根据环境调整它。 – 2013-03-28 07:31:48

+0

@RyanGunn你设置了SMTPCLients,我有一个需要改变它为不同的主机。因为我会使用不同的主机smtp凭证发送电子邮件。所以我必须为不同的主机启动15个客户端。你能给我举个例子说明我该怎么做 – coder771 2018-01-19 11:39:19

0

正如吉姆提到的那样,您可能会遇到节流/拒绝情况。恕我直言,你可能会更成功1)使用单个SmtpClient而不是N个(因此单个客户端可以在内部序列化为/如果需要)和2)使用内置的异步调用(SendMailAsync)而不是StartNew并调用同步版本。

喜欢的东西:

var messages = ... // get collection of MailMessage instances 
var smtpClient = new SmtpClient { ... }; // construct a single SmtpClient 
var tasks = messages.Select(smtpClient.SendMailAsync).ToArray(); 
Task.WaitAll(tasks); 

我不知道,如果这是真的什么帮助,但 - 如果它仍然失败,你可能只需要进行一个长时间运行的任务发送的电子邮件连续。

+0

如果正在进行电子邮件传输,并且您再次调用SendAsync或Send,则将收到InvalidOperationException。取自“http://msdn.microsoft.com/zh-cn/library/system.net.mail.smtpclient.aspx” – 2013-03-27 19:09:53

+0

@ DNNDev.co.za - 我的代码段调用的方法是SendMailAsync,而不是Send或SendAsync 。当然,它可能会表现相同的方式,文档只是没有更新,但该位文档并没有说它会失败:) – 2013-03-27 23:17:02

+0

道歉,我想念你的代码在做什么,并认为它是调用SendAsync 。 – 2013-03-28 07:32:36