XFORWARD コマンドは次の問題を目標にしています:
SMTP ベースのコンテンツフィルタ後のロギング。インターネット ->MTA1->フィルタ->MTA2 形式でコンテンツフィルタ アプリケーションを配置すると、クライアントやメッセージを特定する 情報のロギングは MTA1 がメールをコンテンツフィルタに渡した時点で 変わってしまいます。MTA2 ロギングの解釈を簡単にするために、MTA1 がコンテンツフィルタを通してリモートクライアントやメッセージを特定する 情報を MTA2 に渡してメールハンドリング処理の一部として情報をログに記録できるようになれば役に立つでしょう。
この拡張は別のコマンドとして実装されており、クライアントやメッセージの属性を追加して送るのに使えます。これは MAIL FROM コマンドを使った追加パラメータを渡す形では実装されていません。そうしてしまうと、AUTH などの他の拡張をサポートするためにすでに必要となっている空間では足りず、600文字以上をさらに MAIL FROM コマンド長制限に追加する必要が出てしまいます。
クライアント-サーバ間の対話例はこのドキュメントの最後にあります。
SMTP サーバの EHLO 応答における、この拡張に関するキーワードが XFORWARD です。続いて XFORWARD 実装がサポートしている属性の名前が続きます。
XFORWARD コマンドはメール配送処理の途中 (つまり MAIL とドットの間) 以外のどこでも送ることができます。サーバが ESMTP コマンドパイプライニングをサポートしていれば、コマンドをパイプラインさせることもできます。
XFORWARD 要求の文法を以下に示します。大文字と引用符の付いた文字列は終端記号 (terminals) を、小文字の文字列はメタ終端記号 (meta terminals) を、 SP は空白を表します。コマンドや属性名は大文字で書かれていますが、実際には小文字でも構いません。
xforward-command = XFORWARD 1*( SP attribute-name"="attribute-value )
attribute-name = ( NAME | ADDR | PROTO | HELO | SOURCE )
attribute-value = xtext
属性の値は RFC 1891 のようにエンコードします。
NAME 属性には上流のホスト名、もしくは情報が得られない場合には [UNAVAILABLE] を指定します。ホスト名は非 DNS ホスト名かもしれません。
ADDR 属性には上流ネットワークアドレス、もしくは情報が 得られない場合には [UNAVAILABLE] を指定します。アドレス情報は [] で 囲みません。アドレスは非 IP アドレスかもしれません。
PROTO 属性には上流ホストから受け取るメールのメールプロトコルを 指定します。これは SMTP や最大64文字までの非 SMTP プロトコル名、 もしくは情報が得られない場合には [UNAVAILABLE] となります。
HELO 属性には上流ホストが通知するホスト名 (SMTP HELO コマンドで渡される必要はありません)、もしくは情報が得られない場合には [UNAVAILABLE] を指定します。ホスト名は非 DNS ホスト名かもしれません。
上流ホストにとってローカルなソースからメッセージを受け取った場合 (例えば、メッセージが上流ホスト自身から生成された場合) はSOURCE属性には LOCAL を、その他すべてのメールには REMOTE を、そして情報が得られない場合は [UNAVAILABLE] を指定します。下流のMTAはローカルソースからのメールの ヘッダを書き換えたり修飾する機能を有効にし、それ以外のソースからの メールには無効にすると決めることができます。
注意1: 属性値は255文字よりも長くてはいけません (特定の属性はさらに短くなければいけないものもあります)。またコントロール文字や非 ASCII 文字、空白、その他メッセージヘッダで特別な文字を含んでもいけません。
注意2: DNS ホスト名は最大 255 文字までです。XFORWARD クライアントの実装は SMTP コマンドの制限である 512 文字を超えた XFORWARD コマンドを送ってはいけません。
注意3: [UNAVAILABLE] は大文字、小文字、それらの混在のいずれでも構いません。
注意4: XFORWARD サーバの実装は現在の SMTP セッションからの情報と上流のセッションからの情報を混ぜてはいけません。
注意5: バージョン2.3より前のPostfixの実装では、属性値を xtext エンコードしません。これらの古い実装を解釈しようとするサーバでは、エンコードされていない情報を受け取る準備をしておくべきです。
書式が正しい XFORWARD コマンドを受け取ると、サーバは指定された属性値を保存し、[UNAVAILABLE] という値が指定された属性を消去します。すべての XFORWARD 属性は MAIL FROM コマンドが完了した後で、実際のクライアント情報にリセットされます。
コード 意味 250 成功 421 続行不能、切断中 501 コマンドパラメータ文法の間違い 503 メール処理実行中 550 不十分な認証
以下の例では、クライアントが送る情報を太字で示しています。
220 server.example.com ESMTP Postfix EHLO client.example.com 250-server.example.com 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-XFORWARD NAME ADDR PROTO HELO 250 8BITMIME XFORWARD NAME=spike.porcupine.org ADDR=168.100.189.2 PROTO=ESMTP 250 Ok XFORWARD HELO=spike.porcupine.org 250 Ok MAIL FROM:<wietse@porcupine.org> 250 Ok RCPT TO:<user@example.com> 250 Ok DATA 354 End data with <CR><LF>.<CR><LF> ...message content... . 250 Ok: queued as 3CF6B2AAE8 QUIT 221 Bye
XFORWARD コマンドは監査証跡を変更します。このコマンドの利用は認証されたクライアントに制限しなければいけません。
SMTP 接続キャッシュは、同じ SMTP セッション内での複数のメッセージ配送を可能にします。XFORWARD 属性は MAIL FROM コマンドの完了後にリセットされるので、情報が漏れる可能性はありません。
Moore, K, "SMTP Service Extension for Delivery Status Notifications", RFC 1891, January 1996.