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
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
ウイルス対策プログラムが干渉していないことを確認し、ファイアウォールに除外を追加してください。
アバストウイルス対策を10分間無効にして、動作させました。
@ carlosからの最初の答えは私のために働いた:
session.getProperties().put("mail.smtp.ssl.trust", "smtp.gmail.com");
以下のプロパティをテストし、私にとっても完璧に機能しました:
session.getProperties().put("mail.smtp.starttls.enable", "true");
2つのプロパティだけでこのタイプの問題を解決しましたが、保証により両方を使用しました。
コンテキストがAndroid applicationである場合、Androidデバイスの時刻が現在の日時に設定されていることを確認してください。SSL証明書は認証されます。」
これを修正するのに役立ち、これ以前にすべてを試しましたが、インストールされたjreをJRE 1.8に設定することでした。
Eclipseでの手順:Windows> preferences> Java> installed JRE> jre1.8.0
Jdkに設定されている場合は、jreに切り替えます(これは、最新のJavaバージョン)でデフォルトで設定されることになっています。
here の説明に従って、JavaMailに付属のsmtpsendプログラムを使用してみてください。同じ方法で失敗した場合は、JDK設定またはネットワーク設定に問題があります。
これは、アプリケーションがTLSバージョンをサポートしていない場合にも発生します。SMTPホストが使用しています。
たとえば、アプリケーション(またはJava古いjavax.mail JARを使用するJava $ ===プログラム)がTLSv1.1までしかサポートしていない場合、フォールバックなしでTLSv1.2を使用するSMTPサーバーを設定しようとします。
ポートを465に変更してみてください
mail.smtp.socketFactory.port=465
mail.smtp.port=465
私の場合、問題は削除によって解決されました
prop.put("mail.smtp.starttls.enable", "true");
電子メールサーバーでのSSL構成エラーが原因である可能性がありますが、わかりません。メールサーバー管理者は決してそれを認めず、常にホスティングプロバイダーを非難します:)