我有一个本地邮件服务器(hMailServer)与SSL(端口465)和自签名证书.
域名是"foobar.com"
我设置了我Properties
的启用ssl,禁用auth,并信任任何主机
props.put("mail.smtp.auth", "false"); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.ssl.trust", "*");
如果我通过静态呼叫发送消息,则Transport.send()
电子邮件将被发送.
如果我尝试transport
从会话中获取实例,那么我得到
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
静态调用如何避免SSLHandshakeException?
这是我的测试人员代码:
public static void main(String[] args) throws Exception { Properties props = new Properties(); props.put("mail.smtp.host", "127.0.0.1"); props.put("mail.debug", "false"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.timeout", "60000"); props.put("mail.smtp.auth", "false"); props.put("mail.smtp.sendpartial", "true"); props.put("mail.smtp.ssl.enable", "true"); props.put("mail.smtp.ssl.trust", "*"); Session session = Session.getInstance(props); Message message = new MimeMessage(session); message.setFrom(new InternetAddress("mrFoo@foobar.com")); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("you@foobar.com")); message.setSubject("Just a Test " + new Date()); message.setText("Hello World"); //Comment and uncomment to test Transport.send(message, message.getAllRecipients()); //Transport t = session.getTransport("smtps"); //t.connect(); //t.sendMessage(message, message.getAllRecipients()); //t.close(); }
这是一个隐藏在外面的本地系统,所以我不担心中间人攻击生成自己的证书绕过SSL握手......
你要求"smtps"运输.您设置"smtp"传输的属性.由于您已将"mail.smtp.ssl.enable"属性设置为"true",因此您可以要求"smtp"传输,它将使用SSL.