在阿里云ECS上部署了ServerDog监控服务器,后来收到短信预警信息,但迟迟没有收到对应的邮件预警信息,查看ServerDog日志发现了如下报错:
已知ServerDog在本地运行正常,部署在海外的服务器时也运行正常,为何部署到阿里云上就不行了呢。
从报错内容来看,ServerDog无法连接到网易163的邮件服务器,从而导致发送邮件通知失败。这是一个网络问题,检查ServerDog所在阿里云服务器的防火墙,配置无问题,检查该服务器的安全组设置,发现对应的安全组没有开启25号端口,问题似乎找到了,于是开启安全组的25号端口。
然而,开启了阿里云安全组的25号端口之后,问题依旧。经过测试得知,阿里云的ECS服务器根本没有启用25号端口,25号端口始终处于封禁状态,即便用户手动开启安全组的25号端口也没用。
解决办法:
方法一. 联系阿里云客服,开启25端口,具体方法请参考:
《TCP 25端口解封申请》:https://help.aliyun.com/knowledge_detail/56130.html
方法二. 正如阿里云《TCP 25端口解封申请》一文中所述:
我们可以使用465端口替代25端口, 465端口是为SMTPS(SMTP-over-SSL)协议服务开放的,这是SMTP协议基于SSL安全协议之上的一种变种协议,它继承了SSL安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS和SMTP协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
由于465端口和25端口的差异不是简单的端口修改,而是增加了SSL安全协议,因此,代码层面上也需要进行对应的修改。我使用的是javax.mail,由于在代码设计的时候充分考虑了可配置,因此实际的代码部分不需要任何修改,仅需对配置文件进行调整,增加一些属性即可:
代码:
Properties properties = System.getProperties();
properties.putAll(this.mailConfig.getProperties());
this.session = Session.getDefaultInstance(properties, this.mailConfig.getAuthenticator());
配置调整:
Before:
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:
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>