首页 > 解决方案 > 使用 javamail 和 OAUTH2 从独立应用程序访问 outlook.office365.com

问题描述

我们有一个独立的 Java 应用程序,它使用基本授权连接到 outlook.office365.com。这是一个简单的监控应用程序。

我被要求将其移至“现代”授权,因此这似乎是在创建一个 Azure 应用程序来获取 OAUTH2 的访问令牌。我“认为”我已经正确设置了所有设置,包括 Microsoft 图形 API(委托)

电子邮件 IMAP.AccessAsUser.All offline_access SMTP.Send

因此,我从以下位置检索访问令牌:https : //login.microsoftonline.com/{tenant}/oauth2/v2.0/token 使用 client_credentials 授权类型传递客户端 ID 和机密。

将 java 代码更改为使用 OAUTH2 并使用令牌作为密码后,我收到登录失败。

DEBUG: JavaMail version 1.5.4
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: setDebug: JavaMail version 1.5.4
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle]
DEBUG IMAP: mail.imap.fetchsize: 16384
DEBUG IMAP: mail.imap.ignorebodystructuresize: false
DEBUG IMAP: mail.imap.statuscachetimeout: 1000
DEBUG IMAP: mail.imap.appendbuffersize: -1
DEBUG IMAP: mail.imap.minidletime: 10
DEBUG IMAP: disable AUTH=LOGIN
DEBUG IMAP: disable AUTH=PLAIN
DEBUG IMAP: closeFoldersOnStoreFailure
DEBUG IMAP: trying to connect to host "outlook.office365.com", port 993, isSSL true
* OK The Microsoft Exchange IMAP4 service is ready. [QgBMAEEAUAB...]
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS MOVE ID UNSELECT CHILDREN IDLE NAMESPACE LITERAL+ 
A0 OK CAPABILITY completed.
DEBUG IMAP: AUTH: PLAIN
DEBUG IMAP: AUTH: XOAUTH2
DEBUG IMAP: protocolConnect login, host=outlook.office365.com, user=craig.welton@xyz.com, password=<non-null>
A1 LOGIN craig.welton@xyz.com {1508+}
eyJ0eXAiOiJKV1QiLCJub25.....
A1 NO LOGIN failed.

我在这里错过了一步吗?我读过的大多数关于访问 Outlook 的帖子都来自网络应用程序,而不是独立的。

在此先感谢,克雷格

标签: azureoutlookoauthjakarta-mail

解决方案


不要使用 client_credentials 授权类型来获取访问令牌。因为 client_credentials 流通常在没有用户参与的守护进程中使用,所以它通常需要授予application permissions应用程序而不是delegating permissions. 据我所知:不支持通过 OAuth2 客户端凭据授予流程对 IMAP、POP、SMTP AUTH 协议的 OAuth 访问。

因此,我推荐您使用auth code flow,这需要您在浏览器中获取授权码,然后使用授权码兑换访问令牌。


推荐阅读