2016-01-26 112 views
0

我想从我的Java发送电子邮件,我无法连接到我的主机。 这里我的代码:Javamail - 无法连接到SMTP主机

public class sendEmail implements Runnable{ 
    @Override 
    public void run(){ 
     try{ 
      final String username = "user", password = "pass", from = "[email protected]", to = "[email protected]"; 

      Properties props = new Properties(); 
      props.setProperty("mail.smtp.user", username); 
      props.setProperty("mail.smtp.host", "mail.host.com"); 
      props.setProperty("mail.smtp.ssl.enable", "true"); 
      props.setProperty("mail.smtp.port", "465"); 
      props.setProperty("mail.smtp.starttls.enable", "true"); 
      props.setProperty("mail.smtp.debug", "true"); 
      props.setProperty("mail.smtp.auth", "true"); 
      props.setProperty("mail.smtp.socketFactory.port", "465"); 
      props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
      props.setProperty("mail.smtp.socketFactory.fallback", "false"); 
      Authenticator auth = new SMTPAuthenticator(); 
      Session session = Session.getInstance(props, auth); 
      session.setDebug(true); 

      Message msg = new MimeMessage(session); 
      try{ 
       msg.setSubject("Test SMTP"); 
       msg.setFrom(new InternetAddress(from)); 
       msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); 
       Transport transport = session.getTransport("smtp"); 
       transport.connect("mail.itbuntuksemua.com", username, password); 
       transport.sendMessage(msg, msg.getAllRecipients()); 
       transport.close(); 
       System.out.println("Done"); 
      }catch(MessagingException | NumberFormatException | HeadlessException ex){ 
       ex.printStackTrace(); 
      } 
     }catch(UnknownHostException | NumberFormatException ex){ 
      ex.printStackTrace(); 
     } 
    } 
} 

,在这里我SMTPAuthenticator()代码:

private class SMTPAuthenticator extends javax.mail.Authenticator { 
    @Override 
    public PasswordAuthentication getPasswordAuthentication() { 
     String username = "user"; 
     String password = "pass"; 
     return new PasswordAuthentication(username, password); 
    } 
} 

,并在这里再次,我的报告的错误:

DEBUG:setDebug:JavaMail的版本1.4.7 DEBUG :getProvider()返回javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle] DEBUG SMTP:useEhlo true,useAuth true DEBUG SMTP:尝试连接到主机“mail.host.com”,端口465,isSSL为true javax.mail.MessagingException:无法连接到SMTP主机:mail.host.com,端口:465; 嵌套的异常是: javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的证书路径,请求目标 at com。 sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1961) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654) at javax.mail.Service.connect(Service.java: 295) at javax.mail.Service.connect(Service.java:176) at scam.ccChecker $ sendEmail.run(ccChecker.java:186) at java.lang.Thread.run(Thread.java:745) 引起:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun .security.provider.certpath.SunCertPathBuilderException:在sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl。)上无法找到有效的证书路径到要求的目标 。 java:1937) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296) at sun.security.ssl.ClientHandshaker。 server.certificate(ClientHandshaker.java:1478) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:957) at sun.security。 ssl.Handshaker.process_record(Handshaker.java:892) at sun.security.ssl.SSLSocketImpl.readRecord(SSL Socket.mpl.java:1050) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391) at sun.security.ssl。 SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375) at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549) at com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:354) at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:211) at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927) ... 5更多 引起: sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) 处于sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) sun.security.validator处的请求目标 的有效证书路径.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324) at sun.security.ssl.X509TrustManagerImpl。checkTrusted(X509TrustManagerImpl.java:229) 在sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) 在sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460) ... 16个 原因:sun.security.provider.certpath.SunCertPathBuilderException:无法找到有效的证书路径到要求的目标 at sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145) at sun.security.provider .certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:131) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382) ... 22更多

有人可以帮我吗? :(

+0

看起来像(猜测)他们正在使用自签名证书。 –

+0

[PKIX路径构建失败的可能重复:无法找到所需目标的有效证书路径](http://stackoverflow.com/questions/4062307/pkix-path-building-failed-unable-to-find-valid-certification -path-to-requested) – rjdkolb

+0

您可能没有该邮件服务器的证书。 – Just1689

回答

0

也许你可以尝试设置证书,访问SMTP端口类似的东西:

System.setProperty("javax.net.ssl.trustStore","key"); 
System.setProperty("javax.net.ssl.trustStorePassword","password"); 
+0

我如何获得'trustStore'键? –

+0

您需要生成它。有文章如何做到这一点。 –

+0

我得到了这个(https://docs.oracle.com/cd/E19509-01/820-3503/6nf1il6er/index.html)。但我不明白 –

2

你可能想尝试下载证书,使用密钥工具安装它,然后将它们设置为系统。变量方法如下:

  1. 转到Firefox浏览器的网址,点击HTTPS证书链(旁边的URL地址),单击"more info" > "security" > "show certificate" > "details" > "export.."皮卡名称,然后选择文件类型example.der现在你有文件,密钥存储和。您必须将其添加到JVM
  2. 找到文件$JAVA_HOME/jre/lib/security/cacerts
  3. 导入example.der文件到cacerts文件中使用以下:

    sudo keytool -import -alias example -keystore $JAVA_HOME/jre/lib/security/cacerts -file example.der 
    
  4. 默认密钥库密码为 'changeit'

  5. 您可以查看更改,你用这个显示证书指纹的命令做出的。

    keytool -list -keystore cacerts 
    
  6. 如果这不能解决问题,请尝试将这些Java选项参数:

    -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts" 
    -Djavax.net.ssl.trustStorePassword="changeit" 
    
  7. 或者你可以把它们作为系统变量在Java代码:

    System.setProperty("javax.net.ssl.trustStore","/usr/lib/jvm/java-1.7.0-openjdk-amd64/jre/lib/security/cacerts"); 
    System.setProperty("javax.net.ssl.trustStorePassword","changeit"); 
    

更多说明可以在这里找到:https://stackoverflow.com/a/36427118/1696153

+1

谢谢你的回答,我用这个'System.setProperty(“javax.net.ssl.trustStore”,“*”);'和它的作品很适合我。 –

相关问题