SiteKensa

DMARCのpctタグは廃止されました|RFC 9989での扱いと直し方

公開日 更新日 DMARCメール独自ドメイン
廃止されたpctタグの2つの値(pct=0とpct=100)が、後継のtタグのt=yとt=nにそれぞれ対応することを示す図

DMARCレコードに pct=10 のような指定を書いていて、診断で「pct=10 が指定されています」と表示されることがあります。あるいは t=y を書いていて「t=y のため、実際には quarantine として扱われます」と出ることもあります。

どちらも参考情報として表示しているもので、メールがいま届かなくなっているという意味ではありません。ただし、段階的にポリシーを適用するつもりで pct を書いている場合は、想定と違う動きになります。

先に結論を書きます。

  • pct タグは、RFC 9989(2026年5月)でDMARCのタグ一覧から外されました
  • 後継は t タグです。ただし pct=10 の代わりが t=y になるわけではありません
  • 既存のレコードが無効になるわけではありません。v=DMARC1 のレコードはそのまま有効です
  • 直す内容は、いまのポリシーが none かそれ以外かで変わります
  • いま何が適用されているかは、メール認証の診断で確認できます

この記事は、DMARCレコードを自分で編集したことがあり、pctt の指定について診断で指摘を受けた方に向けて書いています。DMARCレコードをまだ追加していない場合は、先にDMARCを設定していないリスクと最初に置く設定を読んでください。

用語をここで揃えます。すでにご存じの場合は読み飛ばしてください。

用語 意味
タグ p=pct= のように、名前=値 の形で書く1つの指定
p 認証に失敗したメールを受信側にどう扱わせるかの指定。none / quarantine / reject
pct 廃止されたタグ。ポリシーを適用する割合を指定するものでした
t pct の一部の機能を引き継いだタグ。yn の2つだけを取ります
受信側 届いたメールを受け取る側のメールサービス。GmailやOutlookなど

診断に出た表示ごとに、何が起きているか

4つの表示があります。いずれも参考情報として出しています。

表示 何を指しているか 直し方
pct=10 が指定されています 100未満の pct を書いている ポリシーの状態に応じて書き換えます
pct の値が不正です 整数でない、または0から100の外の値 その指定を消します
t=y のため、実際には quarantine として扱われます 宣言したポリシーより1段ゆるい扱いになっている 適用に進むなら消します
t の値が不正です y でも n でもない値 y に直すか、指定を消します

「pct の値が不正です」と「t の値が不正です」は、値の書き間違いです。「pct=10 が指定されています」と「t=y のため」は、書き間違いではなく、いまのDMARCの仕様との食い違いを伝えています。

pctは何をするタグだったのか

pct は、DMARCの以前の仕様(RFC 7489)にあったタグです。ポリシーを none から quarantine へ変えるときや quarantine から reject へ変えるとき、いきなり全部に適用するのではなく、一部のメールにだけ厳しい扱いを求めるためのものでした。

pct=10 と書けば、認証に失敗したメールのうち10%だけを p で指定した扱いにし、残りは1段ゆるい扱いにする、という意図になります。

RFC 9989でタグの一覧から外れました

2026年5月に公開されたRFC 9989は、DMARCの仕様をRFC 7489から置き換えたものです。この中で pct はタグの一覧から外れました。

RFC 9989 セクション9.3 のDMARCタグレジストリでは、各タグの状態が表になっています。

タグ 参照 状態
p RFC 9989 active
t RFC 9989 active
np RFC 9989 active
psd RFC 9989 active
pct RFC 7489 historic
rf RFC 7489 historic
ri RFC 7489 historic

pct の状態は historic で、参照先も古い仕様のままです。rfri も同じ扱いになりました。

廃止された理由は、そもそも意図どおりに動いていなかったからです

RFC 9989 は、廃止の経緯を Appendix A.6 に書いています。

Operational experience showed that the "pct" tag was usually not accurately applied, unless the value specified was either 0 or 100 (the default), and the inaccuracies with other values varied widely from one implementation to another.

(運用上の経験から、「pct」タグは指定された値が0か100(既定値)でない限り、正確に適用されないのが常であり、それ以外の値での不正確さは実装ごとに大きく異なることが分かった)

つまり pct=10 と書いても実際に10%が対象になっていたわけではありませんでした。どれくらいずれるかも受信側ごとに違いました。

一方で pct=0 には、割合とは別の意味が生まれていました。同じ Appendix A.6 は、一部の中継事業者や受信事業者が pct=0 を通常とは違う扱いをする合図として使っていたと書いています。具体的には、後続でDMARCの失敗が起きないようにFromヘッダーを書き換える動作です。

この pct=0 の機能には価値があったため、仕様に残すことになりました。ただし、有効な値が2つしかないタグを pct(percent)という名前のままにする理由がありません。

Because of the value provided by "pct=0" to Domain Owners, it was logical to keep this functionality in the protocol; at the same time, it didn't make sense to support a tag named "pct" that had only two valid values. This version of the DMARC mechanism, therefore, introduces the "t" tag as shorthand for "testing", with the valid values of "y" and "n", which are meant to be analogous in their application by mailbox providers and intermediaries to the "pct" tag values "0" and "100", respectively.

(「pct=0」がドメイン所有者にもたらしていた価値のため、この機能をプロトコルに残すことは理にかなっていた。同時に、有効な値が2つしかないタグを「pct」という名前で維持することには意味がなかった。そこでこのバージョンのDMARCでは、「testing」の略として「t」タグを導入する。有効な値は「y」と「n」で、これらはメールボックス提供者や中継事業者による適用において、「pct」タグの値「0」と「100」にそれぞれ対応するものとして意図されている)

ここが大事な点です。t=yt=n が対応しているのは pct=0pct=100 であって、その間の値ではありません。

pct=10の代わりにt=yを書く、ではありません

t=y は割合を指定するタグではありません。RFC 9989 セクション4.7 は次のように定めています。

t: DMARC policy test mode (plain-text; OPTIONAL; default is "n"). ... This tag does not affect the generation of DMARC reports, and it has no effect on any policy ("p", "sp", or "np") that is "none".

(t: DMARCポリシーのテストモード。plain-text、OPTIONAL、既定値は「n」。……このタグはDMARCレポートの生成に影響せず、「none」であるいかなるポリシー(「p」「sp」「np」)にも効果を持たない)

t=y を書くと宣言したポリシーが全部のメールに対して1段ゆるく適用されます。

宣言したポリシー t=y を書いた場合に適用されるもの
p=reject quarantine
p=quarantine none
p=none 変わりません(効果がありません)

効果が無いのは p に限りません。引用したとおり、対象は pspnp の3つです。サブドメイン向けの sp や、存在しないサブドメイン向けの npnone を指定している場合、その側には t=y が効きません。

たとえば v=DMARC1; p=reject; sp=none; t=y と書いた場合、組織ドメイン宛には quarantine が適用され、サブドメイン宛は sp=none のままになります。spnp の役割はサブドメインのDMARC設定で扱っています。

割合ではなく段階が変わる仕組みなので、「10%だけ適用する」を続ける方法は、いまのDMARCの仕様にはありません。

レポートの内容は変わりません。t=y を書いていても認証結果の集計レポートはこれまでどおり届きます。様子を見ながら判断する段階では、この点が役に立ちます。

いまのレコードをどう直すか

いまのポリシーによって変わります。既存の ruaadkim などのタグは触りません。動かすのは pctt だけです。

いまの状態 変更前の例 変更後
p=none で様子を見ている v=DMARC1; p=none; pct=10; rua=mailto:{報告の宛先} v=DMARC1; p=none; rua=mailto:{報告の宛先}
quarantinereject を宣言したが、まだ適用させたくない v=DMARC1; p=reject; pct=10; rua=mailto:{報告の宛先} v=DMARC1; p=reject; t=y; rua=mailto:{報告の宛先}
適用に進む v=DMARC1; p=reject; pct=100; rua=mailto:{報告の宛先} v=DMARC1; p=reject; rua=mailto:{報告の宛先}
t の値が y でも n でもない v=DMARC1; p=reject; t=yes; rua=mailto:{報告の宛先} テスト中なら t=y、それ以外は t ごと消します

{報告の宛先} は、あなたがレポートを受け取るメールアドレスに置き換えてください。いまのレコードの状態を確かめたい場合は、メール認証の診断にドメインを入れてください。

p=none の行に t=y を足しても意味がありません。RFC 9989 セクション4.7 が「none であるポリシーには効果を持たない」と定めているためです。spnpnone を指定している場合も、その側には効きません。

ポリシーそのものを none から quarantinereject へどう進めるかの判断は、この記事では扱いません。ここで説明したのは pct を書いていた場合にそれをどう畳むかまでです。

値を間違えるとレコード全体はどうなるのか

pct の値が範囲外だった場合、それだけでDMARCレコード全体が捨てられるわけではありません。RFC 9989 セクション4.8 は次のように定めています。

A DMARC Policy Record MUST comply with the formal definition found in this section. Unknown tags MUST be ignored. Syntax errors in the remainder of the record MUST be discarded in favor of default values (if any) or ignored outright.

(DMARCポリシーレコードは、この節にある形式定義に従わなければならない。未知のタグは無視しなければならない。レコードの残りの部分にある構文エラーは、既定値がある場合はそれを優先して破棄するか、そのまま無視しなければならない)

tyes のような値を書いた場合、この規定によって既定値の n として扱われます。つまり、宣言したポリシーがそのまま適用されます。テスト段階のつもりでいると実際には適用されている状態になります。

RFC 9989 に対応した受信側では、pct は一覧に無いタグなので、この規定にもとづいて読み飛ばされます。ただし、すべての受信側がすでに対応しているとは限りません。移行の途中では、以前の仕様のまま pct を解釈する受信側が残っている可能性があります。本サイトの診断が「読み飛ばされます」と断定せずに参考情報として出しているのはこの理由です。

なお、DMARCレコード全体が使われなくなる条件はほかにもあります。

  • v=DMARC1 がレコードの先頭に無い、または値が違う(RFC 9989 セクション4.7)
  • _dmarc にDMARCレコードが2本以上ある(RFC 9989 セクション4.10。DNSの応答に複数のDMARCレコードが含まれる場合、その全部が破棄されると定められています)
  • spnp の値が不正で、rua も無い(RFC 9989 セクション4.10.1)

前の2つはDMARCレコードの書式エラー、最後の1つはサブドメインのDMARC設定で扱っています。

DKIMのt=yとは別のタグです

t=y という同じ書き方が、DKIMのレコードにもあります。名前も値も同じですが、置く場所も意味も違います。取り違えると直すつもりのない側を触ってしまいます。

DMARCの t DKIMの t
どこに書くか _dmarc.example.jp のTXTレコード <セレクタ>._domainkey.example.jp のTXTレコード
何を意味するか 宣言したポリシーをまだ適用しないでほしい この鍵はテスト中で、検証に失敗しても本番と同じに扱わないでほしい
根拠 RFC 9989 セクション4.7 RFC 6376 セクション3.6.1

DKIMの側の詳細はDKIMのテストモード(t=y)を外すときで扱っています。

変更したあとの確認

DNSのレコードを書き換えた場合、外から見える内容がすぐ変わるとは限りません。変更前のレコードには有効期間(TTL)が設定されていて、その時間だけ古い内容が使われ続けることがあります。

変更前に設定していたTTL 古い内容が使われうる最大の時間
300秒 5分
3600秒 1時間
86400秒 24時間

自分のTTLが分からない場合や、時間が経っても反映されない場合は、DNSの変更が反映されないときを読んでください。

反映されたかどうかは、メール認証の診断にドメインを入れて確認できます。この記事で扱った4つの表示が消えていれば、書き換えは反映されています。

まずは全体を診断してみましょう

専門知識がなくてもいまの設定状況と具体的な対処方法をわかりやすく確認できます。

ドメイン設定を診断する

利用中のDNS事業者が分かっているなら事業者別の設定手順から直接進めます。