[Mew-dist 2406] <IM> Return-Path's handling (long)

Takahiro Kambe taca at example.com
1997年 10月 8日 (水) 22:38:05 JST


こんばんは。

ふと二重にReturn-Pathヘッダが付いていることに気づきました。
Return-Pathヘッダは最終的なメッセージの配送の段階で付加される、
エンベロープの残骸じゃなかった送信者情報が入るヘッダです。

言葉を一通り整理します。

o MTA
	Message Transfer Agentで、メールの配送を担うエンティティ、
	これらが協調してMTS(Message Transfer System)を構成する。

o MUA
	Message User Agentで、メール・システムの利用者(人やプログ
	ラム)の意志を反映して、メッセージの送信、取り込みを行う
	エンティティ

この区別はあくまでもモデルとしてのものであり、sendmailにしてもMTA
の処理の大半を行うのは確かだが、MUA的な処理も行っている。現実の
実装では厳密に区別されるものではない。

o エンベロープ
	MUAからMTA、またはMTAからMTAの間でメールを送るときに使用さ
	れる、送信者や受信者の情報。但し、MUAが送るメールの本体(メッ
	セージ)とは独立した存在である。(SMTPではMAIL/RCPTコマンド
	でやりとりされる。)

o メッセージ
	MUAからMTA、またはMTAからMTAの間でやりとりされるメール本体。
	SMTPではメモ・ベースの内容である。

o ヘッダ
	メッセージのうち、MUA等が利用する付加情報を含む部分。
	RFC822ではメッセージの最初から最初の空行の前までのテキスト
	部分。

o ボディ
	メッセージのうち、ユーザが送付する本体。RFC822ではメッセー
	ジの最初に現れる改行の次から最後までのテキスト。

o UNIX From行
	mail.local(/bin/mail)でメッセージの区切りを表す行で、メッ
	セージ本体ではない。(RFC822的な規則にも従っていない。)

o 最初のMUAからMTAへの転送(posting)
	RFC822で必須なヘッダを付加(MUA & MTA)
	アドレスの補完、整形、正規化

o MTAからMTAへの転送(relay)
	トレース・ヘッダ(Received)の付加

o アドレス解釈を変更したい転送(一種のgateway)
	ヘッダのアドレスの積極的な書き換え

o 最終的なメールの配送
	sendmail的な世界ではmail.local(/bin/mail)やprogram mailer


Return-Pathは最後の段階で付加されるものです。以上の様な解釈に従い、
私はmail.local(相当)による配送でもReturn-Pathを付加する様に
sendmailを設定しています。当然、procram mailerでもReturn-Pathを
付加する様にしています。

imgetで取り込むと、UNIX From行からReturn-Pathヘッダを生成していて、
しかも既に存在するReturn-Pathのことを考慮していません。imgetは明ら
かに「配送」の段階を終えたMUAとしての動作であり、ここで新たにヘッ
ダを生成するのは行うべきことではないと思います。しかも、

>From taca Wed Oct  8 21:39:17 1997
Return-Path: taca
...(メッセージが続く)...

とあったものが、

Return-Path: <taca>
Return-Path: taca
Date: Wed, 8 Oct 1997 21:39:16 +0900 (JST)
...(メッセージが続く)...

となり、せっかく正しい形式であったReturn-Pathに < > を呼ぶんに加え
たものを付加してしまいます。

- MHでRPATHをコンパイル時にしているすると確かに同様な動作をします。
- UNIX From行の情報とReturn-Pathヘッダの情報は同様な部分があり、
  冗長です。

しかし、UNIX From行はメッセージの一部ではありませんし、これがある
からといって最終の配送段階でReturn-Pathの付加をしないというのも
理不尽な話です。正しいReturn-Pathを付加することができるのは、MTAの
方であって、MUAの方では限界があります。

以上、いろいろ書いて来ましたが、

    Return-Pathを無条件に付加しないか、そういうオプションが欲しい。

と思います。LocalMbox.pm.imにおいて、

	if ($format eq 'UNIX') {
	    # convert UNIX From_ into Return-Path
	    my $rp = $first_line;
	    $rp =~ s/^From //;
	    $rp =~ s/ [A-Z][a-z][a-z] [A-Z][a-z][a-z] [\d ]\d \d\d:\d\d:\d\d \d\d\d\d$//;
	    $rp = "<$rp>" if ($rp !~ /^<.*>$/);
	    @Message = ("Return-Path: $rp\n");
	} else {
	    @Message = ();
	}

が該当する部分です。

如何なものでしょう?

P.S.
なお、最初の用語の説明はRFC等にそのまま書かれているわけではありま
せん。過去の文献や標準等からの私の理解であることをお断りしておきま
す。

--
神戸 隆博(かんべ たかひろ)
PGP Fingerprint: EB 8B D9 87 48 10 77 AA  57 EC FC B8 A3 07 64 3A



Mew-dist メーリングリストの案内