是否可以实例化一次SMTP客户端并同步发送2000封电子邮件?
当我们使用在此帖子末尾粘贴的代码为我们发送的每封邮件实例化SMTP客户端时,我们收到以下错误:
System.Net.Mail.SmtpException:服务不可用,关闭 传输通道。服务器响应为:4.4.1连接定时 出
我怀疑为每条消息实例化SMTP客户端导致了这个但不确定。 代码如下。
List<MailMessage> messages = GetMailMessages();
foreach( MailMessags m in messages)
{
try
{
SmtpClient client = new SmtpClient();//SHOULD THIS BE PLACED OUTSIDE AND BEFORE THE LOOP
client.Send(m);
}
catch (Exception)
{
throw;
}
}
编辑1:
我刚刚在MSDN上找到了这个。 (http://msdn.microsoft.com/en-us/library/ee706942%28v=vs.110%29.aspx)。 因此,当使用群发电子邮件时,您必须只实例化一次SMTP客户端并将其重新用于所有多个MailMessage。
由SmtpClient的当前实例建立的连接 类到SMTP服务器可能 如果应用程序希望将多个邮件发送到同一SMTP服务器,则重新使用。这是
在使用身份验证或加密时建立与SMTP的连接时特别有用 服务器。验证和建立TLS会话的过程可能是昂贵的操作。一个 在发送大量电子邮件时要求为每条消息重新建立连接 相同的SMTP服务器可能会对性能产生重大影响。有很多 发送电子邮件状态更新,简报分发或电子邮件的高容量电子邮件应用程序 警报。
答案 0 :(得分:0)
你应该真的对你的邮件服务器更友好,但是SMTP客户端可以处理多个电子邮件,如果你这样异步地这样做,你可以更好地使用你的服务器硬件...
async Task SendMail(ICollection<MailMessage> messages)
{
using (var client = new SmtpClient())
{
foreach (MailMessags m in messages)
{
try
{
await client.SendAsync(m);
}
catch (Exception)
{
throw;
}
}
}
}
我怀疑此刻抛出异常的原因是由于重复的连接尝试,所以服务器可能会&#34;表现出来&#34;作为一种方式说&#34;停止用反复的联系戳我...#34;。
上面的代码示例将确定代表您建立的连接数量,以及更多地传达&#34;礼貌地&#34;与服务器一样,正如您所指出的那样,文档指出了这种方法更适合的其他几种情况。