尝试使用 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 客户端。
我正在使用 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 客户端。