¿Cómo resolver el problema javax.mail.AuthenticationFailedException?
javamail smtp-auth (5)
El problema es que está creando un objeto de transport
y está utilizando su método de conexión para autenticarse. Pero luego utiliza un método static
para enviar el mensaje que ignora la autenticación realizada por el objeto.
Por lo tanto, debe usar el sendMessage(message, message.getAllRecipients())
en el objeto o usar un autenticador como lo sugieren otros para obtener la autorización a través de la sesión.
Aquí están las preguntas frecuentes de Java Mail , que debes leer.
Estoy haciendo un Servlet
sendMail
con JavaMail
. Tengo javax.mail.AuthenticationFailedException
en mi salida. ¿Por favor, puede alguien ayudarme? Gracias.
enviar código de correo electrónico:
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>");
}
Salida en 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
Hola a todos Este error proviene de la seguridad de Google ... Esto se puede resolver habilitando Menos seguro.
Vaya a este enlace: " https://www.google.com/settings/security/lesssecureapps " y haga "ENCENDER" y luego su aplicación se ejecuta de forma segura.
Me faltaba este argumento de objeto de autenticador en la línea de abajo
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));
Esta línea resolvió mi problema ahora puedo enviar correo a través de mi aplicación Java. El resto del código es simple al igual que arriba.
Necesita implementar un Authenticator
personalizado
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);
}
}
Ahora úsalo en la Session
Session session = Session.getInstance(props, new GMailAuthenticator(username, password));
También puedes ver las preguntas frecuentes de JavaMail
Solo quería compartir con ustedes:
Se me ocurrió este error después de cambiar la máquina de Digital Ocean (dirección IP). Al parecer Gmail lo reconoció como un ataque de hacking. Después de seguir sus instrucciones y aprobar la nueva dirección IP, el código vuelve a funcionar.