tp5.1 使用 phpmailer 傳送電子郵件
阿新 • • 發佈:2020-12-30
tp5.1 使用 phpmailer 傳送電子郵件
簡介
phpMailer 是一個非常強大的 ph p傳送郵件類,可以設定傳送郵件地址、回覆地址、郵件主題、html網頁,上傳附件,並且使用起來非常方便。
github:https://github.com/PHPMailer/PHPMailer/
phpMailer 的特點:
- 在郵件中包含多個 TO、CC、BCC 和 REPLY-TO。
- 平臺應用廣泛,支援的 SMTP 伺服器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
- 支援嵌入影象,附件,HTML 郵件。
- 可靠的強大的除錯功能。
- 支援 SMTP 認證。
- 自定義郵件頭。
- 支援 8bit、base64、binary 和 quoted-printable 編碼。
安裝
使用 composer 安裝:
composer require phpmailer/phpmailer
郵件服務配置
傳送之前需要擁有自己的郵件伺服器,測試的時候其實用自己申請的免費郵箱最方便了,不需要自己再搭建伺服器了,可能要配置郵箱的SMTP服務,大部分公共郵箱(163、qq等)為了安全預設是關閉的。
網易郵箱配置如下圖:
QQ 郵箱相關配置如下圖:
郵箱 | POP3伺服器(埠995) | SMTP伺服器(埠465或587) |
---|---|---|
qq.com | pop.qq.com | smtp.qq.com |
這裡以163郵箱配置作為示例
設定郵箱客戶端授權碼
找到設定
開啟服務
開啟伺服器之後會有顯示,注意授權碼只顯示一次,開啟過程中注意儲存
對PHPMailer類庫使用進行封裝
在extends下 建立\mail\Mail.php
檔案內容如下
<?php namespace mail; //引入郵件類,tp5.1只要有名稱空間會自動載入 use PHPMailer\PHPMailer\PHPMailer; class Mail { //伺服器配置,一般是預設配置 private $CharSet ="UTF-8"; //設定郵件編碼 private $SMTPDebug = 0; // 除錯模式輸出 private $isSMTP = true; // 使用SMTP private $Host = 'smtp.163.com'; // SMTP伺服器 private $SMTPAuth = true; // 允許 SMTP 認證 private $Username = '郵箱使用者名稱'; // SMTP 使用者名稱 即郵箱的使用者名稱 private $Password = '密碼或者授權碼'; // SMTP 密碼 部分郵箱是授權碼(例如163郵箱) private $SMTPSecure = 'ssl'; // 允許 TLS 或者ssl協議 private $Port = 465; // 伺服器埠 25 或者465 具體要看郵箱伺服器支援 //修改成自己的郵箱 private $From = '[email protected]'; //發件人郵箱 private $FromName = 'makalo'; //發件人的使用者暱稱 //郵件物件 private $mail; //一般只有使用者名稱和密碼還有埠會變動,所以這三個引數可以建立物件動態指定,也可以直接寫死 public function __construct($Username = '', $Password = '', $Port = ''){ if(!empty($Username)){ $this->Username = $Username; } if(!empty($Password)){ $this->Password = $Password; } if(!empty($Port)){ $this->Port = $Port; } //為true表示啟用異常 $mail = new PHPMailer(true); //伺服器配置 $mail->CharSet = $this->CharSet; //設定郵件編碼 $mail->SMTPDebug = $this->SMTPDebug; // 除錯模式輸出 if($this->isSMTP === true){ $mail->isSMTP(); // 使用SMTP } $mail->Host = $this->Host; // SMTP伺服器 $mail->SMTPAuth = $this->SMTPAuth; // 允許 SMTP 認證 $mail->Username = $this->Username; // SMTP 使用者名稱 即郵箱的使用者名稱 $mail->Password = $this->Password; // SMTP 密碼 部分郵箱是授權碼(例如163郵箱) $mail->SMTPSecure = $this->SMTPSecure; // 允許 TLS 或者ssl協議 $mail->Port = $this->Port; // 伺服器埠 25 或者465 具體要看郵箱伺服器支援 $mail->setFrom($this->From, $this->FromName); //發件人 $this->mail = $mail; } /** * 傳送郵件 * @param array $sendAddress 收件人地址陣列, 如果為單值陣列則只寫入收件地址,如果為鍵值陣列則還寫入收件人名稱 * @param array $Attachment 附件陣列,如果為單值陣列則為新增附件,如果為鍵值陣列則新增附件並且重新命名 * @param bool $isHtml 是否以html文件格式傳送 * @param string $Subject 郵件主題 * @param string $Body 郵件內容,如果以html格式可以寫入html * @param string $AltBody 如果為單值陣列則只寫入收件地址,如果為鍵值陣列則還寫入收件人名稱 * @param array $CC 抄送地址陣列, 如果為單值陣列則只寫入收件地址,如果為鍵值陣列則還寫入收件人名稱 * @param array $BCC 密送地址陣列,如果為單值陣列則只寫入收件地址,如果為鍵值陣列則還寫入收件人名稱 * @return bool 是否傳送成功 */ public function sendEMail($sendAddress = [],$Subject = '', $Body = '', $AltBody = '', $Attachment = [] ,$isHtml = true,$CC = [], $BCC = []){ try { //必填引數校驗 if(empty($sendAddress) || empty($Subject) || empty($Body)){ return false; } //收件人 foreach ($sendAddress as $key => $value) { if (is_int($key)) { // 處理單值 $this->mail->addAddress($value); } else { // 處理鍵值 $this->mail->addAddress($value, $key); } } //附件 if(!empty($Attachment)){ foreach ($Attachment as $key => $value) { if (is_int($key)) { // 處理單值 $this->mail->addAttachment($value); } else { // 處理鍵值 $this->mail->addAttachment($value, $key); } } } //抄送 if(!empty($CC)){ //抄送不為空 foreach ($CC as $key => $value) { if (is_int($key)) { // 處理單值 $this->mail->addCC($value); } else { // 處理鍵值 $this->mail->addCC($value, $key); } } } //密送 if(!empty($BCC)){ //密送不為空 foreach ($CC as $key => $value) { if (is_int($key)) { // 處理單值 $this->mail->addBCC($value); } else { // 處理鍵值 $this->mail->addBCC($value, $key); } } } //回覆的時候回覆給哪個郵箱 建議和發件人一致 $this->mail->addReplyTo($this->From, $this->FromName); //Content // 是否以HTML文件格式傳送 傳送後客戶端可直接顯示對應HTML內容 $this->mail->isHTML($isHtml); //郵件主題 $this->mail->Subject = $Subject; //郵件內容 $this->mail->Body = $Body; //如果郵件客戶端不支援HTML則顯示此內容 $this->mail->AltBody = $AltBody; //傳送 $this->mail->send(); return true; } catch (\Exception $e) { echo '郵件傳送失敗: ', $this->mail->ErrorInfo; return false; } } }
測試
不帶附件
//不帶附件
Route::any('test24', function (){
$mail = new Mail('[email protected]', 'EKYBQxxxANDPISHR');
$res = $mail->sendEMail(['[email protected]'], '測試郵件主題'. time(), '<h1>這裡是郵件內容</h1>' . date('Y-m-d H:i:s'),'如果郵件客戶端不支援HTML則顯示此內容');
dump($res);
});
結果
帶附件
//帶附件
Route::any('test25', function (){
$mail = new Mail('[email protected]', 'EKYBxxxPISHR');
$Attachment = [
//直接新增附件
Env::get("root_path") . "test.png",
//新增附件並重命名
'change_name.png' => Env::get("root_path") . "test.png"
];
$res = $mail->sendEMail(
['[email protected]'], '測試郵件主題'. time(),
'<h1>這裡是郵件內容</h1>' . date('Y-m-d H:i:s'),
'如果郵件客戶端不支援HTML則顯示此內容',
$Attachment
);
dump($res);
});
效果