SLOCAL(1)

NAME
slocal - 特別なローカルメール配送

SYNOPSIS
/usr/pkg/libexec/mh/slocal [address info sender]
[-addr address] [-info data] [-sender sender]
[-user username] [-mailbox mbox] [-file file]
[-maildelivery deliveryfile] [-verbose] [-noverbose] [-debug] [-help]

DESCRIPTION
slocal は、選択基準の複雑な設定に応じて、届いたメールを処理するように 設計されたプログラムです。 通常、slocal は手動で起動するのではなく、 システムのメッセージ配送エージェント(MTA) が 代わって slocal を起動します。 slocal で使われるメッセージ選択基準は、ユーザーのホームディレクトリ にある .maildelivery ファイルに書かれます。 このファイルのフォーマットは以下にあります。 メッセージ配送アドレスとメッセージ送り主は、可能であれば メッセージ配送エージェント(MTA) のエンベロープ情報によって決定されます。 SendMail を使用している場合、もしあれば、送り主は UUCP “From ” 行から取得されます。 コマンド・ライン引数もしくは `-addr' と `-sender' オプションの 引数で、これらの値を置き換えるが出来ます。 メッセージは通常、標準入力から読み込まれます。 標準入力から読み込む代わりに、`-file' オプションで、 メッセージが読み込まれるべきファイル名を指定することが出来ます。 `-user' オプションは、メールを配送するユーザー名を slocal に 教えるものです。 `-mailbox' オプションは、ユーザーのメールドロップファイル名を slocal に教えるものです。 `-info' オプションは、あなたに代わって slocal が呼び出した サブプロセスに、任意の引数を渡すのに使われます。 `-verbose' オプションをつけると、 slocal は実行中の動作を標準出力に出します。 `-debug' オプションをつけると、 より詳細なデバッグ出力を標準エラー出力(stderr)に出します。 もし、使用している MTA が SendMail であるなら、

    “| /usr/pkg/libexec/mh/slocal -user username”

という行を、ホームディレクトリの .forward ファイルに含んでいればよいです。 これにより、SendMail が代わりに slocal を起動してくれます。 もし使用している MTA が MMDF-I であれば、 ホームディレクトリに、/usr/pkg/libexec/mh/slocal を bin/rcvmail として (シンボリック) リンクしておけばよいです。 これにより、正しい “address info sender” 引数で、 MMDF-I が代わりに slocal を起動します。 もし使用している MTA が MMDF-II である場合、 slocal は使えません。 同等の機能が MMDF-II によって既に用意されています。 詳しくは、maildelivery(5) を参照して下さい。 .maildelivery ファイルは、どの様にローカル配送を行なうかを制御します。 このファイルの各行は、空白かコンマで区切られた五つのフィールドで成り立って います。 ダブル・クォートが尊重されますので、 これらの文字列は、ダブル・クォートで囲まれることで、 一つの引数としてみなされます。 ダブル・クォート自体は、その前にバックスラッシュをつけて含めることができます。 `#' で始まる行は無視されます。 .maildelivery ファイルの各行のフォーマットは次の通りです。
    header    pattern    action    result    string

header:
パターンを検索するヘッダ名。 メッセージ・ヘッダにありうる全てのフィールド。 次の特別なフィールドも定義されています。

source    送り主情報(MTA のエンベロープから取得。もしくは Sendmail であれば UUCP From から)
addr    送信先情報(MTA のエンベロープから取得)
default    メッセージがどれにも配送されなかった場合のみマッチ
*    全てにマッチ
pattern:
特定のヘッダー行にマッチする文字列の並び。 マッチングには大文字/小文字は関係ありませんが、正規表現は使えません。
action:
メッセージ配送のために行なうアクション

destroy    読まずに捨てます。このアクションは常に成功します。
file もしくは >    string で指定されたファイルに追加します。
メッセージは、メッセージ配送システム(MTS) に使われた メールドロップ形式でファイルに追加されます。 メッセージがファイルに追加することが出来れば、このアクションは成功します。 ファイルに書き込み中に、このメッセージがファイルに追加された日時を示す “Delivery-Date: date” ヘッダが付け加えられます。
mbox    file と同義です。しかし常に、packf で使われる
フォーマット (MMDF の mailbox フォーマット) でメッセージが追加されます。
pipe もしくは |    メッセージを string で指定されたコマンドへ、
標準入力でパイプします。この際、string を解釈するのに Bourne shell sh(1) を使います。 シェルに文字列を送る前に、次の内蔵変数に展開されます。

$(sender)     送り主情報(MTA のエンベロープ情報から。もしくは Sendmail であれば UUCP From から)
$(address)    送信先情報(MTA のエンベロープから取得)
$(size)    メッセージのサイズ (バイト数)
$(reply-to)    メッセージの “Reply-To:” か “From:” 行
$(info)    サブプロセスに引き渡す任意の引数(-info オプション参照)
qpipe or
<caret>    pipe に似ています。
が、内蔵変数展開後、シェルの助けを借りずに、コマンドを直接実行します。 このアクションは、シェルが解釈してしまうかも知れない、特定の文字列の クオート処理を避けるために用いられます。
result:
アクションがどの様に実行されるべきかを示します。
A    アクションを実行します。
アクションが成功すれば、メッセージは配送されたと見なされます。
R    アクションを実行します。
アクションの結果にも関わらず、 メッセージは配送されたと見なされません。
?    メッセージが配送されていない時のみ、アクションを実行します。
アクションが成功すれば、メッセージは配送されたと見なされます。
N    メッセージが配送されておらず、前のアクションが成功した時のみ、
アクションを実行します。 アクションが成功すれば、メッセージは配送されたと見なされます。

要約すると、例として、

#field	pattern	action	result	string
# `#' で始まる行は無視され、空行として扱われます
#
# “To:” 行に mmdf2 とあるものは、mmdf2.log にファイルされます
To	mmdf2	file	A	mmdf2.log
# mmdf からのメッセージを err-message-archive というプログラムにパイプします
From	mmdf	pipe	A	/bin/err-message-archive
# “Sender:” アドレスが “mh-workers” であるものは、
# まだファイルしてないなら、mh.log にファイルされます
Sender	mh-workers	file	?	mh.log
# “To:” unix なら、unix-news ファイルへ出力します
To	Unix	>	A	unix-news
# アドレスが jpo=ack なら、受け取り通知を返送します
addr	jpo=ack	|	R	“/bin/resend -r $(reply-to)”
# steve からのは、全部 destroy (読まずに捨てる)
From	steve	destroy	A	-
# これでもまだマッチしないものは、mailbox へ落します
default	-	>	?	mailbox
# rcvtty を常に走らせる
*	-	|	R	/mh/lib/rcvtty
ファイルは常に全部読まれます。 よって複数マッチする可能性があり、マッチした分、アクションを実行します。 .maildelivery ファイルは、owner がユーザーかルートでなくてはならず、 書き込みは owner によってのみ可能でなくてはなりません。 .maildelivery ファイルが見つからない、もしくはメッセージを配送 するアクションを実行できない場合は、 /usr/pkg/libexec/mh/maildelivery ファイルを同様のルールに従って読まれます。 このファイルは、owner がルートで、ルートによってのみ書き込み可能でなくては なりません。 もしこのファイルがないとか、メッセージの配送するアクションが実行できない という場合は、ユーザーのメールドロップに標準配送されます。 プロセスが呼ばれた場合、その環境は以下の通りです: ユーザー/グループIDは、受取人のIDにセットされます。 ワーキング・ディレクトリは、受取人のホーム・ディレクトリになります。 umask は 0077 です。 プロセスは /dev/tty を持ちません。 標準入力はメッセージにセットされます。 標準出力と診断出力は /dev/null にセットされます。 他の全てのファイル記述子はクローズされます。 環境変数 $USER、$HOME、$SHELL は適切にセットされ、 その他の環境変数はありません。 プロセスには、実行するためにある時間を与えられます。 もしプロセスがこの制限以内に終了出来なかったら、 プロセスは終了されます。 この時間は、size をメッセージのバイト数として、 ((size × 60) + 300) 秒として計算されます。 プロセスの終了ステータスは、アクションが成功したかどうかに応じます。 終了ステータスがゼロであれば、アクションは成功したことを意味します。 これ以外の終了ステータス (もしくは異常終了) はアクションが失敗したことを 意味します。 時間制限を避けるために、 あなたは、forking によって開始するプロセスを実行しようと するかも知れません。 親プロセスはすぐに適切な値を返すだろうし、子プロセスは 必要とするだけ長く実行し続けることが出来ます。 このやり方は、親プロセスが終了ステータス 0 を返す時は、いくらか 危険です。 親プロセスが終了ステータス 非0 を返す時は、 このやり方で、メール・ドロップに素早く配送させることが出来ますが。 ^/usr/pkg/libexec/mh/mtstailor~^テイラー・ファイル ^$HOME/.maildelivery~^ローカル配送を制御するファイル ^/usr/pkg/libexec/mh/maildelivery~^標準のファイルに代わる ^/var/mail/$USER~^デフォルトのメールドロップ rcvstore(1), mhook(1), mh-format(5) `-noverbose' `-maildelivery .maildelivery' `-mailbox /var/mail/$USER' `-file' デフォルトは標準入力 `-user' デフォルトは現在のユーザー 無し。 slocal は、MMDF-II で提供されている maildelivery 機構と 逆互換性があるように設計されています。 だから、slocal の機能性であるように、 .maildelivery ファイルの文法が制限されています。 0 終了ステータスに加えて、MMDF は RP_MOK (32) と RP_OK (9) という値を取ります。 これは、メッセージが完全に配送された、という意味です。 異常終了も含むそれ以外の非 0 終了ステータスでは、 MMDF は RP_MECH (200) として解釈します。 これは、別のルートを使った、という意味です (メールドロップにメッセージを配送します)。 たった二つのリターンコードだけが意味があります。他もそうあるべきです。 slocal は、MMDF-II により提供された maildelivery の 機能性と逆互換性があります。 maildelivery 機構のある MMDF のバージョンは、 MMDF の初期のバージョンと全く互換性がありません。 MMDF-I という古い形式のフックを持つ場合は、 .maildelivery file として、次の一行だけ書いたものを 用意するのが望ましいです。
default - pipe A “bin/rcvmail $(address) $(info) $(sender)”