J'essaie d'envoyer un courrier électronique à l'aide de JavaMail via le serveur SMTP de gmails. Cependant ce code.
final String username = "[email protected]";
final String password = "mygmailpassword";
Properties props = new Properties();
props.put("mail.smtp.auth", true);
props.put("mail.smtp.starttls.enable", true);
props.put("mail.smtp.Host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("[email protected]"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler,"
+ "\n\n No spam to my email, please!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
Renvoie une cette erreur
Could not convert socket to TLS;
La trace complète
Exception in thread "main" Java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Test.main(Test.Java:43)
Caused by: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.Sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.Java:1907)
at com.Sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.Java:666)
at javax.mail.Service.connect(Service.Java:317)
at javax.mail.Service.connect(Service.Java:176)
at javax.mail.Service.connect(Service.Java:125)
at javax.mail.Transport.send0(Transport.Java:194)
at javax.mail.Transport.send(Transport.Java:124)
at Test.main(Test.Java:38)
Caused by: javax.net.ssl.SSLHandshakeException: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.Sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.Java:174)
at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.Java:1649)
at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.Java:241)
at com.Sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.Java:235)
at com.Sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1206)
at com.Sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.Java:136)
at com.Sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.Java:593)
at com.Sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.Java:529)
at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.Java:893)
at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.Java:1138)
at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1165)
at com.Sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.Java:1149)
at com.Sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.Java:549)
at com.Sun.mail.util.SocketFetcher.startTLS(SocketFetcher.Java:486)
at com.Sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.Java:1902)
... 7 more
Caused by: Sun.security.validator.ValidatorException: PKIX path building failed: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:323)
at Sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.Java:217)
at Sun.security.validator.Validator.validate(Validator.Java:218)
at com.Sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.Java:126)
at com.Sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:209)
at com.Sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.Java:249)
at com.Sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.Java:1185)
... 17 more
Caused by: Sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.Java:174)
at Java.security.cert.CertPathBuilder.build(CertPathBuilder.Java:238)
at Sun.security.validator.PKIXValidator.doBuild(PKIXValidator.Java:318)
... 23 more
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
Assurez-vous que votre programme antivirus n'interfère pas et veillez à ajouter une exclusion à votre pare-feu.
J'ai désactivé l'antivirus avast pendant 10 minutes et je le fais fonctionner.
La première réponse de @ carlos a fonctionné pour moi:
session.getProperties().put("mail.smtp.ssl.trust", "smtp.gmail.com");
J'ai testé la propriété ci-dessous et a parfaitement fonctionné pour moi aussi:
session.getProperties().put("mail.smtp.starttls.enable", "true");
Les deux propriétés seules ont résolu ce type de problème, mais par garantie, j'ai utilisé les deux.
Si votre contexte est l'application Android, assurez-vous que votre heure de périphérique Android est définie sur la date et l'heure actuelles. L'exception sous-jacente est "Les certificats SSL n'étaient pas obtenir l'authentification. "
Ce qui m'a aidé à résoudre ce problème, et j'ai tout essayé avant cela, a été de configurer mon jre installé sur JRE 1.8.
Étapes dans Eclipse: Windows> Préférences> Java> JRE installé> jre1.8.0.
S'il est défini sur jdk, passez à jre (ce qui est censé être défini par défaut avec la dernière version Java version).
Essayez d’utiliser le programme smtpsend fourni avec JavaMail, comme décrit ici . Si cela échoue de la même manière, il y a un problème avec votre configuration JDK ou votre configuration réseau.
Cela peut également être le cas si l'application ne prend pas en charge la version version TLS utilisée par l'hôte SMTP.
Par exemple, essayez de configurer un serveur SMTP qui utilise TLSv1.2 sans solution de secours, lorsque votre application (ou Java utilisant un ancien fichier javax.mail JAR) ne prend en charge que jusqu’à TLSv1.1.
Essayez de changer le port en 465
mail.smtp.socketFactory.port=465
mail.smtp.port=465
Dans mon cas, le problème a été résolu par suppression la ligne
prop.put("mail.smtp.starttls.enable", "true");
C'est peut-être à cause de certaines erreurs de configuration SSL sur le serveur de messagerie, je ne suis pas sûr. Les administrateurs de serveur de messagerie ne l'admettent jamais et blâment toujours le fournisseur d'hébergement :)