我正在尝试通过我们的私人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和电子邮件地址时,它可以正常使用
如何修复此异常?
答案 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中所述}}