无法连接到SMTP主机

时间:2014-03-24 13:48:55

标签: java email ssl

我正在尝试通过我们的私人smtp服务器发送电子邮件,这是我的代码

  public static void main(String args[]) throws MessagingException {
  Properties props = System.getProperties();
        props.put("mail.smtps.host", "gi-systems.net");
        props.put("mail.smtps.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.port", "25");
        Session session = Session.getInstance(props, null);
        Message msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress("xxxx@gi-systems.net"));
        msg.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("yyyy@hotmail.com, false));
        msg.setSubject("Password Recovery");
        msg.setText(pwd);
        msg.setSentDate(new Date());
        SMTPTransport t = (SMTPTransport) session.getTransport("smtps");
        t.connect("smtp.gi-systems.net", "xxxx@gi-systems.net", "mypassword");
        t.sendMessage(msg, msg.getAllRecipients());
        System.out.println("Response: " + t.getLastServerResponse());
        t.close();
}

但是当我运行此代码时,我得到了这个异常

Exception in thread "main" javax.mail.MessagingException: Could not connect to SMTP host: smtp.gi-systems.net, 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:1706)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
    at javax.mail.Service.connect(Service.java:291)
    at javax.mail.Service.connect(Service.java:172)
    at com.mycompany.sendmail.App.SendEmail(App.java:45)
    at com.mycompany.sendmail.App.main(App.java:64)
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:1886)
......

Ps:当我使用gmail smtp和电子邮件地址时,它可以正常使用

如何修复此异常?

4 个答案:

答案 0 :(得分:1)

检查以下事项:

例如Gmail。

1

t.connect("smtp.gmail.com", "mailID", "Password");

2.Properties:

props.put("mail.smtp.auth", "true");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.host", "smtp.gmail.com");  //For Gmail 'smtp.gmail.com' check carefully for Yours               
props.put("mail.smtp.port","587");//or port 465

请检查您的情况。

设置属性或身份验证似乎有问题。

答案 1 :(得分:0)

您确定端口地址和主机是否准确无误。我认为对于SMTPS,一般使用587或465端口

由于

答案 2 :(得分:0)

添加协议。

props.put("mail.transport.protocol", "smtps");

问候。

答案 3 :(得分:0)

  

无法找到所请求目标的有效证书路径

这意味着您使用的证书代理机构未知。尝试使用openssl可以:

$ openssl s_client -connect smtp.gi-systems.net:465
...
Certificate chain
 0 s:/C=--/ST=France/L=Roubaix/O=OVH/OU=--/CN=ns317329.ip-37-187-133.eu/emailAddress=root@ns317329.ip-37-187-133.eu
   i:/C=--/ST=France/L=Roubaix/O=OVH/OU=--/CN=ns317329.ip-37-187-133.eu/emailAddress=root@ns317329.ip-37-187-133.eu
...
    Verify return code: 18 (self signed certificate)

因此,您使用的是自签名证书,当然无法通过java验证。 我不确定您是否可以通过指纹验证自签名证书,否则您可能需要创建自己的小型CA(或使用cacert.org或类似的)并将CA导入为受信任的,如{{3中所述}}