使用commons-mail

时间:2015-07-10 10:03:00

标签: java email ssl

所以我正在尝试使用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不是我的问题所以请停止回答。

6 个答案:

答案 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。当然,如果您信任提供这些证书的主机,您就会这样做。即通常公司会创建自己的证书供内部使用。

相关问题