所以我正在尝试使用Java向我的电子邮件发送代码。我从javax.mail开始,但记得我上次使用它时遇到了问题所以我转到了Apache Commons Mail。
我收到了一堆错误。在SSL上,我得到java.net.SocketTimeoutException
,在TLS上,我遇到了一些错误:
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:2000)
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
当我快速进行谷歌搜索时,我找到了this question。现在因为我是一个完全白痴,我不明白答案。
我该怎么做才能解决错误?是否阻止SSL上的超时或TLS上的其他超时。
编辑:我发送电子邮件时没有问题,MessageException
不是我的问题所以请停止回答。
答案 0 :(得分:2)
据我记得,发送电子邮件时遇到类似问题。
我将展示org.springframework.mail.javamail.JavaMailSenderImpl
的示例。基本上有几种处理这种情况的方法。您找到的答案也可以,但它可以在JVM级别上运行。
我已经停止了像你发现的JVM方法。
添加主机(例如,让我们看一下gmail主机:smtp.gmail.com
)。通过向受信任的主机添加主机 - 一切都按预期开始工作。在我的情况下,我必须将此主机添加到
Part of spring xml configuration
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${mail.host}"/>
<property name="port" value="${mail.port}"/>
<property name="username" value="${mail.username}"/>
<property name="password" value="${mail.password}"/>
<property name="javaMailProperties">
<props>
<prop key="mail.transport.protocol">${mail.transport.protocol}</prop>
<prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
<prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
<prop key="mail.smtp.ssl.trust">${mail.smtp.ssl.trust}</prop>
</props>
</property>
</bean>
Properties file
mail.host=smtp.gmail.com
mail.port=587
mail.username=user@gmail.com
mail.password=password
mail.transport.protocol=smtp
mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.smtp.ssl.trust=smtp.gmail.com
考虑到您应该从安全控制台中 gmail 提供相应的权限。
您是否有机会在Apache Common Email的官方网站上试用以下代码:
Email email = new SimpleEmail();
email.setHostName("smtp.googlemail.com");
email.setSmtpPort(465);
email.setAuthenticator(new DefaultAuthenticator("username", "password"));
email.setSSLOnConnect(true);
email.setFrom("user@gmail.com");
email.setSubject("TestMail");
email.setMsg("This is a test mail ... :-)");
email.addTo("foo@bar.com");
email.send();
答案 1 :(得分:0)
将库javax.mail与版本1.5.0-b01一起使用 你会发现有一种简单的方法可以避免这种错误。这是我前一段时间使用过的例子,它的工作原理非常好:
Properties props = new Properties();
MailSSLSocketFactory socketFactory = new MailSSLSocketFactory();
socketFactory.setTrustAllHosts(true);
props.put("mail.imaps.ssl.socketFactory", socketFactory);
如果您正在使用maven,则可以添加此依赖项:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.5.0-b01</version>
</dependency>
答案 2 :(得分:0)
我遇到了同样的错误,这是解决方案
添加以下行:props.put(“mail.smtp.ssl.trust”,“smtp.gmail.com”);
参考:http://javainfinite.com/java/send-email-using-gmail-in-java/
答案 3 :(得分:0)
解决ssl hank shake问题持续存在于java 6.get certificateds from java 7.java 7中的证书文件具有忽略证书身份验证的能力。
复制&#34; cacerts&#34;来自以下java 7目录的文件
C:\ Program Files \ Java \ jdk1.7.0_79 \ jre \ lib \ security
并将其粘贴到
中C:\ Program Files \ Java \ jdk1.6.0 \ jre \ lib \ security
答案 4 :(得分:0)
Email email = new SimpleEmail();
...
// add this line
email.getMailSession().getProperties().put("mail.smtp.ssl.trust", "smtp.gmail.com");
...
email.send();
答案 5 :(得分:0)
错误
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
是证书链坏了。这意味着提供者可能正在使用客户端系统不信任的自签名证书。 受信任的证书存储在 C:\Program Files\Java\jdk1.6.0\jre\lib\security 中的 cacerts 中,如上述答案所述。
对此的解决方案可能是将缺少的根证书或中间证书添加到 cacerts。当然,如果您信任提供这些证书的主机,您就会这样做。即通常公司会创建自己的证书供内部使用。