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}";
}
?>
| 屬性/方法 | 說明 | 常見坑點 |
|---|---|---|
Port | 465(SSL) / 587(TLS) / 25(無加密) | 端口與 SMTPSecure 必須匹配 |
SMTPSecure | 'ssl'、'tls'、false | 163/qq 等主流郵箱強制 SSL/TLS |
Password | 授權碼/客戶端密碼 | 非郵箱登錄密碼,需在郵箱設置中開啟 SMTP 獲取 |
CharSet | UTF-8 | 防止中文亂碼 |
addEmbeddedImage | 嵌入圖片 CID | HTML 中用 cid:xxx 引用,非 http 鏈接 |
AltBody | 純文本備選 | 提升郵件客戶端兼容性、降低進垃圾箱概率 |
$mail->SMTPOptions = ['ssl' => ['verify_peer' => false, 'verify_peer_name' => false, 'allow_self_signed' => true]];(僅測試環境)。<?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 會話,極大提升批量速度
?>