4. SMTP仕様 (The SMTP Specifications)
このセクションには、SMTPコマンド、応答、シーケンス、トレース情報、および実装上の問題に関する詳細な仕様が含まれる。
4.1. SMTPコマンド (SMTP Commands)
4.1.1. コマンドのセマンティクスと構文 (Command Semantics and Syntax)
SMTPコマンドは、オプションでパラメータが続く4文字 (一部は8文字に拡張) の大文字小文字を区別しないASCIIワードである。
拡張HELLO (EHLO) またはHELLO (HELO)
構文: EHLO domain または HELO domain
EHLOコマンドは、SMTPセッションを開始し、サービス拡張を要求する。HELOは、拡張をサポートしていないサーバーのフォールバックである。
例:
C: EHLO client.example.com
S: 250-server.example.com
S: 250-SIZE 52428800
S: 250-8BITMIME
S: 250 STARTTLS
MAIL (MAIL FROM)
構文: MAIL FROM:<reverse-path> [parameters]
送信者を指定することにより、メールトランザクションを開始する。
例:
C: MAIL FROM:<[email protected]>
S: 250 Ok
RECIPIENT (RCPT TO)
構文: RCPT TO:<forward-path> [parameters]
メールの1人の受信者を識別する。
例:
C: RCPT TO:<[email protected]>
S: 250 Ok
DATA
構文: DATA
メッセージコンテンツの開始を示す。コンテンツは <CRLF>.<CRLF> で終了する。
例:
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: [email protected]
C: To: [email protected]
C: Subject: Test
C:
C: Message body here.
C: .
S: 250 Ok: queued as 12345
RESET (RSET)
構文: RSET
現在のメールトランザクションを中止し、バッファをリセットする。
VERIFY (VRFY)
構文: VRFY string
メールボックスが存在することを検証する。
注意: 多くのサーバーは、セキュリティ上の理由でこれを無効にしている。
EXPAND (EXPN)
構文: EXPN string
メーリングリストを展開する。
HELP
構文: HELP [command]
ヘルプ情報を提供する。
NO OPERATION (NOOP)
構文: NOOP
何もせず、接続を維持するために使用される。
QUIT
構文: QUIT
SMTPセッションを終了する。
4.1.2. コマンド引数の構文 (Command Argument Syntax)
コマンドは、ABNF (RFC 5234) で定義された厳格な構文規則に従う。
メールボックス形式: local-part@domain
- Local-part: 最大64文字
- Domain: 完全修飾ドメイン名またはアドレスリテラル
アドレスリテラル:
- IPv4:
[192.0.2.1] - IPv6:
[IPv6:2001:db8::1]
4.1.3. アドレスリテラル (Address Literals)
アドレスリテラルは、括弧で囲まれたドメインである:
[192.0.2.1]- IPv4アドレス[IPv6:2001:db8::1]- IPv6アドレス
4.1.4. コマンドの順序 (Order of Commands)
有効なコマンドシーケンス:
- 接続: サーバーが220を送信
- 挨拶: クライアントがEHLO/HELOを送信
- トランザクション: MAIL → RCPT (1つ以上) → DATA
- 終了: QUIT
無効なシーケンスは、503「コマンドのシーケンスが不正」エラーになる。
4.1.5. 私的使用コマンド (Private-Use Commands)
X で始まるコマンドは、私的使用と実験のために予約されている。
4.2. SMTP応答 (SMTP Replies)
4.2.1. 応答コードの重大度と理論 (Reply Code Severities and Theory)
応答コードは3桁の数字である:
- 2yz: 肯定的完了
- 3yz: 肯定的中間
- 4yz: 一時的否定 (再試行可能)
- 5yz: 永続的否定 (再試行しない)
2桁目はカテゴリを示す:
- x0z: 構文
- x1z: 情報
- x2z: 接続
- x5z: メールシステム
4.2.2. 機能グループ別の応答コード (Reply Codes by Function Groups)
接続確立:
- 220: サービス準備完了
- 421: サービス利用不可
クライアント初期化:
- 250: OK
- 500: 構文エラー
- 502: コマンド未実装
メールトランザクション:
- 250: OK
- 354: メール入力開始
- 450/550: メールボックス利用不可
- 451/551: 処理エラー
- 452/552: ストレージ不足
- 553: メールボックス名無効
- 554: トランザクション失敗
4.2.3. 数値順の応答コード (Reply Codes in Numeric Order)
- 211: システムステータス
- 214: ヘルプメッセージ
- 220: サービス準備完了
- 221: 接続を閉じる
- 250: OK
- 251: ユーザーがローカルではない、転送する
- 252: ユーザーを検証できないが、受け入れる
- 354: メール入力開始
- 421: サービス利用不可
- 450: メールボックス利用不可
- 451: ローカルエラー
- 452: ストレージ不足
- 500: 構文エラー
- 501: パラメータの構文エラー
- 502: コマンド未実装
- 503: コマンドのシーケンスが不正
- 504: コマンドパラメータ未実装
- 550: メールボックス利用不可
- 551: ユーザーがローカルではない
- 552: ストレージ割り当て超過
- 553: メールボックス名が許可されていない
- 554: トランザクション失敗
- 555: パラメータが認識されない
4.3. コマンドと応答のシーケンス (Sequencing of Commands and Replies)
4.3.1. シーケンスの概要 (Sequencing Overview)
SMTPはロックステップである: クライアントがコマンドを送信し、応答を待ってから次のコマンドを送信する。例外: PIPELINING拡張はバッチ処理を許可する。
4.4. トレース情報 (Trace Information)
各SMTPサーバーは、メッセージを受け入れる際にReceivedヘッダーフィールドを追加する:
形式:
Received: from sender.example.com (host.example.com [192.0.2.1])
by receiver.example.com (Postfix) with ESMTP id 12345
for <[email protected]>; Mon, 24 Dec 2024 10:00:00 +0000 (UTC)
4.5. 追加の実装上の問題 (Additional Implementation Issues)
4.5.1. 最小実装 (Minimum Implementation)
完全に機能するSMTPは、以下をサポートしなければならない (MUST):
- コマンド: EHLO、MAIL、RCPT、DATA、RSET、NOOP、QUIT
- 応答コード: すべての標準コード
- キューイングと再試行ロジック
- 適切なエラー処理
4.5.2. 透過性 (Transparency)
サーバーは、ドットスタッフィング (dot-stuffing) を処理しなければならない (MUST): . で始まる行は、DATA送信中に .. としてエスケープされなければならない。
4.5.3. サイズとタイムアウト (Sizes and Timeouts)
4.5.3.1. サイズ制限と最小値 (Size Limits and Minimums)
最小要件:
- Local-part: 64オクテット
- Domain: 255オクテット
- Path: 256オクテット
- コマンド行: 512オクテット
- 応答行: 512オクテット
- テキスト行: 1000オクテット
- 受信者バッファ: 100受信者
4.5.3.2. タイムアウト (Timeouts)
クライアントタイムアウト:
- 初期220メッセージ: 5分
- MAILコマンド: 5分
- RCPTコマンド: 5分
- DATA開始: 2分
- データブロック: 3分
- DATA終了: 10分
サーバータイムアウト:
- コマンド待機: 5分
- DATA待機: 10分
4.5.4. 再試行戦略 (Retry Strategies)
一時的な失敗 (4yzコード) の場合:
- 少なくとも30分ごとに再試行する
- 少なくとも4〜5日間試行を続ける
- 間隔を置いて送信者に警告を送信する
- 最終的な失敗後にバウンスを生成する
4.5.5. ヌルリバースパスを持つメッセージ (Messages with a Null Reverse-Path)
バウンスメッセージは、メールループを防ぐために MAIL FROM:<> (ヌルリバースパス) を使用する。サーバーは、ヌルリバースパスを受け入れなければならない (MUST) が、それらに対してバウンスを生成してはならない (MUST NOT)。