最後更新:2026/10/13
「我有填聯絡表單,怎麼都沒人回?」「訂單成立的信我沒收到。」網站上線之後,這是很常接到的兩句話。去後台一看,表單明明有送出、訂單也成立了,問題出在中間那一段:信沒有寄到,或寄到了卻躺在垃圾信件匣。
臺北很多工作室的網站都有這個狀況,只是沒人發現。這篇說明 WordPress 寄信的方式哪裡容易出問題,以及怎麼改成用正式的信箱寄信。
不想自己改?把這篇交給 AI
把這篇的網址(或全文)連同下面這段話貼給 AI:
我的網站是 WordPress。我想照下面這篇文章,改用 SMTP 寄信,讓表單通知、訂單通知不要再進垃圾信件匣。
請先問我:我用的是哪一種信箱、網站放在哪一家主機。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)
改之前先備份,密碼不要貼給 AI。
WordPress 預設怎麼寄信
WordPress 預設是請主機直接把信送出去,寄件人常常是 wordpress@你的網域。收信的一方(例如 Gmail)收到這封信,會先查幾件事:這台主機有沒有被你的網域授權寄信(SPF)、信上有沒有你的網域簽名(DKIM)、你的網域有沒有說查不過的信要怎麼處理(DMARC)。
一般的虛擬主機或自己架的雲端主機,這三樣常常都沒設好。信不是被丟進垃圾信件匣,就是直接被退回,而網站完全不會告訴你。
Gmail 從 2024 年 2 月起把規定寫得更明確:所有寄到 Gmail 的信,至少要通過 SPF 或 DKIM 其中一種;每天寄給 Gmail 超過 5,000 封的寄件者,SPF、DKIM、DMARC 三樣都要有。小店不會寄到 5,000 封,但第一條規定人人都要遵守。
解法:改用 SMTP,透過一個正式的信箱寄
SMTP 寄信的意思,是網站改成登入一個正式的信箱,請那個信箱代寄,不再自己送信。信箱服務商已經把授權、簽名都處理好了,信自然比較容易進收件匣。常見的選擇有三種:
第一種是用網域信箱,例如 Google Workspace、Microsoft 365,或主機商附的網域信箱。寄件人是 service@你的網域,看起來最正式。Google Workspace 每個帳號每天可以寄 2,000 封,一般小店綽綽有餘。
第二種是個人的 Gmail。可以用,但寄件人會是 @gmail.com,每天的寄信量也比較少(約 500 封),適合剛起步、量很小的網站。
第三種是專門寄系統信的服務,例如 Amazon SES。適合訂單量大、會寄電子報的網站,設定比較多,但量大時費用低、送達率穩定。
不用外掛的寫法
先把信箱帳號密碼寫進網站根目錄的 wp-config.php(加在「That’s all, stop editing!」那一行上面):
define('MIMI_SMTP_HOST', 'smtp.gmail.com');
define('MIMI_SMTP_USER', '[email protected]');
define('MIMI_SMTP_PASS', '應用程式密碼');
再把下面這段放進 Code Snippets 這類外掛或子主題(放法見〈WooCommerce 結帳頁改成台灣習慣〉):
// WordPress 改用 SMTP 寄信。帳號密碼寫在 wp-config.php:
// define('MIMI_SMTP_HOST', 'smtp.gmail.com');
// define('MIMI_SMTP_USER', '[email protected]');
// define('MIMI_SMTP_PASS', '應用程式密碼');
add_action('phpmailer_init', function ($mail) {
if (!defined('MIMI_SMTP_HOST')) {
return;
}
$mail->isSMTP();
$mail->Host = MIMI_SMTP_HOST;
$mail->Port = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->Username = MIMI_SMTP_USER;
$mail->Password = MIMI_SMTP_PASS;
$mail->setFrom(MIMI_SMTP_USER, get_bloginfo('name'), false); // 寄件人要跟登入的帳號一致
});
// 寄信失敗時記到錯誤紀錄,方便查原因
add_action('wp_mail_failed', function ($error) {
error_log('wp_mail 失敗:' . $error->get_error_message());
});
密碼放在 wp-config.php、不直接寫在程式碼片段裡,原因是程式碼片段存在資料庫,匯出、備份、交給別人看的時候容易一起外流;wp-config.php 只在主機上。
phpmailer_init 是 WordPress 每次寄信前的最後一站,我們在這裡把寄信方式改成 SMTP,連接埠 587 搭配 TLS 加密,這是大多數信箱服務都支援的組合。
setFrom 那一行很重要。很多信箱服務只允許你用「登入的那個帳號」當寄件人,網站原本的 wordpress@網域 會被改寫或擋下來,所以這裡統一改成登入的帳號,寄件人名稱用網站名稱。要注意,這也會蓋過 WooCommerce 設定裡的寄件者名稱,網站名稱記得設成店名。
最後一段把寄信失敗的原因寫進主機的錯誤紀錄。我們在測試站故意填一個連不上的主機,寄信後紀錄裡出現「SMTP 錯誤: 無法連線至 SMTP 主機。」,之後出問題就有線索可查。
用 Gmail 寄信要先開兩步驟驗證
Google 帳號不能直接用登入密碼給網站使用。要先開啟「兩步驟驗證」,再到 Google 帳戶的安全性設定建立一組「應用程式密碼」,把那 16 個字元填進 MIMI_SMTP_PASS。之後改了 Google 帳號的密碼,應用程式密碼會失效,要重新產生一組。
雲端主機要注意連接埠
如果你的網站放在 Google Cloud、AWS 這類雲端主機,主機直接寄信用的 25 號連接埠通常被擋住:Google Cloud 一律不開放,AWS 預設有限制,要另外申請。這也是很多人架好雲端主機後「網站怎麼都寄不出信」的原因。改用上面的 SMTP 寫法,走的是 587 號連接埠,不受這個限制。
怎麼確認真的寄好了
設定完,從網站寄一封信到自己的 Gmail,例如在登入頁按「忘記密碼」,或用聯絡表單送一次。打開信,按右上角的「⋮」選「顯示原始郵件」,最上面會列出 SPF、DKIM、DMARC 的結果,看到 PASS 就代表通過。
如果信箱是用自己的網域(第一種做法),還要確認網域的 DNS 已經依照信箱服務商的說明加好 SPF、DKIM 的紀錄。這一步常常被跳過,結果還是進垃圾信件匣。
不想動程式碼的話
也可以裝 SMTP 寄信類的外掛,在後台填主機、帳號、密碼,多半還附寄信紀錄和測試按鈕,對不熟程式碼的人比較友善。外掛和程式碼擇一使用就好,兩個同時開會互相蓋來蓋去。
信寄得到,是網站最基本、也最容易被忽略的功能。表單、訂單通知、會員密碼重設,全都靠它。網站上線時,請一定親手寄一封測試信,確認進的是收件匣。WooCommerce 訂單通知信本身可以怎麼改,可以參考〈WooCommerce 訂單通知信怎麼改〉。
如果你想把網站的表單、通知、會員流程整理好,可以先看〈IG 帳號不是你的資產〉想想網站要做到什麼。MIMI 專做客製化網頁設計,從網站到寄信設定都能一起處理。MIMI 提供臺北網頁設計服務,臺北的工作室可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。
