出於安全考慮,阿里雲騰訊雲等服務器默認封禁TCP25端口出方向的訪問流量,所以用戶無法在阿里雲或騰訊雲上的雲服務器通過TCP25端口連接外部地址。用戶無法通過TCP25端口連接第三方郵件服務商的SMTP服務器對外部發送郵件。這種情況下我們通常可以使用一下兩種方案來解決。
一、申請解封25端口
阿里雲以及騰訊雲解封教程可參考以下鏈接
阿里雲:阿里雲服務器25端口解封教程
騰訊雲:騰訊雲解封25端口教程
(經實測騰訊雲解封很方便,阿里雲可能會申請不通過)
騰訊雲
阿里雲
二、改用465端口
在使用465端口的SSL安全鏈接方案後,千萬不要使用【網易品牌】的免費郵箱(如:163,126,yeah.net等。不過聽說網易收費郵箱能正常收發郵件),否則你發送的郵件會當作是垃圾郵件禁止發送。
網易郵件發送問題鏈接:企業退信的常見問題?-163郵箱常見問題
我們這裏使用的是新浪郵箱進行465端口測試。使用之前需要在郵箱設置中開發客戶端授權碼
示例代碼:
我這裏使用的hutool郵件工具類進行郵件發送。官網鏈接:Hutool參考文檔
<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.0.M4</version> </dependency> <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency>
mail.setting (465端口)
# 郵件服務器的SMTP地址,可選,默認爲smtp.<發件人郵箱後綴> host = smtp.sina.com # 郵件服務器的SMTP端口,默認是25端口 port = 465 # 發件人(必須正確,否則發送失敗) from = [email protected] # 用戶名,必須要設置成你自己使用郵箱的名稱,否則會報錯,權限認證失敗 535錯誤 user = [email protected] # 密碼 此處注意,這裏是授權碼 pass = xxxxxx(對應的郵箱客戶端授權碼) # 使用SSL安全連接 sslEnable = true # 指定實現javax.net.SocketFactory接口的類的名稱,這個類將被用於創建SMTP的套接字 socketFactoryClass = javax.net.ssl.SSLSocketFactory # 如果設置爲true,未能創建一個套接字使用指定的套接字工廠類將導致使用java.net.Socket創建的套接字類, 默認值爲true socketFactoryFallback = false # 指定的端口連接到在使用指定的套接字工廠。如果沒有設置,將使用默認端口456 socketFactoryPort = 465 auth = true
mail.setting(25端口)
host = smtp.yeah.net
# 郵件服務器的SMTP端口,可選,默認25
port = 25
# 發件人(必須正確,否則發送失敗)
from = [email protected]
# 用戶名,默認爲發件人郵箱前綴
user = XXXXXX
# 密碼(注意,某些郵箱需要爲SMTP服務單獨設置授權碼,詳情查看相關幫助)
pass = XXXXX
使用hutool工具類發送郵件非常簡單,調用如下api
MailUtil.send("郵件地址", "郵件主題", "郵件內容", 是否是html);
測試