it-swarm-es.com

javax.mail.AuthenticationFailedException: no se pudo conectar, ¿no se especificó la contraseña?

Este programa intenta enviar correos electrónicos pero genera una excepción de tiempo de ejecución:

javax.mail.AuthenticationFailedException: failed to connect, no password specified?

¿Por qué recibo esta excepción cuando he proporcionado el nombre de usuario y la contraseña correctos para la autenticación?

Tanto el remitente como el receptor tienen cuentas de correo electrónico. El remitente y el receptor tienen cuentas de correo electrónico. El remitente tiene el proceso de verificación en dos pasos deshabilitado.

Este es el código:

import javax.mail.*;
import javax.mail.internet.*;
import Java.util.*;

class tester {
    public static void main(String args[]) {
        Properties props = new Properties();
        props.put("mail.smtp.Host" , "smtp.gmail.com");
        props.put("mail.stmp.user" , "username");

        //To use TLS
        props.put("mail.smtp.auth", "true"); 
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.password", "password");
        //To use SSL
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", 
            "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");


        Session session  = Session.getDefaultInstance( props , null);
        String to = "[email protected]";
        String from = "[email protected]";
        String subject = "Testing...";
        Message msg = new MimeMessage(session);
        try {
            msg.setFrom(new InternetAddress(from));
            msg.setRecipient(Message.RecipientType.TO, 
                new InternetAddress(to));
            msg.setSubject(subject);
            msg.setText("Working fine..!");
            Transport transport = session.getTransport("smtp");
            transport.connect("smtp.gmail.com" , 465 , "username", "password");
            transport.send(msg);
            System.out.println("fine!!");
        }
        catch(Exception exc) {
            System.out.println(exc);
        }
    }
}

Incluso después de dar la contraseña, obtengo la excepción. ¿Por qué no se autentica?

11
Suhail Gupta

Intente crear un objeto javax.mail.Authenticator y envíelo con el objeto de propiedades al objeto Session.

Autenticador editar:

Puede modificar esto para aceptar un nombre de usuario y contraseña y puede almacenarlos allí o donde lo desee.

public class SmtpAuthenticator extends Authenticator {
public SmtpAuthenticator() {

    super();
}

@Override
public PasswordAuthentication getPasswordAuthentication() {
 String username = "user";
 String password = "password";
    if ((username != null) && (username.length() > 0) && (password != null) 
      && (password.length   () > 0)) {

        return new PasswordAuthentication(username, password);
    }

    return null;
}

En su clase donde envía el correo electrónico:

SmtpAuthenticator authentication = new SmtpAuthenticator();
javax.mail.Message msg = new MimeMessage(Session
                    .getDefaultInstance(emailProperties, authenticator));
9
RMT

Debe agregar la autenticación de objetos como parámetro a la sesión. como

Session session = Session.getDefaultInstance(props, 
    new javax.mail.Authenticator(){
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication(
                "[email protected]", "XXXXX");// Specify the Username and the PassWord
        }
});

ahora no obtendrás este tipo de excepción ...

javax.mail.AuthenticationFailedException: failed to connect, no password specified?
10
Sowmya Vallam

Su sesión de correo electrónico debe recibir una instancia de autenticador como se muestra a continuación

Session session = Session.getDefaultInstance(props,
    new Authenticator() {
        protected PasswordAuthentication  getPasswordAuthentication() {
        return new PasswordAuthentication(
                    "[email protected]", "password");
                }
    });

un ejemplo completo está aquí http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-Java-mail-api/

3
Bharat Sharma

Además de la respuesta de RMT. También tuve que modificar un poco el código.

  1. Transport.send debe tener acceso estático
  2. por lo tanto, transport.connect no hizo nada por mí, solo necesitaba configurar la información de conexión en el objeto Propiedades inicial.

aquí están mis métodos send () de muestra. El objeto de configuración es solo un contenedor de datos tonto.

public boolean send(String to, String from, String subject, String text) {
    return send(new String[] {to}, from, subject, text);
}

public boolean send(String[] to, String from, String subject, String text) {

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.Host", config.Host);
    props.put("mail.smtp.user", config.username);
    props.put("mail.smtp.port", config.port);
    props.put("mail.smtp.password", config.password);

    Session session = Session.getInstance(props, new SmtpAuthenticator(config));

    try {
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        InternetAddress[] addressTo = new InternetAddress[to.length];
        for (int i = 0; i < to.length; i++) {
            addressTo[i] = new InternetAddress(to[i]);
        }
        message.setRecipients(Message.RecipientType.TO, addressTo);
        message.setSubject(subject);
        message.setText(text);
        Transport.send(message);
    } catch (MessagingException e) {
        e.printStackTrace();
        return false;
    }
    return true;
}
2
Kenny Cason

Puede valer la pena verificar que la cuenta de gmail no se ha bloqueado debido a varios intentos de inicio de sesión fallidos, es posible que deba restablecer su contraseña. Tuve el mismo problema que tú y resultó ser la solución.

1
Andrew Calder

También tengo este problema, así que no te preocupes. Viene del lado del servidor de correo debido a un problema de autenticación externo. Abra su correo y recibirá un correo del servidor de correo que le indica que habilite la accesibilidad. Cuando haya hecho eso, vuelva a intentar su programa.

1
user4083502

Incluso cuando usaba un Autenticador, tenía que establecer la propiedad mail.smtp.auth en true. Aquí hay un ejemplo de trabajo:

final Properties props = new Properties();
props.put("mail.smtp.Host", config.getSmtpHost());
props.setProperty("mail.smtp.auth", "true");

Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication(config.getSmtpUser(), config.getSmtpPassword());
  }
});
0
alecswan

Este error puede ser sobre caracteres de contraseña. Si su contraseña contiene caracteres especiales y también agrega su contraseña a los métodos de clase Transport;

Por ejemplo

Transport transport = session.getTransport("smtp");
transport.connect("user","[email protected]");

o

Transport.send(msg, "user", "passw%rd");

puede obtener ese error. Porque los métodos Transport class 'pueden no manejar caracteres especiales. Si agrega su nombre de usuario y contraseña en su mensaje usando la clase javax.mail.PasswordAuthentication, espero que pueda escapar de ese error;

Por ejemplo

...
Session session = Session.getInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication("user", "[email protected]|d");
  }
});

Message message = new MimeMessage(session);
...
Transport.send(message);
0
oguzhan

Active "Acceso para aplicaciones menos seguras" en la configuración de Seguridad para la cuenta de gmail. (Desde el correo), consulte el siguiente enlace para obtener referencias

http://www.ghacks.net/2014/07/21/gmail-starts-block-less-secure-apps-enable-access/

0
Prabha
import Java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("serial")
public class RegisterAction {


    public String execute() {


         RegisterAction mailBean = new RegisterAction();

           String subject="Your username & password ";

           String message="Hi," + username;
          message+="\n \n Your username is " + email;
          message+="\n \n Your password is " + password;
          message+="\n \n Please login to the web site with your username and password.";
          message+="\n \n Thanks";
          message+="\n \n \n Regards";

           //Getting  FROM_MAIL

           String[] recipients = new String[1];
            recipients[0] = new String();
            recipients[0] = customer.getEmail();

           try{
          mailBean.sendMail(recipients,subject,message);

          return "success";
          }catch(Exception e){
           System.out.println("Error in sending mail:"+e);
          }

        return "failure";
    }

    public void sendMail( String recipients[ ], String subject, String message)
             throws MessagingException
              {
                boolean debug = false;

                 //Set the Host smtp address

                 Properties props = new Properties();
                 props.put("mail.smtp.Host", "smtp.gmail.com");
                 props.put("mail.smtp.starttls.enable", true);
                 props.put("mail.smtp.auth", true);

                // create some properties and get the default Session

                Session session = Session.getDefaultInstance(props, new Authenticator() {

                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(
                                "[email protected]", "5373273437543");// Specify the Username and the PassWord
                    }

                });
                session.setDebug(debug);


                // create a message
                Message msg = new MimeMessage(session);


                InternetAddress[] addressTo = new InternetAddress[recipients.length];
                for (int i = 0; i < recipients.length; i++)
                {
                  addressTo[i] = new InternetAddress(recipients[i]);
                }

                msg.setRecipients(Message.RecipientType.TO, addressTo);

                // Optional : You can also set your custom headers  in the Email if you Want
                //msg.addHeader("MyHeaderName", "myHeaderValue");

                // Setting the Subject and Content Type
                msg.setSubject(subject);
                msg.setContent(message, "text/plain");

                //send message
                Transport.send(msg);

                System.out.println("Message Sent Successfully");
              }

}
0
Vishal Nawale

Vea la línea 9 de su código, puede ser un error; debería ser:

mail.smtp.user 

no

mail.stmp.user;
0
bymysidel