阿里云ECS默认禁用25端口导致发邮件失败问题

时间:2024-03-15 22:50:25

在阿里云ECS上部署了ServerDog监控服务器,后来收到短信预警信息,但迟迟没有收到对应的邮件预警信息,查看ServerDog日志发现了如下报错:

阿里云ECS默认禁用25端口导致发邮件失败问题

已知ServerDog在本地运行正常,部署在海外的服务器时也运行正常,为何部署到阿里云上就不行了呢。

从报错内容来看,ServerDog无法连接到网易163的邮件服务器,从而导致发送邮件通知失败。这是一个网络问题,检查ServerDog所在阿里云服务器的防火墙,配置无问题,检查该服务器的安全组设置,发现对应的安全组没有开启25号端口,问题似乎找到了,于是开启安全组的25号端口。

然而,开启了阿里云安全组的25号端口之后,问题依旧。经过测试得知,阿里云的ECS服务器根本没有启用25号端口,25号端口始终处于封禁状态,即便用户手动开启安全组的25号端口也没用。

 

解决办法:

方法一. 联系阿里云客服,开启25端口,具体方法请参考:

TCP 25端口解封申请》:https://help.aliyun.com/knowledge_detail/56130.html

方法二. 正如阿里云《TCP 25端口解封申请》一文中所述:

阿里云ECS默认禁用25端口导致发邮件失败问题

我们可以使用465端口替代25端口, 465端口是为SMTPSSMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPSSMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。

由于465端口和25端口的差异不是简单的端口修改,而是增加了SSL安全协议,因此,代码层面上也需要进行对应的修改。我使用的是javax.mail,由于在代码设计的时候充分考虑了可配置,因此实际的代码部分不需要任何修改,仅需对配置文件进行调整,增加一些属性即可:

代码:

Properties properties = System.getProperties();

properties.putAll(this.mailConfig.getProperties());

this.session = Session.getDefaultInstance(properties, this.mailConfig.getAuthenticator());

配置调整:

Before:

<email

       mail.smtp.host="smtp.163.com"

       mail.smtp.port="25"

       mail.smtp.auth="true"

       mail.smtp.connectiontimeout="120000"

       mail.smtp.timeout="120000"

       user="[email protected]"

       password="xx:xx:xx:xx:xx:A3:xx:xx"

       using="true">

</email>

 

After

<email

       mail.smtp.host="smtp.163.com"

       mail.smtp.port="465"

       mail.smtp.socketFactory.port="465"

       mail.smtp.auth="true"

       mail.smtp.socketFactory.class="javax.net.ssl.SSLSocketFactory"

       mail.smtp.connectiontimeout="120000"

       mail.smtp.timeout="120000"

       user="[email protected]"

       password="xx:xx:xx:xx:xx:A3:xx:xx"

       using="true">

</email>