web-dev-qa-db-fra.com

javax.mail.AuthenticationFailedException: échec de la connexion, aucun mot de passe spécifié?

Ce programme tente d'envoyer un courrier électronique mais lève une exception d'exécution:

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

Pourquoi ai-je cette exception quand j'ai fourni le nom d'utilisateur et le mot de passe corrects pour l'authentification?

L'expéditeur et le destinataire ont tous deux un compte g-mail. L'expéditeur et le destinataire ont tous deux un compte g-mail. Le processus de vérification en 2 étapes de l'expéditeur est désactivé. 

C'est le code:

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);
        }
    }
}

Même après avoir donné le mot de passe, je reçois l'exception. Pourquoi n'est-ce pas authentifier?

11
Suhail Gupta

Essayez de créer un objet javax.mail.Authenticator et envoyez-le avec l'objet properties à l'objet Session. 

Authenticator Edit:

Vous pouvez modifier ceci pour accepter un nom d'utilisateur et un mot de passe et vous pouvez les stocker là où vous le souhaitez.

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;
}

Dans votre classe où vous envoyez le courrier électronique:

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

Vous devez ajouter l'authentification d'objet en tant que paramètre à la session. tel que 

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

maintenant vous n'obtiendrez pas ce genre d'exception ....

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

Votre session de courrier électronique doit comporter une instance d'authentificateur, comme indiqué ci-dessous. 

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

un exemple complet est ici http://bharatonjava.wordpress.com/2012/08/27/sending-email-using-Java-mail-api/

3
Bharat Sharma

En plus de la réponse de RMT. J'ai aussi dû modifier un peu le code. 

  1. Transport.send devrait être accédé statiquement
  2. par conséquent, transport.connect n'a rien fait pour moi, il me suffisait de définir les informations de connexion dans l'objet initial Propriétés.

voici mon exemple de méthodes send (). L'objet config est juste un conteneur de données muet.

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

Il peut être intéressant de vérifier que le compte Gmail n’a pas été verrouillé en raison de plusieurs tentatives de connexion infructueuses. Il peut être nécessaire de réinitialiser votre mot de passe. J'ai eu le même problème que vous et cela s'est avéré être la solution.

1
Andrew Calder

J'ai aussi ce problème alors ne vous inquiétez pas. Cela vient du côté du serveur de messagerie en raison d'un problème d'authentification externe. Ouvrez votre courrier et vous recevrez un courrier du serveur de messagerie vous demandant d'activer l'accessibilité. Lorsque vous avez terminé, réessayez votre programme.

1
user4083502

Même en utilisant un authentificateur, je devais définir la propriété mail.smtp.auth sur true. Voici un exemple de travail:

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

Cette erreur peut concerner des caractères de mot de passe. Si votre mot de passe contient des caractères spéciaux et que vous ajoutez également votre mot de passe dans les méthodes de classe Transport;

Par exemple 

Transport transport = session.getTransport("smtp");
transport.connect("user","passw@rd");

ou

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

vous pouvez avoir cette erreur. Parce que les méthodes de la classe Transport peuvent ne pas gérer les caractères spéciaux. Si vous ajoutez votre nom d'utilisateur et votre mot de passe dans votre message à l'aide de la classe javax.mail.PasswordAuthentication, j'espère que vous échapperez à cette erreur;

Par exemple

...
Session session = Session.getInstance(props, new javax.mail.Authenticator()
{
  protected PasswordAuthentication getPasswordAuthentication()
  {
    return new PasswordAuthentication("user", "pas$w@r|d");
  }
});

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

Activez l'option "Accès pour les applications moins sécurisées" dans le paramètre Sécurité du compte gmail.

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

Voir la ligne 9 de votre code, cela peut être une erreur; CA devrait etre:

mail.smtp.user 

ne pas

mail.stmp.user;
0
bymysidel