メールが届かない時の確認チェックリスト — 原因の切り分けと対処法
送信したメールが届かない、迷惑メールフォルダーに入ってしまう。メール配送トラブルは SPF → DKIM → DMARC → MX → PTR → DNSBL → レピュテーション → TLS の順に確認することで、大半の原因を特定できます。原因は DNS レコードの設定不備、IP アドレスの信頼性、メールサーバーの暗号化設定など幅広い範囲にまたがりますが、このチェックリストに沿って順番に切り分ければ、どこに問題があるかを効率的に突き止められます。
このチェックリストでは、メール配送トラブルの原因を 8 つのステップで順番に切り分けます。SPF・DKIM・DMARC の認証設定から、MX レコード、逆引き DNS(PTR)、ブロックリスト(DNSBL)、送信者レピュテーション、メールサーバーの TLS 設定まで、確認すべき項目を網羅しています。
example.com の部分は実際のドメイン名に置き換えてください。
flowchart TD
Start["メールが届かない"] --> SPF{"SPF レコードが\n存在する?"}
SPF -- No --> FixSPF["SPF を設定する\n→ Step 1"]
SPF -- Yes --> DKIM{"DKIM レコードが\n存在する?"}
DKIM -- No --> FixDKIM["DKIM を設定する\n→ Step 2"]
DKIM -- Yes --> DMARC{"DMARC レコードが\n存在する?"}
DMARC -- No --> FixDMARC["DMARC を設定する\n→ Step 3"]
DMARC -- Yes --> MX{"MX レコードが\n正しい?"}
MX -- No --> FixMX["MX を修正する\n→ Step 4"]
MX -- Yes --> PTR{"PTR / FCrDNS が\n正しい?"}
PTR -- No --> FixPTR["PTR を設定する\n→ Step 5"]
PTR -- Yes --> DNSBL{"DNSBL に\n登録されていない?"}
DNSBL -- "登録あり" --> FixDNSBL["解除申請する\n→ Step 6"]
DNSBL -- "登録なし" --> Rep["送信者レピュテーション\nと TLS を確認\n→ Step 7・8"]
チェックリスト一括コピー用
以下をコピーして手元のメモやIssueに貼り付ければ、そのまま確認リストとして使えます。
## メール配送トラブルシューティング チェックリスト
### Step 1 SPF
- [ ] TXT レコードに `v=spf1` が存在する
- `dig TXT example.com +short`
- [ ] `include:` に利用中の送信サービスが含まれている
- [ ] 末尾が `~all` または `-all` で終わっている
- [ ] SPF レコードが 1件だけ存在する
- [ ] DNS ルックアップ回数が 10回以内に収まっている
### Step 2 DKIM
- [ ] `{selector}._domainkey.example.com` に TXT レコードが存在する
- `dig TXT google._domainkey.example.com +short`
- [ ] レコードが `v=DKIM1` で始まっている
- [ ] `p=` に Base64 の公開鍵が含まれている
- [ ] セレクター名がメール送信サービスの設定と一致している
### Step 3 DMARC
- [ ] `_dmarc.example.com` に TXT レコードが存在する
- `dig TXT _dmarc.example.com +short`
- [ ] レコードが `v=DMARC1` で始まっている
- [ ] `p=` に none・quarantine・reject のいずれかが設定されている
- [ ] `rua=` でレポート受信先が指定されている
### Step 4 MX レコード
- [ ] MX レコードが存在する
- `dig MX example.com +short`
- [ ] 宛先ホスト名が正しいメールサーバーを指している
- [ ] 優先度(priority)が意図どおりに設定されている
### Step 5 逆引き DNS(PTR)と FCrDNS
- [ ] 送信 IP に PTR レコードが設定されている
- `dig -x 203.0.113.1 +short`
- [ ] PTR で返るホスト名の A レコードが元の IP に一致する(FCrDNS)
### Step 6 DNSBL(ブロックリスト)
- [ ] 送信サーバーの IP アドレスが主要な DNSBL(Spamhaus ZEN、Barracuda、SpamCop など)に登録されていない
- `dig 1.113.0.203.{your-key}.zen.dq.spamhaus.net +short`(DQS 利用時。従来の zen.spamhaus.org は公開リゾルバーでは正確な結果を返さない場合あり)
### Step 7 送信者レピュテーション
- [ ] Google Postmaster Tools でドメインレピュテーションが Low / Bad になっていない
- [ ] ハードバウンス率が 2% 未満に収まっている
- [ ] 迷惑メール報告率が 0.10% 未満を維持している(推奨 0.10% 未満、上限 0.30%)
### Step 8 メールサーバーの TLS
- [ ] STARTTLS に対応している
- `openssl s_client -starttls smtp -connect mail.example.com:25`
- [ ] 証明書の有効期限が切れていない
- `openssl s_client -starttls smtp -connect mail.example.com:25 2>/dev/null | openssl x509 -noout -dates`
### 一括確認(API)
- `curl "https://labee.dev/api/mail-auth?domain=example.com"`
- `curl "https://labee.dev/api/dns?domain=example.com&type=MX"`
- `curl "https://labee.dev/api/ip?ip=203.0.113.1"`
Step 1 SPF レコードを確認する
SPF(Sender Policy Framework、RFC 7208)は、ドメインからメールを送信できるサーバーの IP アドレスを DNS の TXT レコードに列挙する仕組みです。受信サーバーはメールの送信元 IP を SPF レコードと照合し、許可されていない IP からのメールを拒否またはスパム判定します。SPF が未設定のドメインから送ったメールは、Gmail や Outlook で迷惑メールに振り分けられます。
Google Workspace や Microsoft 365 などのメールプラットフォーム、SendGrid、Amazon SES、Postmark などのメール送信サービスを利用している場合は、各サービスのセットアップガイドに従って include: を追加する形で SPF を設定します。
チェック項目
-
example.comの TXT レコードにv=spf1で始まるレコードが存在する -
include:に利用中のメール送信サービス(Google Workspace なら_spf.google.com、SendGrid ならsendgrid.netなど)が含まれている - レコードの末尾が
~all(ソフトフェイル)または-all(ハードフェイル)で終わっている - SPF レコードが 1件だけ存在する(同一ドメインに複数あると 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", "mte1", "mte2", "pdk1", "pdk2", "mesmtp", "zoho"],
"exhaustive": false
},
"dmarc": { "record": null, "exists": false, "source": null, "domain": "example.com" },
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 142 }
}
data.spf.exists が true であることを確認してください。false の場合、SPF レコードが存在しないか、DNS に反映されていません。
Step 2 DKIM レコードとセレクターを確認する
DKIM(DomainKeys Identified Mail、RFC 6376)は、送信サーバーがメールのヘッダーと本文に電子署名を付与し、受信サーバーが DNS 上の公開鍵で署名を検証する仕組みです。セレクターという識別子を使って複数の鍵を共存させられます。
セレクター名はメール送信サービスの管理画面で確認できます。Google Workspace は google、Microsoft 365 は selector1・selector2、SendGrid は s1・s2 が一般的です。多くのサービスでは、管理画面のセットアップウィザードに従って DNS に CNAME レコードを追加するだけで DKIM の設定が完了します。
チェック項目
-
{selector}._domainkey.example.comに TXT レコードが存在する - レコードの値が
v=DKIM1で始まっている -
p=フィールドに Base64 エンコードされた公開鍵が含まれている(p=が空だと鍵が取り消された状態を意味する) - メール送信サービスの管理画面に表示されているセレクター名と、DNS に設定したセレクター名が一致している
確認コマンド
google セレクターの場合の例です。
dig TXT google._domainkey.example.com +short
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA..."
レコードが返らない場合は、セレクター名が間違っているか、DNS への反映が完了していません。
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, "source": null, "domain": "example.com" },
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 98 }
}
data.dkim.exists が true で、data.dkim.selector が指定したセレクターと一致していることを確認してください。selector パラメーターを省略した場合、API は 18 種の一般的なセレクター候補を自動検出します。
Step 3 DMARC ポリシーを確認する
DMARC(Domain-based Message Authentication, Reporting and Conformance、RFC 7489)は、SPF と DKIM の検証結果に基づいて、認証失敗メールの処理方法を受信サーバーに指示するポリシーです。2024年2月以降、Gmail は1日 5,000通以上 送信するドメインに DMARC 設定を必須としています。
チェック項目
-
_dmarc.example.comに TXT レコードが存在する - レコードの値が
v=DMARC1で始まっている -
p=にnone・quarantine・rejectのいずれかが設定されている -
rua=でレポート受信先メールアドレスが指定されている(例:rua=mailto:dmarc-reports@example.com)
確認コマンド
dig TXT _dmarc.example.com +short
"v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com"
レコードが存在しない場合、DMARC が未設定です。p=none でも Gmail の送信者要件は満たしますが、なりすまし防止の観点では p=quarantine または p=reject への移行が推奨されています。
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", "mte1", "mte2", "pdk1", "pdk2", "mesmtp", "zoho"],
"exhaustive": false
},
"dmarc": {
"record": "v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@example.com",
"exists": true,
"source": "exact",
"domain": "example.com"
},
"bimi": { "record": null, "exists": false }
},
"error": null,
"meta": { "responseTime": 115 }
}
data.dmarc.exists が true であることを確認してください。data.dmarc.source が organizational の場合、サブドメイン自体にはレコードがなく親ドメインのポリシーを継承しています。サブドメイン固有のポリシーが必要な場合は _dmarc.sub.example.com に個別のレコードを設定してください。
Step 4 MX レコードを確認する
MX(Mail Exchanger)レコードは、そのドメイン宛のメールをどのサーバーが受け取るかを指定します。MX レコードが存在しない、または間違ったホスト名を指していると、送信側のメールサーバーが配送先を見つけられずメールが返送されます。
チェック項目
- MX レコードが存在する
- 宛先ホスト名が正しいメールサーバーを指している(Google Workspace なら
aspmx.l.google.comなど) - 優先度(priority)が意図どおりに設定されている(数値が小さいほど優先度が高い)
確認コマンド
dig MX example.com +short
10 aspmx.l.google.com.
20 alt1.aspmx.l.google.com.
MX レコードが返らない場合、ドメイン宛のメールは配送できません。ホスト名の末尾にドット(.)が付くのは DNS の正規表記です。
labee.dev の DNS API で MX レコードを取得できます。
curl "https://labee.dev/api/dns?domain=example.com&type=MX"
{
"success": true,
"data": {
"domain": "example.com",
"records": {
"MX": [
{ "priority": 10, "exchange": "aspmx.l.google.com" },
{ "priority": 20, "exchange": "alt1.aspmx.l.google.com" }
]
}
},
"error": null,
"meta": { "responseTime": 85 }
}
data.records.MX 配列に正しいメールサーバーのホスト名が含まれていることを確認してください。
Step 5 逆引き DNS(PTR)と FCrDNS を確認する
逆引き DNS(PTR レコード)は、IP アドレスからホスト名を引く仕組みです。受信サーバーは送信元 IP の PTR レコードを確認し、PTR が未設定の IP からのメールをスパムとして扱います。Gmail は送信者ガイドラインで PTR レコードの設定を求めており、未設定の IP からのメールは配送を制限します。
Google Workspace、Microsoft 365、SendGrid、Amazon SES などのマネージドサービスを利用している場合は、PTR レコードはサービス側で管理されています。このステップの確認が必要なのは、自前のサーバーからメールを送信している場合です。
FCrDNS(Forward-Confirmed reverse DNS)は、PTR で得られたホスト名を正引き(A レコード)して元の IP に一致するかを検証する仕組みです。PTR が設定されていても、正引きで IP が一致しなければ FCrDNS は失敗します。
チェック項目
- 送信サーバーの IP アドレスに PTR レコードが設定されている
- PTR レコードで返るホスト名の A レコードが元の IP アドレスに一致する(FCrDNS が成立する)
確認コマンド
送信 IP が 203.0.113.1 の場合の例です。
dig -x 203.0.113.1 +short
mail.example.com.
PTR レコードが返ったら、そのホスト名を正引きして IP が一致するかを確認します。
dig A mail.example.com +short
203.0.113.1
PTR の結果と A レコードの結果が一致すれば、FCrDNS は成立しています。
labee.dev の IP API で PTR レコードを確認できます。
curl "https://labee.dev/api/ip?ip=203.0.113.1"
{
"success": true,
"data": {
"ip": "203.0.113.1",
"type": "IPv4",
"isPrivate": false,
"ptr": "mail.example.com"
},
"error": null,
"meta": { "responseTime": 65 }
}
data.ptr にホスト名が返っていれば PTR レコードは設定されています。null の場合は PTR が未設定です。FCrDNS の正引き検証は、追加で DNS API を使って確認できます。
curl "https://labee.dev/api/dns?domain=mail.example.com&type=A"
{
"success": true,
"data": {
"domain": "mail.example.com",
"records": {
"A": [
{ "address": "203.0.113.1", "ttl": 300 }
]
}
},
"error": null,
"meta": { "responseTime": 42 }
}
data.records.A[0].address が元の送信 IP と一致していれば FCrDNS は成立しています。
Step 6 DNSBL(ブロックリスト)を確認する
DNSBL(DNS-based Blocklist)は、スパム送信に使われた IP アドレスをリスト化したデータベースです。受信サーバーは送信元 IP を DNSBL に照会し、リストに登録されていればメールを拒否または迷惑メールに分類します。自分のサーバーの IP が意図せず登録されていると、設定が正しくてもメールが届かなくなります。
コマンド操作に慣れていない場合は、Spamhaus のウェブサイト(https://www.spamhaus.org/lookup/)で送信 IP を直接検索する方法もあります。
チェック項目
- 送信サーバーの IP アドレスが主要な DNSBL(Spamhaus ZEN、Barracuda、SpamCop など)に登録されていない
確認コマンド
DNSBL の照会は、IP アドレスのオクテットを逆順にして DNSBL のドメインに付加した名前を引きます。送信 IP が 203.0.113.1 で Spamhaus ZEN を確認する場合の例です。
Spamhaus は公開 DNS リゾルバー(Google Public DNS 等の公開リゾルバー)経由のクエリーを段階的に廃止しており、2025年以降は Data Query Service(DQS)への移行が必要です。無料の DQS アカウントを登録すると、専用のクエリードメイン({key}.zen.dq.spamhaus.net)が発行されます。従来の zen.spamhaus.org を使ったクエリーは、公開リゾルバー経由ではエラーコード 127.255.255.254 を返すようになっています。
# DQS を利用する場合(推奨)
dig 1.113.0.203.{your-key}.zen.dq.spamhaus.net +short
# 従来形式(公開リゾルバー経由では正確な結果を返さない場合あり)
dig 1.113.0.203.zen.spamhaus.org +short
応答がなければ(空行が返れば)リストに登録されていません。127.0.0.x 形式の応答が返った場合は登録されています。返された IP の末尾のオクテットによってリストの種類がわかります(Spamhaus の場合、127.0.0.2 は SBL、127.0.0.4 は CBL など)。127.255.255.254 が返った場合は、クエリーが制限されていることを意味します。DQS への移行を検討してください。
登録されていた場合は、各 DNSBL の解除申請ページから削除リクエストを送信してください。Spamhaus は https://www.spamhaus.org/lookup/ から確認と解除申請ができます。
用語解説DNSBL(DNS Blocklist)スパム送信元の IP アドレスを DNS で公開し、受信サーバーがリアルタイムで参照するブロックリスト。Spamhaus が代表的なプロバイダー。Step 7 送信者レピュテーションを確認する
送信者レピュテーションは、IP アドレスやドメインに対する受信サーバー側の信頼度スコアです。迷惑メール報告の割合、バウンス率、送信量の急激な変化などが評価に影響します。レピュテーションが低下すると、SPF・DKIM・DMARC がすべて正しく設定されていてもメールが迷惑メールフォルダーに振り分けられます。
チェック項目
- Google Postmaster Tools でドメインレピュテーションが Low / Bad になっていない
- ハードバウンス率が 2% 未満に収まっている
- 迷惑メール報告率が 0.10% 未満を維持している(Gmail の送信者ガイドラインでは推奨 0.10% 未満、上限 0.30%)
確認方法
Google Postmaster Tools(https://postmaster.google.com/)にドメインを登録すると、Gmail が受信したメールの認証結果、レピュテーション、暗号化率などを確認できます。登録にはドメインの DNS に TXT レコードを追加して所有権を証明する必要があります。
レピュテーションが低下している場合は、以下を確認してください。
- 無効なアドレスへの送信を止める(バウンスしたアドレスをリストから削除する)
- 配信停止リンクが正しく機能しているか確認する
- 送信量を急激に増やしていないか確認する(新しい IP やドメインから大量送信すると、IP ウォームアップが不足してスパム判定されやすくなる)
Step 8 メールサーバーの TLS を確認する
STARTTLS は、メールサーバー間の SMTP 通信を途中から TLS 暗号化に切り替える仕組みです(RFC 3207)。Gmail は STARTTLS に対応していないサーバーからのメールに対して、受信者の画面に「暗号化されていません」という警告アイコンを表示します。証明書の有効期限が切れている場合、TLS ネゴシエーションが失敗して平文通信にフォールバックします。
Google Workspace、Microsoft 365 などのマネージドメールサービスでは STARTTLS は標準で有効になっています。このステップの確認が必要なのは、自前のメールサーバーを運用している場合です。
チェック項目
- メールサーバーが STARTTLS に対応している
- TLS 証明書の有効期限が切れていない
確認コマンド
openssl s_client -starttls smtp -connect mail.example.com:25 -brief
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
接続が確立されれば STARTTLS は有効です。CONNECTION ESTABLISHED が表示されない場合、STARTTLS に対応していないか、ポート 25 へのアウトバウンド通信がブロックされています。
証明書の有効期限は以下のコマンドで確認できます。
openssl s_client -starttls smtp -connect mail.example.com:25 2>/dev/null | openssl x509 -noout -dates
notBefore=Jan 1 00:00:00 2025 GMT
notAfter=Apr 1 00:00:00 2026 GMT
notAfter の日付が現在より過去であれば証明書は期限切れです。
よくある設定ミス
SPF レコードが複数存在する
同一ドメインに v=spf1 で始まる TXT レコードが 2件以上あると、RFC 7208 の規定により受信サーバーはチェック結果を permerror として扱います。複数のメール送信サービスを利用している場合は、include: を 1つのレコード内に並べてください。
v=spf1 include:_spf.google.com include:sendgrid.net ~all
DKIM セレクターが DNS に登録されていない
メール送信サービスの管理画面で DKIM を有効化しても、DNS に TXT レコードを追加しなければ受信サーバーは公開鍵を取得できません。サービス側で生成されたセレクター名と、DNS に登録した {selector}._domainkey.example.com のセレクター部分が一致しているかも確認してください。
PTR レコードが未設定のまま送信している
VPS やクラウドサーバーを自前で運用してメールを送信している場合、PTR レコードの設定はホスティング事業者の管理画面から行います。初期状態では PTR が設定されていないことが多く、そのままメールを送信すると Gmail などで拒否されます。Google Workspace、Microsoft 365、SendGrid、Amazon SES などのマネージドメール送信サービスを利用している場合は、サービス側の IP に PTR が設定されているため、この問題は発生しません。
DMARC の rua を設定していない
rua= がないと集計レポートが届かないため、自ドメインを騙ったなりすましメールの検知ができません。p=none で運用を開始する段階でも rua= は設定してください。レポートは XML 形式で届くため、dmarcian、Postmark DMARC、EasyDMARC などの解析サービスを使うと内容を確認しやすくなります。
バウンスしたアドレスに送り続けている
存在しないアドレスへの送信(ハードバウンス)を繰り返すと、送信者レピュテーションが低下します。メール配信サービスのバウンスログを定期的に確認し、ハードバウンスが発生したアドレスはリストから削除してください。