web-dev-qa-db-ger.com

Wie kann ich das Problem "javax.mail.AuthenticationFailedException" beheben?

Ich mache eine sendMailServlet mit JavaMail. Ich habe javax.mail.AuthenticationFailedException in meiner Ausgabe. Kann mir bitte jemand helfen? Vielen Dank.

sendMailServlet-Code:

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

Ausgabe auf 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.

Sie müssen eine benutzerdefinierte Authenticator implementieren.

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

Verwenden Sie es jetzt in der Session

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

Schauen Sie sich auch die JavaMail FAQ an

20
n002213f

Hallo an alle Dieser Fehler stammt von der Google-Sicherheit ..... Dies kann durch Aktivieren von Weniger sicher behoben werden.

Gehen Sie zu diesem Link: " https://www.google.com/settings/security/lesssecureapps " und machen Sie "TURN ON". Dann führt Ihre Anwendung For Sure aus.

20
UmaShankar

Dieses Argument für das Authentifizierungsobjekt fehlte in der unteren Zeile

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

Diese Zeile hat mein Problem gelöst, jetzt kann ich Mail über meine Java-Anwendung versenden. Der Rest des Codes ist genauso wie oben beschrieben.

2
Aaqib

Das Problem ist, Sie erstellen ein transport-Objekt und verwenden die Verbindungsmethode, um sich zu authentifizieren . Dann verwenden Sie eine static-Methode, um die Nachricht zu senden, die die vom Objekt ausgeführte Authentifizierung ignoriert.

Daher sollten Sie entweder die sendMessage(message, message.getAllRecipients())-Methode für das Objekt verwenden oder einen Authentifikator verwenden, wie von anderen vorgeschlagen, um die Berechtigung zu erhalten durch die Sitzung.

Hier ist die Java Mail FAQ , die Sie lesen müssen.

0
ThePCWizard

Ich wollte nur mit Ihnen teilen:
Ich habe diese Fehlermeldung erhalten, nachdem ich die Digital-Ocean-Maschine (IP-Adresse) geändert habe. Offenbar erkannte Gmail es als Hackerangriff. Nachdem Sie die Anweisungen befolgt und die neue IP-Adresse bestätigt haben, ist der Code wieder verfügbar.

0
Zack S

Wenn Sie versuchen, sich von Ihrem neuen Gerät oder Ihrer neuen Anwendung aus in Ihrem Google-Konto anzumelden, müssen Sie CAPTCHA entsperren. Um das CAPTCHA zu entsperren, gehen Sie zu https://www.google.com/accounts/DisplayUnlockCaptcha und dann zu enter image description here

Und stellen Sie auch sicher, dass weniger sichere Apps zulassenenter image description here

0
dasunse