如何使用Javax Mail处理gmail应用程序密码

时间:2019-05-23 17:22:16

标签: java email gmail

我的Java Windows应用程序需要发送电子邮件,并允许用户指定他/她的电子邮件帐户凭据:主机,端口,用户名,密码。当我在托管服务中将我的凭据用于某个帐户时,此方法有效,但使用Gmail帐户时,效果却不如预期用户所希望的那样。问题是Gmail坚持使用“应用密码”。因此,我按照Google的说明操作,并创建了一个16个字符的应用程序密码,谷歌表示必须只使用一次。但是,我发现应用密码必须用于后续运行。

这是演示该问题的示例程序。如果我为Gmail帐户使用该实际密码,它将失败。在创建应用程序/设备专用密码(16个字符)并将其用作密码后,它将可以正常使用。但是,此后我也必须使用该16个字符的密码。我想念什么?

public class SendEmailTLS {

// https://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/中的示例1     公共静态void main(String [] args){

    final String username = "me123@gmail.com";
    final String password = "mypassword";

    Properties prop = new Properties();
    prop.put("mail.smtp.host", "smtp.gmail.com");
    prop.put("mail.smtp.port", "587");
    prop.put("mail.smtp.auth", "true");
    prop.put("mail.smtp.starttls.enable", "true"); //TLS

    Session session = Session.getInstance(prop,
            new javax.mail.Authenticator() {
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(username, password);
                }
            });

    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("me123@gmail.com"));
        message.setRecipients(
                Message.RecipientType.TO,
                InternetAddress.parse("you456@hotmail.com")
        );
        message.setSubject("Testing Gmail TLS");
        message.setText("Dear sir,"
                + "\n\n I'm testing TLS,using port 587");

        Transport.send(message);

        System.out.println("Done");

    } catch (MessagingException e) {
        e.printStackTrace();
    }
}

}

我想补充一点,我现在怀疑我所看到的是它应该工作的方式。我一直认为16字符的App专用密码是保护Gmail服务器的“盐”类东西。我现在读到,它实际上只是我的Gmail帐户的备用密码。如果有人可以确认或否认这种新观点,我将不胜感激。

0 个答案:

没有答案