3

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

4

2 回答 2

6

带有 Gmail 的 JavaMail的官方示例使用 SMTPS(即专用端口上的 SSL/TLS 上的 SMTP)而不是 STARTTLS。本质上,使用 JavaMail 的属性应该是mail.smtps.*而不是mail.smtp.*.

SSLSocketFactory如果您想强制使用特定版本的 SSL/TLS,例如TLSv1.0 ,您需要创建SSLSocketFactory自己sslSocket.setEnabledProtocols(new String[] { "TLSv1" })的插座。

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

为了防止 MITM 攻击,您还需要让客户端验证服务器主机名:您需要设置mail.smtps.ssl.checkserveridentitytrue,因为它似乎是false默认的。

于 2012-08-26T15:00:23.373 回答
0

作为记录,根据布鲁诺斯的回答:

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 :-)

于 2012-08-26T19:02:24.300 回答