如何解决javax.mail.AuthenticationFailedException问题?

如何解决javax.mail.AuthenticationFailedException问题?,java,jakarta-mail,smtp-auth,Java,Jakarta Mail,Smtp Auth,我正在用JavaMail做一个sendMailServlet。我的输出中有javax.mail.AuthenticationFailedException。谁能帮帮我吗?谢谢 sendMailServlet代码: try { String host = "smtp.gmail.com"; String from = "my@gmail.com"; String pass = "pass"; Properties props = Sy

我正在用
JavaMail
做一个
sendMail
Servlet
。我的输出中有
javax.mail.AuthenticationFailedException
。谁能帮帮我吗?谢谢

sendMailServlet代码:

try {
        String host = "smtp.gmail.com";
        String from = "my@gmail.com";
        String pass = "pass";
        Properties props = System.getProperties();
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password", pass);
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        props.put("mail.debug", "true");

        Session session = Session.getDefaultInstance(props, null);
        MimeMessage message = new MimeMessage(session);
        Address fromAddress = new InternetAddress(from);
        Address toAddress = new InternetAddress("test1@gmail.com");

        message.setFrom(fromAddress);
        message.setRecipient(Message.RecipientType.TO, toAddress);

        message.setSubject("Testing JavaMail");
        message.setText("Welcome to JavaMail");
        Transport transport = session.getTransport("smtp");
        transport.connect(host, from, pass);
        message.saveChanges();
        Transport.send(message);
        transport.close();

    }catch(Exception ex){

        out.println("<html><head></head><body>");
        out.println("ERROR: " + ex);
        out.println("</body></html>");
    }

您需要实现一个自定义的

现在把它用在


另请检查下一行中的我缺少此验证器对象参数

Session session = Session.getInstance(props, new GMailAuthenticator(username, password));
这一行解决了我的问题,现在我可以通过Java应用程序发送邮件了。
其余的代码与上面一样简单。

问题是,您正在创建一个
传输
对象,并使用它的连接方法进行身份验证。 但是,然后使用
静态
方法发送消息,该方法忽略了对象所做的身份验证

因此,您应该对对象使用
sendMessage(message,message.getAllRecipients())
方法,或者按照其他人的建议使用验证器来获得授权 通过会议


以下是您需要阅读的内容。

只想与您分享:

在更改数字海洋机器(IP地址)后,我碰巧遇到了这个错误。显然,Gmail认为这是一次黑客攻击。按照他们的指示,并批准新的IP地址后,代码将返回并运行。

此错误来自谷歌安全。。。 这可以通过启用不太安全的功能来解决


转到此链接:“打开”,然后确保应用程序运行。

当您试图从新设备或应用程序登录到您的Google帐户时,必须解锁验证码。 要解锁验证码,请转到 然后

还要确保

什么时候会发生异常?我看不到你脸上的表情logs@n002213f:当我通过jndi调用(jboss)从mailservice.xml获取会话时,如何使用此gmail身份验证程序。@Ashwin-看看类似问题的答案@n002213f:你给出了一个出色的解决方案,现在我正在实现此功能,只需将smtp gmail服务器替换为我自己的smtp服务器名称,但是获取java.lang.NoClassDefFoundError:javax/mail/Authenticator error(因为我在jsp/servlet的帮助下实现它)…任何输入..很好的答案,但我更喜欢第二个(Uma的答案)。我的验证器工作正常,但谷歌的标准(幸运的)太严格了。尽管如此,+1。我面临着完全相同的问题,尝试了这个和第二个答案。两者都不适用于我,我使用tomcat作为web容器。哦,tq:)。我为此奋斗了这么长时间。这不应该发生在任何人身上。所以,我说得很清楚,Phil CIt对我来说是可行的,但如何让它在不允许不太安全的应用程序使用IMAP的情况下工作呢?
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;


class GMailAuthenticator extends Authenticator {
     String user;
     String pw;
     public GMailAuthenticator (String username, String password)
     {
        super();
        this.user = username;
        this.pw = password;
     }
    public PasswordAuthentication getPasswordAuthentication()
    {
       return new PasswordAuthentication(user, pw);
    }
}
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));