Office 365 SMTP 开始触发 net_io_connectionclosed

Office 365 SMTP starts firing net_io_connectionclosed

不久前,我将我的 ASP.NET C# 项目配置为通过 Office 365 发送电子邮件,但上周它开始抛出很多异常。

System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed. 
at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine) 
at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine) 
at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller) 
at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response) 
at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception) 
at System.Net.Mail.SmtpClient.Send(MailMessage message)

如何防止这种情况发生?

  MailMessage message = new MailMessage(System.Configuration.ConfigurationManager.AppSettings["smtpfrom"], email, strOnderwerp, strBody);
            message.Priority = MailPriority.Normal;
            message.IsBodyHtml = true;
            SmtpClient client = new SmtpClient(System.Configuration.ConfigurationManager.AppSettings["smtpserver"], Convert.ToInt32((System.Configuration.ConfigurationManager.AppSettings["smtpport"])));

            client.EnableSsl = Boolean.Parse(System.Configuration.ConfigurationManager.AppSettings["smtpssl"]); ;
            client.Credentials = new System.Net.NetworkCredential(System.Configuration.ConfigurationManager.AppSettings["smtpuser"], System.Configuration.ConfigurationManager.AppSettings["smtppass"]);

            client.Send(message);
            client.Dispose();

似乎在 Dispose 上抛出了异常。

同样的问题于 2 月 8 日在我公司开始。问题来去无规律。

我认为解决问题的方法是更改​​ SMTP 服务器地址。

我们原来的 SMTP 服务器地址是 podxxxxx.outlook.com,大部分时间仍然有效。我在我们的门户中检查了当前的 O365 SMTP 服务器地址,它应该是 smtp.office365.com。

我更改了我的配置以指向这个新地址,问题似乎已经消失了。我的日志在更改后的最后 24 小时内没有显示任何错误。

如果错误再次发生,我会更新。

在我们的案例中,我们已经在使用 smtp.office365.com 端点,但突然间我们开始在我们的一台机器上接收 net_io_connectionclosed,而相同的代码在其他机器上运行良好。调查显示这些机器 smtp.office365.com 解析到不同的 IP 地址,看起来其中一台服务器出现问题。

在尝试写支持查询时,微软似乎在耍我们:

Recently, we started rejecting a percentage of connections to smtp.office365.com that uses TLS1.0/1.1 for SMTP AUTH (complete disablement will start early 2022).

仅此而已。 修复了整个问题。

在 VB.NET 或 c# 中连接到 Office365 时出现 net_io_connectionclosed 错误的所有这些困扰的圣杯是 TSL 版本。

当您使用 VB.NET oder c# 应用程序想要连接时,发送接收消息。 to/from O365 你必须在你的代码中强制使用 TLS12。

只需将最后一行放在您的 EnableSSL = True 下面,您就可以了:

Last Line to force TLS12

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;

这对我有用

如果你们在 2022 年都面临这个问题,那可能是因为 Microsoft 决定停止支持服务端点“smtp.office365.com”的 TLS1.0、TLS1.1。

要解决它, 要么使用“smtp-legacy.office365.com” 要么 通过

配置客户端使用TLS1.2
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

阅读 Microsoft 技术社区的 this 文章了解更多详细信息