【发布时间】:2020-09-17 20:45:35
【问题描述】:
我正在使用 MailKit 2.6.0.0 连接到 Microsoft 365,并使用 OAuth 通过 POP3、IMAP 和 SMTP 进行身份验证。 ImapClient 和 Pop3Client 身份验证成功,但 SmtpClient 没有。这是来自 MailKit 的协议日志:
Connected to smtp://smtp.office365.com:587/?starttls=always
S: 220 MN2PR04CA0011.outlook.office365.com Microsoft ESMTP MAIL Service ready at Sat, 30 May 2020 07:48:32 +0000
C: EHLO [192.168.1.240]
S: 250-MN2PR04CA0011.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.1.240]
S: 250-MN2PR04CA0011.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 BASE64USERANDTOKEN
S: 535 5.7.3 Authentication unsuccessful [MN2PR04CA0011.namprd04.prod.outlook.com]
C: QUIT
S: 221 2.0.0 Service closing transmission channel
我已经破解了 BASE64USERANDTOKEN 值,它看起来与成功的 POP3/IMAP 连接中提供的完全一样。不知道SMTP认证不成功是微软365配置错误,还是协议对话有问题。我正在使用作为 MSDN 订阅权益而提供的 Microsoft 365 开发人员订阅。我找不到任何特定于 SMTP 的配置设置,并且在交换访问令牌的授权代码时使用了正确的范围 (https://outlook.office365.com/SMTP.Send}。我在 Microsoft 365 中也找不到任何有帮助的错误日志条目诊断问题。
关于协议对话,我注意到微软在https://docs.microsoft.com/en-gb/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by-using-oauth的描述
[connection begins]
C: auth xoauth2
S: 334
C: dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
S: 235 2.7.0 Authentication successful
[connection continues...]
不同于 Google 的 https://developers.google.com/gmail/imap/xoauth2-protocol,它类似于 MailKit 协议日志:
[connection begins]
S: 220 mx.google.com ESMTP 12sm2095603fks.9
C: EHLO sender.example.com
S: 250-mx.google.com at your service, [172.31.135.47]
S: 250-SIZE 35651584
S: 250-8BITMIME
S: 250-AUTH LOGIN PLAIN XOAUTH XOAUTH2
S: 250-ENHANCEDSTATUSCODES
S: 250 PIPELINING
C: AUTH XOAUTH2 dXNlcj1zb21ldXNlckBleGFtcGxlLmNvbQFhdXRoPUJlYXJlciB5YTI5LnZGOWRmdDRxbVRjMk52YjNSbGNrQmhkSFJoZG1semRHRXVZMjl0Q2cBAQ==
S: 235 2.7.0 Accepted
[connection continues...]
这可能是身份验证失败的原因吗?
【问题讨论】:
-
我知道这是stackoverflow.com/questions/62027014/… 的副本,但我无法将我的发现添加为对该帖子的评论。显然我的声誉还不够高。
-
可能问题在于 MailKit 在 1 行上发送它,但 XOAUTH2 机制应该允许这样做(它被称为 SASL-IR - IR 代表初始响应)。无论哪种方式都应该没问题,但是您可以继承
SaslMechanismOAuth2并覆盖SupportsInitialResponse属性以使其返回false。这应该足以检验理论。 -
感谢@jstedfast 的帮助,但我的理论被推翻了。我按照建议修改了调用代码,但身份验证仍然不成功。这是协议日志的结尾: C: AUTH XOAUTH2 S: 334 C: BASE64USERANDTOKEN S: 535 5.7.3 身份验证不成功 [MN2PR15CA0014.namprd15.prod.outlook.com] C: QUIT S: 221 2.0.0 服务关闭传输通道我会更加努力地找到指向失败原因的 Microsoft 365 日志条目(肯定不成功的登录尝试是某种安全审计跟踪的一部分)。
标签: office365 mailkit smtp-auth