Как решить проблему javax.mail.AuthenticationFailedException? - PullRequest
17 голосов
/ 12 января 2010

Я делаю sendMail Servlet с JavaMail. У меня есть 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>");
    }

Вывод на 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

Ответы [ 5 ]

20 голосов
/ 10 августа 2015

Привет всем Эта ошибка из безопасности Google ... Эту проблему можно решить, включив Менее безопасный.

Перейдите по этой ссылке: "https://www.google.com/settings/security/lesssecureapps" и сделайте" ВКЛЮЧЕНО ", тогда ваше приложение будет работать наверняка.

20 голосов
/ 12 января 2010

Вам необходимо реализовать пользовательский 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));

Также ознакомьтесь с FAQ по JavaMail

2 голосов
/ 13 июня 2011

Мне не хватало этого аргумента объекта аутентификатора в строке ниже

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

Эта строка решила мою проблему, теперь я могу отправлять почту через приложение Java. Остальная часть кода проста, как и выше.

0 голосов
/ 04 сентября 2014

Просто хотел поделиться с вами:
Я получил эту ошибку после изменения машины Digital Ocean (IP-адрес). Видимо, Gmail признал это хакерской атакой. После следования их указаниям и утверждения нового IP-адреса код возвращается и работает.

0 голосов
/ 26 ноября 2012

Проблема в том, что вы создаете объект transport и используете его метод connect для аутентификации. Но затем вы используете метод static для отправки сообщения, которое игнорирует аутентификацию, выполненную объектом.

Таким образом, вы должны либо использовать метод sendMessage(message, message.getAllRecipients()) для объекта, либо использовать аутентификатор, как это было предложено другими, чтобы получить разрешение через сеанс.

Вот FAQ по Java Mail , вам нужно прочитать.

...