我们正在构建一个解决方案,通过 IMAP 连接到电子邮件邮箱,获取并存储一些相关电子邮件,以便稍后我们可以在 Web UI 中显示它们。稍后我们计划添加对直接从 Web UI 回复相关电子邮件的支持。
我们已经实现了 OAuth2,用于使用授权代码流通过 OAuth2 身份平台验证与 Outlook 邮箱的 IMAP 连接。它在 2024 年 1 月/2 月使用个人 Outlook 邮箱(来自 outlook.live.com 的邮箱)进行初始测试时可以正常工作,但现在不再工作了。我们还需要它与企业 Outlook 邮箱配合使用,但我们没有测试它是否能在 2024 年 1 月/2 月恢复正常工作。
现在,尝试验证 IMAP 连接到 Outlook 邮箱(甚至是个人邮箱)时会失败。授权代码流程本身工作正常,我们能够毫无问题地获取访问令牌,但这些访问令牌无法按预期工作。
我们收到的错误:
DEBUG IMAP: AUTHENTICATE XOAUTH2 command result: A1 NO AUTHENTICATE failed.
有关我们解决方案的一些技术细节:
在 OAuth2 授权代码流程中,我们请求
IMAP.AccessAsUser.All
、SMTP.Send
、User.Read
、offline_access
范围(没有任何前缀),并使用 https://login.microsoftonline.com/common/oauth2/v2.0/authorize
作为授权端点。
如果我们尝试将范围更改为
https://outlook.office.com/IMAP.AccessAsUser.All
、SMTP.Send
、User.Read
、offline_access
(根据文档此处),则在授权代码流期间预计会失败并出现 invalid_scope
错误。
我们已从此处阅读文档https://learn.microsoft.com/en-us/exchange/client-developer/legacy-protocols/how-to-authenticate-an-imap-pop-smtp-application-by- using-oauth,但它要求使用我们无法再为我们的应用程序配置的已弃用范围(它们不在列表中),文档的后面部分讨论了使用客户端凭据授予流程,这不是我们需要的(我们想代表用户访问邮箱)。
我们希望获得如何使其发挥作用的帮助。预先感谢!
您需要为每个资源使用单独的访问令牌:一个令牌用于 Microsoft Graph(对于
User.Read
),另一个令牌用于 IMAP(对于 IMAP.AccessAsUser.All
)。
Microsoft Graph 权限:User.Read
IMAP 权限:
IMAP.AccessAsUser.All
如果混合使用它们(使用 IMAP 权限的完整 URL),您将遇到
invalid_scope
错误。
仅使用权限而不指定资源(仅使用
IMAP.AccessAsUser.All
)会导致 IMAP 令牌无效(尽管我认为它可以通过 Microsoft Graph 获取用户数据)。