是否可以实例化一次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。
如果应用程序希望将多个消息发送到同一SMTP服务器,则可以重新使用由SmtpClient类的当前实例建立到SMTP服务器的连接。这是 在使用身份验证或加密时建立与SMTP服务器的连接时特别有用。验证和建立TLS会话的过程可能是昂贵的操作。在向同一SMTP服务器发送大量电子邮件时重新建立每条消息的连接的要求可能会对性能产生重大影响。有许多高容量电子邮件应用程序可以发送电子邮件状态更新,新闻稿分发或电子邮件警报。
你应该真的对你的邮件服务器更友善,但是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;
}
}
}
}
我怀疑此刻抛出异常的原因是由于重复的连接尝试,所以服务器可能“表现出来”作为一种方式来说“停止用重复连接戳我”。
上面的代码示例将确定代表您建立的连接数量,并与服务器进行更“礼貌”的沟通,正如您所指出的那样,文档指出了这种方法更适合的其他几种情况。