Spring-本地可以发送邮件,服务器无法发送邮件问题

1. 问题背景

1.1 Maven依赖

        
            org.springframework.boot
            spring-boot-starter-mail
            2.1.6.RELEASE
        

1.2 Yaml配置 

spring:
  mail:
    host: smtp.qiye.aliyun.com
    username: xxxxxx
    password: xxxxxx
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

2. 问题描述

按照Spring邮件正常配置后,本地测试可以发送邮件,但是部署至服务器后,出现无法连接smtp.qiye.aliyun.com:25端口(默认是SMTP协议)。按照官方的推荐应该是可以连接25端口的。

Spring-本地可以发送邮件,服务器无法发送邮件问题_第1张图片

3. 如何解决

 问题的原因其实是阿里云服务器默认是不开放25端口的,所以无法连接上,那为什么我该用465端口也还是连不上呢?那是因为465端口是加密的,需要走ssl,本身除了服务器开放这个端口之外,本地还要配置如下:

spring:
  mail:
    properties:
      mail:
        smtp:
          ssl:
            enabled: true

开启ssl配置后,默认走的端口就是465端口。 

4. 源码

4.1 开通SSL配置后,默认走的端口为465,且使用的是SSL传输

我使用的是SMTP协议。

// com.sun.mail.smtp.SMTPTransport#SMTPTransport(javax.mail.Session, javax.mail.URLName, java.lang.String, boolean)
protected SMTPTransport(Session session, URLName urlname, String name, boolean isSSL) {
        // ...
        if (!isSSL) {
            isSSL = PropUtil.getBooleanProperty(props, "mail." + name + ".ssl.enable", false);
        }

        if (isSSL) {
            this.defaultPort = 465;
        } else {
            this.defaultPort = 25;
        }

        this.isSSL = isSSL;
        // ...
    }

5. FAQ

5.1 SSL

SSL是为保障双方信息传输的安全。

  • 客户端向服务器端索要并验证公钥
  • 双方协商生成"对话密钥"
  • 双方采用"对话密钥"进行加密通信

5.2 SMTP

  • 建立连接:在这一阶段,SMTP客户请求与服务器的25端口建立一个TCP连接。一旦连接建立,SMTP服务器和客户就开始相互通告自己的域名,同时确认对方的域名
  • 邮件传送:利用命令,SMTP客户将邮件的源地址、目的地址和邮件的具体内容传递给SMTP服务器,SMTP服务器进行相应的响应并接收邮件
  • 连接释放:SMTP客户发出退出命令,服务器在处理命令后进行响应,随后关闭TCP连接

6. 参考资料

【SpringBoot中发送邮件-本地发送成功,部署到阿里云发送不了】

【SpringBoot项目本地可以发送邮件,部署到阿里云服务器发送邮件失败的解决方法】

【SSL/TLS协议运行机制的概述】

你可能感兴趣的:(问题,Spring)