JavaMail 连接到 Office 365 XOAUTH2 进行 IMAP 身份验证失败

2024-04-27

使用 OAuth2.0 在线 Office365 面临连接问题 我已经设置了应用程序权限以及 IMAP 和 SMTP 连接。基本身份验证似乎工作正常。我相信 IMAP 已启用。我的应用程序配置为任何组织目录(任何 Azure AD 目录 - 多租户)中的帐户,并使用授予类型授权代码。

和委派的 Microsoft Graph 范围https://graph.microsoft.com/IMAP.AccessAsUser.All https://graph.microsoft.com/IMAP.AccessAsUser.All已添加:添加了客户端范围 https://i.stack.imgur.com/tcwr2.png

请求的授权码为访问令牌请求https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token https://login.microsoftonline.com/%7Btenant%7D/oauth2/v2.0/token请求的访问令牌,资源为“https://graph.microsoft.com”

请求访问令牌图像 https://i.stack.imgur.com/Vbyky.png

已成功接收范围为 IMAP.AccessAsUser.All SMTP.Send 的访问令牌

{
    "token_type": "Bearer",
    "scope": "IMAP.AccessAsUser.All SMTP.Send",
    "expires_in": 3599,
    "ext_expires_in": 3599,
    "access_token": "access_token",
    "refresh_token": "refresh_token",
    "id_token": "id_token"
} 

这是Java代码(使用JavaMail jar 1.6.2)

Properties properties= new Properties();
properties.put("mail.imap.ssl.enable", "true");
properties.put("mail.imap.auth.mechanisms", "XOAUTH2");
//properties.put("mail.imap.sasl.enable", "true"); un-commented still results are same
properties.put("mail.imap.auth.login.disable", "true");
properties.put("mail.imap.auth.plain.disable", "true");
properties.put("mail.debug", "true");
properties.put("mail.debug.auth", "true");

Session session = Session.getInstance(props);
session.setDebug(true);

String userEmail = "[email protected] /cdn-cgi/l/email-protection";
String accessToken = "accessToken";

final Store store = session.getStore("imap");
store.connect("outlook.office365.com","993",userEmail, accessToken);

以下输出:

DEBUG: JavaMail version 1.6.2
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle]
DEBUG IMAP: mail.imap.appendbuffersize: -1
DEBUG IMAP: mail.imap.minidletime: 10
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. [TQBB]
A0 CAPABILITY
* CAPABILITY IMAP4 IMAP4rev1 AUTH=PLAIN AUTH=XOAUTH2 SASL-IR UIDPLUS 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, us[email protected] /cdn-cgi/l/email-protection, 
password=<non-null>
A1 AUTHENTICATE XOAUTH2 dXNlAQE=
A1 NO AUTHENTICATE failed.
Could not connect to the message store
javax.mail.AuthenticationFailedException: AUTHENTICATE failed.
at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:731)
at javax.mail.Service.connect(Service.java:366)
at myproject.EmailReceiver.downloadEmails(EmailReceiver.java:79)
at myproject.EmailReceiver.main(EmailReceiver.java:179)

关注其他帖子无法找到范围https://outlook.office365.com/IMAP.AccessAsUser.All https://outlook.office365.com/IMAP.AccessAsUser.All https://outlook.office365.com/SMTP.Send https://outlook.office365.com/SMTP.Send在我的蔚蓝中。可能它们是遗留范围。

除了“https://graph.microsoft.com/IMAP.AccessAsUser.All”和“https://graph.microsoft.com/SMTP.send”之外,是否还需要通过 IMAP 连接到 Exchange 联机。或者现有代码的任何问题。

我使用范围 Offline_access%20https%3A%2F%2Foutlook.office365.com%2FIMAP.AccessAsUser.All%20https%3A%2F%2Foutlook.office365.com%2FSMTP.Send 已解决问题 它提供访问邮件的权限,还提供刷新令牌以重新生成访问令牌。

笔记 : 将范围更改为offline_accesshttps://outlook.office365.com/IMAP.AccessAsUser.All https://outlook.office365.com/IMAP.AccessAsUser.All https://outlook.office365.com/SMTP.Send https://outlook.office365.com/SMTP.Send解决了问题。


我认为您的问题与访问令牌范围有关。我正在开发一个类似的应用程序,但我正在使用范围https://outlook.office365.com/IMAP.AccessAsUser.All https://outlook.office365.com/IMAP.AccessAsUser.All https://outlook.office365.com/SMTP.Send https://outlook.office365.com/SMTP.Send获取访问令牌,如果我尝试使用 SMTP.Send 和 IMAP.AccessAsUser All,它似乎不起作用。

我的访问令牌如下所示: {“token_type”:“承载者”, “范围”:“https://outlook.office365.com/IMAP.AccessAsUser.Allhttps://outlook.office365.com/SMTP.Send” https://outlook.office365.com/SMTP.Send%22, “过期时间”:3599, “ext_expires_in”:3599, “access_token”:“eyJ0eXAiOi...”}

In the azure app config, I just have the Microsoft Graph permissions for IMAP and SMTP. enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaMail 连接到 Office 365 XOAUTH2 进行 IMAP 身份验证失败 的相关文章

随机推荐

  • 有没有办法在 JetBrains“运行配置”中仅运行“外部工具”

    JetBrains IDE 中的所有 或几乎所有 运行配置 都提供了一个选项来运行 外部工具 作为其执行的一部分 有没有办法only在运行配置中运行外部工具 不知道为什么你需要它 我可以建议尝试 Bash 支持插件 http plugins
  • 创建 .conll 文件作为斯坦福解析器的输出

    我想使用斯坦福解析器创建一个 conll 文件以进行进一步处理 到目前为止 我设法使用以下命令解析测试句子 stanford parser full 2013 06 20 lexparser sh stanford parser full
  • 是否可以附加到 DynamoDB 中的多值属性?

    是否可以附加到 Amazon DynamoDB 表中多值属性的值列表 我不太能够使用 put 请求弄清楚它 如果可能的话 我想避免读取 更新 写入逻辑 假设您指的是字符串和数字集如中所述Amazon DynamoDB 数据类型 https
  • Flask 模板中点表示法和方括号之间的区别

    在 Flask Web 框架中使用方括号或点符号有什么区别 两者似乎都有效 例如 在Python脚本中我可以设置session username Geraint 然后我可以使用模板访问它 session username or sessio
  • 具有替代方案的重载方法值表

    我有编译器抱怨的以下代码 val state KTable String String builder table BARY PATH Materialized as PATH STORE 错误信息 error home developer
  • LINQ 表达式的运行时创建

    假设我有这样的表达 int setsize 20 Expression
  • Facebook Marketing API 获取每个日期的营销活动

    我创建了一个应用程序 请求 Facebook 的营销 API 返回我的所有广告帐户 并从我的所有广告帐户返回我的所有广告活动 并从我的所有活动中获取特定日期 或日期范围 的见解 现在 因为我的活动太多 我无法对帐户中的每个活动提出请求 即使
  • 在同一域上的 MVC.net 和 Web API 站点之间共享表单身份验证登录的方法

    我将在同一域上运行一个 ASP net MVC 网站 example com 和一个 Web API 网站 api example com 使用表单身份验证允许用户登录 MVC 站点并让该登录被接受的最佳和最安全的方法是什么 Authori
  • 如何在 Android 的这个特定用例中实现 MQTT?

    我的用例 登录到我的应用程序的用户应该能够向在另一台 Android 设备上登录到该应用程序的自己发送消息 如果用户拥有多个设备 那么一旦他打开该消息 其他设备上的通知必然会消失 Doubts 如何跨设备向特定用户发送数据 我了解如何使用
  • 使用 xlib 将图像加载到窗口上

    我已经创建了窗口类 我想插入图像作为该窗口的背景 文件格式必须为 png 我使用magick 的XImage来加载图像 但不知道如何将其作为我的窗口的背景 知道怎么做吗 使用创建像素图 Pixmap XCreatePixmap displa
  • Django 类视图:__init__

    我想要得到
  • IBM WebSphere MQ 2042 错误

    我有以下代码 int openOptions MQC MQOO INQUIRE MQC MQOO FAIL IF QUIESCING MQC MQOO INPUT SHARED 执行时 我收到错误 com ibm mq MQExceptio
  • java.lang.NoClassDefFoundError: org/apache/ws/commons/schema/resolver/URIResolver

    我正在尝试创建一个简单的 Hello Web 服务 但收到以下错误 type Exception report message Servlet init for servlet AxisServlet threw exception des
  • Spring 3、Jersey (JSR-311) 和 Maven 依赖项

    我目前正在努力集成基于 Jersey 和 Spring 的 REST 服务 我正在使用 Spring 3 0 2 RELEASE 和 jersey spring 1 2 但是 jersey spring 在我的项目中添加了对 Spring
  • Ruby 中的参数化 get 请求?

    如何创建 HTTPGETRuby 中带参数的请求 这很容易做到 当你POSTing require net http require uri HTTP post form URI parse http www example com sea
  • 使用 Struts 2.2.x 的简单 JSON 示例?

    我在获取 JSON 结果时遇到问题支柱2 2 1 1 http struts apache org 2 2 1 1 index html 有没有人有一个简单的工作示例 可以使用以下命令将 JSON 结果返回到 JSP支柱2 2 1 1并准备
  • 如何重构“字符串类型”代码?

    我目前正在开发一个代码库 其中有几类变量 例如数据库路径 它们简单地表示为字符串 这些 非 类型的大多数操作都在实用程序类中定义 我创建了一个新类来表示数据库 并将操作定义为实例方法 采用传统的 OOP 风格 然而 浏览大型代码库并重构它以
  • ASP.NET MVC4 和 Web API 身份验证 + 授权(Windows 8 和 Web)

    我使用 Simple Membership db 创建了一个 ASP NET MVC 4 Internet Web 应用程序来存储用户 角色和配置文件 在我的应用程序中 我创建了一个 Web API 控制器 它将响应http 127 0 0
  • 并行迭代器

    我正在设计一个 C 数据结构 用于图形 供并行代码 使用 OpenMP 使用 假设我想要一个能够迭代所有元素 节点 的方法 当然 这个迭代将是并行的 是否可以使用迭代器来实现此目的 迭代器应该是什么样子才能实现并行访问 在这种情况下 您会建
  • JavaMail 连接到 Office 365 XOAUTH2 进行 IMAP 身份验证失败

    使用 OAuth2 0 在线 Office365 面临连接问题 我已经设置了应用程序权限以及 IMAP 和 SMTP 连接 基本身份验证似乎工作正常 我相信 IMAP 已启用 我的应用程序配置为任何组织目录 任何 Azure AD 目录 多