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.tw | v=spf1 ip4:52.3.252.119 ip4:44.222.39.36 ip4:199.249.231.0/24 ~all | SPF 設在寄信子網域上 |
dig TXT resend._domainkey.most.tw | 有公鑰,解析後是 1024 位元 RSA | DKIM 有設,但金鑰長度偏舊 |
dig TXT _dmarc.most.tw | v=DMARC1; p=none; | 有 DMARC,但沒有 rua,等於收不到任何回報 |
dig MX most.tw | 10 inbound-smtp.ap-northeast-1.amazonaws.com. | 收信走 Amazon SES inbound |
這組設定很典型,也剛好示範了兩個最常見的誤解:
- SPF 設在子網域,不等於 From 網域有 SPF。 寄信服務用
send.most.tw當信封寄件者(DKIM selector 命名為resend),SPF 通過的是send.most.tw;但信件的 From 是@most.tw,兩者組織網域相同,所以寬鬆模式下「算對齊」。如果哪天改了寄信服務、信封網域變成別人的網域,這個對齊就會斷。 - 真正讓信送得出去的是 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 |
| 1 | p=none | 至少一週 | 每天看 rua 報告,找出所有寄信來源 |
| 2 | p=quarantine,小比例 pct | 逐步往上 | 小型組織可從 10% 起、大型組織從 1% 起 |
| 3 | 提高到 pct=100 | 觀察一週無異常後 | 再考慮 p=reject |
第 1 階段那一週是最有價值的時間。你會第一次看到「原來行銷部門還在用一個沒人記得的平台寄信」——這種寄信來源如果直接上 p=reject,等於親手把自己的通知信擋掉。
怎麼驗證(可直接執行)
| 目的 | 指令或位置 |
|---|---|
| 有沒有 DMARC | dig +short TXT _dmarc.你的網域 |
| 有沒有 SPF | dig +short TXT 你的網域 |
| DKIM 公鑰在不在 | dig +short TXT <selector>._domainkey.你的網域 |
| 子網域 SPF | dig +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 pass | SPF 通過的是信封網域,與 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 實際執行所得。)
