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语法错误,再见。l13s3080685qtv.82-gsmtp。以.82结尾的部分随后续每次调用而变化。根据这篇文章,我尝试了";email@gmail.com"(即<email@gmail.com>(。我还尝试使用服务帐户电子邮件(与此类似的电子邮件:appName@serviceName.iam.gserviceaccount.com)但无济于事。我确信我使用的是最新版本的MailKit、MimeKit和Google.Api*,并进行了广泛的搜索,但没有找到任何可以提供解决方案的东西。

有趣的是,在不对代码进行任何更改的情况下,我开始遇到不同的异常。它现在部分基于64 ecoded,并读取以下内容(解码后(:334:{"状态":"400","方案":"承载器","范围":";https://mail.google.com/"}

在此期间,我尝试了另外两个声称自己做对了的实现。没有一个奏效——他们都成功地获得了访问令牌,但却"闯入"了;认证";。所有这些都打击了一个人的思想,使他的努力更加无望。有人想知道是否有任何C#代码能够真正成功地使用OAuth2发送gmail消息…任何提示或其他形式的帮助都将不胜感激。


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

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

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

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

最新更新