Javamail - 无法连接到 SMTP 主机

标签 java email ssl smtp

我正在尝试从我的 java 发送电子邮件,但我无法连接到我的主机。 这是我的代码:

public class sendEmail implements Runnable{
     @Override
     public void run(){
        try{
            final String username = "user", password = "pass", from = "from@mail.com", to = "to@mail.com";

            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 version 1.4.7 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "mail.host.com", port 465, isSSL true javax.mail.MessagingException: Could not connect to SMTP host: mail.host.com, port: 465; 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 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) 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 at 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.serverCertificate(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(SSLSocketImpl.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 more Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) at 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) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460) ... 16 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 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 more

有人可以帮助我吗? :(

最佳答案

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

  1. 在您的 firefox 浏览器中转到 URL,单击 HTTPS 证书链(URL 地址旁边)。单击 “更多信息”>“安全”>“显示证书”>“详细信息”>“导出..”。选择名称并选择文件类型 example.der。现在你有了带有 keystore 的文件,你必须将它添加到你的 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. 默认的 keystore 密码是“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

关于Javamail - 无法连接到 SMTP 主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35007279/

相关文章:

java - 如何用Java创建独立于平台的GUI?

java - 是否可以从输入流中读取单个字符?

c# - 获取outlook中附件的outlookItem类型

email - return-path、reply-to 和 from 之间的行为差​​异是什么?

ssl - 如何为nginx配置pem文件?

java - 如何在 Kotlin 中将日期时间字符串转换为 UTC 格式

java - 无法从匿名类更改变量

html - 如何在 html 中的电子邮件跨度之间添加空格?

postgresql - Heroku - 禁用 Postgresql SSL?

php - 在没有 SSL/OAuth 的情况下向 Wordpress 提交评论