用Java和commons mail发送电子邮件

用Java和commons mail发送电子邮件,java,email,ssl,Java,Email,Ssl,所以我尝试用Java向我的电子邮件发送代码。我从javax.mail开始,但记得上次使用它时遇到了问题,所以我转到了ApacheCommonsMail 不过我还是犯了很多错误。在SSL上,我得到了一个java.net.SocketTimeoutException,在TLS上,我得到了一些错误: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building fai

所以我尝试用Java向我的电子邮件发送代码。我从javax.mail开始,但记得上次使用它时遇到了问题,所以我转到了ApacheCommonsMail

不过我还是犯了很多错误。在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
当我在谷歌上快速搜索时,我发现。因为我是个十足的白痴,所以我不明白答案

如何解决错误?无论是防止SSL上的超时,还是防止TLS上的其他超时


编辑:我发送电子邮件没有问题,而且
MessageException
不是我的问题,因此请停止回答。

据我所知,发送电子邮件也有类似问题

我将在
org.springframework.mail.javamail.JavaMailSenderImpl
的示例中演示。基本上有几种处理这种情况的方法。您找到的答案也会起作用,但它会在JVM级别上起作用。 我已经停止使用JVM方法,不像您发现的那样

应该怎么做

添加主机(例如,让我们看看Gmail主机:<代码> SMTP.gmail。com < /COD>)。通过将主机添加到受信任服务器,一切都开始按预期工作。在我的情况下,我必须将此主机添加到

SpringXML配置的一部分

<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>
请注意,如果是gmail,您应该从安全控制台授予相应的权限

更新 您是否有机会从的官方网站尝试以下代码:


使用版本为1.5.0-b01的库javax.mail 您可以发现有一种简单的方法来避免这种错误。这是我以前使用的一个例子,效果非常好:

        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>

javax.mail
邮件
1.5.0-b01

我遇到了同样的错误,下面是解决方法

添加此行:props.put(“mail.smtp.ssl.trust”、“smtp.gmail.com”)


参考资料:

要解决java 6中持续存在的ssl hank shake问题,请从java 7.java 7获取证书。java 7的证书文件具有忽略证书身份验证的功能

从以下Java7目录复制“cacerts”文件

C:\ProgramFiles\Java\jdk1.7.0\U 79\jre\lib\security

然后把它贴进去

C:\ProgramFiles\Java\jdk1.6.0\jre\lib\security

错误

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中缺少的根证书或中间证书。当然,如果您信任提供这些证书的主机,就可以这样做。i、 e.公司通常需要创建自己的证书供内部使用。

发布您的代码!您使用哪家邮件提供商发送邮件?@kevcodez我使用的是GMail。我不认为这一部分实际上是相关的。这正是我使用的代码(关于Commons电子邮件)。不过,没有对任何内容进行排序。您是否已这样做:考虑到您应该在安全控制台中为gmail授予相应的权限。我不明白您的意思,但我使用了正确的用户名和密码。请转到此链接并启用对您帐户的访问。这应该可以解决你的问题。我的帐户启用了两步验证,所以我有一个应用程序密码。这个答案出现在so的低质量帖子中。。。。你能对你的回答加些评论吗?解释你的逻辑,并对你的代码打算做什么给出一点注释。这将有助于OP,但也将作为未来用户的评论
 <dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</artifactId>
  <version>1.5.0-b01</version>
</dependency>
Email email = new SimpleEmail();
...

// add this line
email.getMailSession().getProperties().put("mail.smtp.ssl.trust", "smtp.gmail.com");

...
email.send();
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target