【问题标题】:Accessing outlook.office365.com from standalone app using javamail and OAUTH2使用 javamail 和 OAUTH2 从独立应用程序访问 outlook.office365.com
【发布时间】:2022-03-16 11:06:05
【问题描述】:

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

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

电子邮件 IMAP.AccessAsUser.All 离线访问 SMTP.发送

所以我从 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 的帖子都来自网络应用程序,而不是独立的。

提前致谢, 克雷格

【问题讨论】:

    标签: azure outlook oauth jakarta-mail


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢卡尔。我们的进程本质上是一个守护进程,因为它每隔几分钟就会读取收件箱。没有浏览器交互。那么,你是说这不可能吗?有其他选择吗?
    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-24
    相关资源
    最近更新 更多