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

我正在使用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(""); out.println("ERROR: " + ex); out.println(""); } 

GlassFish 2.1上的输出:

 DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false 220 mx.google.com ESMTP 36sm10907668yxh.13 DEBUG SMTP: connected to host "smtp.gmail.com", port: 587 EHLO platform-4cfaca 250-mx.google.com at your service, [203.126.159.130] 250-SIZE 35651584 250-8BITMIME 250-STARTTLS 250-ENHANCEDSTATUSCODES 250 PIPELINING DEBUG SMTP: Found extension "SIZE", arg "35651584" DEBUG SMTP: Found extension "8BITMIME", arg "" DEBUG SMTP: Found extension "STARTTLS", arg "" DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" DEBUG SMTP: Found extension "PIPELINING", arg "" STARTTLS 220 2.0.0 Ready to start TLS EHLO platform-4cfaca 250-mx.google.com at your service, [203.126.159.130] 250-SIZE 35651584 250-8BITMIME 250-AUTH LOGIN PLAIN 250-ENHANCEDSTATUSCODES 250 PIPELINING DEBUG SMTP: Found extension "SIZE", arg "35651584" DEBUG SMTP: Found extension "8BITMIME", arg "" DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN" DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg "" DEBUG SMTP: Found extension "PIPELINING", arg "" DEBUG SMTP: Attempt to authenticate AUTH LOGIN 334 VXNlcm5hbWU6 aWpveWNlbGVvbmdAZ21haWwuY29t 334 UGFzc3dvcmQ6 MTIzNDU2Nzhf 235 2.7.0 Accepted DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true 

您需要实现自定义Authenticator

 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 = Session.getInstance(props, new GMailAuthenticator(username, password)); 

另请查看JavaMail FAQ

大家好,这个错误来自谷歌安全……这可以通过启用较低的安全性来解决。

转到此链接:“ https://www.google.com/settings/security/lesssecureapps ”并使“开启”然后您的应用程序运行确定。

我在下面的行中遗漏了这个authenticator对象参数

 Session session = Session.getInstance(props, new GMailAuthenticator(username, password)); 

这条线解决了我的问题现在我可以通过我的Java应用程序发送邮件。 其余的代码很简单,如上所述。

问题是,您正在创建一个transport对象并使用它的connect方法来validation自己。 但是,然后使用static方法发送忽略对象完成的身份validation的消息。

因此,您应该在对象上使用sendMessage(message, message.getAllRecipients())方法,或者使用其他人建议的身份validation器来通过会话进行授权。

这是Java Mail FAQ ,您需要阅读。

只是想和你分享:
更改数字海洋机器(IP地址)后,我碰巧遇到此错误。 显然,Gmail认为这是一次黑客攻击。 遵循他们的指示并批准新的IP地址后,代码又恢复运行。