生产环境遇到的问题
使用端口 25 发送,在测试环境、本地开发环境都可正常发送,但是,发布到阿里云服务器上,提示无法连接到 smtp 服务器:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15org.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 | spring: |
使用 465 的配置,与使用 25 端口的配置项,略有不同
1 | spring: |