Postfixなどのメールサーバーで/var/log/maillogを確認すると、次のようなログが出力されることがあります。
dsn=2.0.0, status=sent
dsn=4.4.1, status=deferred
dsn=5.1.1, status=bounced
この記事では、dsn=5.1.1などのコードが何を意味するのか、どのようにログを読み取ればよいのかを説明します。
この記事では、メール配送の運用や障害調査でよく見かける代表的なコードを掲載しています。
すべての登録済みコードは、記事末尾のIANAレジストリを参照してください。
DSNとは
DSNは、Delivery Status Notificationの略で、メールの配送成功、遅延、失敗などを送信者へ通知する仕組みです。
Postfixのmaillogに出力される次の値は、厳密にはDSNそのものではなく、DSNなどで使用される**拡張ステータスコード(Enhanced Status Code)**です。
dsn=5.1.1
DSNは配送状態を通知するレポートや仕組み全体を指し、5.1.1は配送結果を機械的に判別するためのコードです。
拡張ステータスコードの形式
拡張ステータスコードは、ピリオドで区切られた3つのフィールドで構成されます。
class.subject.detail
例えば、次のコードがあるとします。
5.1.1
各フィールドには、次の意味があります。
| フィールド | 例 | 意味 |
|---|---|---|
class |
5 |
成功、一時的な失敗、恒久的な失敗 |
subject |
1 |
アドレス、メールボックス、ネットワークなどの原因分類 |
detail |
1 |
具体的な状態 |
したがって、5.1.1は次のように読みます。
5 : 恒久的な失敗
1 : アドレス関連
1 : 宛先メールボックスが存在しない
なお、subjectとdetailは必ずしも1桁とは限りません。
例えば、次のようなコードもあります。
5.7.26
5.7.30
そのため、X.Y.Zを「3桁のコード」と表現するのではなく、3つのフィールドで構成されるコードと考えるのが正確です。
1つ目のフィールド:配送結果の分類
最初のフィールドは、配送が成功したのか、一時的な失敗なのか、恒久的な失敗なのかを表します。
| クラス | 意味 | 基本的な扱い |
|---|---|---|
2.x.x |
成功 | 配送処理が成功した |
4.x.x |
一時的な失敗 | 後で再送すると成功する可能性がある |
5.x.x |
恒久的な失敗 | 同じ条件のまま再送しても成功しない可能性が高い |
2.x.x:成功
dsn=2.0.0, status=sent
メールの配送処理が成功したことを表します。
4.x.x:一時的な失敗
dsn=4.4.1, status=deferred
一時的に配送できなかったことを表します。
Postfixは通常、メールをキューに保持し、後から再配送を試みます。
5.x.x:恒久的な失敗
dsn=5.1.1, status=bounced
現在の宛先やメッセージの状態では配送できず、同じ条件で再送しても成功しない可能性が高いことを表します。
2つ目のフィールド:原因の分類
2つ目のフィールドは、配送成功や失敗の原因カテゴリを表します。
| 分類 | 正式な分類 | 意味 |
|---|---|---|
X.0.X |
Other or Undefined Status | その他、または未分類 |
X.1.X |
Addressing Status | 送信元・宛先アドレス関連 |
X.2.X |
Mailbox Status | メールボックス関連 |
X.3.X |
Mail System Status | メールシステム関連 |
X.4.X |
Network and Routing Status | ネットワーク・ルーティング関連 |
X.5.X |
Mail Delivery Protocol Status | SMTPなどの配送プロトコル関連 |
X.6.X |
Message Content or Media Status | メール内容・形式関連 |
X.7.X |
Security or Policy Status | セキュリティ・ポリシー関連 |
例えば、次のコードはすべて恒久的な失敗ですが、原因の分類が異なります。
5.1.1 : 宛先アドレス関連
5.2.3 : メールボックス関連
5.4.4 : ネットワーク・ルーティング関連
5.7.1 : セキュリティ・ポリシー関連
よく見る拡張ステータスコード一覧
成功に関するコード
| コード | 意味 | ログの見方 |
|---|---|---|
2.0.0 |
その他、または未分類の成功 | 一般的な配送成功 |
2.1.0 |
その他のアドレス関連状態 | アドレスに関する正常な処理 |
2.1.5 |
宛先アドレスが有効 | 指定された宛先が有効 |
2.6.0 |
その他のメッセージ内容関連状態 | メッセージ内容に関する正常な処理 |
代表的なログは、次のとおりです。
dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as XXXXX)
このログでは、配送先のメールサーバーがメールを受け付けています。
ただし、status=sentは、Postfixが次の配送先へメールを正常に引き渡したことを表します。
最終受信者がメールを読んだことや、受信トレイへ必ず保存されたことまで保証するものではありません。
アドレス関連のコード
| コード | 意味 | 主な原因 |
|---|---|---|
5.1.0 |
その他のアドレス関連エラー | 詳細分類されていない宛先アドレスの問題 |
5.1.1 |
宛先メールボックスアドレスが存在しない | User unknown、宛先アドレスの間違い |
5.1.2 |
宛先システムアドレスが不正 | 配送先ドメインやシステムアドレスの問題 |
5.1.3 |
宛先アドレスの構文が不正 | メールアドレスの形式が不正 |
5.1.4 |
宛先アドレスが曖昧 | 宛先を一意に特定できない |
5.1.6 |
宛先メールボックスが移動した | 転送先が不明、旧アドレスが無効 |
5.1.7 |
送信者アドレスの構文が不正 | MAIL FROMの形式が不正 |
5.1.8 |
送信者システムアドレスが不正 | 送信者ドメインなどが無効 |
5.1.1の例
dsn=5.1.1, status=bounced
次のような応答文が一緒に出力されることがあります。
550 5.1.1 User unknown
確認する項目は次のとおりです。
- 宛先メールアドレスに入力ミスがないか
- 宛先アカウントが削除されていないか
- aliasesやvirtual aliasの設定が正しいか
- 宛先ドメインの配送設定が正しいか
X.1.1は、宛先メールボックスが存在しないことを示します。
同じ宛先へ再送しても通常は解消しないため、一般的には恒久的な失敗である5.1.1として使用されます。
メールボックス関連のコード
| コード | 意味 | 主な原因 |
|---|---|---|
X.2.0 |
その他のメールボックス関連状態 | 詳細分類されていないメールボックスの問題 |
5.2.1 |
メールボックスが無効 | アカウント停止、受信禁止など |
4.2.2 |
メールボックス容量超過 | 受信者のメールボックスがいっぱい |
5.2.3 |
メッセージサイズが管理上の制限を超過 | 受信者単位のサイズ制限 |
X.2.4 |
メーリングリストの展開に問題が発生 | メーリングリスト処理の失敗 |
Xには、実際の状態に応じて2、4、5のいずれかが入ります。
メールボックス容量超過の注意点
X.2.2は、メールボックスが満杯であることを表します。
4.2.2 Mailbox full
受信者が古いメールを削除すれば解消する可能性があるため、RFC 3463では一時的な失敗として扱うことが推奨されています。
ただし、受信サービスやMTAの実装によっては、次のように5.2.2が返される場合もあります。
5.2.2 Mailbox full
このため、実際の調査ではコードだけでなく、後ろに出力されるSMTP応答文も確認します。
メールシステム関連のコード
| コード | 意味 | 主な原因 |
|---|---|---|
X.3.0 |
その他のメールシステム関連状態 | 詳細分類されていないシステム障害 |
4.3.1 |
メールシステムのストレージ不足 | ディスク、キュー領域、メール保存領域の不足 |
X.3.2 |
システムがネットワークメッセージを受け付けない | メンテナンス中、サービス停止など |
X.3.3 |
必要なシステム機能が使用できない | 必要な機能やサービスを利用できない |
X.3.4 |
メッセージがシステム単位の制限を超過 | MTA全体のメッセージサイズ制限 |
X.3.5 |
システム設定が不正 | メールサーバーの設定不備 |
Xには、実際の状態や実装によって4または5が入ります。
4.3.1の例
dsn=4.3.1, status=deferred
4.3.1は、メールシステムの容量不足を表します。
確認例は次のとおりです。
df -h
df -i
postqueue -p
systemctl status postfix
journalctl -u postfix
ディスク使用率だけでなく、次の項目も確認します。
- inodeが枯渇していないか
- Postfixのキュー領域に空きがあるか
- メールボックス保存領域に空きがあるか
- ファイルシステムが読み取り専用になっていないか
- Postfix関連プロセスが正常に動作しているか
ネットワーク・ルーティング関連のコード
| コード | 意味 | 主な原因 |
|---|---|---|
X.4.0 |
その他のネットワーク・ルーティング状態 | 詳細分類されていない配送経路の問題 |
4.4.1 |
接続先ホストから応答がない | 接続タイムアウト、相手MTA停止、通信障害 |
4.4.2 |
接続が途中で切断された | SMTP通信途中の切断 |
X.4.3 |
ディレクトリサーバーまたはルーティングサーバーの障害 | DNSやディレクトリサービスの問題 |
X.4.4 |
配送経路を決定できない | DNS、MX、transport設定などの問題 |
4.4.5 |
ネットワークが混雑している | 配送経路の輻輳 |
4.4.6 |
配送ループを検出した | 転送やルーティング設定のループ |
X.4.7 |
配送時間切れ | キュー保持期限や指定されたTTLを超過 |
4.4.1の例
dsn=4.4.1, status=deferred (connect to mx.example.com[192.0.2.10]:25: Connection timed out)
この場合、Postfixは配送先のTCP 25番ポートへ接続できていません。
確認例は次のとおりです。
dig MX example.com
dig A mx.example.com
nc -vz mx.example.com 25
traceroute mx.example.com
確認ポイントは次のとおりです。
- 配送先ドメインのMXレコードが正しいか
- MXホストの名前解決ができるか
- TCP 25番ポートへ接続できるか
- ファイアウォールで通信が遮断されていないか
- ISPやクラウド事業者で25番ポートが制限されていないか
- 相手MTAが停止していないか
X.4.1は接続先ホストから応答がない状態を表します。
一時的な停止や通信障害で解消する可能性があるため、基本的には4.4.1として扱われます。
X.4.7の注意点
X.4.7は、メッセージが配送期限を超えたことを表します。
一時的な配送失敗そのものが4.x.xであっても、Postfixが再送を続けた結果、キュー保持期限を超えると最終的にバウンスすることがあります。
一時的な配送失敗
↓
Postfixが再送
↓
キュー保持期限を超過
↓
最終的に配送不能として返送
そのため、最終ログだけでなく、それ以前に発生していた一時エラーも確認する必要があります。
SMTPなどの配送プロトコル関連コード
| コード | 意味 | 主な原因 |
|---|---|---|
X.5.0 |
その他の配送プロトコル状態 | 詳細分類されていないSMTP上の問題 |
X.5.1 |
無効なコマンド | 相手がSMTPコマンドを認識できない |
X.5.2 |
コマンドの構文エラー | SMTPコマンドの形式が不正 |
X.5.3 |
受信者が多すぎる | RCPT TOの宛先数制限 |
X.5.4 |
コマンド引数が不正 | SMTPコマンドのパラメーターが不正 |
X.5.5 |
プロトコルバージョンが不正 | 対応していないプロトコルなど |
X.5.6 |
認証交換エラー | SMTP AUTHなどの情報交換に失敗 |
Xには、エラーが一時的か恒久的かに応じて4または5が入ります。
メッセージ内容・形式関連のコード
| コード | 意味 | 主な原因 |
|---|---|---|
X.6.0 |
その他のメッセージ内容関連状態 | 詳細分類されていない内容上の問題 |
X.6.1 |
メディア形式が未対応 | MIMEタイプや本文形式に対応していない |
X.6.2 |
変換が必要だが禁止されている | コンテンツ変換が認められていない |
X.6.3 |
変換が必要だが実行できない | 文字コードやメディア変換に失敗 |
X.6.4 |
変換を伴って配送された | 一部変換されたうえで配送された |
X.6.5 |
変換に失敗した | メッセージ変換処理のエラー |
X.6.6 |
メッセージ内容を利用できない | 本文や添付ファイルなどの問題 |
ウイルス対策製品、コンテンツフィルター、メール無害化製品などを経由する環境では、このカテゴリが返される場合があります。
セキュリティ・ポリシー関連のコード
| コード | 意味 | 主な原因 |
|---|---|---|
X.7.0 |
その他のセキュリティ・ポリシー状態 | 詳細分類されていないポリシー違反 |
5.7.1 |
配送が許可されていない | Relay denied、アクセス拒否、ポリシー拒否 |
5.7.2 |
メーリングリストへの展開が禁止されている | リスト投稿権限の不足 |
5.7.3 |
セキュリティ変換が必要だが実行できない | 暗号化などが必要だが対応不能 |
5.7.4 |
セキュリティ機能が未対応 | 必要なセキュリティ方式に未対応 |
5.7.5 |
暗号化処理に失敗した | 暗号化や復号に失敗 |
5.7.6 |
暗号化アルゴリズムが未対応 | 必要な暗号方式に非対応 |
5.7.7 |
メッセージ完全性の検証に失敗した | 署名や改ざん検証の失敗 |
5.7.1の例
dsn=5.7.1, status=bounced
応答文には、次のような内容が出ることがあります。
550 5.7.1 Relay access denied
550 5.7.1 Access denied
550 5.7.1 Message rejected due to policy
同じ5.7.1でも、次のように複数の原因が考えられます。
- SMTPリレーが許可されていない
- SMTP AUTHに失敗している
- 送信元IPアドレスが拒否されている
- 送信ドメイン認証に失敗している
- スパム対策ポリシーにより拒否された
- 送信者または受信者がアクセス制御に該当した
- 本文や添付ファイルがセキュリティポリシーに違反した
そのため、5.7.1だけで原因を断定せず、後ろのSMTP応答文を必ず確認します。
SMTP応答コードとの違い
maillogには、DSN拡張ステータスコードとは別に、SMTP応答コードも記録されます。
550 5.1.1 User unknown
それぞれの意味は次のとおりです。
| 値 | 種類 | 意味 |
|---|---|---|
550 |
SMTP応答コード | SMTPコマンドに対する失敗応答 |
5.1.1 |
拡張ステータスコード | 宛先メールボックスが存在しない |
User unknown |
人間向けの応答文 | 相手MTAが出力した具体的な説明 |
SMTP応答コードは通常3桁です。
250
421
450
451
452
550
551
552
553
554
拡張ステータスコードは、ピリオド区切りです。
2.0.0
4.4.1
5.1.1
5.7.1
これらは別のコード体系ですが、次のように一緒に出力されます。
550 5.1.1 User unknown
Postfixのstatusとの違い
Postfixのログには、dsnと一緒にstatusが出力されます。
dsn=2.0.0, status=sent
dsn=4.4.1, status=deferred
dsn=5.1.1, status=bounced
それぞれの役割は次のように異なります。
| 項目 | 意味 |
|---|---|
dsn |
配送結果や失敗理由を標準化されたコードで表す |
status |
Postfixがその宛先への配送をどのように処理したかを表す |
| SMTP応答コード | 相手SMTPサーバーが返した処理結果 |
| SMTP応答文 | 相手サーバーやMTAが出力した具体的な説明 |
代表的なstatusは次のとおりです。
status |
意味 |
|---|---|
sent |
配送先への引き渡しに成功した |
deferred |
配送を延期し、後で再送する |
bounced |
配送不能として処理した |
expired |
キュー保持期限を超過した |
maillogの読み方
次のログを例に確認します。
Oct 30 10:00:00 mail postfix/smtp[12345]: ABCDEF1234:
to=<user@example.com>,
relay=mx.example.com[192.0.2.10]:25,
delay=1.2,
delays=0.1/0.1/0.5/0.5,
dsn=5.1.1,
status=bounced
(host mx.example.com[192.0.2.10] said:
550 5.1.1 User unknown)
キューID
ABCDEF1234
Postfixがメールへ付与した識別子です。
同じキューIDを検索すると、そのメールの受付から配送結果までを追跡できます。
to
to=<user@example.com>
配送対象の宛先です。
relay
relay=mx.example.com[192.0.2.10]:25
実際に接続した配送先MTAです。
dsn
dsn=5.1.1
宛先メールボックスが存在しないことを表します。
status
status=bounced
Postfixが配送不能として処理したことを表します。
SMTP応答
550 5.1.1 User unknown
配送先MTAが返した応答です。
このログからは、次のように判断できます。
配送先MTAへの接続には成功した
↓
配送先MTAが宛先ユーザーを確認した
↓
宛先ユーザーが存在しなかった
↓
550 5.1.1が返された
↓
Postfixは配送不能としてバウンス処理した
dsnだけで原因を断定しない
障害調査では、dsnだけで原因を断定しないことが重要です。
最低でも、次の項目をセットで確認します。
キューID
to=
relay=
dsn=
status=
SMTP応答コード
SMTP応答メッセージ
例えば、同じ5.7.1でも原因は異なります。
550 5.7.1 Relay access denied
550 5.7.1 Message rejected due to policy
550 5.7.1 Sender address rejected
どれも5.7.1ですが、確認すべき設定は異なります。
| 応答文 | 主な確認箇所 |
|---|---|
Relay access denied |
mynetworks、SASL認証、smtpd_relay_restrictions
|
Sender address rejected |
送信者アドレス、アクセスマップ、DNS |
Message rejected due to policy |
スパム対策、ウイルス対策、送信元IP、本文、添付ファイル |
User unknown |
宛先アカウント、aliases、virtual mailbox |
Connection timed out |
DNS、MX、TCP 25番、ファイアウォール、相手MTA |
キューIDで関連ログを確認する
Postfixの調査では、同じキューIDのログをまとめて確認します。
キューIDがABCDEF1234の場合は、次のように検索します。
grep 'ABCDEF1234' /var/log/maillog
systemd journalにログが出ている環境では、次のように確認できます。
journalctl -u postfix | grep 'ABCDEF1234'
圧縮済みのローテートログも含めて確認する場合は、次のように検索できます。
zgrep -h 'ABCDEF1234' /var/log/maillog*
一時エラーでキューに残っているメールは、次のコマンドで確認できます。
postqueue -p
特定のキューIDの内容を確認する場合は、次のとおりです。
postcat -q ABCDEF1234
キューに残っているメールの再配送を要求する場合は、次のコマンドを使用します。
postqueue -f
ただし、原因を解消しないままpostqueue -fを実行しても、同じエラーが繰り返されます。
まずDNS、ネットワーク、宛先、容量、ポリシーなどの原因を確認してください。
代表的なコードの早見表
| コード | 意味 | 最初に確認する場所 |
|---|---|---|
2.0.0 |
配送成功 | 通常は対応不要 |
4.2.2 |
メールボックス容量超過 | 受信者のメールボックス使用量 |
4.3.1 |
メールシステムの容量不足 | ディスク、inode、キュー領域 |
4.4.1 |
接続先ホストから応答がない | DNS、MX、TCP 25番、相手MTA |
4.4.2 |
接続が途中で切断された | ネットワーク、TLS、相手MTA |
4.4.6 |
配送ループを検出した | aliases、転送、transport、MX |
X.4.7 |
配送期限を超過した | キュー保持期間、過去の一時エラー |
5.1.1 |
宛先メールボックスが存在しない | 宛先アドレス、アカウント、aliases |
5.1.3 |
宛先アドレスの構文が不正 | メールアドレス形式 |
5.2.1 |
メールボックスが無効 | アカウント状態、受信設定 |
5.2.3 |
メッセージサイズ制限超過 | 受信者単位のサイズ制限 |
X.3.4 |
システム単位のサイズ制限超過 | Postfixや相手MTAのサイズ制限 |
5.4.4 |
配送経路を決定できない | DNS、MX、transport設定 |
5.7.1 |
配送権限・ポリシーによる拒否 | リレー、アクセス制御、スパム判定 |
Xと記載している部分には、状態に応じて2、4、5のいずれかが入ります。
ただし、すべての組み合わせが有効とは限りません。
詳細コードによっては、一時的な失敗のみ、または恒久的な失敗のみで使用されるものがあります。
調査時の判断フロー
まず、classを確認します。
2.x.x
↓
配送成功
4.x.x
↓
一時的な失敗
↓
キューに残っているか確認
↓
DNS、ネットワーク、容量、相手MTAを確認
5.x.x
↓
恒久的な失敗
↓
宛先、メッセージ、認証、ポリシーを修正する
次に、subjectを確認します。
X.1.X → アドレス関連
X.2.X → メールボックス関連
X.3.X → メールシステム関連
X.4.X → ネットワーク・ルーティング関連
X.5.X → SMTPなどの配送プロトコル関連
X.6.X → メール内容・形式関連
X.7.X → セキュリティ・ポリシー関連
最後に、SMTP応答文を確認して具体的な原因を特定します。
まとめ
maillogのdsn=5.1.1などの値は、DSNなどで使用される拡張ステータスコードです。
コードは、次の3フィールドで構成されます。
class.subject.detail
最初に覚えておきたい分類は、次のとおりです。
| コード | 意味 |
|---|---|
2.x.x |
成功 |
4.x.x |
一時的な失敗 |
5.x.x |
恒久的な失敗 |
X.1.X |
アドレス関連 |
X.2.X |
メールボックス関連 |
X.3.X |
メールシステム関連 |
X.4.X |
ネットワーク・ルーティング関連 |
X.5.X |
配送プロトコル関連 |
X.6.X |
メール内容・形式関連 |
X.7.X |
セキュリティ・ポリシー関連 |
実際の障害調査では、次の情報をセットで確認します。
キューID
to=
relay=
dsn=
status=
SMTP応答コード
SMTP応答メッセージ
例えば、次のログであれば、
dsn=5.1.1, status=bounced (550 5.1.1 User unknown)
単に「5.1.1だった」と判断するだけでなく、次のように読み取ります。
宛先メールボックスが存在しない
↓
配送先MTAが550で拒否した
↓
Postfixは恒久的な配送失敗としてバウンス処理した
DSN拡張ステータスコードは原因を分類するための入口です。最終的な原因は、SMTP応答文や同じキューIDのログを含めて判断することが重要です。