web-dev-qa-db-fra.com

Comment résoudre le problème javax.mail.AuthenticationFailedException?

Je fais une sendMailServlet avec JavaMail. J'ai javax.mail.AuthenticationFailedException sur ma sortie. Est-ce que quelqu'un peut m'aider s'il vous plait? Merci.

code sendMailServlet:

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

Sortie sur 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
16
jl.

Vous devez implémenter un Authenticator

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

Maintenant, utilisez-le dans la Session

Session session = Session.getInstance(props, new GMailAuthenticator(username, password));

Consultez également le JavaMail FAQ

20
n002213f

Bonjour tout le monde Cette erreur provient de Google Security .... .... Ceci peut être résolu en activant Moins sécurisé.

Allez à ce lien: " https://www.google.com/settings/security/lesssecureapps " et assurez-vous que "TURN ON" puis votre application s'exécute à bon escient.

20
UmaShankar

Il me manquait cet argument d'objet authentifiant dans la ligne ci-dessous

Session session = Session.getInstance(props, new GMailAuthenticator(username, password));

Cette ligne a résolu mon problème. Je peux maintenant envoyer des messages via mon application Java. Le reste du code est simple comme ci-dessus.

2
Aaqib

Le problème est que vous créez un objet transport et utilisez sa méthode de connexion pour vous authentifier . Mais ensuite, vous utilisez une méthode static pour envoyer le message qui ignore l'authentification effectuée par l'objet.

Donc, vous devez soit utiliser la méthode sendMessage(message, message.getAllRecipients()) sur l'objet, soit utiliser un authentifiant, comme suggéré par d'autres utilisateurs, pour obtenir l'autorisation. à travers la session.

Voici le Java Mail FAQ , vous devez le lire.

0
ThePCWizard

Je voulais juste partager avec vous:
J'ai eu cette erreur après avoir changé de machine Digital Ocean (adresse IP). Apparemment, Gmail l'a reconnu comme une attaque de piratage. Après avoir suivi leurs instructions et approuvé la nouvelle adresse IP, le code est de nouveau opérationnel.

0
Zack S