1. 程式人生 > 實用技巧 >tp5.1 使用 phpmailer 傳送電子郵件

tp5.1 使用 phpmailer 傳送電子郵件

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);
});

效果

參考:https://www.runoob.com/w3cnote/php-phpmailer.html