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

Spring Boot使用JavaMailSender发邮件报SSLHandshakeException,如何强制用TLSv1.2?

配置未生效原因

你在application.yml中配置ssl.protocols的语法本身没有错误,失效通常是两个原因:

  1. 扁平化key的写法容易因为缩进问题,导致配置没有正确映射到JavaMail的属性规则
  2. 你使用的Java 8 292版本默认禁用了旧版TLS对应的加密套件,仅指定TLS版本不足以完成握手,需要额外指定兼容的加密套件
解决方案

方案1:修正application.yml配置

推荐将邮件配置按层级展开,避免缩进错误,额外补充加密套件配置:

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: ******@gmail.com
    password: *******
    protocol: smtp
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            required: true
            enabled: true
          ssl:
            trust: smtp.gmail.com
            protocols: TLSv1.2
            # 补充兼容TLS1.2的加密套件
            ciphersuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384

如果需要排查问题,可以添加mail.debug: true配置到properties.mail.smtp下,开启后会在控制台打印完整的TLS握手日志,确认TLS版本是否正确加载。

方案2:手动配置JavaMailSender

如果配置文件仍然不生效,可以通过自定义配置类强制覆盖JavaMail属性:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;

import java.util.Properties;

@Configuration
public class MailConfig {

    @Bean
    public JavaMailSender customJavaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("smtp.gmail.com");
        mailSender.setPort(587);
        mailSender.setUsername("******@gmail.com");
        // Gmail需先开启两步验证,再生成应用专用密码填入此处
        mailSender.setPassword("*******");

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.starttls.required", "true");
        props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
        // 强制指定TLS版本
        props.put("mail.smtp.ssl.protocols", "TLSv1.2");
        // 指定兼容的加密套件
        props.put("mail.smtp.ssl.ciphersuites", "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384");
        // 调试时开启即可
        // props.put("mail.debug", "true");

        return mailSender;
    }
}

使用时直接注入customJavaMailSender替代原有自动注入的JavaMailSender即可。

注意事项
  • 不要修改JDK的jdk.tls.disabledAlgorithms配置,该配置是JDK的安全特性,移除TLSv1、TLSv1.1会降低服务整体安全等级
  • 如果你使用Gmail发信,当前Gmail已经不再支持低安全等级的账号密码登录,需要先开启谷歌账号的两步验证,生成应用专用密码后填入配置,否则会出现鉴权失败的问题

内容的提问来源于stack exchange,提问作者VishnuVS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:33:00