首页 文章

Javamail - 无法连接到SMTP主机

提问于
浏览
0

我正在尝试从我的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版本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是真的javax.mail.MessagingException:无法连接到SMTP主机:mail.host.com,端口:465;嵌套异常是:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在com.sun.mail找到请求目标的有效证书路径.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)位于javax的javax.mail.Service.connect(Service.java:295)的com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654) . 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)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)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)com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549)com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:354)com.sun.mail .util.SocketFetcher.getSocket(SocketFetcher.java:211)at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927)... 5更多引起:sun.security.validator.Valid atorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.validator上的sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)找到所请求目标的有效证书路径 . 位于sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)sun.security.ssl的sun.security.validator.Validator.validate(Validator.java:260)的PKIXValidator.engineValidate(PKIXValidator.java:292) .X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460)... 16更多引起:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.provider.certpath的sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)找到所请求目标的有效证书路径 . SunCertPathBuilde r.engineBuild(SunCertPathBuilder.java:131)at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)... 22更多

有人能帮我吗? :(

2 回答

  • 2

    也许您可以尝试设置证书,以访问SMTP端口 . 像这样的东西:

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

    您可能想尝试下载证书,使用keytool安装它,然后将它们设置为系统变量 . 这是如何做:

    • 转到firefox浏览器中的URL,单击HTTPS证书链(URL地址旁边) . 单击 "more info" > "security" > "show certificate" > "details" > "export.." . 选取名称并选择文件类型 example.der . 现在您拥有了keystore文件,您必须将其添加到JVM中

    • 找到文件 $JAVA_HOME/jre/lib/security/cacerts

    • 使用以下内容将 example.der 文件导入 cacerts 文件:

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

    • 您可以查看使用此命令显示证书指纹所做的更改 .

    keytool -list -keystore cacerts
    
    • 如果这不能解决问题,请尝试将这些java选项添加为参数:
    -Djavax.net.ssl.trustStore="$JAVA_HOME/jre/lib/security/cacerts"
    -Djavax.net.ssl.trustStorePassword="changeit"
    
    • 或者您可以将它们作为系统变量放入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

相关问题