要約
- SMTPでは、本文後の肯定応答がメッセージ全体を受理し、サーバーに全配送責任を移すため、受理した複数宛先の異なるローカル結果を即時には分けられない。
- RFC 2033のLMTPは、成功した各
RCPTに最終応答を順番どおり返した。上流キューは未解決宛先だけを保持できるが、配送済み応答が失われれば重複は残る。
一つの本文の後に必要だった複数の結論
キューマネージャーが二つの宛先をローカル配送エージェントへ渡す。どちらのRCPTも受理された。しかし本文を受け取った後、最初のメールボックスへの格納は成功し、次は一時的な容量超過となった。
通常のSMTPは、DATAの最後に250と452を一緒に返す構造を持たない。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はHELOとEHLOをLHLOに置き換えた。LMTPサーバーはSMTPの挨拶を肯定受理してはならず、SMTPサービスの25番ポートも使ってはならない。名称ではなく、本文投入前に応答契約の不一致を検出するためである。
RFC 2033はPIPELININGと拡張ステータスコードも必須にした。RFC 2920は先行送信したコマンドでも応答順を保つ。RFC 2034とRFC 3463は失敗理由を細分化する。しかし詳細なコードだけでは対象のRCPT位置は分からない。順序台帳が先に必要である。
CHUNKINGを使う場合はBDAT LASTが同じ受信者別応答を返す。途中のBDATは一応答のままだ。複数結果はバイト断片ではなく、メッセージ完了に結び付く。
配送と応答の間にはまだ隙間があった
RFC 1047は、受信側が受理した後、送信側が最終250を受け取るまでの同期の隙間を記録した。そこで接続が切れると、受信側は完了と考え、送信側は未完了として再試行する。二通目が生まれうる。
LMTPは曖昧さを受信者単位に小さくしたが、メールボックス書込みとネットワーク応答を一つの原子操作にはしない。Aの肯定応答まで届けばAは閉じられる。Bへの配送後にBの応答が消えれば、上流には受理証拠がない。RFC 2033は受信済みの応答を処理し、残りを一時失敗として扱わせる。
サーバーは各応答を速やかに送ってバッファをflushし、クライアントは全件を待たず順次処理するべきだ。切断時の不明な末尾を短くできる。しかし失われた肯定応答や、すでに格納された一通目を取り戻せない。
LMTPを広域ネットワークで使うべきでないという勧告も、この前提から出る。永続キューとローカル配送の短い境界が想定される。経路が長く不安定になるほど、実行と証拠が分離する確率は高まる。
即時応答はDSNではない
DSNは、責任移転後に起きた配送状態を後から知らせる。LMTPの最終応答は移転そのものを決める。一時応答なら現在のキューがその宛先を保持し、肯定応答ならローカル側が引き受ける。
人が読んだこと、画面に表示されたこと、宛先が本人であることは証明しない。LMTPが細分化したのは輸送責任であって、注意や身元ではない。
出典と限界
根拠はRFC 1047、RFC 2033、RFC 2034、RFC 2920、RFC 3463、RFC 5321に閉じる。これらは文法と責任境界を示すが、現在の普及率、製品既定値、普遍的な接続方式は示さない。RFC 2033はInformationalであり、LMTPの全体導入命令ではない。
会員向け解説
プロフィールの詳細
適切な会員レベルでログインすると、解説全文と出典メモをご覧いただけます。
Strategic Circle 限定
Strategic Circle
すべての読者に公開されています。参加してログインすると プロフィール解説 を閲覧できます。
Strategic Circle に参加Leadership Alliance 会員限定
Leadership Alliance
対象となる IP 資産の所有者・管理者向けです。ログインすると Leadership Alliance の解説を閲覧できます。
Leadership Alliance に参加
