電子郵件
SPF、DKIM、DMARC:為什麼你的信進不了收件匣
「我的信被當成垃圾信」是一個症狀,不是原因。而且它的原因通常不在信的內容,而在收件端根本無法確認這封信真的是你寄的。
這篇把三個郵件驗證標準講清楚,然後給一份實際的設定與檢查順序。看完之後,你至少能自己判斷問題出在哪一層。
先理解收件端在問什麼
當一封信抵達 Gmail 的伺服器,它會依序問三個問題:
- 這封信是不是從一台被授權替這個網域寄信的機器送出來的?(SPF 回答)
- 這封信在傳輸過程中有沒有被改過?寄件網域能證明是自己寄的嗎?(DKIM 回答)
- 如果前兩個檢查沒過,網域擁有者希望我怎麼處理?(DMARC 回答)
三個問題,三個標準。它們不是替代關係,是疊加關係。
SPF:誰可以替我寄信
SPF(Sender Policy Framework)是一筆 DNS TXT 紀錄,內容是一份白名單:哪些 IP 或哪些服務有權用你的網域寄信。
v=spf1 include:_spf.google.com include:amazonses.com -all
拆開來看:
v=spf1:版本宣告,固定這樣寫。include:...:把某個服務的授權清單納入。用 Google Workspace 收發信就要放 Google 的,用 SES 寄轉發信就要放 SES 的。-all:清單以外的一律拒絕。
最後那個修飾符是最多人設錯的地方。常見的三種寫法:
| 寫法 | 意思 | 建議 |
|---|---|---|
-all | 嚴格拒絕 | 目標狀態 |
~all | 軟性失敗,標記但通常仍收下 | 過渡期可用 |
+all | 任何人都可以冒充你 | 絕對不要用 |
我看過不只一次有人為了「先讓信寄得出去」而寫 +all,然後就再也沒改回來。這等於公開宣告任何人都能冒用你的網域。
SPF 的兩個陷阱
第一,一個網域只能有一筆 SPF 紀錄。 如果你為了加入新服務而多開一筆 TXT,兩筆都會失效。正確做法是在原本那筆裡多加一個 include。
第二,DNS 查詢上限是 10 次。 每個 include 都會觸發查詢,而有些服務的 include 內部還會再 include。超過 10 次,整個 SPF 直接判定為 permerror,等同沒設。用線上工具檢查你的查詢次數,這件事很容易在加到第四、第五個服務時悄悄超標。
DKIM:這封信真的是我寄的
SPF 驗證的是「哪台機器」,DKIM(DomainKeys Identified Mail)驗證的是「內容有沒有被改過」。
流程是這樣:寄件伺服器用私鑰對信件的標頭與內文簽章,把簽章放進 DKIM-Signature 標頭。收件端從你的 DNS 取得公鑰,驗證簽章。
你要做的事只有一件:把寄信服務給你的公鑰貼進 DNS。通常長這樣:
selector._domainkey.yourdomain.com TXT "v=DKIM1; k=rsa; p=MIGfMA0GCS..."
selector 是服務商指定的名稱,用來區分同一個網域的多組金鑰。這也代表多個寄信服務可以共存——每個用自己的 selector 就好,不像 SPF 只能有一筆。
DKIM 比 SPF 重要的一個原因是:它能通過轉寄。信件被轉寄時,寄件 IP 變了,SPF 會失敗;但只要內容沒改,DKIM 仍然有效。
DMARC:告訴收件端怎麼處理失敗
有了 SPF 和 DKIM,還缺一件事:當檢查失敗時,收件端該怎麼辦?在沒有 DMARC 的世界裡,這完全由收件端自己決定,結果通常是「還是收下,丟垃圾桶」。
DMARC 讓你明確表態:
_dmarc.yourdomain.com TXT "v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com; pct=100"
關鍵是 p(policy):
p=none:不做任何處置,但寄報告給我。這是起點。p=quarantine:失敗的信丟到垃圾郵件。p=reject:失敗的信直接退回。這是終點。
對齊(alignment):DMARC 真正檢查的東西
這是 DMARC 最容易被誤解的部分。DMARC 不只看 SPF/DKIM 有沒有通過,還要看通過的那個網域,跟使用者看到的寄件人網域是不是同一個。
舉例:你透過某個行銷平台寄信,信封寄件人是 bounce@mail.platform.com,但顯示的寄件人是 you@yourdomain.com。SPF 檢查的是前者,通過了——但它跟後者不對齊,所以 DMARC 的 SPF 部分算失敗。
這就是為什麼很多人明明設了 SPF,DMARC 報告卻一片紅。解法通常是在平台上設定自訂寄件網域(custom sending domain),讓兩者對齊。
照著做的順序
不要一次全部設好然後開機。順序很重要,因為設錯的代價是信全部退回。
第一步:設定 SPF,先用 ~all。 把所有會替你寄信的服務都列進去——包含你可能忘記的那些:CRM、電子報平台、客服系統、發票系統、監控告警。
第二步:設定 DKIM。 每個寄信服務都各自設一組。設完之後,寄一封信給自己,看信件原始檔裡有沒有 dkim=pass。
第三步:設定 DMARC,用 p=none。 這一步不會影響任何信件的投遞,純粹是開始收報告。
第四步:讀報告,至少兩週。 你幾乎一定會發現一兩個自己忘記的寄信來源。這正是 p=none 存在的意義——在還沒有任何東西會被擋掉的情況下,把清單補完整。
第五步:逐步收緊。 報告乾淨之後,SPF 改成 -all,DMARC 改成 p=quarantine,觀察兩週,再改成 p=reject。
從第一步到第五步,一個月是合理的節奏。急不得。
設定完了還是進垃圾桶?
驗證通過只是及格線,不保證進收件匣。過了這一關之後,影響送達率的因素換成這些:
- 退信率。硬退信(地址不存在)比例超過 2–3% 就會開始受影響。所以名單清理不是可選項。
- 投訴率。使用者按下「檢舉垃圾信」的比例超過 0.1% 就是警訊。退訂連結一定要放,而且要好按——讓人找不到退訂鈕,他就會按檢舉,那對你傷害大得多。
- 參與度。長期沒被打開的地址,收件端會逐漸把你降級。定期把 180 天沒互動的地址移出主要名單。
- 發送量的變化速度。從每天 10 封突然跳到每天 5000 封,本身就是可疑訊號。要放量就慢慢放。
- 內容訊號。全圖片無文字、大量縮網址、過度的驚嘆號與全大寫,這些都會扣分。
一份最小檢查清單
寄任何一波信之前,我會確認這五件事:
- 寄一封測試信到自己的 Gmail,看原始檔裡
spf=pass、dkim=pass、dmarc=pass三個都在。 - SPF 的 DNS 查詢次數在 10 次以內。
- DMARC 報告最近兩週沒有出現不明來源。
- 名單裡的硬退信地址已經移除。
- 信裡有可以一鍵完成的退訂連結。
五項全過再按送出。這五分鐘可以省掉之後好幾個月的麻煩。
文中提到的產品
BatchPilot
整理名單、撰寫內容、批次寄送並追蹤結果,讓十人以下團隊的外聯流程不再靠 Excel 加手動複製。
Realty Mailer
輸入地址、謄本文字或同業廣告網址,自動產生一封針對該物件的開發信,並可下載成 PDF。
其他文章
內容有錯誤或想補充?寄信到 support@throuzlabs.com, 我會更新並在文中註明修訂日期。