我需要使用 Javamail 和 TLS 发送电子邮件(不是 STARTTLS,而是专门用于 SSL/TLS 的 smtp 端口!)。我只设法找到了 gmail 的示例,但是使用了 STARTTLS。有人可以发布一个普通 SSL/TLS 的示例吗?非常感谢你!
问问题
1533 次
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.checkserveridentity
为true
,因为它似乎是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 回答