无法使用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
  • 检索授权代码并使用它获取刷新和访问令牌,这将获得以下响应:
  • 所以我想说,到目前为止,在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()上找到的以下示例应用程序,以及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);