尝试使用 MailKit 连接到邮件服务器时出现 AuthenticationException

AuthenticationException when tryign to connect to mail server using MailKit

我正在使用 MailKit 尝试通过 SMTP 通过交换服务器发送电子邮件,但是当我尝试连接时出现以下错误:

An exception of type 'System.Security.Authentication.AuthenticationException' occurred in MailKit.dll but was not handled in user code

Additional information: The remote certificate is invalid according to the validation procedure.

用 Google 搜索会发现很多关于 Gmail 的内容或作为其他错误消息的一部分(例如 FTP 或网络 api 请求等)。我已经与 IT 人员交谈过,它不是自签名证书,我们不需要身份验证(事实上,我管理的 BugZilla 实例设置了相同的设置并且工作正常)。我哪里做错了,或者我怎样才能获得更多详细信息以进一步排除故障?

using (var Client = new SmtpClient())
{
    Client.Connect("mail.address.com", 587, false);
    Client.AuthenticationMechanisms.Remove("XOAUTH2");
    Client.Send(Message);
    Client.Disconnect(true);
}

编辑:我已经与 IT 核实,它与托管 mail.address.com domain 以及作为交换的 IIS 中使用的证书相同。我也将其安装为受信任的根,但仍然出现相同的错误。

编辑 2:如果我将代码更新为 Client.Connect("mail.address.com", 587, true);,则会出现错误:

An exception of type 'System.IO.IOException' occurred in >System.Private.Networking.dll but was not handled in user code

Additional information: The handshake failed due to an unexpected packet format.

尝试使用 Client.Connect("mail.address.com", 587, SecureSocketOptions.None); 禁用 STARTTLS。

如果您想保留 STARTTLS,您可以尝试覆盖 Client.ServerCertificateValidationCallback

获取有关该错误的更多信息的最简单方法是使用如下内容覆盖 ServerCertificateValidationCallback

bool ValidateRemoteCertificate (object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
    Console.WriteLine ("SslPolicyErrors: {0}", sslPolicyErrors);

    return sslPolicyErrors == SslPolicyErrors.None;
}

我在尝试将 MailKit 与 Gmail 一起使用时遇到了完全相同的错误,并发现默认情况下来自 Avast 防病毒软件的 Mail Shield激活了 "Scan SSL connection"。确保关闭它

据我所知,Avast 会"open" 邮件,扫描其中是否有病毒,然后使用自己的证书对其签名 所以邮件将不再由产生该错误的 gmail 证书签名:

An exception of type 'System.Security.Authentication.AuthenticationException' occurred in MailKit.dll but was not handled in user code.

Additional information: The remote certificate is invalid according to the validation procedure.

解决方案一:

  • 关闭防病毒软件(或整个邮件屏蔽)的 SSL 扫描。

方案二(应该是安全性最好的说法):

  • 以某种方式获取防病毒软件使用的证书(Avast 有导出它的选项)
  • 在连接到 gmail 服务器之前将其导入您的 imap/pop/smtp 客户端。