smtp 通过465端口发送邮件失败

问题现象:
1、smtp请求邮件服务器发送邮件,配置了邮件服务器地址和465端口
2、抓包发现在建TCP3次握手动作之后,客户端请求连接达到30s,然后主动中断连接,详见下图

3、java代码中报错如下:


分析过程:
1、怀疑网络问题
通过使用curl命令检查,发现客户端和邮件服务器网络通畅,不存在网络问题,详见smtp报文分析(25、465、587端口)_Steven-Russell的博客-CSDN博客

2、发现客户端主动中断连接,并且达到30s之后中断,那么极有可能时触发了客户端的smtp超时,检查smtp配置 mail.smtp.timeout = 30000,恰好佐证了想法

3、通过添加 smtp 的debug配置,mail.debug=true ,打印出debug日志 
4、排查日志,发现isSSL=false

5、反观465端口时smtp的ssl交互端口,那么和isSSL=false不就矛盾了吗?
6、检查代码,配置 mail.smtp.ssl.enable 改为true,重新运行程序,发现邮件发送成功。

综上可知,问题根因:
1、465是smtp的ssl安全端口,所以使用javamail时必须有如下配置:
properties.put("mail.smtp.ssl.enable", "true"); // 默认值为false
2、一定要仔细排查前述配置是否因为代码分支不同,导致设置为false,或者默认值为false

 

 

注意:此处因为服务器配置smtps端口是465,方才有上述结论,若是手动配置了其他端口作smtps的安全端口,同理需要 properties.put("mail.smtp.ssl.enable", "true");

你可能感兴趣的:(服务器,tomcat,运维)