電子郵件

SPF、DKIM、DMARC:為什麼你的信進不了收件匣

發佈於 2026-04-02 .約 11 分鐘閱讀

「我的信被當成垃圾信」是一個症狀,不是原因。而且它的原因通常不在信的內容,而在收件端根本無法確認這封信真的是你寄的。

這篇把三個郵件驗證標準講清楚,然後給一份實際的設定與檢查順序。看完之後,你至少能自己判斷問題出在哪一層。

先理解收件端在問什麼

當一封信抵達 Gmail 的伺服器,它會依序問三個問題:

  1. 這封信是不是從一台被授權替這個網域寄信的機器送出來的?(SPF 回答)
  2. 這封信在傳輸過程中有沒有被改過?寄件網域能證明是自己寄的嗎?(DKIM 回答)
  3. 如果前兩個檢查沒過,網域擁有者希望我怎麼處理?(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 封,本身就是可疑訊號。要放量就慢慢放。
  • 內容訊號。全圖片無文字、大量縮網址、過度的驚嘆號與全大寫,這些都會扣分。

一份最小檢查清單

寄任何一波信之前,我會確認這五件事:

  1. 寄一封測試信到自己的 Gmail,看原始檔裡 spf=passdkim=passdmarc=pass 三個都在。
  2. SPF 的 DNS 查詢次數在 10 次以內。
  3. DMARC 報告最近兩週沒有出現不明來源。
  4. 名單裡的硬退信地址已經移除。
  5. 信裡有可以一鍵完成的退訂連結。

五項全過再按送出。這五分鐘可以省掉之後好幾個月的麻煩。

文中提到的產品

其他文章

回到文章列表 →

內容有錯誤或想補充?寄信到 support@throuzlabs.com, 我會更新並在文中註明修訂日期。