今天公司一臺服務器沒法發送郵件給客戶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協議以後就不會再被誤判爲垃圾郵件了。