WordPress 通過 wp_mail() 發送所有郵件(註冊通知、密碼重置、評論提醒、表單投遞等)。默認配置存在三大痛點:
text/plain,無法發送富文本WordPress <wordpress@yourdomain.com>,易進垃圾箱、不可回覆本文提供純代碼方案解決前兩點,並推薦SMTP 插件方案徹底解決送達率問題。
<?php
// functions.php
/**
* 將所有 wp_mail() 內容類型設置為 text/html
*/
function my_wp_mail_content_type() {
return 'text/html';
}
add_filter('wp_mail_content_type', 'my_wp_mail_content_type');
?>
啟用後,wp_mail() 的 $message 參數可直接包含 HTML 標籤。注意:此過濾器全局生效,若部分郵件需純文本,需在具體調用處臨時移除過濾器:
// 某處需要純文本
remove_filter('wp_mail_content_type', 'my_wp_mail_content_type');
wp_mail($to, $subject, $plain_text_message);
add_filter('wp_mail_content_type', 'my_wp_mail_content_type');
<?php
// functions.php
/**
* 自定義發件人名稱
*/
function my_wp_mail_from_name($name) {
return '我的品牌名稱'; // 如:Acme Corp、博客名
}
add_filter('wp_mail_from_name', 'my_wp_mail_from_name');
/**
* 自定義發件人郵箱
*/
function my_wp_mail_from($email) {
return 'no-reply@mydomain.com'; // 必須為真實存在、可接收郵件的地址
}
add_filter('wp_mail_from', 'my_wp_mail_from');
?>
最佳實踐:
noreply@mail.mydomain.com),隔離主域名信譽Reply-To 頭指向真實客服郵箱,方便用戶回覆wp_mail(
string|array $to, // 收件人:字符串或數組,多地址用逗號分隔
string $subject, // 主題
string $message, // 內容(HTML 或純文本)
string|array $headers = '', // 額外頭:From、Cc、Bcc、Reply-To、Content-Type 等
string|array $attachments = '' // 附件路徑:數組或換行分隔字符串
): bool
<?php
// 1. 基礎發送
wp_mail('user@example.com', '歡迎註冊', '歡迎加入我們!');
// 2. HTML 郵件 + 多收件人 + 抄送 + 附件
$to = ['user1@example.com', 'user2@example.com'];
$subject = '月度報告';
$message = '<h1>月度報告</h1><p>詳見附件</p>';
$headers = [
'From: 報告系統 <reports@mydomain.com>',
'Cc: manager@mydomain.com',
'Reply-To: support@mydomain.com',
'Content-Type: text/html; charset=UTF-8',
];
$attachments = [
WP_CONTENT_DIR . '/uploads/reports/monthly_202401.pdf',
];
wp_mail($to, $subject, $message, $headers, $attachments);
// 3. 批量發送(建議使用隊列,避免超時)
$users = get_users(['fields' => 'ID']);
foreach ($users as $user) {
$email = $user->user_email;
// 推薦:放入 Redis 隊列,Worker 異步發送
// wp_mail($email, ...);
}
?>
PHP mail() 依賴本地 MTA(Postfix/Sendmail),配置複雜、IP 信譽差、無日誌可查。**SMTP 直接使用郵件服務商服務器**,是生產環境標準做法。
WP Mail SMTP| 服務商 | SMTP 主機 | 端口 | 加密 | 適用場景 |
|---|---|---|---|---|
| QQ 郵箱/企業郵箱 | smtp.qq.com | 465/587 | SSL/TLS | 國內個人/中小企業 |
| 163/126 郵箱 | smtp.163.com | 465/994 | SSL | 個人開發者 |
| Gmail | smtp.gmail.com | 465/587 | SSL/TLS | 國際業務(需開啟應用專用密碼) |
| SendGrid | smtp.sendgrid.net | 587 | TLS | 交易郵件、大規模發送 |
| Mailgun | smtp.mailgun.org | 587 | TLS | 開發者友好、API 豐富 |
| 阿里雲企業郵箱 | smtp.mxhichina.com | 465 | SSL | 國內企業級 |
插件設置頁面底部有「發送測試郵件」功能,務必測試:
<?php
// 根據場景動態切換發件配置
function my_dynamic_smtp($phpmailer) {
$is_order = strpos($phpmailer->Subject, '訂單') !== false;
if ($is_order) {
// 訂單郵件走專用事務郵件通道
$phpmailer->isSMTP();
$phpmailer->Host = 'smtp.sendgrid.net';
$phpmailer->Port = 587;
$phpmailer->SMTPSecure = 'tls';
$phpmailer->Username = 'apikey';
$phpmailer->Password = 'SG.xxx';
$phpmailer->From = 'orders@mydomain.com';
$phpmailer->FromName = '訂單系統';
}
}
add_action('phpmailer_init', 'my_dynamic_smtp');
?>
| 現象 | 可能原因 | 解決方案 |
|---|---|---|
| 郵件發送失敗、返回 false | PHP mail() 被禁用、無 MTA | 必須配置 SMTP 插件 |
| 進垃圾箱/推廣箱 | 無 SPF/DKIM、發件域名信譽差、內容觸發規則 | 配置域名解析、使用專業郵件服務商、優化內容 |
| 收不到郵件 | 服務商拒收、灰名單、頻率限制 | 查看 SMTP 日誌、換服務商、降低頻率 |
| 附件丟失/損壞 | 路徑錯誤、權限不足、文件過大 | 使用絕對路徑、檢查 upload_max_filesize、post_max_size |
| 中文亂碼 | 編碼未聲明 | Headers 加 Content-Type: text/html; charset=UTF-8 |
WordPress 郵件系統定制三步走:
wp_mail_content_type 啟用 HTML,wp_mail_from/wp_mail_from_name 定制發件人遵循此路徑,可將郵件送達率從「不可用」提升至「企業級可靠」。