You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Java Mail发邮件报SSLHandshakeException多数邮件发送失败

问题诱因

SSL握手阶段远程主机关闭连接、小概率发送成功的核心原因集中在三类:

  • Spring Java Mail v3.2.2绑定的JavaMail版本老旧,对高版本TLS的支持存在缺陷。你配置的-Dhttps.protocols=TLSv1.1,TLSv1.2默认仅作用于HTTPS连接,不会自动覆盖SMTP的STARTTLS连接,大部分握手场景会默认尝试TLS 1.0等已被多数邮件服务端隐性限流拦截的版本,仅小概率协商到高版本TLS,因此出现20%的发送成功率。
  • 运营商或本地网络出口对老旧TLS版本的SMTP连接做了随机丢弃策略,也会导致概率性握手失败。
  • 旧版本JavaMail的SSL上下文复用逻辑存在bug,高并发场景下连接池复用的握手上下文失效,同样会触发概率性连接中断。
解决步骤
  1. 新增SMTP专用的TLS版本配置,弥补https.protocols不覆盖SMTP的问题,在现有的javaMailProperties配置中新增以下属性:
<prop key="mail.smtp.ssl.protocols">TLSv1.1 TLSv1.2</prop>
<prop key="mail.smtp.starttls.required">true</prop>
<!-- 如果邮件服务端支持TLSv1.3可直接加入配置 -->

如果偏好使用JVM参数配置,需要新增:

-Dmail.smtp.ssl.protocols="TLSv1.1 TLSv1.2"

注意多个TLS版本之间使用空格分隔,不是逗号。

  1. 升级JavaMail相关依赖,将Spring 3.2.2对应的JavaMail版本至少升级到com.sun.mail:javax.mail:1.6.2,该版本修复了TLS协商的多个已知缺陷,无需改动现有业务代码即可兼容。

  2. 高并发发送场景可新增SMTP连接池相关配置,避免频繁握手触发服务端限流:

<prop key="mail.smtp.connectiontimeout">10000</prop>
<prop key="mail.smtp.timeout">10000</prop>
<prop key="mail.smtp.writetimeout">10000</prop>

内容的提问来源于stack exchange,提问作者M L E

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:27:04