当前位置: 首页 > 知识库问答 >
问题:

访问outlook。使用javamail和OAUTH2从独立应用程序下载office365.com

轩辕修能
2023-03-14

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

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

电子邮件IMAP。访问服务器。所有offline\u访问SMTP。邮寄

因此,我从以下位置检索访问令牌:https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token使用client\u凭据授予类型传递客户端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的大多数帖子都是从web应用程序而不是独立的。

提前谢谢Craig

共有1个答案

江烨伟
2023-03-14

不要使用client\u凭据授予类型来获取访问令牌。由于client\u凭据流通常在没有用户参与的守护程序中使用,因此它通常需要向应用程序授予应用程序权限,而不是委派权限。据我所知:不支持通过OAuth2客户端凭据授予流对IMAP、POP、SMTP身份验证协议进行OAuth访问。

因此,我建议您使用身份验证码流,这要求您在浏览器中获取授权码,然后使用授权码兑换访问令牌。

 类似资料:
  • 你能告诉我Office365 REST API和EWS Java API之间的区别吗? 我为REST API搜索Java库,但没有可用的库。 两个月前,我在ews java api中提出了一个问题,但仍然没有得到他们的任何回应。 您能否建议任何可靠的解决方案来使用office365 API从Java应用程序。 使用我们需要注册我们的应用程序与Azure,我们可以重新Giter是免费的还是付费的。如

  • 现在假设我们想要使用 Spark API 写一个独立的应用程序。我们将通过使用 Scala(用 SBT),Java(用 Maven) 和 Python 写一个简单的应用程序来学习。 我们用 Scala 创建一个非常简单的 Spark 应用程序。如此简单,事实上它的名字叫 SimpleApp.scala: /* SimpleApp.scala */ import org.apache.spark.S

  • 我正在使用Eclipse和Jboss开发EJB2.0项目。下面是代码示例: 09:33:50,273 INFO[org.jboss.as.ejb3.deployment.processors.ejbJNDIBindingsDeploymentUnitProcessor](MSC service thread 1-3)部署单元部署“ejbProject1.jar”中名为AdviceBean的会话be

  • 我试图通过JSE独立应用程序访问EJB。 在查找过程中找不到JNDI名称,这让我很苦恼。 经过一些研究,没有任何解决方案,我在Glassfish服务器日志中发现了一条部署后的消息,声明如下: “[glassfish 4.1][INFO][AS-EJB-00054][javax.enterprise.EJB.container][tid:_ThreadID=47 _ThreadName=admin

  • 问题内容: 我正在寻找在 独立的(桌面/秋千)* 应用程序中使用 Spring的 示例或教程,我进行了很多搜索,但找不到有用的东西,所有示例和教程均适用于Web应用程序,请告知。 * 问题答案: 使用maven创建独立应用程序,如下所示: 使用Maven创建独立的应用程序 将applicationContext放在类路径中,并按如下所示将其加载到主类中: 在此处查看全文: http://www.d

  • 问题内容: 我正在考虑开发由两部分组成的桌面应用程序: 用户界面(例如Java应用) 后端Node.js服务器 2个部分通过插座连接。不要问为什么我知道这很奇怪。 我将希望能够为客户提供带有安装程序的应用程序。我不希望用户必须自己安装Node.js。 有没有一种方法可以独立安装Node.js服务器,即无需在系统上全局安装Node.js。 对于任何(Windows,Linux,Mac OS X …)