使用Xoauth2验证到Gmail smtp.结果"用户名和密码"不被接受 &g



由于最近删除了不太安全的应用程序,并且不想沿着应用程序密码的路线前进。我一直在尝试启用Xoauth2与smtp服务器作为一个更安全的可持续的方法授权我的用户。

我已经创建了一个简单的控制台应用程序来测试。 使用mailkit
  1. 连接到google的smtp服务器
  2. 使用xoauth2
  3. 在google cloud console上创建安装的应用程序。

授权似乎有效,我正在获得访问令牌。问题似乎是smtp服务器不接受它,或者可能是我如何应用它。

using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;

var path = @"C:YouTubedevcredentials.json";
var scopes = new[] { "email" };
var userName = "test2";
var credential = GoogleWebAuthorizationBroker.AuthorizeAsync(GoogleClientSecrets.FromFile(path).Secrets,
scopes,
userName,
CancellationToken.None,
new FileDataStore(Directory.GetCurrentDirectory(), true)).Result;
credential.GetAccessTokenForRequestAsync();
var message = new EmailMessage()
{
From = "xxx@gmail.com",
To = "xxx@gmail.com",
MessageText = "test",
Subject = "test"
};
try
{
using (var client = new SmtpClient())
{
client.Connect("smtp.gmail.com", 465, true);

var oauth2 = new SaslMechanismOAuth2 ("xxx@gmail.com", credential.Token.AccessToken);
await client.AuthenticateAsync (oauth2, CancellationToken.None);

client.Send(message.GetMessage());
client.Disconnect(true);
}

}
catch (Exception ex)
{
int i = 1;  // throws MailKit.Security.AuthenticationException here
}

public class EmailMessage
{
public string To { get; set; }
public string From { get; set; }
public string Subject { get; set; }
public string MessageText { get; set; }
public MimeMessage GetMessage()
{
var body = MessageText;
var message = new MimeMessage();
message.From.Add(new MailboxAddress("test", From));
message.To.Add(new MailboxAddress("test", To));
message.Subject = Subject;
message.Body = new TextPart("plain") { Text = body };
return message;
}
}

完整的错误信息如下:

MailKit.Security。AuthenticationException: 535: 5.7.8不接受用户名和密码。欲知详情,请浏览5.7.8 https://support.google.com/mail/?p=BadCredentials da26-20020a056402177a00b004315050d7dfsm6610655edb81 - GSMTP在MailKit.Net.Smtp.SmtpClient。AuthenticateAsync(SaslMechanism机制,Boolean doAsync, CancellationToken CancellationToken)在程序。$(String[] args) in C:YouTubedevGmailCodeSMTPTestingSmtpTestSmtpTestXoauth2Program.cs:line 38

看来在纠结了一段时间之后。

标准电子邮件范围不正确。smtp服务器的XOauth2有两个仅用于它的作用域

  • https://mail.google.com/
  • https://www.googleapis.com/auth/gmail.imap_admin

最后一个显然只适用于工作区。

<标题>修复h1>
var scopes = new[] { "email" };

var scopes = new[] { "https://mail.google.com/" };

更多信息可以在这里找到Oauth2范围

最新更新