Outlook SMTP Oauth Send - 身份验证不成功



我一直在尝试使用旧版邮件 API 在旧版应用程序中实现电子邮件功能,以便在从Microsoft示例项目开始通过设备代码流获取令牌后添加 OAuth 支持。

沿着这条路线,我添加了SMTP.Send和许多其他 API 权限来查找缺失的部分。(包括害怕错过一个的{ "User.Read", "User.ReadBasic.All", "SMTP.Send", "offline_access", "Mail.Send" }(

我一直在使用 MailKit 库进行测试以构建概念验证。

到目前为止,我有以下代码片段在尝试进行身份验证后失败。

public void SendSmtpMessageAsync(string id, string accessToken)
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("From Name", "From Address@Example.com"));
message.To.Add(new MailboxAddress("To Name", "To Address@Example.com"));
message.Subject = "How you doin'?";
message.Body = new TextPart("plain")
{
Text = @"Test Email Content"
};
using (var client = new SmtpClient(new ProtocolLogger(Console.OpenStandardOutput())))
{
try
{
client.Connect("smtp.office365.com", 587, SecureSocketOptions.StartTls);
var oauth2 = new SaslMechanismOAuth2(id, accessToken);
var temp = client.AuthenticationMechanisms;
client.Authenticate(oauth2);
client.Send(message);
client.Disconnect(true);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}

邮件套件日志

我启用了日志记录并获得了一个日志,该日志显示客户端连接而不是发送令牌进行身份验证,但身份验证失败。

Connected to smtp://smtp.office365.com:587/?starttls=always
S: 220 MW3PR05CA0003.outlook.office365.com Microsoft ESMTP MAIL Service ready at Mon, 25 May 2020 21:31:07 +0000
C: EHLO [192.168.0.7]
S: 250-MW3PR05CA0003.outlook.office365.com Hello [<<My IP>>]
S: 250-SIZE 157286400
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-STARTTLS
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250 SMTPUTF8
C: STARTTLS
S: 220 2.0.0 SMTP server ready
C: EHLO [192.168.0.7]
S: 250-MW3PR05CA0003.outlook.office365.com Hello [<<My IP>>]
S: 250-SIZE 157286400
S: 250-PIPELINING
S: 250-DSN
S: 250-ENHANCEDSTATUSCODES
S: 250-AUTH LOGIN XOAUTH2
S: 250-8BITMIME
S: 250-BINARYMIME
S: 250-CHUNKING
S: 250 SMTPUTF8
C: AUTH XOAUTH2 <<Token omitted but I have confirmed that it is Base64 encoded and 
in the format of base64("user=" + userName + "^Aauth=Bearer " + accessToken + "^A^A")>>
S: 535 5.7.3 Authentication unsuccessful [MW3PR05CA0003.namprd05.prod.outlook.com]
MailKit.Security.AuthenticationException: 535: 5.7.3 Authentication unsuccessful 
[MW3PR05CA0003.namprd05.prod.outlook.com]

任何方向或资源将不胜感激,因为大多数现有帖子都是在 2020 年之前添加旧版 SMTP 支持时发布的。此外,如果您发现任何误解,请告诉我,以便我可以进行一些额外的阅读。

经过大量搜索并试图与Microsoft交谈,我被指向了另一个帖子的答案的方向。 (我添加了一个 POP3 调用,该调用的格式与 OP 中的 SMTP 调用相同。答案说包括范围https://outlook.office.com/POP.AccessAsUser.All所以在替换我在SMTP和POP3调用使用现代身份验证工作之前POP.AccessAsUser.All之后。


此外,现在我知道答案,我看到它记录在Microsoft文档中 使用 OAuth 验证 IMAP、POP 或 SMTP 连接,验证这是正确的解决方案。

请确保在授权应用程序和请求访问令牌时指定完整范围,包括 Outlook 资源 URL。

| Protocol  | Permission scope string
|-----------|-------------------------------------
| IMAP      | https://outlook.office.com/IMAP.AccessAsUser.All
| POP       | https://outlook.office.com/POP.AccessAsUser.All
| SMTP AUTH | https://outlook.office.com/SMTP.Send

希望这对面临相同问题的其他任何人有所帮助

在花费数小时和数天试图解决Authentication unsuccessful错误之后,我发现了一件重要的事情:

在 oAuth2 流期间请求"范围"时,请确保除了offline_accesshttps://outlook.office.com/SMTP.Send之外,不要请求任何范围

就我而言,问题是 - 我也要求User.Read范围

我遇到了类似的问题,这是由于我对 Microsoft 365 的错误配置引起的。 有关详细信息,请参阅邮件套件未成功 SMTP OAuth 与 Microsoft 365 服务器。 希望这有帮助。

最新更新