首页 > 解决方案 > 使用带有 TLS 1.2 的 SmtpClient 将未经身份验证的邮件发送到 Microsoft 365

问题描述

我的理解是,从 2021 年 1 月开始,微软将要求 TLS 1.2 使用 365 连接器发送邮件。我有一个运行良好的连接器,它允许中继来自我的网络公共 IP 的消息。多年来,我将它用于大型 Web 应用程序、文档扫描仪机器和其他本地应用程序。我使用 365 服务共享邮箱 (services@mydomain.com) 作为发件人,不使用身份验证。

我从未成功将其设置为与 TLS 一起使用,因此大多数流量都未加密。我发现了很多类似的问题,但没有一个具有相同的配置,而且绝对没有一个具有可接受的答案(大多数答案只是说“不要使用 SSL”)。

我想开始在我的 Web 应用程序上修复 TLS,然后修复其余部分。这是 C# 中的 .Net 4.8 Web 表单项目。

web.config 文件包含以下设置:

<system.net>
    <mailSettings>
      <smtp deliveryMethod="Network">
        <network host="mydomain-com.mail.protection.outlook.com" port="25" enableSsl="true" defaultCredentials="true" />
      </smtp>
    </mailSettings>
  </system.net>

在网页中,我以这种方式发送消息:

using System.Net.Mail;
            using SmtpClient client = new SmtpClient();
            
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
    
            MailMessage msg = new MailMessage
            {
                From = new MailAddress("services@mydomain.com", "Tester"),
                IsBodyHtml = true,
                Subject = "Test message",
                Body = "Test message."
            };
    
            msg.To.Add("xxx@mydomain.com");
            client.Send(msg);

现在有趣的部分。这在我的客户端计算机(一台 Windows 11 机器)上完美运行。邮件已正确传递,并且经过检查,在所有退回邮件中都使用了 TLS 1.2。

当我使用相同的 web.config 设置在 Windows 2016 生产服务器上移动相同的代码时,这不起作用。我收到错误消息:服务器不支持安全连接(在事件查看器中登录为事件 1309、SmtpException、堆栈跟踪:

 in System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
 in System.Net.Mail.SmtpClient.GetConnection()
 in System.Net.Mail.SmtpClient.Send(MailMessage message)

将端口更改为 587 不起作用。让服务器发送消息的唯一方法是将 web.config 部分设置为enableSsl="true". 这当然是不可接受的,因为一旦微软停止转发不安全的邮件,它就会停止工作。

防火墙允许流量。这一定是 Windows Server 设置中的问题,但 TLS 1.2 在同一服务器的其他地方使用,所以我不明白可能是什么原因。

标签: .netwebformsoffice365smtpclient.net-4.8

解决方案


推荐阅读