尝试使用 MailKit 连接到 GMail 时出错
Error trying to Connect to GMail with MailKit
我有以下代码...
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
{
ClientId = "<< MY CLIENT ID>>",
ClientSecret = "<<MY CLIENT SECRET>>"
},
new[] { "https://www.googleapis.com/auth/gmail.readonly" },
"<<EMAIL ADDRESS>>",
CancellationToken.None,
new FileDataStore("Mail2.Auth.Store")).Result;
using (var client = new ImapClient())
{
// THE CODE FAILS ON THIS NEXT LINE
client.Connect("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
client.Authenticate("<<EMAIL ADDRESS>>", credential.Token.AccessToken);
}
当 运行 时,代码在指示上失败,如 AuthenticationException: The remote certificate is invalid according to the validation procedure.
我最初认为这是因为该帐户启用了两步验证。因此,我设置了另一个帐户,确保它只使用常规身份验证设置,但我遇到了同样的错误。
我在此处和其他地方找到了很多处理此异常的帖子,但它们似乎处理了使用 SmtpClient()
和此处的问题,正如您从代码中看到的那样, ImapClient()
.
出现错误
任何人都可以建议可能是错误的原因吗?是 Gmail 吗?邮件工具包? 。网?以上都是?
问题是您的系统不接受 GMail 的 SSL 证书。
您可以覆盖 client.ServerCertificateValidationCallback
。
一个非常简单的解决方案示例可能如下所示:
client.ServerCertificateValidationCallback = () => true;
显然,这意味着如果有人进行了欺骗 imap.gmail.com,您的软件就会陷入 MITM 攻击,所以这并不理想。
您可能希望将证书的指纹与已知指纹进行匹配,或者将证书添加到本地证书存储并为其分配信任级别。
我有以下代码...
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(new ClientSecrets
{
ClientId = "<< MY CLIENT ID>>",
ClientSecret = "<<MY CLIENT SECRET>>"
},
new[] { "https://www.googleapis.com/auth/gmail.readonly" },
"<<EMAIL ADDRESS>>",
CancellationToken.None,
new FileDataStore("Mail2.Auth.Store")).Result;
using (var client = new ImapClient())
{
// THE CODE FAILS ON THIS NEXT LINE
client.Connect("imap.gmail.com", 993, SecureSocketOptions.SslOnConnect);
client.Authenticate("<<EMAIL ADDRESS>>", credential.Token.AccessToken);
}
当 运行 时,代码在指示上失败,如 AuthenticationException: The remote certificate is invalid according to the validation procedure.
我最初认为这是因为该帐户启用了两步验证。因此,我设置了另一个帐户,确保它只使用常规身份验证设置,但我遇到了同样的错误。
我在此处和其他地方找到了很多处理此异常的帖子,但它们似乎处理了使用 SmtpClient()
和此处的问题,正如您从代码中看到的那样, ImapClient()
.
任何人都可以建议可能是错误的原因吗?是 Gmail 吗?邮件工具包? 。网?以上都是?
问题是您的系统不接受 GMail 的 SSL 证书。
您可以覆盖 client.ServerCertificateValidationCallback
。
一个非常简单的解决方案示例可能如下所示:
client.ServerCertificateValidationCallback = () => true;
显然,这意味着如果有人进行了欺骗 imap.gmail.com,您的软件就会陷入 MITM 攻击,所以这并不理想。
您可能希望将证书的指纹与已知指纹进行匹配,或者将证书添加到本地证书存储并为其分配信任级别。