默默看郵件
← 回到部落格
SPFDKIMDMARC

SPF、DKIM、DMARC 是什麼?一次搞懂郵件驗證三兄弟

信件一直進垃圾信件夾?九成機率跟這三個設定有關。用白話文解釋 SPF、DKIM、DMARC 到底是什麼、為什麼重要、怎麼設。

默默·2026 年 4 月 22 日

SPF、DKIM、DMARC 是什麼?一次搞懂郵件驗證三兄弟

很多人來找我的原因都一樣:「信件一直進垃圾信件夾,我不知道為什麼。」

我問的第一個問題永遠是:「你的 SPF、DKIM、DMARC 有設嗎?」

八成的人回答:「什麼?」

所以這篇就是專門為你寫的。除了 DNS 設定,影響信件抵達率的原因其實還有很多——但 SPF/DKIM/DMARC 是最基礎、最先要確認的三件事。


先說為什麼這三個東西這麼重要

收件匣的守門員(Gmail、Outlook、Yahoo Mail 這些信箱服務)每天要處理幾十億封信,其中大量是詐騙信、釣魚信、垃圾信。它們必須快速判斷:這封信是真的嗎?這個寄件人是它自稱的那個人嗎?

SPF、DKIM、DMARC 就是幫你證明身份用的。

沒有這三個設定,你寄出去的信對收件方來說就是一個陌生人敲門,不知道你是誰,也不知道你是不是壞人。被擋在門外很正常。

這三個設定都是放在 DNS 裡的記錄。你不需要改動你的寄信伺服器或 ESP 的任何程式邏輯——你只需要在你的域名管理後台加幾筆 TXT 記錄。但加錯了也會出問題,所以這篇我會講清楚每個設定的邏輯和常見錯誤。


SPF:你告訴世界「哪些伺服器可以代表我寄信」

SPF 是 Sender Policy Framework 的縮寫。

白話翻譯:你在自己的網域 DNS 裡放一筆記錄,告訴全世界「只有這些 IP 位址有資格用我的名字寄信」。

舉個例子:你用 Mailchimp 寄電子報,Mailchimp 的伺服器代替你發信。如果你沒設 SPF,收件方看到「這封信聲稱來自 yourcompany.com,但寄件的 IP 不在授權清單上」,就會起疑。

SPF 的樣子長這樣:

v=spf1 include:mailchimp.com ~all

意思是:「我授權 Mailchimp 的伺服器替我寄信,其他來源的信請放寬處理(~all)。」


幾個常踩的地雷:

DNS 查詢次數超過 10 次

SPF 有個很多人不知道的限制:include: 這種需要查詢 DNS 的機制最多只能用 10 次。很多公司同時在用 Mailchimp、HubSpot、Salesforce、Zendesk……每個工具都要加一個 include:,很容易超過 10 次。

超過限制之後,你的 SPF 記錄會回傳 permerror(永久性錯誤),等於整個 SPF 完全失效——就像根本沒有設一樣。

如果你用的工具很多,可以考慮使用 SPF Flattening 服務,把多個 include: 轉成直接列出 IP 的方式,減少查詢次數。

-all vs ~all

-all 是硬拒絕(不在清單的一律擋)。 ~all 是軟拒絕(標記但不一定擋)。

大多數情況用 ~all 就好。用 -all 要絕對確定你的授權清單是完整的,否則一個漏掉的合法 ESP,你的信就被你自己的 SPF 擋掉了。

SPF 驗證的是信封上的寄件人,不是你看到的 From

這點很多人不知道,是後面理解 DMARC Alignment 的關鍵。SPF 驗證的是 MAIL FROM(SMTP 層的發件人,又叫 Envelope Sender 或 Return-Path),不是你在信件裡看到的 From 欄位。這兩個可以不一樣,而 DMARC 會要求它們對齊。


DKIM:你在每封信上蓋一個防偽印章

DKIM 是 DomainKeys Identified Mail 的縮寫。

白話翻譯:郵件伺服器在寄出去的每封信上加一個數位簽章,收件方可以拿你公開在 DNS 的公鑰來驗證「這封信確實是從你的系統發出去的,而且中途沒有被人改過」。

SPF 驗證的是誰寄的,DKIM 驗證的是信有沒有被動過手腳。兩個從不同角度保護你的信件。


DKIM 的設定邏輯:

  1. 你的 ESP(或自己的郵件伺服器)生成一對金鑰:私鑰留在伺服器,公鑰放到 DNS
  2. 每封信寄出時,伺服器用私鑰對信件內容(信頭和信體的特定部分)產生簽章
  3. 收件方拿 DNS 上的公鑰解密簽章,驗證是否一致

如果簽章一致,代表:這封信是從持有私鑰的伺服器發出的,而且內容從那時候到現在沒有被修改過。

DNS 裡的 DKIM 記錄長這樣:

selector1._domainkey.yourcompany.com  TXT  "v=DKIM1; k=rsa; p=MIGfMA0..."

selector1 是選擇器(Selector),你可以有多個 DKIM 金鑰對應不同的 ESP,靠這個區分。比如 Mailchimp 用 k1._domainkey,HubSpot 用 hs1._domainkey,各自不干擾。


常見問題:

我不知道我的 DKIM Selector 是什麼

收一封你自己寄出的信,查看原始碼(Gmail 右上角三個點 → 「顯示原始郵件」),找 DKIM-Signature 那一行,s= 後面的值就是 Selector。

金鑰長度用 RSA 2048 位

RSA 1024 早就被認為不夠安全了,現在的標準是 2048 位。如果你的 ESP 或伺服器還在用 1024 位,要更新。

DKIM 金鑰要定期輪換

很多人設好之後就放著不管。安全最佳實踐是每 6-12 個月輪換一次 DKIM 金鑰,降低私鑰外洩的風險。輪換的時候要先把新的公鑰加到 DNS,確認傳播完成後再把伺服器切換到新的私鑰,這樣中間不會有空窗期。


DMARC:你告訴收件方「驗不過的信要怎麼處理」

DMARC 是 Domain-based Message Authentication, Reporting & Conformance 的縮寫,名字很長,但概念不難。

DMARC 做兩件事:

  1. 定義政策:SPF 或 DKIM 驗不過的信,你要求收件方怎麼處理?不管(none)、放進垃圾信件夾(quarantine)、直接拒絕(reject)?
  2. 回傳報告:讓你知道有哪些 IP 在用你的名字寄信,以及驗證通過的比例。

DMARC 的樣子:

v=DMARC1; p=quarantine; rua=mailto:dmarc@yourcompany.com; pct=100
  • p=quarantine:驗不過就丟進垃圾信件夾
  • rua=:把彙整報告寄到這個信箱(Aggregate Report,每天一次)
  • pct=100:對 100% 的信件套用這個政策

你也可以設 ruf= 接收 Forensic Report(個別失敗信件的報告),但這個有隱私爭議,很多 ISP 不再傳送了。


DMARC 有個很多人搞混的地方:Alignment(對齊)

DMARC 不只看 SPF 和 DKIM 有沒有通過,還要看驗證的網域跟 From 信頭的網域是不是同一個

這叫做 Alignment(對齊)。

簡單說:你的 From 是 @yourcompany.com,SPF 或 DKIM 驗的也要是 yourcompany.com,不是其他網域。

很多人 SPF 通過了,但因為 ESP 用自己的網域做 Envelope Sender(Return-Path 是 bounce.mailchimp.com),而不是你的網域,DMARC 的 SPF Alignment 就過不了。

解法是:讓你的 ESP 用你自己的子域名做 Return-Path(有些 ESP 叫做「Custom Bounce Domain」或「Custom Return-Path」),或者確保 DKIM 簽章使用你自己的網域,用 DKIM Alignment 來通過 DMARC。


如何讀 DMARC 報告

DMARC 報告是 XML 格式,直接看很痛苦。建議用免費的工具把報告視覺化:

  • Google Postmaster Tools:Gmail 的角度,免費
  • dmarcian:免費版有基礎功能,可以看報告摘要
  • MXToolbox DMARC Report:另一個免費選項

報告裡最重要的資訊:有哪些 IP 在用你的網域寄信,以及每個 IP 的驗證通過率。這可以幫你:

  • 找到你不知道的合法寄件來源(例如某個第三方服務在代表你發信,但你忘了設定)
  • 發現有人在偽造你的網域(Phishing 攻擊)

DMARC 要怎麼部署?循序漸進,不要一開始就 reject

  1. 先設 p=none,只收報告,觀察有哪些來源在寄信
  2. 分析報告 2-4 週,確認所有合法來源(ESP、工具)都通過驗證
  3. 把所有合法來源都設好 SPF 或 DKIM 之後,改成 p=quarantine,先從 pct=25 開始,觀察一週
  4. 慢慢把 pct 拉到 100,確認沒有正常信件被誤擋
  5. 穩定之後,再升到 p=reject

很多人急著設 p=reject 結果把自己的正常信也擋掉了。不要急,部署 DMARC 是需要過程的。


三個設定的關係,一張圖說清楚

你寄一封信
  │
  ├── SPF 檢查:這個 IP 被授權了嗎?(驗 Envelope Sender)
  │
  ├── DKIM 檢查:這個簽章是真的嗎?(驗信件完整性)
  │
  └── DMARC 檢查:
        ├── SPF 通過,且 SPF 網域 = From 網域?(SPF Alignment)
        ├── DKIM 通過,且 DKIM 網域 = From 網域?(DKIM Alignment)
        ├── 至少一個 Alignment 通過 → DMARC Pass
        └── 都失敗 → 按 p= 政策處理(none / quarantine / reject)

常見的診斷工具

自己設定完,怎麼確認有沒有設對?

  • MXToolbox:查 SPF、DKIM、DMARC 記錄是否正確、IP 是否在黑名單
  • Mail Tester(mail-tester.com):寄一封測試信,會評分並列出問題
  • Google Postmaster Tools:查 Domain Reputation、IP Reputation、DMARC 通過率
  • DMARC Analyzer:把 DMARC 報告轉成人看得懂的格式

這些工具大部分都有免費版,設定完後跑一遍是個好習慣。


最後,幫你整理一個行動清單

  • 確認你寄信用的每個 ESP 都加進 SPF
  • 檢查 SPF DNS 查詢次數沒有超過 10 次(用 MXToolbox 的 SPF Check 可以驗)
  • 在每個 ESP 設定 DKIM,並把公鑰加到 DNS
  • 確認 DKIM 金鑰長度是 RSA 2048 位
  • 設定 DMARC,先從 p=none 開始
  • rua= 開始收報告,看看有誰在用你的網域
  • 分析 DMARC 報告 2-4 週,確認所有合法來源都通過 Alignment
  • 觀察穩定後,視情況升級到 quarantine,再到 reject

有問題或不確定自己設對了嗎?我的網域健康度檢查工具可以幫你自動驗一遍,或是直接找我聊聊

常見問題

SPF、DKIM、DMARC 一定要三個都設嗎?
建議三個都設。SPF 宣告哪些伺服器能代表你寄信,DKIM 幫每封信蓋防偽章,DMARC 告訴收件方驗不過的信要怎麼處理。Gmail、Yahoo 對大量寄件者已經把三者列為基本要求,只設一兩個會越來越不夠。
只設 SPF、不設 DKIM 可以嗎?
短期內信還是寄得出去,但 DMARC 的對齊(Alignment)會受影響,抵達率也比較不穩。想要長期穩定進收件匣,還是三個一起設最保險。
DNS 設定要多久才會生效?
DNS 記錄更新需要時間傳播,視你的供應商設定,通常幾分鐘到幾小時,偶爾要等到 24 小時。改完先等一下再驗證。
我怎麼知道自己設對了沒?
可以用網域健康度檢查工具自動驗一遍 SPF、DKIM、DMARC 和對齊狀態,或觀察 DMARC 報告有沒有驗證失敗的來源。
默默
默默

台灣 Email Deliverability 顧問。曾協助數十個品牌完成 IP 預熱,黑色星期五期間維持 95% 抵達率。 如果你的信一直進垃圾信件夾,歡迎找我聊。

預約免費諮詢 →