Outlook Javax.mail 535 5.7.139 身份验证失败,请求不符合成功验证的条件

Outlook Javax.mail 535 5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully

提问人:Markus Moltke 提问时间:7/28/2023 最后编辑:Markus Moltke 更新时间:8/1/2023 访问量:586

问:

我正在尝试使用 . 下面提到的错误最近开始发生。我不确定是什么原因导致的,但我怀疑它可能与 Outlook 365 和 SMTP 设置有关。 但是,在尝试这样做时,我收到以下错误:jakarta.mail 2.0.1

2023-07-28T00:36:08.077359363Z javax.mail.AuthenticationFailedException: 535 5.7.139 Authentication unsuccessful, the request did not meet the criteria to be authenticated successfully. Contact your administrator. [xxxxx 2023-07-28T00:36:07.942Z xxxxx]
2023-07-28T00:36:08.077401363Z 
2023-07-28T00:36:08.077407063Z  at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:947)
2023-07-28T00:36:08.077411063Z  at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:858)
2023-07-28T00:36:08.077414563Z  at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:762)
2023-07-28T00:36:08.077417963Z  at javax.mail.Service.connect(Service.java:342)
2023-07-28T00:36:08.077427964Z  at javax.mail.Service.connect(Service.java:222)
2023-07-28T00:36:08.077431564Z  at javax.mail.Service.connect(Service.java:243)
2023-07-28T00:36:08.077434864Z  at javax.mail.Transport.send0(Transport.java:228)
2023-07-28T00:36:08.077456364Z  at javax.mail.Transport.send(Transport.java:150)
2023-07-28T00:36:08.077459864Z  at com.nomnom.communicationserver.communication.SMTPHelper.sendEmail(SMTPHelper.java:324)
2023-07-28T00:36:08.081170884Z  at com.nomnom.communicationserver.servlet.SenderServlet.doPost(SenderServlet.java:191)

该程序之前已经工作过,但是最近它开始给我上述错误。

我设置 Transporter 的配置如下:

Properties smtpProps = new Properties();

// SMTP
smtpProps.put("mail.smtp.auth", "true");
smtpProps.put("mail.smtp.starttls.enable", "true");
smtpProps.put("mail.smtp.auth.mechanisms", "XOAUTH2");
smtpProps.put("mail.smtp.host", "smtp.office365.com");
smtpProps.put("mail.smtp.port", "587"); // required for outlook
      
smtpSession = Session.getInstance(smtpProps);
smtpSession.setDebug(true);
transport = (SMTPTransport) smtpSession.getTransport("smtp");

除此之外,以下是我用来发送请求的代码:


private static String acquireToken() throws Exception {
  ConfidentialClientApplication app = ConfidentialClientApplication.builder(
        dotenv.get("CLIENT_ID"),
        ClientCredentialFactory.createFromSecret(dotenv.get("CLIENT_SECRET")))
          .authority(dotenv.get("CLIENT_AUTHORITY"))
          .build();   
  
  ClientCredentialParameters clientCredentialParam = ClientCredentialParameters.builder(
          Collections.singleton(scope))
          .build();
  
  CompletableFuture<IAuthenticationResult> future = app.acquireToken(clientCredentialParam);
  IAuthenticationResult result = future.get();
  return result.accessToken();
}

public void sendEmail(String destination) throws Exception {
  MimeMessage message = new MimeMessage(session);

  // [...]

  // Connect if not already connected
  if (!transport.isConnected()) {
    String accessToken = acquireToken();
    transport.connect("smtp.office365.com", dotenv.get("MAIL_USERNAME"), accessToken);
  }

  transport.sendMessage(message, message.getAllRecipients());
}

我尝试过的事情:

  • 我尝试使用用户名和密码,但出现相同的错误
  • 在这种情况下,我已确保用户名和密码正确无误。
  • 我也在管理面板中启用了 SMTP 身份验证。

由于某种原因,我无法为电子邮件创建应用密码。还应该提到的是,该电子邮件是一个工作帐户,并且是 Outlook 电子邮件。我注意到其他人的 Outlook 个人帐户也遇到了类似的问题。但是,我还没有看到工作帐户解决方案中提到的错误。

如果需要更多信息,请随时:)提出要求

Java 身份验证 电子邮件 Office365 Jakarta-Mail

评论

0赞 Roman C 7/28/2023
您添加了标签 [tag: jakarta-mail],但使用了 .你知道java ee版本的区别吗?javax.mail
0赞 Markus Moltke 7/28/2023
是的,我找到了javax.mail的标签,只是认为它已更改为jakarta-mail

答:

0赞 Eugene Astafiev 7/29/2023 #1

这是使用旧身份验证时广泛存在的问题,您可以找到很多关于该问题的帖子。您应该检查以下几点:

  • 使用 Exchange Online PowerShell 验证是否在应用程序用于连接到 Microsoft 365 或 Office 365 的许可邮箱上启用了经过身份验证的 SMTP 提交(也称为 )。SMTP AUTH

  • 在正在使用的许可邮箱上禁用多重身份验证 (MFA):

    1. 在 Microsoft 365 管理中心的左侧导航菜单中,选择“用户”>“活动用户”。
    2. 在“活动用户”页上,选择“多重身份验证”。
    3. 在“多重身份验证”页上,选择用户并禁用“多重身份验证”状态。
  • 通过将“启用安全默认值”切换为“否”来禁用 Azure 安全默认值:

    1. 以安全管理员、条件访问管理员或全局管理员身份登录到 Azure 门户。
    2. 浏览到 Azure Active Directory > 属性。
    3. 选择“管理安全默认值”。
    4. 将“启用安全默认值”开关设置为“否”。
    5. 选择“保存”。
  • 从阻止旧式身份验证的条件访问策略中排除用户:Exclude the user from a Conditional Access policy that blocks Legacy Authentication:

    1. 以安全管理员、条件访问管理员或全局管理员身份登录到 Azure 门户。
    2. 浏览到“Azure Active Directory”>“安全性”>条件访问。
    3. 在阻止旧式身份验证的策略中,排除“用户和组”下正在使用的邮箱>“排除”。
    4. 选择“保存”。

这些设置将阻止 .有关详细信息,请参阅错误:身份验证失败Legacy Authentication

评论

0赞 Markus Moltke 8/1/2023
我已确保上述所有内容都不会阻止我进行身份验证。与此同时,我也决定升级到 .这并没有改变任何事情。我已经编辑了这个问题,以包含使用jakarta的更新代码。javax.mailjakarta.mail
2赞 Markus Moltke 8/1/2023 #2

我弄清楚了导致问题的原因。该问题不是由 MFA 或类似原因引起的。相反,这是由于没有配置正确的权限造成的。accessToken

我修复它的方式是转到应用程序注册 -> API 权限。 在此之后,应用程序需要权限。我之前已添加权限。然而,这还不够。还应该提到的是,它需要属于该类别。SMTP.SendAsAppMail.SendOffice 365 Exchange Online

我找到问题的方式: 如果其他人偶然发现这个问题,我建议将 oauth 访问令牌放入像 jwt.io 这样的网站中。在这里,可以看到令牌的范围等。这帮助我看到了缺少的权限。