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

无法使用OAuth 2通过Jakarta Mail连接到Office 365 SMTP Server

颛孙庆
2023-03-14
  1. 创建Office 365开发者帐户,填充用户和用户数据
https://login.microsoftonline.com/{my_tenant_id}/oauth2/v2.0/authorize?
client_id={my_client_id}&
state=state_to_check&
redirect_uri=http://localhost:5555/callback/authorization&
scope=offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send
&response_type=code

如你所见,我使用的范围如下:

offline_access 
https://outlook.office.com/IMAP.AccessAsUser.All 
https://outlook.office.com/POP.AccessAsUser.All 
https://outlook.office.com/SMTP.Send
{
    "token_type": "Bearer",
    "scope": "https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/Mail.Read https://outlook.office.com/Mail.Read.All https://outlook.office.com/Mail.Read.Shared https://outlook.office.com/Mail.ReadBasic https://outlook.office.com/Mail.ReadWrite https://outlook.office.com/Mail.Send https://outlook.office.com/Mail.Send.All https://outlook.office.com/Mail.Send.Shared https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send https://outlook.office.com/User.Read",
    "expires_in": 3599,
    "ext_expires_in": 3599,
    "access_token": ...,
    "refresh_token": ...
}

所以我想说,到目前为止,在OAuth 2.0身份验证过程中,一切都如预期的那样工作。现在,继续使用访问令牌访问用户的电子邮件帐户,我在应用程序的电子邮件逻辑中添加了以下几行代码,以便通过OAuth启用IMAP:

[more props stuff here]

if (useOauth) {
    props.put("mail." + protocol + ".auth", "true");
    props.put("mail." + protocol + ".auth.mechanisms", "XOAUTH2");
    props.put("mail." + protocol + ".auth.login.disable", "true");
    props.put("mail." + protocol + ".auth.plain.disable", "true");
}

return Session.getInstance(props);

这工作非常好,我可以通过IMAP连接,读取文件夹、邮件等。我的问题是,如果我尝试以类似的方式修改SMTP代码,我会出现以下错误:

Exception in thread "main" jakarta.mail.AuthenticationFailedException: 451 4.7.0 Temporary server error. Please try again later. PRX4  [AM9P191CA0011.EURP191.PROD.OUTLOOK.COM]

    at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:947)
    at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:858)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:762)
    at jakarta.mail.Service.connect(Service.java:342)
    at jakarta.mail.Service.connect(Service.java:222)
    at jakarta.mail.Service.connect(Service.java:243)
    at Application.main(Application.java:52)

我看了一下我在github(https://github.com/eino-makitalo/vesa-mailtest/tree/master/src/main)上找到的下面的示例应用程序和stackoverflow上的几个答案,看看我是否错过了专门为SMTP设置的任何属性,但我一直遇到同样的错误,使用以下配置:

        Properties props = new Properties();
        props.put("mail.smtp.auth.xoauth2.disable", "false");
        props.put("mail.smtp.auth.mechanisms", "XOAUTH2");
        props.put("mail.smtp.starttls.enable", "true");

        props.put("mail.smtp.host","smtp.office365.com");
        props.put("mail.smtp.port", "587");
        props.put("mail.transport.protocol","smtp");

        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.auth.login.disable","true");
        props.put("mail.smtp.auth.plain.disable","true");

        props.put("mail.debug.auth", "true");

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

        Transport transport = session.getTransport("smtp");
        transport.connect( username, token);

现在我希望,也许有人以前遇到过这个问题,可以帮我解决。我能找到的关于上述异常postet的唯一问题都与自定义exchange服务器设置有关,以及您应该如何在这些服务器上配置DNS设置。但我认为这与我无关,因为我没有尝试连接到自定义exchange服务器。

更新:所以我用谷歌服务尝试了相同的配置,它对IMAP和SMTP都有效,所以微软服务肯定有问题。但我仍然不确定我还能做些什么来让它发挥作用。

共有1个答案

和魁
2023-03-14

好的,我发现了问题:出于某种原因,我没有尝试显式地请求openId范围。不知道为什么,但出于某种原因,我在脑子里想,如果您不明确指定,它将自动被请求。明确请求openId后,SMTP和IMAP都可以工作。

 类似资料:
  • 问题内容: 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以通过使用本地计算机上的curl来访问Kibana和Elastic search 我得到以下回应 var hashRoute =’/ app / kibana’; var defaultRoute =’/ app / kibana’; var hash = window.location.hash;

  • 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以使用 我得到以下回应 var hashRoute='/app/kibana'; var defaultRoute='/app/kibana'; var hash=window.location.hash; if(hash.length){window.location=hashRoute hash;}其他{wi

  • 问题内容: 我最近安装了Elasticsearch,并且在开始的几天里一切正常,但是今天以某种方式停止了工作 当我启动该服务时,它声称很好… 但后来我明白了 查看elasticsearch日志: 看起来有关于Java VM的警告;那可能是问题吗?我还应该尝试/看看什么? 问题答案: 1) 使用linux中的命令 检查端口9200的状态 。 就我而言,以下是启动时的结果。 对我不是服务,否则找到正在

  • 这几天来,我无法在本地运行mac os ML的机器上连接到我的postgreSQL数据库。 我机器的nmap显示postgres在5432上运行,我可以通过pgadmin和psql进行本地连接。 收听地址设置为* 当我尝试连接JDBC时,我会遇到以下异常 组织。postgresql。util。PSQLException:连接被拒绝。检查主机名和端口是否正确,邮政局长是否接受TCP/IP连接。

  • 出于测试目的,我尝试使用Spring-Integration连接到SFTP,并成功地使用了下面提到的相同的代理实现(JumpHostProxyCommand)。 下面是我一直使用的Spring boot+Apache Camel代码: Jsch代理: build.gradle文件: 我已经挣扎了两天来找出错误的根本原因,任何关于这个问题的帮助都是非常感谢的。谢了!

  • 问题内容: 我在通过Ruby-Watir Webdriver连接到Tor时遇到问题。 我使用Tor浏览器套件。问题是,当我尝试通过Watir(Selenium)连接时,似乎无法打开Tor而不是常规的Firefox。 在研究类似问题时,我尝试了以下方法: 当我使用上述代码时,我仍然会打开普通的firefox浏览器,并且无法连接到洋葱站点。 有什么想法吗?是否需要将Tor浏览器连接到我的webdriv

  • 我正在尝试将sonarqube(版本5.1.2)与intellij(2016.2)集成。我已经添加了sonarLint插件。当我试图将一个sonar服务器添加到sonarLint设置中时,它会询问sonar服务器的用户名和密码以及其他细节,如URL。但它无法连接到声纳服务器,并出现错误:请求失败:https://example.com/api/system/status