问题描述
Web项目使用apache的commons-email发送邮件,本地运行正常,部署到aliyun服务器后无法发送邮件。
原因
查看日志发现报错,内容如下:
org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.163.com:25
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1421)
at org.apache.commons.mail.Email.send(Email.java:1448)
at com.lyn.petadopt.service.impl.SendEmailRunnable.run(SecurityServiceImpl.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.163.com, 25; timeout 60000; nested exception is:
java.net.SocketTimeoutException: connect timed out
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:2053)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:697)
at javax.mail.Service.connect(Service.java:386)
at javax.mail.Service.connect(Service.java:245)
at javax.mail.Service.connect(Service.java:194)
at javax.mail.Transport.send0(Transport.java:253)
at javax.mail.Transport.send(Transport.java:124)
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1411)
... 3 more
查询资料发现,aliyun考虑到安全方面,默认关闭发送邮件的25端口,导致无法连接到邮件服务器。
解决方案
共两种解决方案:
方案1
向aliyun提交申请,解封25端口,需要3-5天。
由于未找到提交解封申请的入口,此处不做详细描述。
方案2
放弃25端口,使用ssl加密并改用465端口。
在apache commons-email中使用方法如下:
//启用ssl加密
email.setSSLOnConnect(true);
//使用465端口(不设置也可,ssl默认为465)
email.setSslSmtpPort("465");
重新部署,问题解决。