java javamail smtp-auth

¿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



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.