从VPS发送邮件时Javamail:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException
我遇到以下问题。我有一个Seam Web应用程序,它具有电子邮件组成和使用Javamail发送的功能。该应用程序在我本地的JBoss应用程序服务器中发送邮件很好,但它不适用于安装在myhosting.com VPS中的JBoss服务器。我知道这个问题可能是因为我尝试连接的Web服务器或URL没有来自授权CA的有效证书,但我运行了一个实用程序(http://cold-caffein.blogspot.com/2011/07/looks-like-article-no-more-unable-to.html),该实用程序允许我验证证书并显示它们没问题(我正在连接到Gmail)。从VPS发送邮件时Javamail:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException
设置会话属性相关的代码如下:
props.put("mail.smtp.auth", "true");
props.setProperty("mail.smtp.starttls.enable", "true");
,我读了另一个原因问题可以使用mail.smtp.starttls.enable设置为true,但代码不工作所有(在本地服务器或VPS中),如果我省略第二行或将该属性设置为false。
我不知道这个问题是否与myhosting提供的mail2web邮件服务有关(请查看下面提供的两个日志中的第9行,这是事情开始不同的地方)。这里是当地的JavaMail日志和VPS”服务器日志(后者表示我得到的错误):
本地日志:
18:57:31,129 INFO [STDOUT] DEBUG: setDebug: JavaMail version 1.4ea
18:57:31,227 INFO [STDOUT] DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
18:57:31,383 INFO [STDOUT] DEBUG SMTP: useEhlo true, useAuth true
18:57:31,384 INFO [STDOUT] DEBUG SMTP: useEhlo true, useAuth true
18:57:31,384 INFO [STDOUT] DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 25, isSSL false
18:57:31,677 INFO [STDOUT] 220 mx.google.com ESMTP c8sm4881699yhm.14
18:57:31,677 INFO [STDOUT] DEBUG SMTP: connected to host "smtp.gmail.com", port: 25
18:57:31,680 INFO [STDOUT] EHLO SOFMANSERVER
18:57:32,088 INFO [STDOUT] 250-mx.google.com at your service, [200.25.201.121]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250 PIPELINING
18:57:32,088 INFO [STDOUT] DEBUG SMTP: Found extension "SIZE", arg "35882577"
18:57:32,088 INFO [STDOUT] DEBUG SMTP: Found extension "8BITMIME", arg ""
18:57:32,088 INFO [STDOUT] DEBUG SMTP: Found extension "STARTTLS", arg ""
18:57:32,088 INFO [STDOUT] DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
18:57:32,088 INFO [STDOUT] DEBUG SMTP: Found extension "PIPELINING", arg ""
18:57:32,088 INFO [STDOUT] STARTTLS
18:57:32,212 INFO [STDOUT] 220 2.0.0 Ready to start TLS
18:57:32,803 INFO [STDOUT] EHLO SOFMANSERVER
18:57:33,829 INFO [STDOUT] 250-mx.google.com at your service, [200.25.201.121]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH
250-ENHANCEDSTATUSCODES
250 PIPELINING
18:57:33,829 INFO [STDOUT] DEBUG SMTP: Found extension "SIZE", arg "35882577"
18:57:33,829 INFO [STDOUT] DEBUG SMTP: Found extension "8BITMIME", arg ""
18:57:33,829 INFO [STDOUT] DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH"
18:57:33,829 INFO [STDOUT] DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
18:57:33,829 INFO [STDOUT] DEBUG SMTP: Found extension "PIPELINING", arg ""
18:57:33,829 INFO [STDOUT] DEBUG SMTP: Attempt to authenticate
18:57:33,829 INFO [STDOUT] AUTH LOGIN
...
和邮件发送成功地。
VPS日志:
2011-10-26 19:54:10,290 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG: setDebug: JavaMail version 1.4ea
2011-10-26 19:54:10,292 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
2011-10-26 19:54:10,335 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: useEhlo true, useAuth true
2011-10-26 19:54:10,335 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: useEhlo true, useAuth true
2011-10-26 19:54:10,335 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 25, isSSL false
2011-10-26 19:54:10,418 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) 220 xsmtp05.mail2web.com ESMTP Exim Wed, 26 Oct 2011 19:54:09 -0400
2011-10-26 19:54:10,418 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: connected to host "smtp.gmail.com", port: 25
2011-10-26 19:54:10,418 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) EHLO <my-vps-host-name>
2011-10-26 19:54:10,456 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) 250-xsmtp05.mail2web.com Hello <my-vps-host-name> [<my-vps-ip>]
250-SIZE 104857600
250-PIPELINING
250-AUTH PLAIN LOGIN
250-STARTTLS
250 HELP
2011-10-26 19:54:10,456 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: Found extension "SIZE", arg "104857600"
2011-10-26 19:54:10,456 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: Found extension "PIPELINING", arg ""
2011-10-26 19:54:10,456 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"
2011-10-26 19:54:10,456 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: Found extension "STARTTLS", arg ""
2011-10-26 19:54:10,456 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) DEBUG SMTP: Found extension "HELP", arg ""
2011-10-26 19:54:10,456 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) STARTTLS
2011-10-26 19:54:10,582 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) 220 TLS go ahead
2011-10-26 19:54:10,582 INFO [STDOUT] (http-<my-vps-ip-and-jboss-port>-15) EHLO <my-vps-host-name>
2011-10-26 19:54:10,623 ERROR [<Class that sends mail>] (http-<my-vps-ip-and-jboss-port>-15) Can't send command to SMTP host
javax.mail.MessagingException: Can't send command to SMTP host;
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
...
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
...
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
...
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
我应该怎么做才能摆脱这种错误的?
问题解决了,它既不是网络问题,也不是代码问题。我们使用的是javamail-1.4,升级到版本1.4.4后,问题消失了。
您可以在https://java.net/projects/javamail/pages/Home升级库javax.mail.jar(现在的版本是1.5.5),并添加代码:
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.trust", "*");
props.put("mail.smtp.ssl.socketFactory", sf);
是的,更新库是解决方案。通过使用Apache Commons Email,我们已经把所有这些'放在手边的属性'放在了后面。 – jpangamarca
它比java邮件更好吗? – TungHarry
它建立在JavaMail的基础之上:“Commons Email旨在提供一个用于发送电子邮件的API,它建立在Java Mail API之上,旨在简化它。” (https://commons.apache.org/proper/commons-email/)。它可以让你实际发送更少LOC的电子邮件,而不用大惊小怪。 – jpangamarca
你运行从VPS自身上述效用?这似乎是它的信任存储的问题。 – jsight