问题现象: 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");