由于最近删除了不太安全的应用程序,并且不想沿着应用程序密码的路线走。我一直试图在smtp服务器上启用Xoauth2,作为我的用户更安全、可持续的授权方法。
我创建了一个简单的控制台应用程序来测试这一点。
授权似乎有效,我将获得一个访问令牌。问题是smtp服务器将不接受它,也可能是我如何应用它。
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util.Store;
using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
var path = @"C:\YouTube\dev\credentials.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 da26-20020a056402177a00b004315050d7dfsm6610655edb.81 - gsmtp at MailKit.Net.Smtp.SmtpClient.AuthenticateAsync(SaslMechanism MailKit.Net.Smtp.SmtpClient.AuthenticateAsync(SaslMechanism,Boolean,CancellationToken cancellationToken at Program.$(String[] args) in C:\YouTube\dev\Gmail\Code\SMTPTesting\SmtpTest\SmtpTestXoauth2\Program.cs:line 38
发布于 2022-06-14 08:57:18
在与此斗争了一段时间后,它就接合了。
标准的电子邮件范围不正确。带有smtp服务器的XOauth2只有两个作用域。
最后一个显然只适用于工作区。
修复
我唯一需要在代码中修改的是
var scopes = new[] { "email" };
至
var scopes = new[] { "https://mail.google.com/" };
更多信息可以在这里找到Oauth2范围。
https://stackoverflow.com/questions/72614113
复制相似问题