view conf/doc/ja-slocal.rf @ 7:c20e4181370f

utf-8 input assumption in case of base64/utf-8
author kono
date Sun, 04 Dec 2005 02:30:39 +0900
parents bce86c4163a3
children
line wrap: on
line source

.\"	@(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<caret>\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