framework - javamail netbeans
Resuelve el error javax.mail.AuthenticationFailedException (13)
2 posibles razones:
- Su nombre de usuario puede requerir el ID de correo electrónico completo ''[email protected]''
- Más obvio: la contraseña es incorrecta. Depurar para ver si la contraseña que se usa es correcta.
No estoy familiarizado con esta función para enviar correos en java. Recibo un mensaje de error al enviar un correo electrónico para restablecer la contraseña. Espero que puedas darme una solución.
A continuación está mi código:
public synchronized static boolean sendMailAdvance(String emailTo, String subject, String body)
{
String host = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ADDRESS");
String userName = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-USERNAME");
String password = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PASSWORD");
String port = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-PORT");
String starttls = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-STARTTLS");
String socketFactoryClass = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-SOCKET-CLASS");
String fallback = AppConfigManager.getProperty("SENDER-EMAIL-SMTP-ALLOW-FALLBACK");
try
{
java.util.Properties props = null;
props = System.getProperties();
props.put("mail.smtp.user", userName);
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.debug", "true");
if(!"".equals(port))
{
props.put("mail.smtp.port", port);
props.put("mail.smtp.socketFactory.port", port);
}
if(!"".equals(starttls))
props.put("mail.smtp.starttls.enable",starttls);
if(!"".equals(socketFactoryClass))
props.put("mail.smtp.socketFactory.class",socketFactoryClass);
if(!"".equals(fallback))
props.put("mail.smtp.socketFactory.fallback", fallback);
Session session = Session.getDefaultInstance(props, null);
session.setDebug(true);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(userName));
msg.setSubject(subject);
msg.setText(body, "ISO-8859-1");
msg.setSentDate(new Date());
msg.setHeader("content-Type", "text/html;charset=/"ISO-8859-1/"");
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
msg.saveChanges();
Transport transport = session.getTransport("smtp");
transport.connect(host, userName, password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
return true;
}
catch (Exception mex)
{
mex.printStackTrace();
return false;
}
}
Lanza el siguiente error:
DEBUG: setDebug: JavaMail version 1.4.1ea-SNAPSHOT
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL false 220 mx.google.com ESMTP m4sm5929870pbg.38 - gsmtp
DEBUG SMTP: connected to host "smtp.gmail.com", port: 465
EHLO fatin
250-mx.google.com at your service, [175.139.198.14]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN
250-ENHANCEDSTATUSCODES
250 CHUNKING
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 VXNlcm5hbWU6
YWNjb3VudEBibG9vbWluZy5jb20ubXk=
334 UGFzc3dvcmQ6
Ymxvb21pbmc=
535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 http://support.google.com/mail/bin/answer.py?answer=14257 m4sm5929870pbg.38 - gsmtp
[STDOUT] javax.mail.AuthenticationFailedException
[STDOUT] at javax.mail.Service.connect(Service.java:319)
[STDOUT] at javax.mail.Service.connect(Service.java:169)
[STDOUT] at com.vlee.util.mail.SendMail.sendMailAdvance(SendMail.java:283)
[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.fnSendPwd(DoMemberLogin.java:251)
[STDOUT] at com.vlee.servlet.ecommerce.DoMemberLogin.doPost(DoMemberLogin.java:72)
Cambie esto (configure la aplicación menos segura): google.com/settings/security/lesssecureapps
Deberías cambiar el puerto a 587
, probé tu código y funciona bien
Si aún ocurre un error, cambie la variable de sesión al siguiente código:
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, password);
}
});
En caso de que alguien venga buscando una solución para este problema.
Los problemas de autenticación se pueden aliviar activando la verificación de Google en dos pasos para la cuenta en uso y creando una contraseña específica de la aplicación. Tuve el mismo problema que el OP. Habilitar 2 pasos funcionaba.
He estado recibiendo el mismo error por mucho tiempo.
Cuando cambié la depuración de la sesión a verdadero
Session session = Session.getDefaultInstance(props, new GMailAuthenticator("[email protected]", "xxxxx"));
session.setDebug(true);
Obtuve la url de ayuda https://support.google.com/mail/answer/78754 desde la consola junto con javax.mail.AuthenticationFailedException.
De los pasos en el enlace, seguí cada paso. Cuando cambié mi contraseña con una combinación de letras, números y símbolos para ser una sorpresa, el correo electrónico se generó sin excepción de autenticación.
Nota: Mi contraseña anterior era menos segura.
La mayoría de los errores de AuthenticationFieldException ocurren cuando se intentó evitar el inicio de sesión, ingrese su cuenta de gmail primero y vaya a google.com/settings/security/lesssecureapps y verifique que se activen. Resolví este tipo de problema de esta manera.
Por defecto, la cuenta de Gmail es altamente segura. Cuando utilizamos gmail smtp desde una herramienta que no es de Gmail, el correo electrónico está bloqueado. Para probar en nuestro entorno local, haga que su cuenta de Gmail sea menos segura ya que
- Ingresa a Gmail.
- Acceda a la URL como google.com/settings/security/lesssecureapps
- Seleccione "Activar"
Puede ser este problema causado por la protección de la cuenta de Gmail. Simplemente haga clic en el enlace a continuación y desactive la configuración de seguridad. Funcionará. google.com/settings/security/lesssecureapps
Si está iniciando sesión en su cuenta de Gmail desde una nueva aplicación o dispositivo, es posible que Google esté bloqueando ese dispositivo. Intente seguir estos pasos:
Para proteger su cuenta, Google puede dificultar el acceso a su cuenta si sospechamos que no es usted. Por ejemplo, Google podría solicitar información adicional además de su nombre de usuario y contraseña si está viajando o si intenta iniciar sesión en su cuenta desde un nuevo dispositivo.
Vaya a https://g.co/allowaccess desde un dispositivo diferente que haya utilizado anteriormente para acceder a su cuenta de Google y siga las instrucciones. Intenta iniciar sesión nuevamente desde la aplicación bloqueada.
Tuve este problema también, pero la solución no tenía nada que ver con la codificación. Asegúrese de poder conectarse a Gmail. Ping smtp.gmail.com. Si no obtiene una respuesta, consulte la configuración de su firewall. También podría ser un problema de configuración de proxy.
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendMail1 {
public static void main(String[] args) {
// Recipient''s email ID needs to be mentioned.
String to = "valid email to address";
// Sender''s email ID needs to be mentioned
String from = "valid email from address";
// Get system properties
Properties properties = System.getProperties();
properties.put("mail.smtp.starttls.enable", "true");
properties.put("mail.smtp.host", "smtp.gmail.com");
properties.put("mail.smtp.port", "587");
properties.put("mail.smtp.auth", "true");
Authenticator authenticator = new Authenticator () {
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication("userid","password");//userid and password for "from" email address
}
};
Session session = Session.getDefaultInstance( properties , authenticator);
try{
// Create a default MimeMessage object.
MimeMessage message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));
// Set Subject: header field
message.setSubject("This is the Subject Line!");
// Now set the actual message
message.setText("This is actual message");
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
}catch (MessagingException mex) {
mex.printStackTrace();
}
}
}
trying to connect to host "smtp.gmail.com", port 465, isSSL false
Obtuviste mal la configuración de smtp de gmail. Gmail requiere SSL. Consulte los tutoriales sobre cómo enviar correos electrónicos a través de Java a través de Gmail SMTP, por ejemplo: http://www.mkyong.com/java/javamail-api-sending-email-via-gmail-smtp-example/
- google.com/settings/security/lesssecureapps
- ir a su cuenta y activar la seguridad que funcionará