名称
mhook − MH のメール受信フック
形式
$HOME/.maildelivery
/usr/new/lib/mh/rcvdist [−form formfile] [switches for postproc] address ... [−help]
/usr/new/lib/mh/rcvpack file [−help]
/usr/new/lib/mh/rcvtty [command] [−form formatfile] [−format string] [−bell] [−nobell] [−newline] [−nonewline] [−biff] [−help]
解説
メール受信フックは、メールメッセージを受け取った時に、 必ず実行されるプログラムです。 ホームディレクトリ中の .forward ファイルに、
“| /usr/new/lib/mh/slocal −user $USER”
という行を入れておくと、ユーザ自身がフックを起動しなくても、 代わりに SendMail によって起動されます。
.maildelivery ファイルは普通の ASCII ファイルであり、 ローカルな配信をどのように行なうかを制御します。 このファイルは、 slocal によって読み込まれます。
.maildelivery ファイルの各行のフォーマットは、次の通りです。
field pattern action result string
ここで
field:
パターンを検索されるフィールドの名前です。 ここには、メッセージのヘッダ中に現れるフィールドがすべて指定できます。 さらに、次のような特別なフィールドも定義されています。
source:外部送信者の情報
addr :受信者に配信するために使用されるアドレス
default:メッセージがまだ配信されていない場合にの みマッチする
∗ :すべてにマッチする
pattern:
指定されたフィールドとマッチする文字のシーケンスです。 マッチングは大文字小文字の区別なく行われ、RE−based ではありません。
action:
メッセージを配信するアクションです。これは次にあげるもののいずれかです
file または >:
string で指定されるファイルにメッセージを追加します。 標準的なメールドロップ配信処理が行われます。 メッセージがファイルに追加されれば、このアクションは成功です。
ファイルへの書き込み時に、次のフィールドが新たに付け加えられます。
Delivery−Date: date
これはメッセージがファイルに加えられた日付と時刻を示します。
pipe または |:
メッセージを標準入力として、string で 指定されるコマンドにパイプします。 Bourne シェル sh(1) を文字列の解釈実行に使用します。 シェルに文字列を与えるに先立って、次にあげる組み込み変数が展開されます。
$(sender) :メッセージのリターンアドレス
$(address):受信者への配信に使用されるアドレス
$(size) :メッセージの大きさ(バイト数)
$(reply−to):メッセージの “Reply−To:” もしくは
“From:” フィールドのどちらか一方
$(info):さまざまな外部の情報
プロセスが起動されると、その環境は次のようになります。
ユーザ/グループ id は受信者の id にセットされます。 作業ディレクトリは受信者のディレクトリです。 umask は 0077 です。プロセスは /dev/tty を持ちません。 メッセージが標準入力になります。 標準出力と診断出力は /dev/null に出力されます。 その他のファイルディスクリプタはクローズされます。 環境変数 $USER、$HOME、$SHELL は適切にセットされます。 これら以外の環境変数はありません。
プロセスには実行するのに十分な時間が与えられます。 もしプロセスがこの制限時間内に終了できない場合には、 プロセスは強制的に終了させられます。 与えられる時間は ((size × 60) + 300) 秒として計算されます。 size はメッセージのバイト数です。
プロセスの終了ステータスは、そのアクションが成功したかどうかを 判断するときに参照されます。 終了ステータスが 0 の場合はアクションが成功したことを示し、 その他の状態ならば失敗したことを示します。
時間の制約を避けるためには、forking で開始するプロセスを 実行しなければなりません。親プロセスは適切な値を即座に返し、 子プロセスはそのまま実行を続けます。 これによって、好きなことを好きな時間だけ実行できます。 この方法は、親プロセスが 0 の終了ステータスを返す時には、 若干の危険を伴うことがあります。 親プロセスが 0 以外の終了ステータスを返すときには、 この方法によって、より速く自分のメールドロップに配信できます。
qpipe または <caret>:
pipe と同様ですが、組み込み変数を展開したのち、 シェルの支援なしに、直接コマンドを実行します。
destroy:
このアクションは常に成功します。
result:
アクションがどのように実行されるかを示します。
A:
アクションを実行します。アクションが成功すれば、メッセージは配信されたとみなされます。
R:
アクションを実行します。アクションの結果が示されなければ、 メッセージは配信されなかったと考えられます。
?:
メッセージが配信されていない場合にのみアクションを 実行します。ここでアクションが成功すれば、メッセージ が配信されたと考えられます。
N:
メッセージが配信されておらず、直前のアクションが成功している場合にのみ、 アクションを実行します。 アクションが成功すれば、メッセージが配信されたと考えられます。
ファイルは常に完全に読み込まれます。 そのために、複数のマッチングが可能であり、 いくつかのアクションをとることができます。 .maildelivery ファイルはユーザかルートのどちらかに所有され、 その所有者のみが書き込み可能でなければなりません。 .maildelivery ファイルが見つからなかったり、 メッセージを配信するアクションが実行されなかったときには、 /usr/new/lib/mh/maildelivery ファイルが同じ規則に従って読み込まれます。 このファイルは、ルートに所有され、 ルートのみが書き込み可能でなければなりません。 このファイルが見つからなかったり、 メッセージを配信するアクションが実行されない場合には、 ユーザのメールドロップ(/usr/spool/mail/$USER)に 標準の配信が行われます。
.maildelivery ファイル中の引数は、 空白またはコンマで区切られます。 ダブルクォートが有効なので、 これらの文字は、一続きの引数をダブルクォートで囲んでおけば、 単一の引数にすることができます。 ダブルクォートは、バックスラッシュを前置きすることによって 引数に含めることができます。
まとめとして、次に例を示します。
#fieldpatternactionresultstring
# ’#’ で始まる行は、空行と同じく無視されます。
#
# “To:” 行に mmdf2 のあるメイルを mmdf2.log に書き込みます。
Tommdf2fileAmmdf2.log
# mmdf からのメッセージをプログラム err-message-archive にパイプします。
FrommmdfpipeAerr-message-archive
# “Sender:” にアドレス “uk-mmdf-workers” があり、まだファイル
# されてないものを全て mmdf2.log に書き込みます。
Senderuk-mmdf-workersfile?mmdf2.log
# “To:” unix − unix-news に書き込みます。
ToUnix>Aunix-news
# アドレスが jpo=mmdf なら、mmdf-redist にパイプします。
addrjpo=mmdf|Ammdf-redist
# アドレスが jpo=ack なら、受領コピーを送り返します。
addrjpo=ack|R“resend −r $(reply-to)”
# steve からのメッセージは全て無視します。
FromstevedestroyA−
# まだマッチしていないものを mailbox に書き込みます。
default−>?mailbox
# 常に rcvalert を実行します。
∗−|Rrcvalert
現在のところ、4つのプログラムが利用できます。 rcvdist(受信したメッセージをさらに別の受信者に再配布する)、 rcvpack(受信したメッセージを packfd ファイルにセーブする)、 および rcvtty(受信したメッセージのユーザを通知する)です。 4番目のプログラムである rcvstore(1) については別に述べます。 これらはすべて /usr/new/lib/mh/ ディレクトリにあります。
rcvdist プログラムは、メッセージのコピーを、 そのコマンド行にあげられているすべてのアドレスに再送信します。 rcvdist は、mh−format(5) に 記述されているフォーマット文字列を使用します。
rcvpack プログラムは、メッセージのコピーを、 そのコマンド行にあげられているすべてのファイルに付け加えます。 .maildelivery のおかげで、 このプログラムを使用することは旧式になってしまいました。
rcvtty プログラムは、メッセージを標準入力とし、 指定されたファイルを実行します。 そして、その出力結果は、ユーザの端末に表示します。 ファイルを指定しない、あるいは指定が間違っていたりした場合、rcvtty は 代わりに1行スキャンリストを出力します。 ‘−form formatfile’ と ‘−format string’ オプションのどちらかを使って、 デフォルトの出力フォーマットを変更できます(mh−format (5) 参照)。 メッセージの出力の前にまず改行が出力されます。そして出力の終りには端末ベルが 鳴らされます。 ‘−nonewline’ および ‘−nobell’ オプションはこれらの機能を抑制します。 通常、rcvtty は mesg (1) の書き込み許可に従います。 ‘−biff’ オプションにより、rcvtty は biff (1) によって セットされる通知状態に従います。 端末アクセスデーモン (TTYD) がシステム上で利用できる場合、 rcvtty は出力をユーザの端末に書き出す代わりに、デーモンに渡します。
関連ファイル
^/usr/new/lib/mh/mtstailor~^テーラーファイル
^$HOME/.maildelivery~^ローカル配送管理ファイル
^/usr/new/lib/mh/maildelivery~^標準ファイルの代わりに用いられる
関連事項
コンテクスト
なし
歴史
MH の古いバージョンとの互換性のため、 slocal がユーザの .maildelivery ファイルを見つけられない場合、 ユーザの $HOME ディレクトリにある旧形式の rcvmail フックの実行を試みます。 特に、最初に
.mh_receive file maildrop directory user
の実行を試み、それがだめなら、ユーザのメイルドロップに書き込む前に
$HOME/bin/rcvmail user file sender
を実行してみます。
さらにフックもしくはプロセスの起動時に、 標準入力に加えてファイルディスクリプタ 3 (3) にもメッセージが 割り当てられます。
バグ
2つのリターンコードだけが意味を持ちます。 それ以外も意味を持つべきでしょう。
NEWS-OSRelease 4.1C