【问题标题】:SMTP.SendMail Error - An existing connection was forcibly closed by the remote hostSMTP.SendMail 错误 - 现有连接被远程主机强行关闭
【发布时间】:2012-07-13 03:18:49
【问题描述】:

我正在尝试使用以下代码发送电子邮件并收到上述错误。

有两封电子邮件正在发送,第一封似乎送达正常,下面的代码似乎不起作用。

有人可以帮忙吗?

        using (var mail = new MailMessage(fromEmail.Trim(), ToEmail.Trim()))
        {
            mail.IsBodyHtml = true;

            bodyText = bodyText.Replace("**Message**", Message);

            // populate the message
            mail.Subject = subject;
            mail.Body = bodyText;

            // send it
            var smtpClient = new SmtpClient();
            smtpClient.Send(mail);
        }

配置:

  <system.net>
    <mailSettings>
      <smtp from="test@foo.com">
        <network defaultCredentials="true" port="25" host="127.0.0.1" password="" userName=""/>
      </smtp>
    </mailSettings>
  </system.net>

【问题讨论】:

  • 可能是接收服务器的反垃圾邮件设置拒绝来自同一来源的过于靠近的连接。作为测试,在发送之间设置几秒钟的延迟。

标签: asp.net email smtp


【解决方案1】:

不要将MailMessage 作为using 块的主题,而是尝试将SmtpClient 设置为主题。

编辑: 如果您的 .net 版本

假设using 块也代表实例方法的主体,一个简单的测试可能是:

  1. 创建包含类的实例

  2. 通过调用上面引用的类方法发送第一条消息 罢工>

  3. 设置 reference = null(换句话说,确保 SmtpClient 已实际标记/处置。您可能希望/需要手动处置实例作为进一步检查)

    Jeff Tucker 建议您将 SmtpClient.Timeout 值设置为 2 - 有关更多信息,请参阅他的评论。

  4. 创建同一类的新实例

  5. 发送第二条消息

在此之后(假设可行),您可以迭代这些步骤以优化和缩小逻辑,直到您对它感到满意为止。

【讨论】:

  • MailMessage 和 SmtpClient 都在 .Net 4 中实现了 IDisposable,所以两者都应该有用途。不过,在这两者中,SmtpClient 是更重要的正确处置。
  • Smtp 在我所针对的框架版本中没有实现 IDisposable。有什么想法吗?
  • 将 SmtplClient.Timeout 值设置为 2,这将导致连接在您发送第一封电子邮件后被破坏(可能)并强制将新连接添加到连接池中。您应该使用 2 的原因是因为一个错误(在 .NET 4 中已修复)使 1 和 0 的值实际上是无穷大。 Smtp 连接独立于 SmtpClient 对象进行池化,因此将其设置为 null 或尝试手动处理它将不起作用(并且在 4.0 之前它没有 Dispose 方法)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 1970-01-01
  • 2021-05-12
相关资源
最近更新 更多