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

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)

有効なコマンドシーケンス:

  1. 接続: サーバーが220を送信
  2. 挨拶: クライアントがEHLO/HELOを送信
  3. トランザクション: MAIL → RCPT (1つ以上) → DATA
  4. 終了: 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)。