javax.mail.AuthenticationFailedException:Transport.send期间连接失败(消息)

javax.mail.AuthenticationFailedException: failed to connect during Transport.send(Message)

我通过 gmail 发送邮件的代码在 3 个月前运行良好。但是当我今天再次检查时,它失败并出现以下错误。 我的 Gmail 帐户未通过 2 因素验证。

代码:

package com.mail;

import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class Mailer {
    
    public static void sendMail(String messageSubject, String messageString)
    {
         Properties props = new Properties();    
         props.put("mail.smtp.host", ConstantsHolder.MAIL_HOST); 
         props.put("mail.smtp.user", ConstantsHolder.FROM_EMAIL);
         props.put("mail.smtp.socketFactory.port", "465");    
         props.put("mail.smtp.socketFactory.class",    
                   "javax.net.ssl.SSLSocketFactory");    
         props.put("mail.smtp.auth", "true");    
         props.put("mail.smtp.port", "465");
         props.put("mail.smtp.debug", "true");
         props.put("mail.smtp.socketFactory.fallback", "false");

         //To use TLS
         props.put("mail.smtp.starttls.enable", "true");
         
         //get Session   
         Session session = Session.getDefaultInstance(props,    
          new Authenticator() {
          protected PasswordAuthentication getPasswordAuthentication() {    
          return new PasswordAuthentication(ConstantsHolder.FROM_EMAIL,ConstantsHolder.FROM_EMAIL_PASSWD);  
          }    
         });    
         //compose message    
         try {    
          MimeMessage message = new MimeMessage(session);    
          message.addRecipient(Message.RecipientType.TO,new InternetAddress(ConstantsHolder.TO_EMAIL));    
          message.setSubject(messageSubject);    
          message.setText(messageString);    
          //send message  
          Transport.send(message);
          System.out.println("message sent successfully");    
         } 
         catch (MessagingException e) 
         {
             System.out.println("Failed " + e.getMessage()); 
             throw new RuntimeException(e);
         } 
    }
}

错误是:

Failed failed to connect
Exception in thread "main" java.lang.RuntimeException: javax.mail.AuthenticationFailedException: failed to connect
    at com.mail.Mailer.sendMail(Mailer.java:57)
    at com.mail.MailMain.main(MailMain.java:7)
Caused by: javax.mail.AuthenticationFailedException: failed to connect
    at javax.mail.Service.connect(Service.java:322)
    at javax.mail.Service.connect(Service.java:172)
    at javax.mail.Service.connect(Service.java:121)
    at javax.mail.Transport.send0(Transport.java:190)
    at javax.mail.Transport.send(Transport.java:120)
    at com.mail.Mailer.sendMail(Mailer.java:51)
    ... 1 more

我是不是做错了什么? 我还检查了其他问题,但它与“连接失败:未提供密码”有关

=========================================== ================== 编辑:解决方案 按照@Nasten1988 的要求尝试打开调试模式后,我找到了问题的根本原因并能够继续。因此将@Nasten1988 的答案标记为正确答案。

阅读我对实际问题的回答。

=========================================== ==================

连接失败:可能你的连接被防火墙阻止了,你的软件是最新的吗?未提供密码:检查 Google 的要求,他们可能更改了它们并检查您的密码是如何为您的邮件方法提供的。也许调试器可以帮助你。这就是我想要的。

所以这对我有帮助 -

我将邮件会话的调试模式设置为 true -

session.setDebug(true);

显示了实际问题 - 我的 Gmail 帐户中关闭了不太安全的应用程序。 显然,如果一段时间不使用,它会自动关闭。

https://myaccount.google.com/lesssecureapps

您必须先关闭双因素身份验证,然后才能允许安全性较低的应用。