使用phpmailer傳送郵件

楊江_fer發表於2019-02-16

最近做郵件傳送的時候嘗試了一下phpmailer,但是在用的過程中還是遇到一些問題,在這裡記一下。做的過程中主要遇到這幾個問題。
1.在做常規測試的時候,發現郵件傳送特別慢。這裡主要找到是這句造成的:

$this->smtp_conn = @stream_socket_client( $host . ":" . $port, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $socket_context );

遇到這個問題,需要將$SMTPDebug設定成2。預設設定是0什麼也不處理;

2.在郵件傳送中需要新增抄送人。可以這麼設定:

if(is_string($addCC)){
    $mail->addCC("xxx@qq.com");// 設定郵件抄送人,可以只寫地址,上述的設定也可以只寫地址
}else if(is_array($addCC)){
    foreach ($addCC as $k=>$v){
        $mail->addCC($v);
    }
}

3.新增附件

if($is_attachment){
    $mail->AddAttachment($attachment_add); //可以新增附件
}

4.新版有時候還會報

MAIL FROM command failed: 501 mail from address must be same as authorization user
這個錯誤;這裡主要是沒有設定來源:$mail->setFrom("xxx@qq.com", "測試");

5.有時需要新增抄送功能,可以這麼設定。陣列的時候是批量新增抄送,字串是單個抄送。

if(is_string($addCC)){
    $mail->addCC("wangqian@jiguo.com");// 設定郵件抄送人,可以只寫地址,上述的設定也可以只寫地址
}else if(is_array($addCC)){
    foreach ($addCC as $k=>$v){
        $mail->addCC($v);
    }
}

最後附上一個簡單的實現函式

/**
 * $username 使用者名稱
 * $password 密碼
 * $setFromusername 傳送人姓名
 * $send_mail 需要傳送的郵件地址
 * $addCC 需要抄送的郵件地址
 * $title 郵件標題
 * $content 郵件內容
 * $is_attachment 是都需要附件
 * $attachment_add 附件地址
*/

function send($username, $password, $setFromusername,$send_mail, $addCC,$title,$content="",$is_attachment=0, $attachment_add=""){
    $mail = new PHPMailer();
    if(is_string($send_mail)){
        $send_mail[] = $send_mail;
    }

    foreach ($send_mail as $k=>$v){
        $mail->IsSMTP();
        $mail->CharSet  =`UTF-8`; //設定郵件的字元編碼,這很重要,不然中文亂碼
        $mail->SMTPAuth = true; //開啟認證
        $mail->Port     = 465;
        $mail->Host     = "smtp.exmail.qq.com";
        $mail->Username = $username;
        $mail->Password = $password;
        $mail->SMTPSecure = `ssl`;
        $mail->setFrom($username, $setFromusername);

        $to = $v;
        $mail->AddAddress($to);
        if(is_string($addCC)){
            $mail->addCC($addCC);// 設定郵件抄送人,可以只寫地址,上述的設定也可以只寫地址
        }else if(is_array($addCC)){
            foreach ($addCC as $k=>$v){
                $mail->addCC($v);
            }
        }

        $mail->Subject  = $title;
        $mail->Body     = $content ? $content : $title;
        $mail->AltBody  = $content ? $content : $title;; //當郵件不支援html時備用顯示,可以省略
        $mail->WordWrap = 80; // 設定每行字串的長度
        if($is_attachment){
            $mail->AddAttachment($attachment_add); //可以新增附件
        }

        $mail->IsHTML(true);
        $mail->Send();
    }

    echo `郵件已傳送`;
}

相關文章