阿里云:Could not connect to SMTP host: smtp.163.com, port: 25

问题描述:

自己写了个监控程序,通过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...

解决思路有两个:

  1. 解封25号端口(不推荐);
  2. 使用其他端口(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博客】

你可能感兴趣的:(Java,java,java-ee)