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