メール認証 完全チェックリスト
2024年2月以降、Gmail は1日5,000通以上を送信するドメインに対して SPF・DKIM・DMARC のすべてを必須としています。Outlook(Microsoft 365)も同様に未認証メールの拒否を強化しています。このチェックリストは、自分のドメインがこれらの要件を満たしているかを順番に確認するためのものです。
example.com の部分は実際のドメイン名に置き換えてください。
チェックリスト一括コピー用
以下をコピーして手元のメモやIssueに貼り付ければ、そのまま確認リストとして使えます。
## メール認証チェックリスト
### SPF
- [ ] TXT レコードに `v=spf1` が存在する
- `dig TXT example.com +short`
- [ ] `include:` に利用中のメール送信サービスが含まれている
- [ ] 末尾が `~all` または `-all` で終わっている
- [ ] SPF レコードが 1件だけ存在する
- [ ] DNS ルックアップ回数が 10回以内に収まっている
### DKIM
- [ ] `{selector}._domainkey.example.com` に TXT レコードが存在する
- `dig TXT google._domainkey.example.com +short`
- [ ] レコードが `v=DKIM1` で始まっている
- [ ] `p=` に Base64 の公開鍵が含まれている
- [ ] セレクター名がメール送信サービスの設定と一致している
### DMARC
- [ ] `_dmarc.example.com` に TXT レコードが存在する
- `dig TXT _dmarc.example.com +short`
- [ ] レコードが `v=DMARC1` で始まっている
- [ ] `p=` に none・quarantine・reject のいずれかが設定されている
- [ ] `rua=` でレポート受信先が指定されている
- [ ] SPF または DKIM の少なくとも一方がアライメントを通過している
### BIMI(任意)
- [ ] `default._bimi.example.com` に TXT レコードが存在する
- `dig TXT default._bimi.example.com +short`
- [ ] レコードが `v=BIMI1` で始まっている
- [ ] `l=` に SVG ロゴの URL が設定されている
- [ ] DMARC ポリシーが `p=quarantine` または `p=reject` になっている
### 一括確認(API)
- `curl "https://labee.dev/api/mail-auth?domain=example.com"`
- `curl "https://labee.dev/api/mail-auth?domain=example.com&selector=google"`
Step 1 SPF レコードを確認する
SPF(Sender Policy Framework)は、そのドメインからメールを送信できるサーバーを DNS に列挙する仕組みです。受信サーバーはメールの送信元 IP を SPF レコードと照合し、許可されていない IP からのメールを弾きます。
チェック項目
-
example.comの TXT レコードにv=spf1で始まるレコードが存在する -
include:に利用中のメール送信サービス(Google Workspace なら_spf.google.com、SendGrid ならsendgrid.netなど)が含まれている - レコードの末尾が
~all(ソフトフェイル)または-all(ハードフェイル)で終わっている - SPF レコードが 1件だけ 存在する(同一ドメインに複数の SPF レコードがあると RFC 7208 違反となり、チェックが失敗する)
-
include:のネスト数を含む DNS ルックアップ回数が 10回以内 に収まっている
確認コマンド
dig TXT example.com +short
"v=spf1 include:_spf.google.com ~all"
v=spf1 で始まる行がなければ SPF が未設定です。複数行に v=spf1 が現れる場合は、1つに統合する必要があります。
labee.dev の API でも同じ情報を取得できます。
curl "https://labee.dev/api/mail-auth?domain=example.com"
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"mode": "auto",
"record": null,
"exists": false,
"selector": "",
"matches": [],
"checkedSelectors": ["google", "selector1", "selector2", "s1", "s2", "k1", "k2", "k3", "default", "dkim", "mail", "smtp"],
"exhaustive": false
},
"dmarc": { "record": null, "exists": false },
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 142 }
}
data.spf.exists が true で、data.spf.record の内容が dig の結果と一致していることを確認してください。
Step 2 DKIM レコードを確認する
DKIM(DomainKeys Identified Mail)は、送信サーバーがメールのヘッダーと本文に電子署名を付与し、受信サーバーが DNS に公開された公開鍵で検証する仕組みです。セレクターと呼ばれる識別子を使って複数の公開鍵を共存させられるため、Google Workspace、SendGrid、Amazon SES など複数サービスを併用する場合も、それぞれ別のセレクターで設定します。
セレクター名はメール送信サービスの管理画面で確認できます。Google Workspace では google が使われることが多く、SendGrid は s1 や s2 が一般的です。
チェック項目
-
{selector}._domainkey.example.comに TXT レコードが存在する - レコードの値が
v=DKIM1で始まっている - レコードに
p=フィールドが含まれており、空でない(p=の後に Base64 エンコードされた公開鍵が続く) - メール送信サービスの管理画面に表示されているセレクター名と、DNS に設定したセレクター名が一致している
確認コマンド
google セレクターの場合を例として示します。
dig TXT google._domainkey.example.com +short
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
レコードが返らない場合は、セレクター名が間違っているか、DNS への反映が完了していません。TTL が短い場合でも伝搬には最大 48時間 かかることがあります。
labee.dev の API では selector パラメーターを指定します。
curl "https://labee.dev/api/mail-auth?domain=example.com&selector=google"
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"mode": "explicit",
"record": "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...",
"exists": true,
"selector": "google"
},
"dmarc": { "record": null, "exists": false },
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 98 }
}
data.dkim.exists が true で、data.dkim.selector がリクエストに指定したセレクターと一致していることを確認してください。selector パラメーターを省略した場合、API は一般的なセレクター候補(google, selector1, s1 など)を自動検出します。特定のセレクターを確認したい場合は明示的に指定してください。
Step 3 DMARC レコードを確認する
DMARC(Domain-based Message Authentication, Reporting and Conformance)は、SPF と DKIM の検証結果を基に、認証失敗メールをどう処理するかを受信サーバーに指示するポリシーです。レポート機能(rua、ruf)により、自ドメインを使った不正送信の検知にも使えます。
ポリシーは3段階あります。p=none は何もせず監視のみ、p=quarantine は迷惑メールフォルダーに振り分け、p=reject は完全に拒否します。Gmail の送信者要件では p=none でも要件を満たしますが、最終的には p=quarantine または p=reject への移行を推奨しています。
チェック項目
-
_dmarc.example.comに TXT レコードが存在する - レコードの値が
v=DMARC1で始まっている -
p=にnone・quarantine・rejectのいずれかが設定されている -
rua=でレポート受信先メールアドレスが指定されている(例:rua=mailto:dmarc-reports@example.com) - SPF または DKIM の少なくとも一方が当該ドメインでアライメントを通過している(DMARC はどちらかひとつのアライメント一致で通過する)
確認コマンド
dig TXT _dmarc.example.com +short
"v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com"
labee.dev の API では、DMARC も同じエンドポイントで取得できます。
curl "https://labee.dev/api/mail-auth?domain=example.com"
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"mode": "auto",
"record": null,
"exists": false,
"selector": "",
"matches": [],
"checkedSelectors": ["google", "selector1", "selector2", "s1", "s2", "k1", "k2", "k3", "default", "dkim", "mail", "smtp"],
"exhaustive": false
},
"dmarc": {
"record": "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com",
"exists": true
},
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 115 }
}
data.dmarc.exists が true で、data.dmarc.record の p= 値が意図したポリシーと一致していることを確認してください。
Step 4 BIMI レコードを確認する(任意)
BIMI(Brand Indicators for Message Identification)は、DMARC でメールが認証された場合に受信クライアントのブランドロゴを表示する拡張仕様です。Gmail や Apple Mail、Yahoo Mail が対応しています。BIMI を有効にするには DMARC ポリシーが p=quarantine または p=reject である必要があります。p=none では動作しません。
VMC(Verified Mark Certificate)は商標登録済みロゴへの認証書で、取得には費用がかかります。VMC なしでも BIMI レコード自体は設定できますが、一部クライアントでロゴが表示されない場合があります。
チェック項目
-
default._bimi.example.comに TXT レコードが存在する - レコードの値が
v=BIMI1で始まっている -
l=に SVG フォーマットのロゴ URL が設定されている - DMARC ポリシーが
p=quarantineまたはp=rejectになっている
確認コマンド
dig TXT default._bimi.example.com +short
"v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/cert.pem"
labee.dev の API では BIMI も同時に確認できます。
curl "https://labee.dev/api/mail-auth?domain=example.com"
{
"success": true,
"data": {
"spf": { "record": "v=spf1 include:_spf.google.com ~all", "exists": true },
"dkim": {
"mode": "auto",
"record": "v=DKIM1; k=rsa; p=MIIBIjAN...",
"exists": true,
"selector": "google",
"matches": [
{ "selector": "google", "record": "v=DKIM1; k=rsa; p=MIIBIjAN...", "exists": true }
],
"checkedSelectors": ["google", "selector1", "selector2", "s1", "s2", "k1", "k2", "k3", "default", "dkim", "mail", "smtp"],
"exhaustive": false
},
"dmarc": { "record": "v=DMARC1; p=reject; rua=mailto:dmarc-reports@example.com", "exists": true },
"bimi": {
"record": "v=BIMI1; l=https://example.com/logo.svg; a=https://example.com/cert.pem",
"exists": true
}
},
"error": null,
"meta": { "responseTime": 132 }
}
data.bimi.exists が true で、data.bimi.record の l= に正しい SVG URL が設定されていることを確認してください。
よくある設定ミス
SPF レコードが複数存在する
同一ドメインに v=spf1 で始まる TXT レコードが2件以上あると、RFC 7208 の規定により受信サーバーはチェックを失敗(permerror)として扱います。複数のサービスを追加したい場合は include: を1つのレコード内に並べます。
v=spf1 include:_spf.google.com include:sendgrid.net ~all
DKIM セレクターが DNS に存在しない
メール送信サービスの管理画面でセレクターを生成しても、DNS に TXT レコードを登録しないと有効になりません。セレクターの登録先は {selector}._domainkey.example.com です。dig で確認してレコードが返らない場合は、DNS プロバイダーの管理画面で TXT レコードを追加してください。
DMARC の rua= を設定していない
rua= がないと、受信サーバーからの集計レポートが届かないため、なりすましメールの検知ができません。ポリシーを p=none で運用開始する段階でも rua= は必ず設定してください。レポートは XML 形式で送られるため、専用の解析サービス(dmarcian、Postmark など)を使うと読みやすくなります。
DNS の変更がまだ伝搬していない
TTL を短く設定していても、DNS の変更は世界中のリゾルバーに伝搬するまで最大 48時間 かかります。変更直後に dig や API で確認しても古い値が返る場合があります。TTL の値を確認し、その時間が経過した後に再度チェックしてください。
Pro プランで継続監視
DNS 変更の自動検知、SSL 期限アラート、複数ドメインのまとめ管理など、 継続して確認し続けるための機能を準備中です。