阿里云ECS默认禁用25端口导致发邮件失败:Couldn't connect to host, port: smtp.example.com

时间:2021-10-07 16:37:48

使用JavaMail发送邮件,用的是阿里云的邮件服务。在本地测试是没有问题,但是上传到阿里云的ecs上就报错:

MailSendException: Mail server connection failed; nested exception is com.sun.mail.util.MailConnectException: Couldn't connect to host, port: smtp.majing.io, 25; timeout -1;

原来是阿里云处于安全考虑,TCP 25 端口出方向默认被封禁。

解决方法

有两种解决方法:

  1. 向阿里云申请解封25端口。
  2. 改为ssl加密465端口发送。

向阿里云申请解封25端口,可以参考:https://help.aliyun.com/knowledge_detail/56130.html

JavaMail使用ssl加密465端口发送邮件

主要是在原来发送邮件的配置上添加ssl,并设置为465端口。

Properties javaMailProperties = new Properties();
javaMailProperties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
javaMailProperties.setProperty("mail.smtp.socketFactory.port", "465");
javaMailProperties.setProperty("mail.smtp.port", "465");

使用spring配置如下:

<bean  class="org.springframework.mail.javamail.JavaMailSenderImpl">
   <property name="host" value="${mail.host}"/>
   <property name="username" value="${mail.username}"></property>
       <property name="password" value="${mail.password}"></property>
   <property name="javaMailProperties">
      <props>
         <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
         <prop key="mail.smtp.socketFactory.port">465</prop>
         <prop key="mail.smtp.port">465</prop>
      </props>
   </property>
</bean>