如果看着文字眼乏就去看看視頻吧->
如何注冊騰訊企業郵箱
https://www.bilibili.com/video/av14351397/
如何在項目中使用
https://www.bilibili.com/video/av14351961/
下面是我自己在采坑的過程中遇到的問題
首先我們下載PHPMailer的,下載地址:https://github.com/PHPMailer/PHPMailer
將文件部入到我們的TP框架中,放到extend/org中。
第一步我們應該准備發送郵箱的賬號,我這里用的是騰訊企業郵箱
沒有的可以直接注冊一個:https://exmail.qq.com
將類文件PHPMailer.php第1760行的方法里的if判斷中添加include_once 'SMTP.php';
if (!is_object($this->smtp)) { include_once 'SMTP.php'; $this->smtp=new SMTP(); }
在控制器里面代碼
<?php namespace app\api\controller; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use think\Controller; use think\Loader; class Mailsms extends Controller { //發送商,,,QQ企業郵箱地址都是smtp.exmail.qq.com const HOST='smtp.exmail.qq.com'; //發件人郵箱....企業郵箱中一個成員的賬號 const USERNAME='youname@youyuming.top'; //發件箱授權碼。。。。。。這里是成員賬號的登錄密碼 const PASSWORD='passworld'; //發送模板 const TEMPLATE='您的驗證碼是{code},請在10分鍾內填寫。'; //是否debug 測試環境使用 const DEBUG=true; //實例 protected $mail; public function _initialize(){ Loader::import("org.PHPMailer.src.Exception",EXTEND_PATH,".php"); Loader::import("org.PHPMailer.src.PHPMailer",EXTEND_PATH,".php"); Loader::import("org.PHPMailer.src.SMTP",EXTEND_PATH,".php"); $this->mail=new PHPMailer(); } /** * target 發送給誰 收件人的郵箱 * subject 主題 * code 驗證碼apiMailsms/index */ public function sendMail($target,$subject,$code) { $content = str_replace('{code}',$code,self::TEMPLATE); try{ $this->mail->SMTPDebug=self::DEBUG; $this->mail->isSMTP(); $this->mail->Host=self::HOST;//服務器 $this->mail->SMTPAuth=true;//是否開啟SMTP認證 $this->mail->Username=self::USERNAME;//發件人郵箱 $this->mail->Password=self::PASSWORD;//發件箱授權碼 // $this->mail->SMTPSecure='tls';//啟用TLS加密,' ssl '也接受 // $this->mail->Port='25';//端口
//注意使用阿里域名的需要使用ssl加密,465端口, $this->mail->SMTPSecure='ssl';//啟用TLS加密,' ssl '也接受 $this->mail->Port='465';//端口 $this->mail->CharSet='UTF-8';//設置郵件內容編碼 $this->mail->setFrom(self::USERNAME); //發件人 //$this->mail->addAttachment('/var/tmp/file.tar.gz');//附件 //$this->mail->addAttachment('/tmp/image.jpg', 'new.jpg');//附件重命名 $this->mail->addAddress($target);//發送給誰 $this->mail->isHTML(true); $this->mail->Subject=$subject; $this->mail->Body=$content; //$this->mail->AltBody ='This is the body in plain text for non-HTML mail clients'; if($this->mail->send()){ echo "發送成功!"; }else{ echo "發送失敗!"; } }catch(Exception $e) { echo "異常拋出"; } } public function index(){ $this->sendMail('收件人的郵箱','郵箱標題',自定義數據); } }
可以看出連接超時導致郵件發送失敗,初步懷疑測試環境宿主機無法訪問外網,進入bash后 curl http://baidu.com可正常響應,排除此種情況,然后同樣方法到部署的具體容器環境(docker)控制台 curl http://baidu.com 同樣可以正常響應,判斷應用環境沒有問題,則判斷是否騰訊郵件服務器問題,到宿主機訪問:Telnet smtp.exmail.qq.com 25,訪問超時。后咨詢PE答復阿里雲ECS為管控垃圾郵件,屏蔽了25端口號的服務,所以導致該訪問超時,嘗試使用ssl方式的465端口,修改代碼如下之后成功發送郵件:
郵件直接進入垃圾箱原因:
1. 以觸發式的過濾算法鑒別垃圾郵件
這種垃圾郵件過濾器通常安裝在電子郵件客戶端軟件或者郵件服務器上,其過濾垃圾郵件原理是過濾軟件檢查郵件發送人、標題、正文內容、郵件中出現的鏈接和域名,甚至電話號碼。當發現帶明顯垃圾郵件的典型特征,則給予這封郵件一定的垃圾郵件特征分數。當分數達到一定數值,郵件將被標記為垃圾郵件,直接過濾到郵件垃圾箱。
比如,郵件標題中出現¥、$符號,則可以給予2分垃圾郵件分數;郵件內容中出現“免費”、“發票”、“促銷”等典型垃圾郵件詞匯,給予1分;郵件中如包含已經被確認為經常發送垃圾郵件的域名,再加1分;甚至郵件內容中出現被確認與垃圾郵件相關的電話號碼,也給個分數。當這些垃圾分數相加達到某一個數值時,比如達到10分,這封郵件將被標識為垃圾郵件,將會被ISP商丟進垃圾郵箱
2. 以黑名單為基礎
有些創建和維護郵件黑名單的組織,專門接受用戶的垃圾郵件投訴,如果確認是垃圾郵件,黑名單管理者將把發送垃圾郵件的服務器和用戶IP地址放入黑名單。比較知名的垃圾郵件黑名單通常都與其他ISP商共享黑名單數據庫。一旦某個IP地址被列入黑名單,世界上很多ISP都將拒收來自這個IP地址的所有郵件。
有時候用戶投訴,其實收到的郵件並不是垃圾郵件,而是用戶忘記了曾經注冊過相關電子雜志。如果你的IP地址被錯誤的投訴而列入黑名單,Jeasin.com建議您,唯一的辦法就是聯系黑名單維護組織,說明情況,提出證據,要求把你的IP地址從黑名單中刪除,此過程比較復雜困難。
3. 郵件防火牆
很多郵件服務器運行在郵件防火牆之后,這些防火牆會共同地使用各種過濾器和黑名單,再加上自行研究的一些算法,來鑒別和剔除垃圾郵件。這些防火牆的算法更復雜,並且不與他人分享細節,對正常的郵件送達也可能有致命的影響,如部分郵件服務器要求有人工添加確認功能,針對大部分陌生地址郵件,華思郵件告訴各位我們應將采用拒收的策略。