web-dev-qa-db-fra.com

Javamail n'a pas pu convertir le socket en TLS GMail

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
40
user962206
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
115
carlos

Assurez-vous que votre programme antivirus n'interfère pas et veillez à ajouter une exclusion à votre pare-feu.

21
shiva raj

J'ai désactivé l'antivirus avast pendant 10 minutes et je le fais fonctionner.

20
Shahid Abbasi

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.

7
ℛɑƒæĿ

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. "

1
Rizwan_Khan

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).

0
Miadnew

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.

0
Bill Shannon

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.

0
Catalan Cabbage

Essayez de changer le port en 465

mail.smtp.socketFactory.port=465
mail.smtp.port=465
0
trilogy

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 :)

0
nurb