繁体   English   中英

C# OAuth2 SMTPclient.Authenticate() 异常

[英]C# OAuth2 SMTPclient.Authenticate() exceptions

我将服务帐户添加到我的 email@gmail.com,为其激活 OAuth2 并下载了密钥。 然后我按照这个(救生) 帖子中描述的步骤进行操作,唯一的区别是我从 Json 文件中实例化了“凭据”(加载 p12 总是会给我“无效的网络密码”)。 有了这个,我可以成功获得访问令牌,这是执行此操作的行:

Task<bool> result = credential.RequestAccessTokenAsync(CancellationToken.None);

然后我从 MailKit 实例化 SmtpClient 并尝试连接和验证:

client.Connect("smtp.gmail.com", 587, SecureSocketOptions.StartTls);
var oauth2 = new SaslMechanismOAuth2("email@gmail.com", credential.Token.AccessToken);
client.Authenticate(oauth2);

最后一行生成读取555: 5.5.2 Syntax error, goodbye 的异常。 l13sm3080685qtv.82 - gsmtp 以 0.82 结尾的部分随着每次后续调用而变化。 根据这篇文章,我尝试了“email@gmail.com”的不同变体(即 <email@gmail.com>)。 我也尝试使用服务帐户电子邮件(类似于此的电子邮件:appName@serviceName.iam.gserviceaccount.com)但无济于事。 我很确定我使用的是最新版本的 MailKit、MimeKit 和 Google.Api*,并进行了广泛的搜索,但没有找到可以提供解决方案的内容。

有趣的是,在没有对代码进行任何更改的情况下,我开始遇到不同的异常。 它现在部分 base64 编码并读取(解码后): 334: {"status":"400","schemes":"Bearer","scope":"https://mail.google.com/"}

与此同时,我尝试了另外 2 个声称他们做对了的实现。 没有任何效果 - 他们都成功获得了访问令牌,但在“身份验证”时中断。 所有这一切都让你大吃一惊,让努力变得更加无望。 有人想知道是否有任何 C# 代码在使用 OAuth2 发送 gmail 消息方面真正成功......任何提示或其他形式的帮助将不胜感激。


下面 jstedfast 指出的方法效果很好,但我想跟进一些问题。 标准评论太多了,所以我在这里添加了它:

当流程第一次执行时,它会打开弹出的浏览器窗口,用户必须登录/批准应用程序/服务才能访问 gmail 帐户。 看起来访问密钥必须存储在硬盘驱动器上。 如果我从 GoogleAuthorizationCodeFlow 构造函数中删除了“DataStore”,则每次执行代码时浏览器似乎都会弹出。 我必须修复的应用程序通常在没有任何用户交互的情况下运行。 有没有办法通过启用/禁用开发人员控制台中定义的 gmail 帐户或服务/应用程序中的某些内容来避免浏览器弹出? 如果不能这样使用标准的gmail帐户,也许是GSuite域的一部分的电子邮件可以? 拥有该应用程序的客户使用 Google GSuite,并且他们拥有包含电子邮件和文档的域。 我想现在我明白了 jstedfast 关于客户端到服务器与服务器到服务器的评论。

按照以下说明进行操作:https ://github.com/jstedfast/MailKit/blob/master/GMailOAuth2.md

如果您正在加载 .p12,那么您就做错了。 该方法用于服务到服务,而不是客户端到服务。 我上面提供的说明是针对客户到服务的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM