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

xjreopfe  于 2023-08-01  发布在  Java
关注(0)|答案(2)|浏览(771)

我正在尝试使用jakarta.mail 2.0.1发送电子邮件。下面提到的错误最近开始出现。我不知道是什么原因导致的,但我怀疑它可能与Outlook 365和SMTP设置有关。然而,我在尝试这样做时得到以下错误:

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个人帐户。然而,我还没有看到提到的错误与解决方案的工作帐户。
如果需要更多信息,请随时索取:)

bmvo0sr5

bmvo0sr51#

我发现了问题的根源。这个问题不是由MFA或类似的东西引起的。而是由于accessToken没有配置正确的权限而导致的。
我修复它的方式是去应用程序注册-> API权限。在此之后,应用程序需要SMTP.SendAsApp权限。我之前添加了Mail.Send权限。然而,这还不够。还应该提到的是,它需要在Office 365 Exchange Online类别下。
我发现问题的方式:如果其他人遇到这个问题,我建议使用oauth访问令牌并将其放入像jwt.io这样的网站。在这里,可以看到令牌的范围以及其他内容。这帮助我看到了丢失的许可。

j1dl9f46

j1dl9f462#

这是一个使用遗留身份验证的广泛问题,你可以找到很多关于这个问题的帖子。有几件事你应该检查:

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

1.对正在使用的许可邮箱禁用多重身份验证(MFA):
1.在Microsoft 365管理中心的左侧导航菜单中,选择“用户”>“活动用户”。
1.在“活动用户”页面上,选择“多重身份验证”。
1.在多因素身份验证页面上,选择用户并禁用多因素身份验证状态。
1.通过将“启用安全默认值”切换为“否”来禁用Azure安全默认值:
1.以安全管理员、条件访问管理员或全局管理员身份登录Azure门户。
1.浏览到Azure Active Directory >属性。
1.选择管理安全默认值。
1.将启用安全默认值切换设置为否。
1.选择保存。
1.从阻止旧版身份验证的条件访问策略中排除用户:
1.以安全管理员、条件访问管理员或全局管理员身份登录Azure门户。
1.浏览到Azure Active Directory >安全性>条件访问。
1.在阻止旧版身份验证的策略中,在“用户和组”>“排除”下排除正在使用的邮箱。
1.选择保存。
这些设置将阻止Legacy Authentication。有关详细信息,请参阅错误:身份验证不成功。

相关问题