如题

生产环境遇到的问题

使用端口 25 发送,在测试环境、本地开发环境都可正常发送,但是,发布到阿里云服务器上,提示无法连接到 smtp 服务器:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
org.springframework.mail.MailSendException: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.qq.com, 25; timeout 5000;
nested exception is:
java.net.SocketTimeoutException: connect timed out. Failed messages: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.qq.com, 25; timeout 5000;
nested exception is:
java.net.SocketTimeoutException: connect timed out
...
Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.qq.com, 25; timeout 5000
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2118) ~[javax.mail-1.5.6.jar:1.5.6]
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:712) ~[javax.mail-1.5.6.jar:1.5.6]
at javax.mail.Service.connect(Service.java:366) ~[javax.mail-1.5.6.jar:1.5.6]
at org.springframework.mail.javamail.JavaMailSenderImpl.connectTransport(JavaMailSenderImpl.java:501) ~[spring-context-support-4.3.14.RELEASE.jar:4.3.14.RELEASE]
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:421) ~[spring-context-support-4.3.14.RELEASE.jar:4.3.14.RELEASE]
... 68 more
Caused by: java.net.SocketTimeoutException: connect timed out
...

经查,原来,阿里云服务器基于安全考虑,默认禁用了 25 端口。
官方是这么说的
出于安全考虑,阿里云默认封禁TCP 25端口出方向的访问流量,即你无法在阿里云上的云服务器通过TCP 25端口连接外部地址。

TCP 25端口的出方向封禁可能影响您通过TCP 25 端口连接第三方邮件服务商的SMTP服务器对外部发送邮件。如果您需要使用阿里云上的云服务器对外部发送邮件,建议您使用阿里云邮产品或者使用第三方邮件服务商提供的465端口。

如果存在特殊场景,您必须在云服务器上使用TCP 25端口进行对外连接,请在安全管控平台中提交25端口解封申请。

按照官方的提示,登录阿里云,提交申请,但是还是被拒绝了(审核不通过),理由如下:

不支持本机25端口解封,建议您尝试使用外部邮件服务商的465加密端口,或者查询所访问发信服务是否提供其它SMTP端口。如果使用的是阿里企邮或邮件推送,支持80和465端口发送,请将25更换为80端口。

于是,尝试使用 465 加密端口,问题得以解决,只是配置略有不同而已,其实很简单。

以下重点说一下,spring boot 项目,25 端口与 465 端口配置的不同。

spring boot 项目,发送邮件,服务配置

直接在 application.yml 配置即可

application.yml 配置项,使用端口 25

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
spring:
mail:
host: smtp.qq.com
port: 25
username: 1614923608@qq.com
password: # qq 邮箱配置的密码,非邮箱登录密码,在邮箱开启 smtp 的设置处配置,需要绑定手机并发短信才能设置
defaultEncoding: UTF-8
protocol: smtp
properties:
mail:
smtp:
connectiontimeout: 5000
timeout: 3000
writetimeout: 5000
auth: true
starttls:
enable: true
required: true

使用 465 的配置,与使用 25 端口的配置项,略有不同

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
spring:
mail:
host: smtp.qq.com
username: 1614923608@qq.com
password: # qq 邮箱配置的密码,非邮箱登录密码,在邮箱开启 smtp 的设置处配置,需要绑定手机并发短信才能设置
defaultEncoding: UTF-8
properties:
mail:
smtp:
connectiontimeout: 5000
timeout: 3000
writetimeout: 5000
auth: true
ssl:
trust: smtp.qq.com
socketFactory:
class: javax.net.ssl.SSLSocketFactory
port: 465
starttls:
enable: true
required: true