Javamail和TLS? (不是STARTTLS)

时间:2012-08-26 12:40:35

标签: java javamail ssl

我需要使用Javamail和TLS发送电子邮件(不是STARTTLS,而是专用于SSL / TLS的专用smtp端口!)。我只设法找到gmail的例子,但是使用STARTTLS。有人可以发一个正常SSL / TLS的例子吗?非常感谢你!

2 个答案:

答案 0 :(得分:5)

official examples for JavaMail with Gmail使用SMTPS(即专用端口上的SMTP over SSL / TLS)而非STARTTLS。实质上,使用JavaMail的属性应该是mail.smtps.*而不是mail.smtp.*

如果要强制使用特定版本的SSL / TLS,例如TLSv1.0,则需要创建自己的SSLSocketFactory,可能包含默认SSLSocketFactory(或其他任何内容)会定制),但你需要在返回套接字之前调用sslSocket.setEnabledProtocols(new String[] { "TLSv1" })

您需要通过SSLSocketFactory配置属性将mail.smtps.ssl.socketFactory作为实例传递,或者通过mail.smtps.ssl.socketFactory.class传递为完全限定的类名(在这种情况下,您必须实现一个名为getDefault)的静态方法。

要防止MITM攻击,您还需要让客户端验证服务器主机名:您需要将mail.smtps.ssl.checkserveridentity设置为true,因为默认情况下它似乎是false

答案 1 :(得分:0)

对于记录,根据Brunos回答:

private static void sendMailSSL(String host, int port, String user, String pass, String to, String from, String subj, String message) throws UnsupportedEncodingException, MessagingException
{
    Properties props = System.getProperties();
    props.put("mail.smtps.ssl.checkserveridentity", true);       

    Session session = Session.getDefaultInstance(props, null);       
    MimeMessage msg = new MimeMessage(session);


    msg.setFrom(new InternetAddress(from, from));
    msg.addRecipients(RecipientType.TO, to);
    msg.setSubject(subj);
    msg.setText(message);


    Transport t = session.getTransport("smtps");
    try {
        t.connect(host, port, user, pass);  
        t.sendMessage(msg, msg.getAllRecipients());
    } finally {
        t.close();
    }
}

请注意,我没有测试checkserveridentity是否真的被考虑过。至少它确实使用SSL: - )