.\" @(MHWARNING) .\" written by MH-plus project .SC SLOCAL 1 .NA slocal \- 特別なローカルメール配送 .SY @(MHETCPATH)/slocal \%[address\ info\ sender] .na .br \%[\-addr\ address] \%[\-info\ data] \%[\-sender\ sender] .br \%[\-user\ username] \%[\-mailbox\ mbox] \%[\-file\ file] .\" \%[\-home\ homedir] .br \%[\-maildelivery\ deliveryfile] \%[\-verbose] \%[\-noverbose] \%[\-debug] \%[\-help] .ad .DE \fIslocal\fP は、選択基準の複雑な設定に応じて、届いたメールを処理するように 設計されたプログラムです。 通常、\fIslocal\fP は手動で起動するのではなく、 システムのメッセージ配送エージェント(MTA) が 代わって \fIslocal\fP を起動します。 \fIslocal\fP で使われるメッセージ選択基準は、ユーザーのホームディレクトリ にある \fI\&.maildelivery\fP ファイルに書かれます。 このファイルのフォーマットは以下にあります。 メッセージ配送アドレスとメッセージ送り主は、可能であれば メッセージ配送エージェント(MTA) のエンベロープ情報によって決定されます。 \fISendMail\fP を使用している場合、もしあれば、送り主は UUCP \*(lqFrom\ \*(rq 行から取得されます。 コマンド・ライン引数もしくは `\-addr' と `\-sender' オプションの 引数で、これらの値を置き換えるが出来ます。 メッセージは通常、標準入力から読み込まれます。 標準入力から読み込む代わりに、`\-file' オプションで、 メッセージが読み込まれるべきファイル名を指定することが出来ます。 `\-user' オプションは、メールを配送するユーザー名を \fIslocal\fP に 教えるものです。 `\-mailbox' オプションは、ユーザーのメールドロップファイル名を \fIslocal\fP に教えるものです。 `\-info' オプションは、あなたに代わって \fIslocal\fP が呼び出した サブプロセスに、任意の引数を渡すのに使われます。 `\-verbose' オプションをつけると、 \fIslocal\fR は実行中の動作を標準出力に出します。 `\-debug' オプションをつけると、 より詳細なデバッグ出力を標準エラー出力(stderr)に出します。 .Uh "メッセージ配送エージェント(MTA)" もし、使用している MTA が \fISendMail\fP であるなら、 .sp .nf .in +.5i \*(lq|\ @(MHETCPATH)/slocal\ \-user\ username\*(rq .in -.5i .fi .sp という行を、ホームディレクトリの \&.forward ファイルに含んでいればよいです。 これにより、\fISendMail\fP が代わりに \fIslocal\fP を起動してくれます。 もし使用している MTA が \fIMMDF-I\fP であれば、 ホームディレクトリに、@(MHETCPATH)/slocal を bin/rcvmail として (シンボリック) リンクしておけばよいです。 これにより、正しい \*(lq\fIaddress\ info\ sender\fP\*(rq 引数で、 \fIMMDF-I\fP が代わりに \fIslocal\fP を起動します。 もし使用している MTA が \fIMMDF-II\fP である場合、 \fIslocal\fP は使えません。 同等の機能が \fIMMDF-II\fP によって既に用意されています。 詳しくは、maildelivery(5) を参照して下さい。 .Uh "maildelivery ファイル" \fI\&.maildelivery\fR ファイルは、どの様にローカル配送を行なうかを制御します。 このファイルの各行は、空白かコンマで区切られた五つのフィールドで成り立って います。 ダブル・クォートが尊重されますので、 これらの文字列は、ダブル・クォートで囲まれることで、 一つの引数としてみなされます。 ダブル・クォート自体は、その前にバックスラッシュをつけて含めることができます。 `#' で始まる行は無視されます。 \fI\&.maildelivery\fR ファイルの各行のフォーマットは次の通りです。 \fBheader pattern action result string\fR .sp .in +.5i .ti -.5i \fBheader\fP: .br パターンを検索するヘッダ名。 メッセージ・ヘッダにありうる全てのフィールド。 次の特別なフィールドも定義されています。 .sp .in +1i .ta +1i .ti -1i \fIsource\fR 送り主情報(MTA のエンベロープから取得。もしくは Sendmail であれば UUCP From から) .ti -1i \fIaddr\fR 送信先情報(MTA のエンベロープから取得) .ti -1i \fIdefault\fR メッセージがどれにも配送されなかった場合のみマッチ .ti -1i \fI*\fR 全てにマッチ .in -1i .ti -.5i \fBpattern\fR: .br 特定のヘッダー行にマッチする文字列の並び。 マッチングには大文字/小文字は関係ありませんが、正規表現は使えません。 .ti -.5i \fBaction\fR: .br メッセージ配送のために行なうアクション .sp .in +1i .ta +1i .ti -1i \fIdestroy\fR 読まずに捨てます。このアクションは常に成功します。 .ti -1i \fIfile\fR もしくは > \fBstring\fR で指定されたファイルに追加します。 メッセージは、メッセージ配送システム(MTS) に使われた メールドロップ形式でファイルに追加されます。 メッセージがファイルに追加することが出来れば、このアクションは成功します。 ファイルに書き込み中に、このメッセージがファイルに追加された日時を示す \*(lqDelivery\-Date:\ date\*(rq ヘッダが付け加えられます。 .ti -1i \fImbox\fR \fIfile\fR と同義です。しかし常に、\fIpackf\fR で使われる フォーマット (MMDF の mailbox フォーマット) でメッセージが追加されます。 .ti -1i \fIpipe\fR もしくは | メッセージを \fBstring\fR で指定されたコマンドへ、 標準入力でパイプします。この際、string を解釈するのに Bourne shell \fIsh\fR(1) を使います。 シェルに文字列を送る前に、次の内蔵変数に展開されます。 .sp .in +1i .ta +1i .ti -1i $(sender) 送り主情報(MTA のエンベロープ情報から。もしくは Sendmail であれば UUCP From から) .ti -1i $(address) 送信先情報(MTA のエンベロープから取得) .ti -1i $(size) メッセージのサイズ (バイト数) .ti -1i $(reply\-to) メッセージの \*(lqReply\-To:\*(rq か \*(lqFrom:\*(rq 行 .ti -1i $(info) サブプロセスに引き渡す任意の引数(\-info オプション参照) .in -1i .ti -1i \fIqpipe\fR or .ti -1i \fI\fR \fIpipe\fR に似ています。 が、内蔵変数展開後、シェルの助けを借りずに、コマンドを直接実行します。 このアクションは、シェルが解釈してしまうかも知れない、特定の文字列の クオート処理を避けるために用いられます。 .in -1i .ti -.5i \fBresult\fR: .br アクションがどの様に実行されるべきかを示します。 .in +1i .ta +1i .ti -1i \fIA\fR アクションを実行します。 アクションが成功すれば、メッセージは配送されたと見なされます。 .ti -1i \fIR\fR アクションを実行します。 アクションの結果にも関わらず、 メッセージは配送されたと見なされません。 .ti -1i \fI?\fR メッセージが配送されていない時のみ、アクションを実行します。 アクションが成功すれば、メッセージは配送されたと見なされます。 .ti -1i \fIN\fR メッセージが配送されておらず、前のアクションが成功した時のみ、 アクションを実行します。 アクションが成功すれば、メッセージは配送されたと見なされます。 .sp .in -1i .in -.5i 要約すると、例として、 .sp .if t .in +.5i .nf .ta \w'default 'u +\w'mh-workersxx 'uC +\w'destroy 'uC +\w'result 'u #\fIfield\fR \fIpattern\fR \fIaction\fR \fIresult\fR \fIstring\fR # `#' で始まる行は無視され、空行として扱われます # # \*(lqTo:\*(rq 行に mmdf2 とあるものは、mmdf2.log にファイルされます \fITo mmdf2 file A mmdf2.log\fP # mmdf からのメッセージを err-message-archive というプログラムにパイプします \fIFrom mmdf pipe A /bin/err-message-archive\fP # \*(lqSender:\*(rq アドレスが \*(lqmh-workers\*(rq であるものは、 # まだファイルしてないなら、mh.log にファイルされます \fISender mh-workers file ? mh.log\fP # \*(lqTo:\*(rq unix なら、unix-news ファイルへ出力します \fITo Unix > A unix-news\fP .\" # アドレスが jpo=mmdf なら、mmdf-redist へパイプします .\" \fIaddr jpo=mmdf | A mmdf-redist\fP # アドレスが jpo=ack なら、受け取り通知を返送します \fIaddr jpo=ack \fP|\fI R \*(lq/bin/resend\0\-r\0$(reply-to)\*(rq\fP # steve からのは、全部 destroy (読まずに捨てる) \fIFrom steve destroy A \-\fP # これでもまだマッチしないものは、mailbox へ落します \fIdefault \- > ? mailbox\fP # rcvtty を常に走らせる \fI* \- \fP|\fI R /mh/lib/rcvtty\fP .re .fi .if t .in -.5i ファイルは常に全部読まれます。 よって複数マッチする可能性があり、マッチした分、アクションを実行します。 \fI\&.maildelivery\fR ファイルは、owner がユーザーかルートでなくてはならず、 書き込みは owner によってのみ可能でなくてはなりません。 \fI\&.maildelivery\fR ファイルが見つからない、もしくはメッセージを配送 するアクションを実行できない場合は、 @(MHETCPATH)/maildelivery ファイルを同様のルールに従って読まれます。 このファイルは、owner がルートで、ルートによってのみ書き込み可能でなくては なりません。 もしこのファイルがないとか、メッセージの配送するアクションが実行できない という場合は、ユーザーのメールドロップに標準配送されます。 .Uh "サブプロセスの環境" プロセスが呼ばれた場合、その環境は以下の通りです: ユーザー/グループIDは、受取人のIDにセットされます。 ワーキング・ディレクトリは、受取人のホーム・ディレクトリになります。 umask は 0077 です。 プロセスは /dev/tty を持ちません。 標準入力はメッセージにセットされます。 標準出力と診断出力は /dev/null にセットされます。 他の全てのファイル記述子はクローズされます。 環境変数 \fB$USER\fR、\fB$HOME\fR、\fB$SHELL\fR は適切にセットされ、 その他の環境変数はありません。 プロセスには、実行するためにある時間を与えられます。 もしプロセスがこの制限以内に終了出来なかったら、 プロセスは終了されます。 この時間は、size をメッセージのバイト数として、 ((size × 60) + 300) 秒として計算されます。 プロセスの終了ステータスは、アクションが成功したかどうかに応じます。 終了ステータスがゼロであれば、アクションは成功したことを意味します。 これ以外の終了ステータス (もしくは異常終了) はアクションが失敗したことを 意味します。 時間制限を避けるために、 あなたは、\fIforking\fR によって開始するプロセスを実行しようと するかも知れません。 親プロセスはすぐに適切な値を返すだろうし、子プロセスは 必要とするだけ長く実行し続けることが出来ます。 このやり方は、親プロセスが終了ステータス 0 を返す時は、いくらか 危険です。 親プロセスが終了ステータス 非0 を返す時は、 このやり方で、メール・ドロップに素早く配送させることが出来ますが。 @BEGIN: MSGID .Uh "重複メッセージの削除" \fIslocal\fR は、重複メッセージを発見し削除することが可能です。 これを行なうには、$HOME ディレクトリに \&.maildelivery.pag と \&.maildelivery.dir という 二つの空のファイルを作ります。 これらは、入ってきたメッセージの Message-ID を貯めておくために 使われる ndbm ファイルです。 @END: MSGID .Fi ^@(MHETCPATH)/mtstailor~^テイラー・ファイル ^$HOME/\&.maildelivery~^ローカル配送を制御するファイル ^@(MHETCPATH)/maildelivery~^標準のファイルに代わる ^@(MHDROPLOC)~^デフォルトのメールドロップ .Sa rcvstore(1), mhook(1), mh\-format(5) @BEGIN: MMDFIIMTS , maildelivery(5) @END: MMDFIIMTS .De `\-noverbose' .Ds `\-maildelivery \&.maildelivery' .Ds `\-mailbox @(MHDROPLOC)' .Ds `\-file' デフォルトは標準入力 .Ds `\-user' デフォルトは現在のユーザー .Co 無し。 .Hi @BEGIN: MHMTS 古いバージョンの \fIMH\fR との互換性により、 \fIslocal\fR がユーザーの \fI\&.maildelivery\fR ファイルを見つけられ なかった場合、ユーザーの $HOME ディレクトリで、古い形の rcvmail の 実行を試みます。 まず最初に .ti +.5i \&.mh\(rureceive file maildrop directory user の実行を試み、失敗したら、 あきらめてユーザーのメールドロップへ書き込む前に、 .ti +.5i $HOME/bin/rcvmail user file sender の実行を試みます。 加えて、 フックかプロセスが起動された時はいつでも、 標準入力に加えて、ファイル記述子 3 がメッセージにセットされます。 @END: MHMTS \fIslocal\fP は、\fIMMDF-II\fP で提供されている \fImaildelivery\fP 機構と 逆互換性があるように設計されています。 だから、\fIslocal\fP の機能性であるように、 \fI\&.maildelivery\fP ファイルの文法が制限されています。 0 終了ステータスに加えて、\fIMMDF\fR は \fIRP_MOK\fR (32) と \fIRP_OK\fR (9) という値を取ります。 これは、メッセージが完全に配送された、という意味です。 異常終了も含むそれ以外の非 0 終了ステータスでは、 \fIMMDF\fR は \fIRP_MECH\fR (200) として解釈します。 これは、別のルートを使った、という意味です (メールドロップにメッセージを配送します)。 .Bu たった二つのリターンコードだけが意味があります。他もそうあるべきです。 \fIslocal\fP は、\fBMMDF-II\fP により提供された \fImaildelivery\fP の 機能性と逆互換性があります。 \fImaildelivery\fR 機構のある \fIMMDF\fR のバージョンは、 \fIMMDF\fP の初期のバージョンと全く互換性がありません。 \fIMMDF-I\fP という古い形式のフックを持つ場合は、 \fI\&.maildelivery\fR file として、次の一行だけ書いたものを 用意するのが望ましいです。 .ti +.5i default \- pipe A \*(lqbin/rcvmail $(address) $(info) $(sender)\*(rq .En