与任务并行库发送邮件抛出错误
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。”
关于“net_io_connectionclosed”异常,请查看此链接,因为它可能会指示您为何正在关闭连接。这可能是身份验证问题,防火墙等
Enabling Tracing for System.Net
请找我会在你的情况,而不是产卵1000个任务这是不是很有效的使用下面的代码。
谢谢你的解决方案..我想问你如何决定const int _clientcount = 15? 是clientcount取决于运行硬件或每台机器的smtp数量受限于.net/iis – 2013-03-28 07:17:00
这仅仅适用于我的环境。取决于每个环境和SMTP服务器的设置。它可能只允许说每个IP 5连接。也许使用配置设置,以便您可以根据环境调整它。 – 2013-03-28 07:31:48
@RyanGunn你设置了SMTPCLients,我有一个需要改变它为不同的主机。因为我会使用不同的主机smtp凭证发送电子邮件。所以我必须为不同的主机启动15个客户端。你能给我举个例子说明我该怎么做 – coder771 2018-01-19 11:39:19
正如吉姆提到的那样,您可能会遇到节流/拒绝情况。恕我直言,你可能会更成功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);
我不知道,如果这是真的什么帮助,但 - 如果它仍然失败,你可能只需要进行一个长时间运行的任务发送的电子邮件连续。
如果正在进行电子邮件传输,并且您再次调用SendAsync或Send,则将收到InvalidOperationException。取自“http://msdn.microsoft.com/zh-cn/library/system.net.mail.smtpclient.aspx” – 2013-03-27 19:09:53
@ DNNDev.co.za - 我的代码段调用的方法是SendMailAsync,而不是Send或SendAsync 。当然,它可能会表现相同的方式,文档只是没有更新,但该位文档并没有说它会失败:) – 2013-03-27 23:17:02
道歉,我想念你的代码在做什么,并认为它是调用SendAsync 。 – 2013-03-28 07:32:36
难道你打开太多的连接到SMTP服务器,或者打它太快,它的节流吗?如果每秒钟执行一次或每五秒执行一次,会发生什么情况? – 2013-03-27 15:32:13
我不认为SmtpClient(或服务器)同时支持到同一台服务器的多个连接。想想你要做的事情:你要求多个'SmtpClient'对象连接到* same *服务器并发送电子邮件。 'SmtpClient'将重新使用连接到同一台服务器,所以你可能处于竞争状态。您是否尝试过使用'SendAsync'而不是使用'Task'? – 2013-03-27 15:56:33
至少,我希望你会想要使用一个'SmtpClient'对象 – 2013-03-27 15:57:26