发送2000封电子邮件

时间:2014-02-19 23:15:04

标签: c# smtpclient

是否可以实例化一次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服务器可能会对性能产生重大影响。有很多       发送电子邮件状态更新,简报分发或电子邮件的高容量电子邮件应用程序       警报。

1 个答案:

答案 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;与服务器一样,正如您所指出的那样,文档指出了这种方法更适合的其他几种情况。