
有人在 WordPress 網站註冊會員,系統會寄兩封信:
- 給新會員:標題是「《網站名稱》通知:登入詳細資料」,內容只有一行「如需設定密碼,請點擊下方網址」加一串很長的網址。
- 給管理員:「《網站名稱》通知:新使用者註冊」,列出帳號和 Email。
寄件人還是「WordPress」。會員收到這種信,很容易以為是詐騙,直接刪掉,結果永遠沒有設定密碼。
這篇不用外掛,把三件事改好:會員信改成有按鈕的 HTML 信、管理員信附上後台連結、寄件人改成公司名稱。程式碼放在子佈景主題的 functions.php,或用 Code Snippets 這類外掛新增。
一、寄給新會員的信
PHP
// 寄給新會員的信:改標題、改成 HTML 格式,保留設定密碼的連結
add_filter( 'wp_new_user_notification_email', function ( $email, $user, $blogname ) {
// 從原本的信裡找出「設定密碼」的網址
if ( ! preg_match( '#https?://\S+action=rp\S*#', $email['message'], $m ) ) {
return $email; // 找不到就維持原本的信,避免會員收不到連結
}
$set_password_url = $m[0];
$name = $user->display_name ? $user->display_name : $user->user_login;
$email['subject'] = '歡迎加入「' . $blogname . '」,請設定你的密碼';
$email['headers'] = array( 'Content-Type: text/html; charset=UTF-8' );
$email['message'] = '
<div style="max-width:560px;margin:0 auto;font-family:Arial,\'Microsoft JhengHei\',sans-serif;font-size:16px;line-height:1.7;color:#333">
<h2 style="color:#1e8a8a">' . esc_html( $name ) . ',歡迎加入!</h2>
<p>你的帳號是:<strong>' . esc_html( $user->user_login ) . '</strong></p>
<p>請按下面的按鈕設定密碼,設定完成就可以登入。連結有使用期限,請盡快設定。</p>
<p style="margin:28px 0">
<a href="' . esc_url( $set_password_url ) . '" style="background:#1e8a8a;color:#fff;padding:12px 28px;border-radius:6px;text-decoration:none;display:inline-block">設定密碼</a>
</p>
<p style="font-size:14px;color:#777">按鈕沒反應的話,請複製這個網址到瀏覽器打開:<br>' . esc_html( $set_password_url ) . '</p>
<p style="font-size:14px;color:#777">如果你沒有註冊過,請忽略這封信。</p>
</div>';
return $email;
}, 10, 3 );說明:
wp_new_user_notification_email是 WordPress 寄信給新會員之前的篩選器,可以改收件人、標題、內容和標頭。舊教學常常把整個wp_new_user_notification()函式重寫一遍,WordPress 改版時容易出問題,現在用這個篩選器就好。- 設定密碼的網址:WordPress 已經把網址寫在原本的信裡,用正規表示式找出來沿用,不用自己再產生一次。萬一找不到(例如其他外掛已經改過信),就維持原本的信,至少會員還收得到連結。
headers設成text/html,這封信才會用 HTML 顯示。只在這封信加,網站寄出的其他信不受影響。- 信裡的名稱、帳號用
esc_html()、網址用esc_url()處理,會員填的內容不會變成 HTML 程式碼。 - HTML 信的樣式要寫在每個標籤的
style裡。很多信箱軟體會把<style>整段拿掉,寫在裡面的樣式會失效。 - 按鈕下面再放一次純文字網址,按鈕在某些信箱點不了的時候,會員還能複製網址。
- 設定密碼的連結預設 24 小時內有效,所以信裡提醒會員盡快設定。
二、寄給管理員的通知
PHP
// 寄給管理員的新會員通知:標題好辨認,附上後台編輯連結
add_filter( 'wp_new_user_notification_email_admin', function ( $email, $user, $blogname ) {
$email['subject'] = '【新會員】' . $user->user_login . ' 剛剛註冊了';
$email['message'] = "網站「{$blogname}」有新會員註冊:\n\n"
. '帳號:' . $user->user_login . "\n"
. 'Email:' . $user->user_email . "\n"
. '註冊時間:' . wp_date( 'Y-m-d H:i' ) . "\n\n"
. "到後台查看:\n" . admin_url( 'user-edit.php?user_id=' . $user->ID ) . "\n";
return $email;
}, 10, 3 );wp_new_user_notification_email_admin是寄給管理員那封信的篩選器。- 標題改成「【新會員】帳號 剛剛註冊了」,在收件匣一眼就認得出來。
- 內容附上註冊時間和後台的「編輯使用者」連結,點了直接看這個會員。時間用
wp_date(),會照網站設定的時區顯示。 - 這封信維持純文字,給自己看的信,簡單清楚就好。
如果網站有開「管理員審核」(新會員要管理員核准才能登入),可以在這封信加一句「請到後台核准」,提醒自己處理。
三、寄件人不要再是 WordPress
PHP
// 網站寄出的信,寄件人名稱和地址不要再是「WordPress」
add_filter( 'wp_mail_from_name', function () {
return '正威網路行銷';
} );
add_filter( 'wp_mail_from', function () {
return 'service@example.com'; // 換成你網域的信箱
} );wp_mail_from_name改寄件人名稱,wp_mail_from改寄件地址。這兩個會套用到網站寄出的所有信,包括忘記密碼、留言通知。- 寄件地址要用自己網域的信箱,例如網站是
example.com,就用service@example.com。用 Gmail、Yahoo 的地址當寄件人,收件端檢查寄件來源時對不上,很容易被當成垃圾信。 - 如果網站已經裝了 SMTP 寄信外掛,寄件人通常在外掛的設定裡就能改,外掛的設定會蓋過這兩行,改那裡就好。
實際測試的結果
在測試網站上,先不加程式碼註冊一個帳號,再加上三段程式碼註冊一個,攔下寄出的信比較:
- 原本:管理員收到「《網站名稱》通知:新使用者註冊」,會員收到「《網站名稱》通知:登入詳細資料」,兩封都是純文字,寄件人是 WordPress。
- 加上之後:管理員收到「【新會員】帳號 剛剛註冊了」,內容有註冊時間和後台連結;會員收到「歡迎加入「網站名稱」,請設定你的密碼」,是有綠色按鈕的 HTML 信;兩封的寄件人都變成「正威網路行銷」。
- 用 HTML 信裡的按鈕連結去設定密碼,顯示「密碼已重設」,連結可以正常使用。
- 網站名稱裡有
&符號,標題也正常顯示,沒有變成&。
WooCommerce 的「新帳號」信是另一封
顧客在 WooCommerce「我的帳號」或結帳時建立帳號,寄出的是 WooCommerce 自己的「新帳號」信,不是上面那封。這封到 WooCommerce → 設定 → 電子郵件,在列表裡找「新帳號」就能改標題、內容;寄件者名稱和地址在同一頁的「電子郵件發送選項」。
信一直寄不到?
改了內容,信還是沒收到,問題通常在寄信本身:主機的寄信功能被擋、寄件地址沒設定好,信就進了垃圾郵件匣或直接消失。建議設定 SMTP,用正式的信箱帳號寄信,做法可以參考用 Gmail 收發公司企業信箱:寄件(SMTP)設定。
延伸閱讀
- WordPress 會員註冊後自動登入、跳轉到指定頁面(PHP 8 安全寫法)
- WordPress 留言審核通過自動寄信通知留言者(含回覆通知程式碼)
- WordPress 發表新文章自動寄信通知會員:正確寫法與大量寄信的注意事項
會員收到的第一封信,就是對網站的第一印象。正威網路行銷是 25 年經驗的基隆網頁設計工作室,會員網站的通知信、寄信設定都會一起處理好,台北與全台客戶也歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。