← RFC Reference

RFC 2920 – SMTP パイプライニング

Internet Standard (STD 60) Core SMTP & Message Format Published March 2026
ELI5: 通常のSMTPは、1つの文を言ってから相手の返答を待ち、次の文を言う、というような会話に似ています。パイプライニングは、複数の文を次々と話し続けて、相手がそれらすべてに一度に返答するようなものです。各コマンド間で一時停止する必要がないため、会話全体がはるかに高速に終了します。特に両者が遠く離れている場合はそうです。

このRFCが存在する理由

標準的なSMTPは厳密なリクエスト・レスポンスプロトコルです。クライアントは1つのコマンドを送信し、サーバーのレスポンスを待ってから次のコマンドを送信します。各ラウンドトリップはレイテンシを追加し、特に高レイテンシなネットワークリンクでは顕著です。50人の受信者がいるメッセージの場合、クライアントはRCPT TOコマンドだけで50回の個別のラウンドトリップを必要とします。

RFC 2920はPIPELINING SMTP拡張機能を定義しており、これにより、クライアントは個別のレスポンスを待たずに複数のコマンドをバッチで送信できます。サーバーはコマンドをバッファリングして順序通りに処理し、すべてのレスポンスをまとめて送り返します。これにより、SMTPセッションの総時間が大幅に短縮されます。

パイプライニングは最も広くサポートされているSMTP拡張機能の1つです。ほぼすべての最新メールサーバーがこれをアドバタイズしており、ほとんどのSMTPクライアントライブラリはデフォルトで使用しています。

動作方法

  1. クライアントはEHLOを送信し、サーバーがそのケーパビリティリストでPIPELININGをアドバタイズしていることを確認します。
  2. クライアントは、パイプライニングが安全なコマンド(通常、MAIL FROM、1つ以上のRCPT TO、およびDATA)をグループ化します。
  3. クライアントは、個別のレスポンスを待たずに、これらすべてのコマンドを連続して送信します。
  4. サーバーは各コマンドを順序通りに処理し、コマンドごとに1つのレスポンスを順序通りに送り返します。
  5. クライアントはすべてのレスポンスを読み取り、エラー(例えば、受信者が拒否された場合)を処理します。

SMTPの例

パイプライニングなし(エンベロープの場合5ラウンドトリップ):

C: MAIL FROM:<news@example.com> S: 250 2.1.0 OK C: RCPT TO:<alice@recipient.com> S: 250 2.1.5 OK C: RCPT TO:<bob@recipient.com> S: 250 2.1.5 OK C: RCPT TO:<carol@recipient.com> S: 550 5.1.1 User unknown C: DATA S: 354 Start mail input

パイプライニングあり(エンベロープ全体の場合1ラウンドトリップ):

# クライアントがすべてのエンベロープコマンドを一度に送信 C: MAIL FROM:<news@example.com> C: RCPT TO:<alice@recipient.com> C: RCPT TO:<bob@recipient.com> C: RCPT TO:<carol@recipient.com> C: DATA # サーバーが5つのコマンドすべてに順序通りでレスポンス S: 250 2.1.0 OK S: 250 2.1.5 OK S: 250 2.1.5 OK S: 550 5.1.1 User unknown S: 354 Start mail input # クライアントがメッセージデータを送信(carolは拒否されたが、aliceとbobは続行) C: Subject: Weekly update C: C: This week's news... C: . S: 250 2.0.0 OK, queued

重要な技術詳細

パイプライニングが可能なコマンド

すべてのSMTPコマンドがパイプライニングに安全とは限りません。RFC 2920はコマンドを2つのカテゴリに分類しています:

パイプライニング可能 レスポンスを待つ必要がある
MAIL FROM EHLO / HELO
RCPT TO STARTTLS
DATA AUTH
RSET QUIT
NOOP DATAコンテンツ(ドット詰めされたボディ)

接続状態を変更するコマンド(EHLOSTARTTLSAUTH)は同期ポイントです。クライアントはレスポンスを待ってからその他を送信する必要があります。

エラー処理

パイプライニング時、バッチ内の一部のコマンドが成功し、他は失敗することがあります。クライアントは順序通りにレスポンスをコマンドに一致させる必要があります。拒否されたRCPT TOはトランザクション全体を無効にしません。メッセージはアクセプトされた受信者に配信されます。ただし、MAIL FROMが拒否された場合、その後のRCPT TOコマンドも失敗します。

TCPバッファリング上の考慮事項

パイプライニングはTCPのバッファリングに依存しています。クライアントは読み込まずにソケットに複数のコマンドを書き込み、TCPの送信バッファがそれらを保持できることを信頼します。非常に大量のRCPT TOコマンド(数百または数千)の場合、クライアントはTCPバッファを満たしてデッドロックするのを避けるため、グループ単位でパイプライニングする必要がある場合があります。

STARTTLSとの相互作用

STARTTLSを含むEHLOレスポンス後、クライアントはSTARTTLSを他のコマンドとパイプラインしてはいけません。TLSハンドシェイクは接続全体の状態を変更するため、それは厳密な同期ポイントです。TLSが確立され、新しいEHLOが送信された後、パイプライニングを再開できます。

一般的なミス

配信可能性への影響

Related RFCs