Как решить проблему javax.mail.AuthenticationFailedException?
Я делаю 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 ответов
Вам нужно реализовать кастом 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
Привет всем Эта ошибка из безопасности Google... Это можно решить, включив менее безопасный.
Перейдите по этой ссылке: " https://www.google.com/settings/security/lesssecureapps" и установите "ВКЛЮЧЕНО", после чего приложение запустится наверняка.
Мне не хватало этого аргумента объекта аутентификатора в строке ниже
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));
Эта строка решила мою проблему, теперь я могу отправлять почту через приложение Java. Остальная часть кода проста, как и выше.
Когда вы пытаетесь войти в свою учетную запись Google с нового устройства или приложения, вам необходимо разблокировать CAPTCHA. Чтобы разблокировать CAPTCHA, перейдите на https://www.google.com/accounts/DisplayUnlockCaptcha, а затем
А также убедитесь, что на
Проблема в том, что вы создаете transport
объект и используя его метод подключения для аутентификации. Но тогда вы используете static
метод для отправки сообщения, которое игнорирует аутентификацию, выполненную объектом.
Итак, вы должны использовать sendMessage(message, message.getAllRecipients())
метод на объекте или использовать аутентификатор как предложено другими, чтобы получить авторизацию через сеанс.
Просто хотел поделиться с вами
Я получил эту ошибку после изменения машины Digital Ocean (IP-адрес). Видимо, Gmail признал это хакерской атакой. После следования их указаниям и утверждения нового IP-адреса код возвращается и работает.