2026年7月28日

2026年7月28日

MTA-STSのレポート(TLS-RPT)を読み解く方法|JSONの項目と失敗の種類別の対処

MTA-STSを設定すると届くレポートは、TLS-RPT(RFC 8460)という仕組みで送られる、gzip圧縮されたJSONファイルです。読むときは「誰が・いつの分を」「成功と失敗の件数」「失敗の種類(result-type)と相手のMXホスト」の3点を順に見ます。この記事では、レポートの受け取り方、JSONの主な項目の意味、jqを使った集計方法、失敗の種類ごとの確認と対処を説明し、testing モードから enforce モードへ移るときの判断材料にできるようにします。

レポートは何を報告しているのか

最初に向きを整理しておきます。TLS-RPTのレポートは、他社のメールサーバーが、あなたのドメイン宛てにメールを届けようとしたとき、TLS接続がうまくいったかどうかを、送信側の視点でまとめたものです。

  • 対象は受信(あなたのドメインのMXサーバーへの配送)です。
  • WordPressのお問い合わせフォームなど、サイトから送るメールの成否は、このレポートには出てきません。それは送信先のドメインが受け取るレポートに出る情報です。
  • DMARCの集計レポートとは別物です。DMARCは送信元の認証(SPF・DKIM)の結果、TLS-RPTは配送経路の暗号化の結果を報告します。

レポートを受け取るには、MTA-STSのTXTレコードとは別に、TLS-RPT用のTXTレコードを公開しておく必要があります。

_mta-sts.example.com.  TXT  "v=STSv1; id=20261018T000000"
_smtp._tls.example.com. TXT "v=TLSRPTv1; rua=mailto:tls-reports@example.com"

公開されているかは次のように確認します。

dig _smtp._tls.example.com TXT +short
dig _mta-sts.example.com TXT +short

レポートは送信側の事業者ごとに、おおむね1日単位で届きます。大手のメール事業者を中心に送られていますが、どの事業者が送るかや送付の頻度は事業者の判断によります(2026年10月現在)。メールで届く場合、添付ファイルとして .json.gz 形式で付いています。

JSONの主な項目

添付ファイルを展開すると、次のような構造のJSONが出てきます。値は説明用の例です。

{
  "organization-name": "Example Sender Inc.",
  "date-range": {
    "start-datetime": "2026-10-16T00:00:00Z",
    "end-datetime": "2026-10-16T23:59:59Z"
  },
  "contact-info": "smtp-tls-reporting@sender.example",
  "report-id": "2026-10-16T00:00:00Z_example.com",
  "policies": [
    {
      "policy": {
        "policy-type": "sts",
        "policy-string": ["version: STSv1", "mode: testing", "mx: mx1.example.com", "max_age: 604800"],
        "policy-domain": "example.com",
        "mx-host": ["mx1.example.com"]
      },
      "summary": {
        "total-successful-session-count": 1240,
        "total-failure-session-count": 12
      },
      "failure-details": [
        {
          "result-type": "certificate-host-mismatch",
          "sending-mta-ip": "192.0.2.25",
          "receiving-mx-hostname": "mx2.example.com",
          "receiving-ip": "203.0.113.20",
          "failed-session-count": 12
        }
      ]
    }
  ]
}

項目ごとの読み方は次のとおりです。

  • organization-name / contact-info:レポートを送ってきた事業者と、その問い合わせ先。
  • date-range:集計の対象期間。UTCで書かれているため、日本時間に直すと9時間ずれます。
  • policy-type:送信側が適用したポリシーの種類。sts はMTA-STS、tlsa はDANE、no-policy-found はポリシーが見つからなかったことを表します。
  • policy-string:送信側が実際に使ったMTA-STSポリシーの中身。送信側はポリシーを max_age の間キャッシュするため、ポリシーを更新した直後は、ここに古い内容が残っていることがあります。
  • summary:成功と失敗のセッション数。ここで全体の失敗率をつかみます。
  • failure-details:失敗の内訳。result-type が失敗の種類、receiving-mx-hostname と receiving-ip が接続しようとしたあなたのMXです。

jqで要点を取り出す

レポートの数が増えると、1件ずつ開いて読むのは大変です。jq を使えば必要な項目だけを表にできます。

gunzip -c report.json.gz > report.json

# 送信元と期間
jq '{org: ."organization-name", range: ."date-range", id: ."report-id"}' report.json

# ポリシーごとの成功・失敗件数
jq -r '.policies[] | [.policy."policy-type", .policy."policy-domain",
  .summary."total-successful-session-count", .summary."total-failure-session-count"] | @tsv' report.json

# 失敗の内訳(種類・MX・IP・件数)
jq -r '.policies[] | ."failure-details"[]? | [."result-type",
  (."receiving-mx-hostname" // "-"), (."receiving-ip" // "-"), ."failed-session-count"] | @tsv' report.json

見るべきなのは、失敗が特定のMXホストに偏っているか、特定の送信事業者だけで起きているかです。全事業者で同じMXに同じ種類の失敗が出ていれば、原因はあなたのMX側にある可能性が高く、1社だけなら送信側の事情も考えられます。

失敗の種類ごとの確認と対処

result-type はRFC 8460で定められた値で、主なものは次のとおりです。

certificate-host-mismatch

MXサーバーの証明書に、MXホスト名が含まれていません。複数のMXのうち1台だけ証明書の設定が漏れている、というケースがよくあります。MXサーバーに直接つないで証明書を確認します。

openssl s_client -starttls smtp -connect mx2.example.com:25 -servername mx2.example.com </dev/null 2>/dev/null \
  | openssl x509 -noout -subject -ext subjectAltName -enddate

国内の家庭用回線などでは25番ポートへの外向きの接続が制限されていることが多いため、この確認はサーバーなど25番ポートに接続できる環境から行います。

certificate-expired / certificate-not-trusted

証明書の期限切れ、または信頼されていない証明書(自己署名や中間証明書の欠落)です。上のコマンドで期限を確認し、中間証明書を含めたチェーンが送られているかも見ます。自動更新を使っている場合は、更新後にメールサーバーが新しい証明書を読み込み直しているかも確認します。

starttls-not-supported

MXがSTARTTLSに対応していない、または特定のサーバーで無効になっています。メールサーバーの設定でSTARTTLSが有効か確認します。

sts-policy-fetch-error / sts-policy-invalid

送信側がポリシーファイルを取得できなかった、または書式が正しくなかったことを表します。次の点を確認します。

curl -sv https://mta-sts.example.com/.well-known/mta-sts.txt
  • HTTPSで200が返ること。リダイレクトは追わない決まりのため、別のURLへ転送する設定は失敗になります。
  • mta-sts.example.com 用の有効な証明書があること。
  • Content-Type が text/plain であること。
  • 中身の version、mode、mx、max_age の書式が正しく、mx に実際のMXホスト名がすべて含まれていること。

sts-webpki-invalid / validation-failure

前者はポリシー取得時のHTTPS証明書の検証失敗、後者はそれ以外の検証エラーをまとめた種類です。additional-information や failure-reason-code に補足がある場合は、その内容を手がかりにします。

policy-type が no-policy-found になっている

MTA-STSを設定したつもりなのに no-policy-found と報告される場合は、_mta-sts のTXTレコードが見つかっていないか、ポリシーの取得に至っていません。TXTレコードの名前の綴りと、ポリシーファイルの公開状態を確認します。

enforce へ移るときの判断

MTA-STSは、まず mode: testing で公開し、レポートを数週間ほど観察してから mode: enforce に切り替えるのが安全です。testing では失敗してもメールは配送されますが、enforce ではポリシーに合わない接続での配送を送信側が見送るため、設定の不備がそのまま受信できない状態につながります。

切り替えの目安は、主要な送信事業者のレポートで失敗がほぼ無くなり、残った失敗の原因も説明できる状態です。ポリシーファイルを変更したら、_mta-sts のTXTレコードの id も新しい値に変えてください。id が変わらないと、送信側は更新に気づかず、キャッシュした古いポリシーを使い続けます。設定ファイルやDNSを変更する前には、現在の内容を控えておきます。

まとめ

  • MTA-STSのレポートはTLS-RPTの仕組みで届くgzip圧縮のJSONで、受け取るには _smtp._tls のTXTレコードが必要。
  • 報告されるのは、他社からあなたのMXへの配送の暗号化の結果。サイトからの送信メールの成否は含まれない。
  • summary で失敗率をつかみ、failure-details の result-type と receiving-mx-hostname で原因の場所を絞る。jqで表にすると比較しやすい。
  • 証明書の不一致・期限切れ、ポリシーファイルの取得失敗が代表的な原因。openssl と curl でMXとポリシーファイルを直接確認する。
  • testing で失敗が説明できる状態になってから enforce へ。ポリシー変更時はTXTレコードの id も更新する。

お気軽にご相談ください

お見積りへ お問い合わせへ
▲