web-dev-qa-db-ja.com

JavamailはソケットをTLS GMailに変換できませんでした

GmailのSMTPサーバー経由でJavaMailを使用してメールを送信しようとしています。ただし、このコード。

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

このエラーを返します

Could not convert socket to TLS;

完全なスタックトレース

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

ウイルス対策プログラムが干渉していないことを確認し、ファイアウォールに除外を追加してください。

21
shiva raj

アバストウイルス対策を10分間無効にして、動作させました。

20
Shahid Abbasi

@ carlosからの最初の答えは私のために働いた:

session.getProperties().put("mail.smtp.ssl.trust", "smtp.gmail.com");

以下のプロパティをテストし、私にとっても完璧に機能しました:

session.getProperties().put("mail.smtp.starttls.enable", "true");

2つのプロパティだけでこのタイプの問題を解決しましたが、保証により両方を使用しました。

7
ℛɑƒæĿ

コンテキストがAndroid applicationである場合、Androidデバイスの時刻が現在の日時に設定されていることを確認してください。SSL証明書は認証されます。」

1
Rizwan_Khan

これを修正するのに役立ち、これ以前にすべてを試しましたが、インストールされたjreをJRE 1.8に設定することでした。

Eclipseでの手順:Windows> preferences> Java> installed JRE> jre1.8.0

Jdkに設定されている場合は、jreに切り替えます(これは、最新のJavaバージョン)でデフォルトで設定されることになっています。

0
Miadnew

here の説明に従って、JavaMailに付属のsmtpsendプログラムを使用してみてください。同じ方法で失敗した場合は、JDK設定またはネットワーク設定に問題があります。

0
Bill Shannon

これは、アプリケーションがTLSバージョンをサポートしていない場合にも発生します。SMTPホストが使用しています。

たとえば、アプリケーション(またはJava古いjavax.mail JARを使用するJava $ ===プログラム)がTLSv1.1までしかサポートしていない場合、フォールバックなしでTLSv1.2を使用するSMTPサーバーを設定しようとします。

0
Catalan Cabbage

ポートを465に変更してみてください

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

私の場合、問題は削除によって解決されました

prop.put("mail.smtp.starttls.enable", "true");

電子メールサーバーでのSSL構成エラーが原因である可能性がありますが、わかりません。メールサーバー管理者は決してそれを認めず、常にホスティングプロバイダーを非難します:)

0
nurb