Je fais une sendMail
Servlet
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
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
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.
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.
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.
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.