为什么 SmtpClient 发送邮件在 Asp.Net 应用程序中失败并出现异常?

Why is SmtpClient Send mail failing with exceptions in Asp.Net application?

我正在尝试通过 SmtpClient(“smtp.office365.com”)发送电子邮件,但 运行 遇到了问题。

考虑以下代码片段:

var fromAddress = new MailAddress("someone@example.com", "TestFrom");
var toAddress = new MailAddress("someoneto@example.com", "TestSend");
string fromPassword = "SomePassword";

var smtp = new SmtpClient
{
    Host = "smtp.office365.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};

using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = "Hey There Did this Test Work?",
    Body = "Hey There Did this Test Work?",
    IsBodyHtml = true,
})

smtp.Send(message);

此代码可在 .Net 控制台应用程序中正常运行。 我还可以使用相同的凭据并通过 PowerShell 发送电子邮件。

当我尝试在 Asp.Net 应用程序中使用相同的代码片段时,它失败了。 我已经在本地部署到 Azure 的应用程序上进行了尝试。 我得到了相同的结果。

我得到以下异常:

Failure sending mail. Unable to read data from the transport connection: net_io_connectionclosed.

我听说在过去 3 个月之前的某个时候它曾经正常工作。 我在这里做错了什么吗?我应该使用其他配置设置吗? Asp.Net 是否需要(在本地和 Azure 中)设置一些东西才能让它工作?

感谢

我们在发送电子邮件时遇到了类似的问题,结果证明这是因为我们没有强制执行 TLS 1.2。您可以使用以下代码强制执行它:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

您只需要在您的应用程序中调用一次,因此 Application_Start 中的回调 global.asax 是放置它的一个可能位置。