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レコードを優先度でソートする (数値が小さいほど優先度が高い):
mail1.example.com(優先度10)mail2.example.com(優先度20)mail3.example.com(優先度30)
ステップ3: 配信の試行
優先度順に各ホストへの接続を試みる:
- 最高優先度 (最小番号) のMXへの接続を試みる
- 接続が失敗した場合、次の優先度レベルを試す
- 成功するか、すべての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コード)
ベストプラクティス
- TTLの尊重: TTL値に従ってDNS結果をキャッシュする
- 接続タイムアウト: 合理的なタイムアウトを使用する (例: 初期接続で5分)
- 再試行ロジック: 一時的な失敗 (4xx) の場合、定期的に再試行する
- 負荷分散: 同じ優先度のMXレコードの場合、選択をランダム化する
- IPv6サポート: AとAAAAの両方のレコードを試す
- エラー処理: 一時的失敗と永続的失敗を区別する
5.2. IPv6とMXレコード (IPv6 and MX Records)
MXホスト名を解決する際、クライアントは以下を行うべきである (SHOULD):
- A (IPv4) とAAAA (IPv6) の両方のレコードを照会する
- 両方が利用可能な場合はIPv6を優先する (実装依存)
- 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
デュアルスタックに関する考慮事項
- Happy Eyeballs: わずかな遅延でIPv6とIPv4を並行して試す
- タイムアウト処理: IPv6の試行がIPv4を過度に遅延させないようにする
- 優先設定: IPv4/IPv6の優先設定の構成を許可する
- フォールバック: 互換性のために常にIPv4フォールバックを用意する