通过Java在启用双重身份验证的Gmail帐户中发送电子邮件

11

我想创建一个函数,可以向任何指定的收件人(gmail)发送电子邮件。但遇到的问题是,当我提供使用两步验证的凭据时,我的身份验证失败。对于没有两步验证的帐户,它可以正常工作。那么我该怎么做才能在启用两步身份验证的情况下实现此功能呢?

以下是我用来发送电子邮件的代码:

public static boolean sendMail(String fromMail, String fromPassword, String toMail, String message) {
        try {
            final String user = fromMail, password = fromPassword;
            Properties prop = new Properties();
            prop.setProperty("mail.smtp.host", "smtp.gmail.com");
            prop.setProperty("mail.smtp.port", "465");
            prop.setProperty("mail.smtp.auth", "true");
            prop.setProperty("mail.smtp.ssl.enable", "true");
//            prop.put("mail.debug", "true");

//            prop.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

            Session sess = Session.getDefaultInstance(prop, new Authenticator() {

                @Override
                protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
                    return new javax.mail.PasswordAuthentication(user, password);
                }
            });

//            Session sess=Session.getDefaultInstance(prop);

            sess.setDebug(true);

            Message msg = new MimeMessage(sess);

            msg.setFrom(new InternetAddress(fromMail));
            msg.setRecipient(Message.RecipientType.TO, new InternetAddress(toMail));
            msg.setText(message);
            msg.setContent(message, "text/html");


            Transport.send(msg);
            return true;
        } catch (MessagingException msgEx) {
            msgEx.printStackTrace();
            return false;
        }
    }
2个回答

11

我检查了链接并获得了一个应用程序特定的密码,我能够成功地登录浏览器。但在这里的代码中,某些地方我需要指定那个密码。因为即使生成了应用程序特定密码后,它仍然给我错误。 - ATR
有趣。一段时间前,当我遇到这个问题时,谷歌SMTP服务给了我一个特定的2步验证错误信息。你有检查过吗? - Friek
1
是的,我就是在谈论那个问题。我遇到了一个名为“javax.mail.AuthenticationFailedException: 535-5.7.1 Application-specific password required.”的错误。那么该怎么解决呢? - ATR
我能想象的唯一方法是在我之前提供的url上创建应用程序专用密码,并将其用于身份验证。如果要求使用应用程序特定密码,则不应再使用原始密码。 - Friek

2
有两种解决方案:
  1. 您可以通过“friek”提供的链接生成应用程序特定密码,即“https://accounts.google.com/IssuedAuthSubTokens”,并使用生成的应用程序特定密码替换原始密码。我已经尝试过这个方法,它可以正常工作。
或者
  1. 出现异常(javax.mail.AuthenticationFailedException: 535-5.7.1 Application-specific password required)的原因是您可能激活了gmail帐户的两步验证。如果您使用未激活两步验证的帐户,则可以使用原始密码发送电子邮件。我也尝试过这个方法,它可以正常工作。

您说得对,我刚刚创建了一个没有双重认证的新账户,顺利地完成了操作。感谢您的帮助!! - Akash5288

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接