2014-02-19 176 views
4

可以实例化一次SMTP客户端并同步发送2000封电子邮件吗?发送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会话的过程可能是昂贵的操作。 A 要求在发送大量电子邮件到 时为每条消息重新建立连接,同一个SMTP服务器可能会对性能产生重大影响。有多个 大容量电子邮件应用程序发送电子邮件状态更新,新闻稿分发或电子邮件 警报。

+3

是的,绝对实例化循环外的客户端,并为每个邮件重新使用它。在消息之间休息几秒钟可能会很好。 – HaukurHaf

+0

使用单个'SmtpClient'来处理所有消息,并在完成时调用'Dispose()'(使用'using'语句)。 –

+0

你可以尝试在发送后使用SmtpClient - '使用(var client = new SmtpClient()){client.Send(m); }' – Win

回答

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; 
      } 
     } 
    } 
} 

我怀疑此时抛出异常的原因是由于重复连接尝试,所以服务器可能“表现出来”作为“停止重复连接戳我”的方式。

上面的代码示例将确定代表您要创建多少个连接,并且与服务器进行“礼貌”沟通,正如您所指出的那样,文档指出了其他方案更适合的其他方案至。

相关问题