2

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

MailKit.dll 中出现“System.Security.Authentication.AuthenticationException”类型的异常,但未在用户代码中处理

附加信息:根据验证程序,远程证书无效。

谷歌搜索这会带来很多关于 Gmail 的内容或作为其他错误消息的一部分(如 FTP 或 Web 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 核实,它与 IIS 中使用的证书相同,用于托管mail.address.com domain以及交换。我也将它安装为受信任的根,但仍然得到同样的错误。

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

>System.Private.Networking.dll 中出现“System.IO.IOException”类型的异常,但未在用户代码中处理

附加信息:由于意外的数据包格式,握手失败。

4

2 回答 2

4

尝试使用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;
}
于 2016-02-03T20:37:44.357 回答
2

我在尝试将MailKit 与 Gmail一起使用时遇到了完全相同的错误,并发现默认情况下,Avast 防病毒软件的Mail Shield已激活“扫描 SSL 连接” 。确保将其关闭

据我所知,Avast 将“打开”邮件,扫描它是否有病毒,然后使用它自己的证书对其进行签名,这样邮件就不会再由 gmail 的证书签名,这会产生该错误:

MailKit.dll 中出现“System.Security.Authentication.AuthenticationException”类型的异常,但未在用户代码中处理。

附加信息:根据验证程序,远程证书无效。

解决方案1:

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

解决方案2(应该是最好的安全性):

  • 以某种方式获取防病毒软件使用的证书(Avast 可以选择导出它)
  • 在连接到 gmail 服务器之前,将其导入 imap/pop/smtp 客户端。
于 2016-02-27T22:26:52.227 回答