解决错误javax.mail.AuthenticationFailedException

时间:2013-09-13 04:17:50

标签: java javamail

我不熟悉这个用java发送邮件的功能。发送电子邮件重置密码时收到错误。希望你能给我一个解决方案。

以下是我的代码:

public synchronized static boolean sendMailAdvance(String emailTo, String subject, String body)
{
    String host = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ADDRESS");
    String userName = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-USERNAME");
    String password = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PASSWORD");
    String port = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PORT");
    String starttls = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-STARTTLS");
    String socketFactoryClass = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-SOCKET-CLASS");
    String fallback = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ALLOW-FALLBACK");                         

    try
    {
        java.util.Properties props = null;
        props = System.getProperties();
        props.put("mail.smtp.user", userName);
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.debug", "true");

        if(!"".equals(port))
        {
            props.put("mail.smtp.port", port);
            props.put("mail.smtp.socketFactory.port", port);
        }

        if(!"".equals(starttls))
            props.put("mail.smtp.starttls.enable",starttls);

        if(!"".equals(socketFactoryClass))                   
            props.put("mail.smtp.socketFactory.class",socketFactoryClass);

        if(!"".equals(fallback))
            props.put("mail.smtp.socketFactory.fallback", fallback);

        Session session = Session.getDefaultInstance(props, null);
        session.setDebug(true);

        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(userName));
        msg.setSubject(subject);                
        msg.setText(body, "ISO-8859-1");
        msg.setSentDate(new Date());
        msg.setHeader("content-Type", "text/html;charset=\"ISO-8859-1\"");
        msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
        msg.saveChanges();

        Transport transport = session.getTransport("smtp");
        transport.connect(host, userName, password);
        transport.sendMessage(msg, msg.getAllRecipients());
        transport.close();
            return true;
    }
    catch (Exception mex)
    {
        mex.printStackTrace();
        return false;
    }
}

引发以下错误:

  

DEBUG:setDebug:JavaMail版本1.4.1ea-SNAPSHOT

DEBUG: getProvider() returning   javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
     

DEBUG SMTP:useEhlo true,useAuth true

     

DEBUG SMTP:尝试连接主机“smtp.gmail.com”,端口465,isSSL false 220 mx.google.com ESMTP m4sm5929870pbg.38 - gsmtp

     

DEBUG SMTP:连接到主机“smtp.gmail.com”,端口:465

     

EHLO fatin

     

250-mx.google.com为您服务,[175.139.198.14]

     

250-SIZE 35882577

     

250-8BITMIME

     

250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN

     

250 ENHANCEDSTATUSCODES

     

250 CHUNKING

     

DEBUG SMTP:找到扩展名“SIZE”,arg“35882577”

     

DEBUG SMTP:找到扩展名“8BITMIME”,arg“”

     

DEBUG SMTP:找到扩展名“AUTH”,arg“登录PLOA XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN”

     

DEBUG SMTP:找到扩展名“ENHANCEDSTATUSCODES”,arg“”

     

DEBUG SMTP:找到扩展名“CHUNKING”,arg“”

     

DEBUG SMTP:尝试进行身份验证

     

AUTH LOGIN

     

334 VXNlcm5hbWU6

     

YWNjb3VudEBibG9vbWluZy5jb20ubXk =

     

334 UGFzc3dvcmQ6

     

Ymxvb21pbmc =   535-5.7.8不接受用户名和密码。了解更多信息   535 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257

     

m4sm5929870pbg.38 - gsmtp

     

[STDOUT] javax.mail.AuthenticationFailedException

     

[STDOUT]在javax.mail.Service.connect(Service.java:319)

     

[STDOUT]在javax.mail.Service.connect(Service.java:169)

     

[STDOUT] at com.vlee.util.mail.SendMail.sendMailAdvance(SendMail.java:283)

     

[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.fnSendPwd(DoMemberLogin.java:251)

     

[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.doPost(DoMemberLogin.java:72)

14 个答案:

答案 0 :(得分:76)

可能是由Gmail帐户保护导致此问题。只需点击下面的链接并禁用安全设置即可。  https://www.google.com/settings/security/lesssecureapps

答案 1 :(得分:12)

您应该将端口更改为587,我测试了您的代码并且工作正常

如果仍然发生错误,请将会话变量更改为以下代码:

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

答案 2 :(得分:8)

默认情况下,Gmail帐户具有高度安全性。当我们从非gmail工具使用gmail smtp时,电子邮件被阻止。要在我们的本地环境中进行测试,请将您的Gmail帐户设置为

  1. 登录Gmail。
  2. https://www.google.com/settings/security/lesssecureapps
  3. 访问网址
  4. 选择“开启”

答案 3 :(得分:4)

更改此设置(设置不太安全的应用): https://www.google.com/settings/security/lesssecureapps

答案 4 :(得分:4)

如果您是从新的应用程序或设备登录您的Gmail帐户,Google可能会阻止该设备。请尝试以下步骤:

为了保护您的帐户,如果我们怀疑您不是您,Google可能会更难登录您的帐户。例如,如果您正在旅行或尝试从新设备登录帐户,Google可能会要求您提供除用户名和密码之外的其他信息。

从您之前用于访问Google帐户的其他设备转到https://g.co/allowaccess,然后按照说明操作。 尝试从被阻止的应用再次登录。

答案 5 :(得分:2)

我长期以来一直在犯同样的错误。

当我将会话调试更改为true

Session session = Session.getDefaultInstance(props, new GMailAuthenticator("xxxxx@gmail.com", "xxxxx"));
session.setDebug(true);

我从控制台获得了帮助URL https://support.google.com/mail/answer/78754以及javax.mail.AuthenticationFailedException。

通过链接中的步骤,我按照每个步骤进行操作。当我用混合的字母,数字和符号更改密码时,我感到惊讶的是,生成的电子邮件没有验证异常。

注意:我的旧密码更不安全。

答案 6 :(得分:1)

2个可能的原因:

  • 您的用户名可能需要整个电子邮件ID“username@example.com”
  • 最明显的是:密码错误。调试以查看正在使用的密码是否正确。

答案 7 :(得分:1)

您需要记住一些步骤。

现在有两种情况 如果您是在本地计算机上开发它的,请在浏览器中登录到您的Google帐户,这样Google就会识别该计算机。

如果您已将应用程序部署到服务器上,则在第一个请求之后,您将收到身份验证错误,因此您必须授予对服务器的访问权限,只需转到此处进行访问即可-https://www.google.com/accounts/DisplayUnlockCaptcha

答案 8 :(得分:0)

trying to connect to host "smtp.gmail.com", port 465, isSSL false

你的gmail smtp设置错误了。 Gmail需要SSL。请参阅有关如何通过Gmail SMTP通过Java发送电子邮件的教程,例如:http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/

答案 9 :(得分:0)

以防万一有人来寻找这个问题的解决方案。

通过激活正在使用的帐户的Google两步验证并创建应用专用密码,可以缓解身份验证问题。我和OP有同样的问题。启用两步工作。

答案 10 :(得分:0)

我也有这个问题,但解决方案与编码无关。确保您能够连接到Gmail。 Ping smtp.gmail.com。如果您没有收到回复,请检查您的防火墙设置。它也可能是代理设置问题。

答案 11 :(得分:0)

适用于我的解决方案有两个步骤。

  1. 第一步

    package com.student.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;
    
    /**
     *
     * @author jorge santos
     */
    public class GoogleMail {
        public static void main(String[] args) {
            Properties props = new Properties();
            props.put("mail.smtp.host", "smtp.gmail.com");
            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"); 
            Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {
                                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication("conaderindicadores@gmail.com","Silueta95#");
                }
            });
    
        try {
    
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("conaderindicadores@gmail.com"));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse("netneillip@gmail.com"));
            message.setSubject("Testing Subject");
            message.setText("Test Mail");
    
            Transport.send(message);
    
            System.out.println("Done");
    
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
    
    }
    
  2. 启用gmail安全性

    https://myaccount.google.com/u/2/lesssecureapps?pli=1&pageId=none
    

答案 12 :(得分:0)

使用给定的 SMTP 设置实现三件事

  1. 禁用两因素身份验证:https://myaccount.google.com/security
  2. 允许安全性较低的应用:https://www.google.com/settings/security/lesssecureapps
  3. 允许使用以下链接的新设备:https://g.co/allowaccess

SMTP 设置:

  • smtp.gmail.com
  • 端口:465
  • 使用 SSL
  • 来自电子邮件地址
  • Gmail 用户名
  • Gmail 密码
  • 收件人电子邮件地址

答案 13 :(得分:-1)

import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendMail1 {

    public static void main(String[] args) {
        // Recipient's email ID needs to be mentioned.
          String to = "valid email to address";

          // Sender's email ID needs to be mentioned
          String from = "valid email from address";


          // Get system properties
          Properties properties = System.getProperties();

          properties.put("mail.smtp.starttls.enable", "true"); 
          properties.put("mail.smtp.host", "smtp.gmail.com");

          properties.put("mail.smtp.port", "587");
          properties.put("mail.smtp.auth", "true");
          Authenticator authenticator = new Authenticator () {
                public PasswordAuthentication getPasswordAuthentication(){
                    return new PasswordAuthentication("userid","password");//userid and password for "from" email address 
                }
            };

            Session session = Session.getDefaultInstance( properties , authenticator);  
          try{
             // Create a default MimeMessage object.
             MimeMessage message = new MimeMessage(session);

             // Set From: header field of the header.
             message.setFrom(new InternetAddress(from));

             // Set To: header field of the header.
             message.addRecipient(Message.RecipientType.TO,
                                      new InternetAddress(to));

             // Set Subject: header field
             message.setSubject("This is the Subject Line!");

             // Now set the actual message
             message.setText("This is actual message");

             // Send message
             Transport.send(message);
             System.out.println("Sent message successfully....");
          }catch (MessagingException mex) {
             mex.printStackTrace();
          }
    }

}