记录:解决部署在阿里云服务上的应用无法发送邮件的问题

560 阅读2分钟

        公司某个业务功能需要将指定时间段内的订单营收数据导出并发送到指定的邮箱,功能开发已经完成了有一段时间了,开发及测试过程中一直可以成功发送邮件,于是就将功能上线并且没在生产环境验证(这是个相当糟糕的习惯)。今天突然有人反馈说接口调用成功了,但是邮件一直没有收到,于是就开始了排查工作。

        先说明一下项目的技术栈,服务端是使用 SpringBoot 2.X ,前端使用的是Angular.js。所以项目要支持邮件发送功能,那必须就要相关的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

接下来的各种配置工作不再赘述,具体如何去做百度一下会有很多博客介绍。SpringBoot的自动配置已然是解放了各位程序员大佬的双手。一般情况下做完,项目的邮件发送相关配置会是这样的:

spring:
  mail:
    host: smtp.sina.com
    username: emailuser
    password: pwdxxxxxx
    properties:
      from: emailuser@sina.com

此时启动项目在本地的开发环境能正常的发出邮件,甚至在办公室内网的测试服务器上也能发送成功,然而发布到阿里云服务器上后就会发现,接口调用成功但是邮件并没有发出。这其实已经能说明应该是阿里云做了某些限制,经过查阅资料后得知阿里云为了防止一些垃圾邮件的收发限制了smtp邮件服务的非SSL端口(端口号是 25),那么解决问题的方法就简单明了了:我们不用25端口就行了,可以使用 smtp邮件服务的SSL端口,我选择了465端口。好吧,动手做起来,把配置文件修改一下,指定一下端口号:

spring:
  mail:
    host: smtp.sina.com
    port: 465
    # 其他配置还是一样

启动项目、调用接口,你会发现报错了,服务端告诉你:邮件服务被拒了。

        接下来继续解决问题吧,通过百度可以知道有一些具体的实现方式,但是都不是使用SpingBoot的方式去解决,直觉告诉我:这绝对不可能!SpringBoot从初版发展到现在的2.X版本不可能连邮件发送要使用SSL端口的配置都没有!再次查询资料,发现果然还是有的,需要在邮件相关配置的properties内添加一些配置内容:

spring:
  mail:
    host: smtp.sina.com
    username: emailuser
    password: pwdxxxxxx
    properties:
      from: emailuser@sina.com
      mail:
        smtp:
          ssl:
            trust: smtp.sina.com
          auth: true
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory
            port: 465
          starttls:
            enable: true
            required: true

没错,我仅仅是改了配置文件,本地开发环境启动、发送、成功。接着打包发布到线上测试环境调用接口也成功了,OK~~确认功能修复完成。