无法使用oauth 2通过雅加达邮件连接到office 365 smtp服务器

cgh8pdjw  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(345)

我目前正在尝试将oauth2集成到java应用程序的现有电子邮件基础结构中。该应用程序使用jakarta mail,根据他们的文档,jakarta mail支持oauth2(https://eclipse-ee4j.github.io/mail/oauth2). 出于某种原因,我正在努力连接到office 365 smtp服务器,而通过imap连接工作得非常好。到目前为止,我一直在做的是:
创建office 365开发人员帐户,填充用户和用户数据。
登录azure后端,配置应用程序注册,包括回调url等以及以下api权限:https://i.stack.imgur.com/lxjer.png
使用以下身份验证url创建身份验证代码:

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": ...
}

所以我想说,到目前为止,在OAuth2.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);

现在我希望,也许有人以前碰到过这个问题,可以帮我解决。我能找到的关于上述异常poset的唯一问题都与自定义exchange服务器设置有关,以及您应该如何在这些服务器上配置dns设置。但我认为这与我无关,因为我没有尝试连接到自定义exchange服务器。
更新:所以我在google服务中尝试了相同的配置,它同时适用于imap和smtp,所以微软的服务肯定有问题。但我仍然不确定我还能做些什么来让它发挥作用。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题