阿里雲ECS發送郵件時SMTP協議25端口異常,更換爲SMTPS協議465端口

問題描述

今天公司一臺服務器沒法發送郵件給客戶java

因而看了一下日誌報瞭如下錯誤spring

org.springframework.mail.MailSendException: Mail server connection failed; nested exception is javax.mail.MessagingException: Could not connect to SMTP host: smtp.aliyun.com, port: 25;

telnet 了一下郵箱的確不通安全

不對呀,公司其餘幾臺ECS服務器上面的爲何好使?至此本人已懵逼服務器

中間折騰了好幾個小時,又提了工單,鬧心的過程不說了。app

最後肯定問題是因爲阿里雲ECS服務器把25端口封鎖了socket

那爲何只有這一臺很差使?緣由在於2016年9月底之後新購買的服務器纔會封鎖此端口,這臺是後買的其餘幾臺都是老服務器。函數

 

解決方法

若是想繼續發送郵件只能使用SMTPS協議465端口測試

簡單解釋一下SMTPS協議是什麼鬼阿里雲

25端口(SMTP):25端口爲SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協議)服務所開放的,是用於發送郵件。加密

465端口(SMTPS):465端口是爲SMTPS(SMTP-over-SSL)協議服務開放的,這是SMTP協議基於SSL安全協議之上的一種變種協議,它繼承了SSL安全協議的非對稱加密的高度安全可靠性,可防止郵件泄露。SMTPS和SMTP協議同樣,也是用來發送郵件的,只是更安全些,防止郵件被黑客截取泄露,還可實現郵件發送者抗抵賴功能。防止發送者發送以後刪除已發郵件,拒不認可發送過這樣一份郵件。

好吧,如今開始代碼改造吧。

package com.plsoft.pmall.utils;

import com.plsoft.pmall.ProjectEnvironment;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.*;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;


/** SendMail - 發送郵件
 *
 * @version 1.0
 */
public class SendMail {
    private static Logger logger = LoggerFactory.getLogger(SendMail.class);

    //單例模式
    private static SendMail sendMail = null;
    //發送設置 因爲始終從公司郵箱發送,因此只建立一套發送設置
    private JavaMailSenderImpl sender = new JavaMailSenderImpl();
    //發件人郵箱
    private String from = "";

    /**
     *  私有化構造函數
     */
    private SendMail(){
        try{
            //從配置文件獲取參數
            InputStream inputStream = SendMail.class.getClassLoader().getResourceAsStream(ProjectEnvironment.getPropertiesFileName("application"));
            Properties applicationProperties = new Properties();
            applicationProperties.load(inputStream);
            String host = applicationProperties.getProperty("host");
            String username = applicationProperties.getProperty("user");
            String password = applicationProperties.getProperty("pwd");
            from = applicationProperties.getProperty("from");

            sender.setHost(host);//SMTP服務器地址
            sender.setPort(465); //使用SMTPS協議465端口
            sender.setUsername(username);//郵箱登錄用戶名
            sender.setPassword(password);//郵箱登陸密碼
            Properties properties = new Properties();
            properties.put("mail.smtp.auth", "true");//登陸服務器是否須要認證
            properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");//SSL證書Socket工廠
            properties.setProperty("mail.smtp.socketFactory.port", "465"); //使用SMTPS協議465端口

            sender.setJavaMailProperties(properties);
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    /**
     * 獲取實例
     * @return
     * @throws IOException
     */
    public static SendMail getSendMail(){
        if(sendMail == null){
            return new SendMail();
        }else{
            return sendMail;
        }
    }

    /**
     * 發送郵件
     * @param to 收件人郵箱
     * @param subject 郵件標題
     * @param content 郵件內容
     */
    public void send(String to,String subject,String content) {
        try {
            MimeMessage mailMessage = sender.createMimeMessage();
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailMessage,"utf-8");
            messageHelper.setFrom(from);//發件人郵箱
            messageHelper.setTo(to);//收件人郵箱
            messageHelper.setSubject(subject);//郵件標題
            messageHelper.setText(content,true);//郵件內容,true表示啓動HTML格式的郵件
            sender.send(mailMessage);//發送郵件
            logger.info("郵件\"" + subject + "\"已發送至" + to + "郵箱");
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

 

改造後經測試組測試郵件發送正常!

這理其實順帶還解決了另外一個問題,原來使用SMTP協議時QQ郵箱總斷定爲垃圾郵件,自從換了SMTPS協議以後就不會再被誤判爲垃圾郵件了。

相關文章
相關標籤/搜索