PHPMailer 是 PHP 最流行的郵件發送庫,支援 SMTP 驗證、SSL/TLS 加密、HTML 郵件、附件等功能。本文提供可直接落地的完整代碼範例,涵蓋 163 與 QQ 郵箱的授權碼獲取、核心配置參數說明與常見坑點排查。
核心差異: QQ 郵箱必須啟用 SSL(端口 465 或 587),163 郵箱預設使用非加密端口 25(亦支援 SSL 465/587)。
// 引入 PHPMailer 核心檔案(建議使用 Composer 自動載入)
require_once "PHPMailer/PHPMailerAutoload.php"; // 或分別 include class.phpmailer.php、class.smtp.php
$mail = new PHPMailer();
// 基礎 SMTP 設定
$mail->isSMTP(); // 使用 SMTP
$mail->SMTPAuth = true; // 啟用 SMTP 驗證
$mail->Host = 'smtp.163.com'; // SMTP 伺服器
$mail->Port = 25; // 非加密端口(SSL 請用 465/587)
// $mail->SMTPSecure = 'ssl'; // 163 非必須;QQ 必須開啟
$mail->CharSet = 'UTF-8'; // 郵件編碼
// 發件人資訊
$mail->From = 'your_account@163.com'; // 完整郵箱地址
$mail->FromName = '發件人姓名'; // 顯示名稱
$mail->Username = 'your_account@163.com'; // SMTP 登入帳號(完整郵箱)
$mail->Password = '你的授權碼'; // SMTP 登入密碼(授權碼)
// 郵件內容
$mail->isHTML(true); // HTML 格式
$mail->Subject = '測試郵件主題';
$mail->Body = '這是測試郵件內容,驗證碼:' . $token;
$mail->AltBody = '純文字備用內容'; // 非 HTML 郵件客戶端顯示
// 收件人(可多次呼叫添加多個)
$mail->addAddress('recipient@example.com', '收件人姓名');
// 附件(可選)
// $mail->addAttachment('/path/to/file.pdf', 'rename.pdf');
// 發送與結果處理
if ($mail->send()) {
echo '發送成功';
} else {
echo '發送失敗:' . $mail->ErrorInfo;
}
// 開發環境建議開啟除錯:$mail->SMTPDebug = 2; // 2 = 顯示完整 SMTP 交互
$mail->Host = 'smtp.qq.com'; $mail->SMTPSecure = 'ssl'; // 必須 $mail->Port = 465; // SSL 端口 $mail->Username = '123456@qq.com'; // QQ 號碼@qq.com $mail->Password = 'qq授權碼'; // 獨立密碼
從 GitHub 下載後,僅需保留以下核心檔案即可部署:
src/PHPMailer.phpsrc/SMTP.phpsrc/Exception.phplanguage/phpmailer.lang-zh_cn.php(中文錯誤訊息,可選)建議使用 Composer 安裝:composer require phpmailer/phpmailer,自動處理依賴與自動載入。
| 現象 | 可能原因 | 解決方向 |
|---|---|---|
| SMTP connect() failed | 端口/加密方式錯誤、防火牆攔截、伺服器不支援 SSL | 檢查 Host/Port/SMTPSecure;telnet 測試端口連通性;確認 OpenSSL 擴充已啟用 |
| Authentication failed | 帳號/授權碼錯誤、未開啟 SMTP 服務 | 重新獲取授權碼;郵箱設定確認 SMTP 已開啟 |
| 郵件進垃圾桶 | SPF/DKIM/DMARC 未配置、內容觸發反垃圾規則 | 域名配置 SPF/DKIM;避免敏感詞;使用可信發信 IP |
| 中文亂碼 | CharSet 未設為 UTF-8、資料庫/檔案編碼不一致 | 統一專案編碼為 UTF-8;$mail->CharSet = 'UTF-8' |
addAddress 並 clearAddresses(),或使用郵件佇列(如 RabbitMQ + Worker)異步處理。