我目前正在尝试将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,所以微软的服务肯定有问题。但我仍然不确定我还能做些什么来让它发挥作用。
暂无答案!
目前还没有任何答案,快来回答吧!