错误:trustAnchors parameter must be non-empty
问题描述
之前使用spring mail时的ssl都是false,放到服务器上后改为true就出现了这样的问题:

尝试修改587端口、465端口,甚至触发了:
- Mail server connection failed; nested exception is jakarta.mail.MessagingException: Could not convert socket to TLS
- PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
等错误,拷打GPT,谷歌后,给出的解决方案有:
- 替换/更新运行环境java的cacert文件为最新jdk下的cacert文件
- 重新加载ca-certificates-java文件
- 更新OpenJDK中的update-java-alternatives
- 修改java.security中的keystore.type为jks
- 替换mvn文件
- (gpt一直推荐我)把服务器的证书链使用keytool手动添加到cacerts中,但是我一直没搞明白这是怎么实现的
但是这些方法对我都没有用。
解决方法
后来看到一个帖子中的:
https://stackoverflow.com/questions/16115453/javamail-could-not-convert-socket-to-tls-gmail
在yml配置中添加了ssl.trust配置,就可以顺利运行了。163、qq的smtp服务都可以。
具体配置为:
spring:
mail:
host: smtp.qq.com # 邮件服务器地址
username: 你的邮箱 # 邮件发送者的邮箱用户名
password: 你的授权码 # 邮件发送者的邮箱密码(或授权码)
port: 465 # 邮件服务器端口号(465是SMTP协议的SSL端口,587端口是startssl)
default-encoding: utf-8 # 默认邮件编码格式
protocol: smtp # 邮件协议,通常是SMTP
properties: # 邮件连接的其他属性
mail:
smtp:
auth: true # 是否启用认证,设置为`true`启用SMTP认证(必需)
timeout: 30000 # 设置连接超时(单位:毫秒),防止SSL连接超时错误(可选)
connectiontimeout: 30000 # 设置连接的超时(单位:毫秒),防止连接超时错误(可选)
ssl:
enable: true # 是否启用SSL,设置为`true`启用SSL加密(必需)
trust: smtp.qq.com # 信任的主机(设置为邮件服务器地址,避免SSL错误)
debug: true # 是否开启邮件发送的调试模式(可选)

浙公网安备 33010602011771号