使用SpringBoot + JavaMailSender 发送邮件报错 Mail server connection failed;Could not connect to SMTP host

报错信息如下:

java

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 465, response: -1. Failed messages: javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 465, response: -1

解决办法:

在 application.yml 中将邮件配置为 SSL 连接

yml

spring:
  mail:
    host: smtp.qq.com
    username: 你的邮箱账号
    password: 你的邮箱授权码(QQ邮箱)
    port: 465
    protocol: smtp
    default-encoding: utf-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
          ssl:
            enable: true
          socketFactory:
            port: 465
            class: javax.net.ssl.SSLSocketFactory

如果你使用的是 properties 文件,应该修改为:

properties

# JavaMailSender 配置
spring.mail.host=smtp.qq.com
spring.mail.username=你的邮箱账号
spring.mail.password=你的邮箱授权码(QQ邮箱)
spring.mail.port=465
spring.mail.default-encoding=utf-8
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# SSL 配置
spring.mail.protocol=smtp
spring.mail.properties.mail.smtp.ssl.enable=true
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory

推荐一个 yml、properties 文件在线转换的网站 在线yaml转properties-在线properties转yaml-ToYaml.com

 

来源:https://www.cnblogs.com/songjilong/p/12577010.html

<think>嗯,用户现在的问题是遇到551错误,也就是非SSL登录被拒绝。他们之前提到了在Spring配置文件中配置邮件服务,现在想知道如何在YAML文件中正确配置邮件设置来避免这个问题。我需要结合之前给出的JavaMail配置步骤,转换成Spring Boot的application.yml格式。 首先,用户引用了Spring的XML配置和application.properties,但用户实际需要的是YAML配置。之前回答中提到了两种方案:直接SSL(端口465)和STARTTLS(端口587)。现在需要将这些属性转换为YAML结构。 记得在YAML中,属性路径是用点号分隔的,层级用缩进表示。比如mail.smtp.ssl.enable在YAML里应该是spring.mail.properties.mail.smtp.ssl.enable。这是因为Spring Boot邮件配置通常以spring.mail开头,而额外的JavaMail属性放在spring.mail.properties下。 需要确认用户用的是Spring Boot邮件自动配置,所以host、username、password这些基本配置应该在spring.mail下。然后,针对SSL或STARTTLS的设置,作为属性添加进去。例如,直接SSL需要设置ssl.enable为true,端口设为465。而STARTTLS则是starttls.enable和required设为true,端口587。 另外,用户可能需要处理自签名证书的问题,这时候可能需要配置JVM参数或者信任库,但在YAML中可能无法直接设置,需要额外提示用户如何处理,比如通过命令行参数或JKS文件导入。 还要注意检查常见的错误,比如端口是否正确,防火墙是否开放,以及用户名密码是否正确。同时,可以建议用户启用调试日志来查看连接过程,确认SSL是否生效。 用户可能对YAML的结构不太熟悉,所以需要明确展示两种方案的配置示例,并解释每个参数的作用。比如,在方案A中,直接SSL需要指定端口465,启用SSL,并防止回退到非加密连接。方案B则是使用587端口,启用STARTTLS并强制要求加密。 最后,提醒用户测试配置是否有效,可以通过发送测试邮件或检查日志来确认SSL连接是否成功建立。如果有证书问题,可能需要额外步骤,这在之前的回答中已经提到过,需要在这里简要提及并提供引用链接。</think>### 基于Spring Boot的YAML邮件配置解决方案 以下是针对 `551 Rejected login by non-SSL` 错误的完整YAML配置方案,覆盖**直接SSL**和**STARTTLS**两种加密模式: --- #### **方案A:直接SSL模式(端口465)** ```yaml spring: mail: host: smtp.example.com # SMTP服务器地址 port: 465 # SSL专用端口 username: your@email.com password: your_password protocol: smtps # 必须使用smtps协议 properties: mail.smtp.ssl.enable: true # 强制SSL加密[^1] mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory # SSL套接字工厂 mail.smtp.socketFactory.fallback: false # 禁用非加密回退 mail.smtp.auth: true # 启用认证 mail.debug: true # 建议开启调试日志 ``` --- #### **方案B:STARTTLS模式(端口587)** ```yaml spring: mail: host: smtp.example.com port: 587 # STARTTLS标准端口 username: your@email.com password: your_password properties: mail.smtp.starttls.enable: true # 启用STARTTLS升级[^2] mail.smtp.starttls.required: true # 强制要求加密 mail.smtp.auth: true mail.debug: true ``` --- ### **关键参数解析** | 参数 | 作用 | 典型值 | |------|------|-------| | `spring.mail.protocol` | 协议类型选择 | `smtps`(SSL)或`smtp`(STARTTLS) | | `mail.smtp.ssl.enable` | 直接SSL开关 | `true`/`false` | | `mail.smtp.starttls.enable` | STARTTLS升级开关 | `true`/`false` | | `mail.debug` | 输出SMTP握手过程 | `true`可验证加密是否生效 | --- ### **证书问题处理(自签名证书场景)** 若服务器使用自签名证书,需在JVM启动参数中添加信任配置: ```bash java -Dmail.smtp.ssl.trust="smtp.example.com" -jar app.jar ``` 或通过YAML显式声明信任主机: ```yaml spring: mail: properties: mail.smtp.ssl.trust: smtp.example.com # 绕过证书校验(仅限测试环境) ``` --- ### **配置验证方法** 1. **查看调试日志**: 当`mail.debug: true`时,日志中应出现: ```log DEBUG SMTP: STARTTLS command received DEBUG SMTP: Negotiating TLS connection with host smtp.example.com ``` 或 ```log DEBUG SMTP: Using SSL socket factory for connection ``` 2. **发送测试邮件**: 注入`JavaMailSender`进行测试: ```java @Autowired private JavaMailSender mailSender; public void sendTestMail() { SimpleMailMessage message = new SimpleMailMessage(); message.setTo("test@example.com"); message.setSubject("SSL测试"); message.setText("TLS连接成功"); mailSender.send(message); } ``` --- ### **常见错误修复** | 错误现象 | 解决方案 | |---------|---------| | `javax.net.ssl.SSLHandshakeException` | 添加`mail.smtp.ssl.trust`或导入证书到JVM信任库[^3] | | `Could not connect to SMTP host` | 检查防火墙是否开放465/587端口 | | `Authentication failed` | 确认`username/password`与SMTP服务商提供的凭据一致 | --- ### 相关问题 1. 如何在Spring Boot中动态切换邮件配置(如多租户场景)? **答**:通过`@ConfigurationProperties`绑定多组配置,使用`JavaMailSenderImpl`动态构建发送实例[^4]。 2. YAML配置与传统的`mail.properties`有何差异? **答**:YAML通过层级结构替代点分隔符,例如`mail.smtp.ssl.enable`对应`spring.mail.properties.mail.smtp.ssl.enable`。 3. 如何为不同的邮件服务商(Gmail/QQ/企业邮箱)配置参数? **答**:核心参数保持一致,主要差异在`host`和`port`: ```yaml # Gmail配置示例 spring: mail: host: smtp.gmail.com port: 465 protocol: smtps ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值