首页 > 解决方案 > C# 在 Windows Server 2008 R2 上使用 System.Web.Mail 发送认证邮件时出错

问题描述

在端口 465 (tls1.2) 上发送认证邮件 (System.Web.Mail.MailMessage) 仅在 windows server 2008 r2 上失败

我有一个基于框架 4.5 的函数,但它使用旧库(System.Web.Mail.MailMessage)通过端口 465(认证邮件 tls1.2)上的 smtp 服务器发送电子邮件,该函数在 Windows 10 上正确运行和 windows server 2012 但在 windows server 2008 r2 上失败。该错误属于 System.Web.HttpException 类型,表明它无法访问服务器,但在端口 465 上进行 telnet 有效。windows server 2008 r2有什么问题?

try
{
System.Web.Mail.MailMessage newMail = new System.Web.Mail.MailMessage();
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "server");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", "465");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", "2");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", "1");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "username");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "pwd");
newMail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", "true");

newMail.From = "mail";
newMail.To = "mail";
newMail.Subject = "test web Mail";
newMail.BodyFormat = System.Web.Mail.MailFormat.Html;
newMail.Body = "body....";
newMail.Priority = System.Web.Mail.MailPriority.High;

System.Web.Mail.SmtpMail.SmtpServer = "smtpserver:465";
System.Web.Mail.SmtpMail.Send(newMail);

Console.WriteLine("Email Send");
}
catch (Exception ex)
{
Console.WriteLine(ex);
}

System.We.HttpException (0x80004005) 传输无法连接到服务器

标签: c#windows-server-2008-r2tls1.2mailmessage

解决方案


我通过按照指南或 Imantas的建议启用 tls1.2 来解决

在 windows server 2008 R2 中,如果不存在以下密钥,则必须通过在系统注册表中插入来启用 tls1.2 协议:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols 添加文件夹 TLS 1.2 和文件夹 TLS 1.2 下,在两个文件夹中添加子文件夹 Client 和子文件夹 Server,输入DisabledByDefault密钥集0Enabled密钥集1


推荐阅读