メインコンテンツまでスキップ

5. アドレス解決とメール処理 (Address Resolution and Mail Handling)

このセクションでは、SMTPクライアントがメールメッセージを配信する場所を決定する方法と、配信プロセスをどのように処理すべきかについて説明する。

5.1. ターゲットホストの特定 (Locating the Target Host)

SMTPクライアントが特定のドメインにメールを配信する場合、適切な宛先ホストを決定しなければならない (MUST)。このプロセスは、ドメインネームシステム (Domain Name System, DNS) を使用し、以下の手順に従う:

ステップ1: MXレコードの検索

宛先ドメインのメール交換器 (Mail eXchanger, MX) レコードをDNSに照会する:

$ dig example.com MX

;; ANSWER SECTION:
example.com. 3600 IN MX 10 mail1.example.com.
example.com. 3600 IN MX 20 mail2.example.com.
example.com. 3600 IN MX 30 mail3.example.com.

ステップ2: 優先度でソート

MXレコードを優先度でソートする (数値が小さいほど優先度が高い):

  1. mail1.example.com (優先度10)
  2. mail2.example.com (優先度20)
  3. mail3.example.com (優先度30)

ステップ3: 配信の試行

優先度順に各ホストへの接続を試みる:

  1. 最高優先度 (最小番号) のMXへの接続を試みる
  2. 接続が失敗した場合、次の優先度レベルを試す
  3. 成功するか、すべてのMXホストが使い果たされるまで続ける

ステップ4: A/AAAAレコードへのフォールバック

MXレコードが存在しない場合、ドメイン自体をメールサーバーとして扱う:

  • Aレコード (IPv4) またはAAAAレコード (IPv6) を検索する
  • そのIPアドレスへの直接接続を試みる

重要: MXレコードが存在するがすべて失敗した場合、A/AAAAレコードにフォールバックしてはならない (MUST NOT)。

詳細なアルゴリズム

1. 宛先ドメインのMXレコードを照会する
2. MXレコードが見つかった場合:
a. "." (ヌルMX) を指すMXを削除する
b. 残りのMXを優先度でソートする
c. 各優先度レベルについて (最小番号から開始):
i. この優先度のすべてのMXホストをIPアドレスに解決する
ii. 同じ優先度のホストをランダムに並べ替える
iii. 各ホストへの接続を試みる
iv. 接続が成功した場合、メールを配信する
v. この優先度のすべてのホストが失敗した場合、次の優先度を試す
d. すべてのMXホストが失敗した場合、配信を延期する (一時的失敗)
3. MXレコードが見つからなかった場合:
a. ドメインのA/AAAAレコードを照会する
b. ドメインのIPへの直接接続を試みる
c. 接続が失敗した場合、配信を延期する
4. ドメインが解決しない場合:
- 永続的失敗を返す (5xxコード)

ベストプラクティス

  1. TTLの尊重: TTL値に従ってDNS結果をキャッシュする
  2. 接続タイムアウト: 合理的なタイムアウトを使用する (例: 初期接続で5分)
  3. 再試行ロジック: 一時的な失敗 (4xx) の場合、定期的に再試行する
  4. 負荷分散: 同じ優先度のMXレコードの場合、選択をランダム化する
  5. IPv6サポート: AとAAAAの両方のレコードを試す
  6. エラー処理: 一時的失敗と永続的失敗を区別する

5.2. IPv6とMXレコード (IPv6 and MX Records)

MXホスト名を解決する際、クライアントは以下を行うべきである (SHOULD):

  1. A (IPv4) とAAAA (IPv6) の両方のレコードを照会する
  2. 両方が利用可能な場合はIPv6を優先する (実装依存)
  3. IPv6接続が失敗した場合はIPv4にフォールバックする

:

mail.example.com has:
A 192.0.2.1
AAAA 2001:db8::1

プロセス:
1. IPv6を試す: 2001:db8::1
2. 失敗した場合、IPv4を試す: 192.0.2.1

IPv6アドレスリテラル

SMTPは、MAIL FROMおよびRCPT TOでIPv6アドレスリテラルをサポートする:

形式: user@[IPv6:2001:db8::1]

:

C: MAIL FROM:<sender@[IPv6:2001:db8::1]>
S: 250 Ok

デュアルスタックに関する考慮事項

  1. Happy Eyeballs: わずかな遅延でIPv6とIPv4を並行して試す
  2. タイムアウト処理: IPv6の試行がIPv4を過度に遅延させないようにする
  3. 優先設定: IPv4/IPv6の優先設定の構成を許可する
  4. フォールバック: 互換性のために常にIPv4フォールバックを用意する