错误:trustAnchors parameter must be non-empty

问题描述

之前使用spring mail时的ssl都是false,放到服务器上后改为true就出现了这样的问题:

image

尝试修改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,谷歌后,给出的解决方案有:

  1. 替换/更新运行环境java的cacert文件为最新jdk下的cacert文件
  2. 重新加载ca-certificates-java文件
  3. 更新OpenJDK中的update-java-alternatives
  4. 修改java.security中的keystore.type为jks
  5. 替换mvn文件
  6. (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               # 是否开启邮件发送的调试模式(可选)
posted @ 2025-01-20 16:57  A07_xxxx  阅读(341)  评论(0)    收藏  举报