问题描述:
自己写了个监控程序,通过javamail发送监控信息,当部署到服务执行就报错:
javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25;
DEBUG SMTP: trying to connect to host "smtp.163.com", port 25, isSSL false
javax.mail.MessagingException: Could not connect to SMTP host: smtp.163.com, port: 25;
nested exception is:
java.net.ConnectException: Connection timed out (Connection timed out)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654)
at javax.mail.Service.connect(Service.java:295)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:196)
at com.sonkwo.bi.quartz.util.EmailUtils.sendEmail(EmailUtils.java:108)
at com.sonkwo.bi.quartz.task.RyTask.toSendCheckSyncData(RyTask.java:109)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
意思是说:服务器无法通过host: smtp.163.com, port: 25进行连接
通过手动telnet验证,确实无法连通
telnet smtp.163.com 25
Trying 220.181.15.161...
解决思路有两个:
- 解封25号端口(不推荐);
- 使用其他端口(465号端口,推荐)。
想起来了,在做azkaban发送邮件通知的时候就遇到过这个问题,最终是通过重新编译azkaban源码,才将25端口改成了465端口,具体见:【(21条消息) Azkaban重新编译,解决:Could not connect to SMTP host: smtp.163.com, port: 465【2022年01月10日】_打不死的小强哥哥的博客-CSDN博客】
最终解决办法:
修改javamail中的端口号,添加如下代码:
// PS: 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启),
// 如果无法连接邮件服务器, 仔细查看控制台打印的 log, 如果有有类似 “连接失败, 要求 SSL 安全连接” 等错误,
// 打开下面 /* ... */ 之间的注释代码, 开启 SSL 安全连接。
/*
// SMTP 服务器的端口 (非 SSL 连接的端口一般默认为 25, 可以不添加, 如果开启了 SSL 连接,
// 需要改为对应邮箱的 SMTP 服务器的端口, 具体可查看对应邮箱服务的帮助,
// QQ邮箱的SMTP(SLL)端口为465或587, 其他邮箱自行去查看)
final String smtpPort = "465";
props.setProperty("mail.smtp.port", smtpPort);
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
props.setProperty("mail.smtp.socketFactory.port", smtpPort);
问题最终解决,邮件顺利发出了。。。
ps:若想获得javamail的源码,请见【(21条消息) 通过javaMail发送邮件_打不死的小强哥哥的博客-CSDN博客】