将 JavaMail 与 TLS 结合使用

2022-08-31 20:25:30

我在SO上发现了关于JavaMail API和通过SMTP服务器发送邮件的其他几个问题,但没有一个讨论使用TLS安全性。我正在尝试使用JavaMail通过我的工作SMTP邮件服务器向自己发送状态更新,但它需要TLS,并且我无法在网上找到任何如何使用JavaMail访问需要TLS加密的SMTP服务器的示例。任何人都可以帮忙吗?


答案 1

实际上,我们的产品中有一些通知代码,如果可用,则使用TLS发送邮件。

您需要设置 Java 邮件属性。您只需要 TLS,但如果 SMTP 服务器使用 SSL,则可能需要 SSL。

Properties props = new Properties();
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.auth", "true");  // If you need to authenticate
// Use the following if you need SSL
props.put("mail.smtp.socketFactory.port", d_port);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

然后,您可以将此传递给 JavaMail 会话或任何其他会话实例器,如 。Session.getDefaultInstance(props)


答案 2

好帖子,行

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

如果 SMTP 服务器使用 SSL 身份验证,则为必需的,就像 GMail SMTP 服务器一样。但是,如果服务器通过 TLS 使用纯文本身份验证,则它不应该存在,因为 Java Mail 会抱怨初始连接是纯文本。

还要确保您使用的是最新版本的 Java Mail。最近,我使用了以前项目中的一些旧的Java Mail jar,并且无法使代码正常工作,因为登录过程失败了。在我升级到最新版本的Java Mail之后,错误的原因变得很清楚:它是一个javax.net.ssl.SSLHandshakeException,在旧版本的lib中没有抛出。