首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHPMailer 郵件發送完整實戰:SMTP 配置、附件、嵌入圖片、HTML 內容與錯誤處理

     編輯:PHP 相關知識

PHPMailer 郵件發送完整實戰:SMTP 配置、附件、嵌入圖片、HTML 內容與錯誤處理

PHPMailer 是 PHP 最流行的郵件發送庫,支援 SMTP 認證、SSL/TLS 加密、多附件、嵌入圖片、HTML/純文本替代體。本文以 163 郵箱為例,提供生產級完整代碼並解析關鍵配置。

完整發送代碼

<?php
require_once 'PHPMailerAutoload.php'; // 或 composer autoload
// require_once 'class.phpmailer.php'; // 舊版單文件

$mail = new PHPMailer(true); // true 開啟異常拋出

try {
    // 1. SMTP 基礎配置
    $mail->isSMTP();
    $mail->Host       = 'smtp.163.com';
    $mail->Port       = 465; // SSL端口,TLS用587
    $mail->SMTPSecure = 'ssl'; // ssl 或 tls
    $mail->SMTPAuth   = true;

    // 2. 認證信息(需開啟SMTP服務並獲取授權碼,非登錄密碼)
    $mail->Username   = 'yourmail@163.com';
    $mail->Password   = 'your_auth_code';

    // 3. 郵件頭設置
    $mail->CharSet    = 'UTF-8';
    $mail->Encoding   = 'base64';
    $mail->Subject    = '測試郵件主題';
    $mail->setFrom('yourmail@163.com', '發件人姓名');
    $mail->addAddress('recipient@example.com', '收件人昵稱');
    // $mail->addCC('cc@example.com'); // 抄送
    // $mail->addBCC('bcc@example.com'); // 密送

    // 4. 附件
    $mail->addAttachment('/path/to/file.xls', '重命名.xls');

    // 5. 嵌入圖片(HTML中用 cid:my-attach 引用)
    $mail->addEmbeddedImage('/path/to/logo.jpg', 'my-attach', 'logo.jpg');

    // 6. 郵件正文
    $mail->isHTML(true);
    $mail->Body    = '你好, 朋友!
這是一封來自 PHPMailer 的測試郵件!
'; $mail->AltBody = '你好, 朋友! 這是純文本備選內容。'; // 不支持HTML的客戶端顯示 // 7. 發送 $mail->send(); echo '發送成功!'; } catch (Exception $e) { echo "發送失敗: {$mail->ErrorInfo}"; } ?>

關鍵配置詳解

屬性/方法說明常見坑點
Port465(SSL) / 587(TLS) / 25(無加密)端口與 SMTPSecure 必須匹配
SMTPSecure'ssl'、'tls'、false163/qq 等主流郵箱強制 SSL/TLS
Password授權碼/客戶端密碼非郵箱登錄密碼,需在郵箱設置中開啟 SMTP 獲取
CharSetUTF-8防止中文亂碼
addEmbeddedImage嵌入圖片 CIDHTML 中用 cid:xxx 引用,非 http 鏈接
AltBody純文本備選提升郵件客戶端兼容性、降低進垃圾箱概率

常見錯誤與解決

  1. SMTP connect() failed: 檢查端口、加密方式、防火牆、雲服務商是否封禁 25/465/587 端口(阿里雲/騰訊雲默認封禁 25,需申請解封或用 465/587)。
  2. Authentication failed: 確認用戶名/授權碼正確、已開啟 SMTP 服務、未開啟「客戶端授權碼」鎖定。
  3. Certificate verification failed: 本地 CA 證書缺失,臨時方案 $mail->SMTPOptions = ['ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true]];(僅測試環境)。
  4. 郵件進垃圾箱: 配置 SPF/DKIM/DMARC 域名解析、正文避免營銷敏感詞、保持文本/HTML 比例、使用獨立 IP 發信。

批量發送優化

<?php
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.163.com';
$mail->SMTPAuth = true;
$mail->Username = 'yourmail@163.com';
$mail->Password = 'auth_code';
$mail->setFrom('yourmail@163.com', '系統通知');
$mail->Subject = '批量測試';
$mail->Body = '內容...';

$recipients = ['a@b.com', 'c@d.com', 'e@f.com'];
foreach ($recipients as $to) {
    $mail->clearAddresses(); // 清空上一輪收件人
    $mail->addAddress($to);
    try {
        $mail->send();
        echo "$to 發送成功\n";
    } catch (Exception $e) {
        echo "$to 發送失敗: {$mail->ErrorInfo}\n";
    }
}
// 長連接複用 SMTP 會話,極大提升批量速度
?>

現代替代方案

  • Symfony Mailer / Laravel Mail: 框架整合、異步隊列、多傳輸驅動。
  • SendGrid / Mailgun / Amazon SES API: 雲郵件服務,高送達率、統計分析、模板管理,適合大規模業務。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved