Подтвердить что ты не робот

Как решить проблему javax.mail.AuthenticationFailedException?

Я делаю sendMail Servlet с JavaMail. У меня есть javax.mail.AuthenticationFailedException на моем выходе. Кто-нибудь может помочь мне? Спасибо.

код sendMailServlet:

try {
        String host = "smtp.gmail.com";
        String from = "[email protected]";
        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("[email protected]");

        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
4b9b3361

Ответ 1

Вам нужно реализовать пользовательский 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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Здесь Часто задаваемые вопросы по почте Java, вы должны прочитать.

Ответ 5

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

Ответ 6

Когда вы пытаетесь войти в свою учетную запись Google с вашего нового устройства или приложения, вы должны разблокировать CAPTCHA. Чтобы разблокировать капчу, перейдите на https://www.google.com/accounts/DisplayUnlockCaptcha а затем enter image description here

А также убедитесь, что разрешены менее безопасные приложения на enter image description here