Outlook SMTP Oauth 发送 - 身份验证不成功

Outlook SMTP Oauth Send - Authentication Unsuccessful

我一直在尝试使用 Legacy Mail API to add OAuth support after getting a token through the Device Code Flow starting with the Microsoft Sample Project.

在旧版应用程序中实现电子邮件功能

沿着那条路线,我添加了 SMTP.Send 和许多其他 API 权限来找到丢失的部分。 (包括{ "User.Read", "User.ReadBasic.All", "SMTP.Send", "offline_access", "Mail.Send" }怕漏了一个)

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

到目前为止,我有以下代码片段,但在尝试验证后失败了。

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);
        }
    }
}


MailKit 日志

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

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 365配置错误造成的,详情请看MailKit unsuccessful SMTP OAuth with Microsoft 365 server。希望这有帮助。

经过大量搜索并尝试与 Microsoft 交谈后,我找到了另一个 post 的答案。 (我添加了一个与 OP 中的 SMTP 调用格式相同的 POP3 调用。)The answer 据说包含范围 https://outlook.office.com/POP.AccessAsUser.All 所以在替换 POP.AccessAsUser.All 之前我有SMTP 和 POP3 调用使用现代身份验证工作。


此外,既然我知道了答案,我在 Microsoft 的文档中看到了它 Authenticate an IMAP, POP or SMTP connection using OAuth 验证这是正确的解决方案。

Make sure to specify the full scopes, including Outlook resource URLs, when authorizing your application and requesting an access token.

| 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

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