Java 发送邮件,本地可以,部署后发送失败

基于 SpringBoot 的邮件发送功能,只解决问题,具体发送代码不做赘述。

基本配置

# 这个配置在本地测试时没问题
spring.mail.host=smtp.qq.com
spring.mail.username=[email protected]
spring.mail.password=这里是授权码(一般不是邮箱密码)
spring.mail.default-encoding=UTF-8

本地测试没问题,部署到阿里云服务器后发不出去。【没有报错信息】

# 之所以不报错,是因为默认的超时时间无限制,所以会一直卡在连接中。加入下面配置,设置超时时间,可以触发报错。
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.writetimeout=5000
# --- 含义 ----
#mail.smtp.connectiontimeout:连接时间限制,单位毫秒。是关于与邮件服务器建立连接的时间长短的。默认是无限制。
#mail.smtp.timeout:邮件接收时间限制,单位毫秒。这个是有关邮件接收时间长短。默认是无限制。
#mail.smtp.writetimeout:邮件发送时间限制,单位毫秒。邮件附加上传的时间长短。默认同样是无限制。按需设置。

发现报错如下:
Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn’t connect to host, port: smtp.qq.com, 25; timeout -1

问题:本机25端口超时

解决:改用465端口 (服务器需要先开启端口)

# 如果25端口可用,则上面的配置就够用了。但是一般情况下25端口会被禁用,建议开启并使用465端口,走邮件的SSL协议
# 加入下面配置
spring.mail.port=465
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.port=465
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.mail.smtp.socketFactory.fallback=false

问题补充:

阿里云ECS默认禁用25端口导致发邮件失败:Couldn't connect to host, port: smtp.example.com
有两种解决方法:
  1. 向阿里云申请解封25端口  => https://help.aliyun.com/knowledge_detail/56130.html
  2. 改用465端口ssl加密发送。
465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,
它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,
防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

参考:

JavaMail 发送邮件阻塞问题解决——设置 smtp 超时时间
关于使用Java Mail 发邮件,连接超时问题

你可能感兴趣的:(所学,spring,boot,java,javamail)