DMARC 完整教學 2026:SPF、DKIM、DMARC 三件套設定

2026 年 11 月 5 日起,Outlook.com、Hotmail、Live、MSN 開始拒收沒有 DMARC 記錄的網域寄出的部分郵件,錯誤碼是 550 5.7.1 與 AS9031519。這篇從零開始教 SPF、DKIM、DMARC 三件套:各自負責什麼、對齊(alignment)怎麼算、2048 位元 DKIM 金鑰怎麼產、TXT 記錄為什麼要拆成 255 字元一段、Google 官方建議的三階段上線順序,以及用 openssl+dkimpy 實際簽章驗證的輸出。文末附本站網域的實測稽核結果與可執行檢查指令。

  • Dennis
  • 9 分鐘閱讀
DMARC 完整教學 2026:SPF、DKIM、DMARC 三件套設定

DMARC 是一筆放在 _dmarc.<你的網域> 的 DNS TXT 記錄,用來告訴收件端「這個網域寄出的信如果沒通過 SPF 或 DKIM,你要怎麼處理」。沒有這筆記錄,2026 年 11 月起 Outlook 系列信箱會開始退你的信。

這不是演算法更新,也不是要你換寄信服務。它是一筆幾十個字元的 DNS 記錄,加上兩個你大概已經有、但很可能設錯的舊記錄。問題是,全台灣有大量中小企業與個人品牌根本沒設,而且因為只有部分信件被退,所以幾乎不會被發現。

先看懂事件:為什麼現在每個人都該檢查

時間規則影響對象沒過會怎樣
2024 年起Gmail、Yahoo 對每日寄送 5,000 封以上的大量寄件者要求 SPF、DKIM、DMARC 三件套行銷、電子報平台進垃圾信或退信
2025 年 5 月起微軟對寄往 Outlook.com 超過每日 5,000 封的寄件者要求三者通過大量寄件者550 5.7.515 Access denied
2026 年 11 月 5 日起Outlook.com、Hotmail、Live、MSN 對沒有 DMARC 記錄的網域拒收部分郵件一般寄件者、小公司、個人550 5.7.1 Message rejected: Message lacks SPF/DKIM/DMARC Auth Records (AS9031519)

第三列才是這次的重點:它沒有門檻、沒有公告、沒有明確失敗清單。資安服務商 MailRoute 從自家外送日誌最早看到這批退信,並指出被退的網域多半 SPF 正常、有些連 DKIM 都正常,缺的就是「把兩者綁到 From 位址」的那筆 DMARC。

更麻煩的是它只退一部分。同一批信,一封進得去、下一封被退,重寄又可能成功。寄件人看到一串縮寫就當成偶發錯誤,收件人則根本不知道有信來過。發票沒到、預約確認沒到、回信看起來像已讀不回——這些都不會進到任何監控儀表板。

三件套各自負責什麼

新手最常卡住的地方,是把三個縮寫當成同義詞。它們檢查的東西完全不同:

記錄放在哪檢查什麼對齊誰主要弱點
SPF網域根目錄 TXT(most.tw)寄件伺服器的 IP 在不在授權清單信封寄件者(Return-Path/MAIL FROM),不是 From 標頭轉寄就會斷;查詢次數上限 10 次
DKIM<selector>._domainkey.<網域>信件內容有沒有被改過(以私鑰簽章、公鑰驗章)d= 參數的網域金鑰外洩等於可偽造;金鑰太短會被降評
DMARC_dmarc.<網域>上面兩個有沒有「對齊 From 網域」,以及不對齊時怎麼處理From 標頭網域它自己不驗證任何東西,只做政策與回報

三個記錄的關係可以用一句話記住:SPF 管「誰可以寄」,DKIM 管「內容有沒有被動過」,DMARC 管「這兩個結果跟畫面上顯示的寄件人是不是同一個網域」。

最後那句是關鍵。很多公司 SPF、DKIM 都設了,DMARC 卻一直沒過,就是因為兩者驗的網域跟 From 網域不一樣——這叫對齊(alignment)問題。

對齊:最容易設錯的一步

DMARC 通過的條件只有一個:

SPF 通過 且 信封寄件網域與 From 網域對齊,或 DKIM 通過 且 d= 網域與 From 網域對齊。

「對齊」有兩種模式:嚴格(strict,網域必須完全相同)與寬鬆(relaxed,只要組織網域相同即可,例如 mail.example.com 對齊 example.com)。預設是寬鬆,除非你在記錄裡寫 adkim=s 或 aspf=s。

來看一個真實例子,本站網域 2026-11-08 的實際查詢結果:

查詢實際結果意義
dig TXT most.tw只有兩筆網域驗證用的 TXT,沒有 v=spf1根網域沒有任何 SPF
dig TXT send.most.twv=spf1 ip4:52.3.252.119 ip4:44.222.39.36 ip4:199.249.231.0/24 ~allSPF 設在寄信子網域上
dig TXT resend._domainkey.most.tw有公鑰,解析後是 1024 位元 RSADKIM 有設,但金鑰長度偏舊
dig TXT _dmarc.most.twv=DMARC1; p=none;有 DMARC,但沒有 rua,等於收不到任何回報
dig MX most.tw10 inbound-smtp.ap-northeast-1.amazonaws.com.收信走 Amazon SES inbound

這組設定很典型,也剛好示範了兩個最常見的誤解:

  1. SPF 設在子網域,不等於 From 網域有 SPF。 寄信服務用 send.most.tw 當信封寄件者(DKIM selector 命名為 resend),SPF 通過的是 send.most.tw;但信件的 From 是 @most.tw,兩者組織網域相同,所以寬鬆模式下「算對齊」。如果哪天改了寄信服務、信封網域變成別人的網域,這個對齊就會斷。
  2. 真正讓信送得出去的是 DKIM,不是 SPF。 根網域沒有 SPF,但 DKIM 的 d=most.tw 與 From 對齊,於是 DMARC 仍然通過。這正好說明為什麼「信都收得到」不能當成設定正確的證據——p=none 之下,就算兩個都不過,收件端也不會擋你。

而 p=none 又沒有 rua,代表沒有人會收到失敗回報。掛著一個沒有回報地址的 DMARC,等於在門口裝了一台沒有接電的監視器:形式上有,實際上什麼都不知道。

SPF 怎麼寫

最小可用版本長這樣(~all 是軟失敗,-all 是硬失敗):

v=spf1 include:_spf.google.com include:amazonses.com ~all

幾個實務規則:

規則說明踩到會怎樣
一個網域只能有一筆 SPF兩筆 v=spf1 會造成 permerror全部視為未通過
查詢機制合計不超過 10 次include、a、mx、ptr、exists、redirect 都算超過回 permerror,等於 SPF 失效
void 查詢不超過 2 次查了但沒資料的查詢同上
別用 ptr慢又不可靠,多數服務已不支援拉高查詢次數、拖慢收信
用 ~all 起手,穩定後再改 -all軟失敗在觀察期比較安全一開始就 -all 會把自己的轉寄信擋掉

估算查詢次數最快的方法,是把所有會觸發 DNS 查詢的機制列出來數一遍。上面那筆範例是 2 個 include,加上每一層 include 內部展開的查詢(Google 的 _spf.google.com 自己就包含多層),實務上很容易在「多加一個 SaaS 服務」時悄悄爆表。每次新增寄信服務,都要重數一次。

DKIM 怎麼做(含實際輸出)

DKIM 需要一對金鑰:私鑰留在寄信端簽章,公鑰放到 DNS 讓收件端驗章。用 openssl 產 2048 位元金鑰:

openssl genrsa -out dkim.key 2048
openssl rsa -in dkim.key -pubout -outform PEM

實際執行後,公鑰的 base64 內容(去掉 PEM 標頭尾)長度是 392 字元,組成完整記錄後總長 410 字元:

v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArWJfRdUY...

DNS 的 TXT 記錄有「單一字串 255 位元組」的限制,所以 410 字元必須拆成兩段(實測 255 + 155),多數 DNS 供應商會自動幫你拆,但自架 BIND 或用 API 寫入時要自己處理:

"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArWJfRdUY...(前 255 字元)"
"(剩下的 155 字元)"

記錄名稱是 <selector>._domainkey.<網域>,selector 自己取(default、google、resend、s1 都常見)。寄信端簽章時的 s= 必須跟 selector 完全一致,不然收件端查不到公鑰。

簽完之後怎麼確認真的有效?用 Python 的 dkimpy 實際跑一次(簽章用剛產生的私鑰,驗章用 DNS 函式回傳同一把公鑰):

測試程式呼叫實際結果
原始信件驗章dkim.verify(signed, dnsfunc=...)True
把主旨改一個字後驗章dkim.verify(tampered, dnsfunc=...)False

簽章標頭長這樣(h= 列出被納入簽章的標頭,bh= 是內文雜湊):

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com;
 i=@example.com; q=dns/txt; s=demo; t=1794168144; h=from : to : subject : date; bh=...

True / False 這一組對照是 DKIM 存在的意義:它證明的是「內容沒被改」,不是「寄件人是你」。所以偽造者如果偷到你的私鑰,DKIM 一樣會通過——這也是為什麼 2048 位元、定期輪替、私鑰不進 git 是三件必須同時做到的事。RFC 8301 的規定是簽章金鑰至少 1024 位元、建議 2048 位元;本站目前那把解析出來是 1024 位元,屬於「能用但不理想」的等級。

DMARC 怎麼寫

最小版本就是一行:

v=DMARC1; p=none; rua=mailto:dmarc@example.com

常用標籤:

標籤作用常見值
p主政策:沒通過時怎麼辦none(只觀察)/quarantine(進垃圾信)/reject(直接拒收)
sp子網域政策(未設定時繼承 p)建議比 p 更嚴格
pct政策套用的百分比p=quarantine; pct=10
rua彙總報告寄到哪(每天一封 XML)mailto:dmarc@你的網域
ruf失敗個案的詳細報告(含原始標頭,注意隱私)多數情況可不設
adkim / aspf對齊模式,r 寬鬆、s 嚴格預設 r
fo什麼情況下寄失敗報告0/1/d

三個實務細節:

  • rua 一定要設。 沒有回報的 p=none 完全沒有資訊價值,你會不知道自己有多少信被擋、被誰擋。
  • 記錄只能有一筆。 放在 _dmarc.<網域>,TXT 型別;實務上也不要用 CNAME 轉址,部分驗證器不支援,而且多一層查詢鏈就多一個失敗點。
  • p=reject 不是終點,是結果。 前提是 SPF 與 DKIM 都對齊、而且所有寄信來源(官網、客服系統、電子報、會計系統、人資系統)都盤點過。

上線順序:照 Google 官方建議走最安全

Google Workspace 的官方文件(2026-10-26 更新)把 rollout 寫得很具體,值得直接照抄:

階段設定持續時間要做的事
0先設好 SPF 與 DKIM至少提前 48 小時確認兩者都通,再談 DMARC
1p=none至少一週每天看 rua 報告,找出所有寄信來源
2p=quarantine,小比例 pct逐步往上小型組織可從 10% 起、大型組織從 1% 起
3提高到 pct=100觀察一週無異常後再考慮 p=reject

第 1 階段那一週是最有價值的時間。你會第一次看到「原來行銷部門還在用一個沒人記得的平台寄信」——這種寄信來源如果直接上 p=reject,等於親手把自己的通知信擋掉。

怎麼驗證(可直接執行)

目的指令或位置
有沒有 DMARCdig +short TXT _dmarc.你的網域
有沒有 SPFdig +short TXT 你的網域
DKIM 公鑰在不在dig +short TXT <selector>._domainkey.你的網域
子網域 SPFdig +short TXT send.你的網域
寄件端實際簽章結果寄一封測試信到 Gmail,看「顯示原始郵件」裡的 Authentication-Results
收件端判定同上,看 spf=、dkim=、dmarc= 三個欄位是否為 pass

Authentication-Results 那行是唯一的權威。DNS 記錄設得再漂亮,只要收件端顯示 dmarc=fail,就是沒過。

常見錯誤對照表

症狀常見原因修法
550 5.7.1 ... lacks SPF/DKIM/DMARC Auth Records根本沒有 _dmarc 記錄先加 v=DMARC1; p=none; rua=...
DMARC fail 但 SPF passSPF 通過的是信封網域,與 From 不同網域且不對齊讓寄信服務用你的子網域當信封寄件者,或改由 DKIM 對齊
DKIM fail 但 DNS 查得到公鑰selector 不符、私鑰與公鑰不是同一對、或簽章後內容又被改對齊 s= 與記錄名稱;重新產金鑰對
轉寄後 DMARC 失敗轉寄改變了信封寄件者,SPF 必然斷靠 DKIM(內容不變仍可驗);郵件列表用 ARC
加了新服務後突然大量失敗SPF 查詢次數超過 10 次,或那個服務沒被 include重數查詢、把不用的 include 拿掉
自己寄給自己正常,寄客戶卻進垃圾信p=none 讓失敗不報錯,你只是沒看到設 rua 收報告,或寄到 Gmail 看標頭

誰需要、誰可以晚點做

情況建議
會寄信給客戶(報價、發票、預約、通知)立刻做,這是本次 Outlook 變更的直接受害者
有電子報、有官網表單通知信立刻做,rua 至少設起來
用 Google Workspace/Microsoft 365 但沒動過 DNS一小時內可完成,別拖
只用免費信箱、沒有自有網域不需處理(沒有網域就沒有 DMARC 可設)
網域純粹做網站、完全不寄信仍建議設 v=DMARC1; p=reject; 防止別人冒名寄信

最後那一列常被忽略:一個「不寄信」的網域,正是最容易被人拿來偽造寄件人的網域。設 p=reject 的成本是零,收益是別人不能再拿你的品牌名去釣魚。

站內延伸閱讀

(本文為技術整理,未接受任何廠商贊助;文中所有查詢結果為 2026-11-08 實際執行所得。)

📬 訂閱 most.tw 電子報

每週精選 AI 工具教學與技術乾貨,直接送到你的信箱。免費、隨時可退訂。

訂閱即表示同意收到 most.tw 電子報,隨時可一鍵退訂。

💬 有問題想討論?加 LINE 聯絡我

歡迎透過 LINE 官方帳號直接留言,我會盡快回覆你的問題。

加入 LINE 好友