无法使用OAuth 2通过雅加达邮件连接到Office 365 SMTP服务器 我目前正在尝试将OAuth2集成到java应用程序的现有电子邮件基础结构中。该应用程序使用的是雅加达邮件,根据他们的文档,雅加达邮件支持OAuth2(https://eclipse-ee4j.github.io/mail/OAuth2). 出于某种原因,我正在努力连接到Office 365 SMTP服务器,而通过IMAP连接工作得非常好。以下是我到目前为止一直在做的事情: 创建Office 365开发人员帐户,填充用户和用户数据 登录azure后端,配置应用程序注册,包括回调url等,以及以下api权限: 使用以下身份验证url创建身份验证代码:
如您所见,我正在使用以下作用域:无法使用OAuth 2通过雅加达邮件连接到Office 365 SMTP服务器 我目前正在尝试将OAuth2集成到java应用程序的现有电子邮件基础结构中。该应用程序使用的是雅加达邮件,根据他们的文档,雅加达邮件支持OAuth2(https://eclipse-ee4j.github.io/mail/OAuth2). 出于某种原因,我正在努力连接到Office 365 SMTP服务器,而通过IMAP连接工作得非常好。以下是我到目前为止一直在做的事情: 创建Office 365开发人员帐户,填充用户和用户数据 登录azure后端,配置应用程序注册,包括回调url等,以及以下api权限: 使用以下身份验证url创建身份验证代码:,java,oauth-2.0,smtp,office365,jakarta-mail,Java,Oauth 2.0,Smtp,Office365,Jakarta Mail,如您所见,我正在使用以下作用域: offline_access https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/POP.AccessAsUser.All https://outlook.office.com/SMTP.Send 检索授权代码并使用它获取刷新和访问令牌,这将获得以下响应: 所以我想说,到目前为止,在OAuth2.0身份验证过程中,一切都按照预期进行。现在,继续使用访问令牌
offline_access
https://outlook.office.com/IMAP.AccessAsUser.All
https://outlook.office.com/POP.AccessAsUser.All
https://outlook.office.com/SMTP.Send
[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()上找到的以下示例应用程序,以及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都有效,所以微软的服务肯定有问题。但是我仍然不确定我还能做些什么来让它工作。好的,我发现了问题:出于某种原因,我没有考虑尝试显式地请求openId范围。不知道为什么,但出于某种原因,我在脑子里想,如果您不明确指定,它将自动被请求。明确请求openId后,SMTP和IMAP都可以工作。Hi,有一个问题:您的java应用程序后端是唯一的,还是在登录以使用IMAP检索邮件时有任何真实的用户交互?我正在处理这样一个应用程序,需要使用IMAP从microsoft服务器获取邮件,使用雅加达邮件,完全是后端,无需任何用户交互。对于任何配置,我都不想使用Graph进行交互。
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)
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);