要約

  • SMTPでは、本文後の肯定応答がメッセージ全体を受理し、サーバーに全配送責任を移すため、受理した複数宛先の異なるローカル結果を即時には分けられない。
  • RFC 2033のLMTPは、成功した各RCPTに最終応答を順番どおり返した。上流キューは未解決宛先だけを保持できるが、配送済み応答が失われれば重複は残る。

一つの本文の後に必要だった複数の結論

キューマネージャーが二つの宛先をローカル配送エージェントへ渡す。どちらのRCPTも受理された。しかし本文を受け取った後、最初のメールボックスへの格納は成功し、次は一時的な容量超過となった。

通常のSMTPは、DATAの最後に250452を一緒に返す構造を持たない。RFC 5321では、本文終端の判断に部分成功はない。サーバーが肯定応答を返せば、メッセージ全体の責任を引き受ける。その後の一部失敗は、自ら再試行するか、後から通知しなければならない。

ネットワーク上のホスト間で蓄積転送するSMTPには、この一体性が役立つ。受信サーバーには永続キューがあり、先に受理して後から処理できる。だが、すでに永続キューを持つ管理器から近接したメールボックス処理へ渡す場面では、同じ責任を下流にも複製する理由になる。

LMTPは、インターネットメール全体ではなく、この境界だけを変えた。

応答の個数が責任の置き場を変えた

1996年のInformational RFCであるRFC 2033は、DATAの最終ドット後に、以前成功したRCPTごとに一つの応答を返すと定めた。順番はRCPTの発行順である。

宛先Aへの最終250を上流が永続処理すれば、Aを再試行集合から外せる。Bが452なら、Bだけをキューに残す。下流エージェントはメールボックスに最も近い事実を返すが、未解決作業を保管する別キューにはならない。

対応は位置で決まる。DATA前に拒否された宛先は最終列に含まれない。同じforward-pathが二度成功しても、二つの位置と二つの応答が必要だ。複数行応答は一位置分である。後からアドレス文字列で並べ直せばよい、という契約ではない。

最初のRCPT成功も配送完了ではない。本文後の対応する肯定応答が初めて、その宛先の責任を移す。

LHLOは似たプロトコルを区別した

LMTPとESMTPはよく似ているため、最終応答数の違いを見落とすと危険である。SMTPクライアントは最初のLMTP応答を全体の完了と読み、残りを次のコマンドへ誤対応させうる。LMTPクライアントはSMTPの一応答後に来ない結果を待ち続けうる。

そこでLMTPはHELOEHLOLHLOに置き換えた。LMTPサーバーはSMTPの挨拶を肯定受理してはならず、SMTPサービスの25番ポートも使ってはならない。名称ではなく、本文投入前に応答契約の不一致を検出するためである。

RFC 2033はPIPELININGと拡張ステータスコードも必須にした。RFC 2920は先行送信したコマンドでも応答順を保つ。RFC 2034RFC 3463は失敗理由を細分化する。しかし詳細なコードだけでは対象のRCPT位置は分からない。順序台帳が先に必要である。

CHUNKINGを使う場合はBDAT LASTが同じ受信者別応答を返す。途中のBDATは一応答のままだ。複数結果はバイト断片ではなく、メッセージ完了に結び付く。

配送と応答の間にはまだ隙間があった

RFC 1047は、受信側が受理した後、送信側が最終250を受け取るまでの同期の隙間を記録した。そこで接続が切れると、受信側は完了と考え、送信側は未完了として再試行する。二通目が生まれうる。

LMTPは曖昧さを受信者単位に小さくしたが、メールボックス書込みとネットワーク応答を一つの原子操作にはしない。Aの肯定応答まで届けばAは閉じられる。Bへの配送後にBの応答が消えれば、上流には受理証拠がない。RFC 2033は受信済みの応答を処理し、残りを一時失敗として扱わせる。

サーバーは各応答を速やかに送ってバッファをflushし、クライアントは全件を待たず順次処理するべきだ。切断時の不明な末尾を短くできる。しかし失われた肯定応答や、すでに格納された一通目を取り戻せない。

LMTPを広域ネットワークで使うべきでないという勧告も、この前提から出る。永続キューとローカル配送の短い境界が想定される。経路が長く不安定になるほど、実行と証拠が分離する確率は高まる。

即時応答はDSNではない

DSNは、責任移転後に起きた配送状態を後から知らせる。LMTPの最終応答は移転そのものを決める。一時応答なら現在のキューがその宛先を保持し、肯定応答ならローカル側が引き受ける。

人が読んだこと、画面に表示されたこと、宛先が本人であることは証明しない。LMTPが細分化したのは輸送責任であって、注意や身元ではない。

出典と限界

根拠はRFC 1047RFC 2033RFC 2034RFC 2920RFC 3463RFC 5321に閉じる。これらは文法と責任境界を示すが、現在の普及率、製品既定値、普遍的な接続方式は示さない。RFC 2033はInformationalであり、LMTPの全体導入命令ではない。