Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ mhook(n) — NEWS-os 3.3

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

rcvstore(1)

 

名称

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 ...] ­[−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):多方面の外部の情報

 
プロセスが起動されると、その環境は user/group id:s が 受信者の id:s にセットされます。 作業ディレクトリは受信者のディレクトリです。 umask は 0077 です。プロセスは /dev/tty を持ちません。 標準入力はメッセージにセットされます。 標準出力と診断出力は /dev/null に出力されます。 その他のファイルディスクリプタはクローズされます。 環境変数 $USER、$HOME、$SHELL は適切にセットされ、 これら以外の環境変数はありません。
 
プロセスには実行するのに十分な時間が与えられます。 もしプロセスがこの制限時間内に終了できない場合には、 プロセスは最終的な強制手段(extreme prejudice)で終了します。 与えられる時間は ((size × 60) + 300) 秒として計算されます。 この式において、size はメッセージのバイト数です。
 
プロセスの終了ステータスは、動作が成功したかどうかを 判断するときに参照されます。 終了ステータスが 0 の場合は動作が成功したことを示し、 その他の状態ならば失敗したことを示します。
 
時間の制約を避けるためには、forking で開始するプロセスを 実行しなければなりません。親プロセスは適切な値を即座に返し、 子プロセスはそのまま実行を続けます。 これによって、好きなことを好きな時間だけできます。 この方法は、親プロセスが 0 の終了ステータスを返す時には、 若干の危険を伴うことがあります。 親プロセスが 0 以外の終了ステータスを返すときには、 この方法によって、より速く自分のメールドロップに配信できます。
 

qpipe または <caret>:
pipe と同様ですが、組み込み変数を拡張したのち、 シェルの支援なしに、直接コマンドを実行します。
 

destroy:
この動作は常にうまくいきます。

 

result:
動作がどのように実行されているかを表示します。
 

A:
動作を実行します。動作がうまくいけば、メッセージは配信されたと考えられます。
 

R:
動作を実行します。動作の結果が示され なければ、メッセージは配信されなかったと考えられます。
 

?:
メッセージが配信されなかった場合にのみ行動を 実行します。ここで行動が成功すれば、メッセージ が配信されたと考えられます。

 
ファイルは常に完全に読み込まれます。 そのために、いくつかのマッチを作ることが可能で、 いくつかの動作をとることができます。 .maildelivery ファイルはユーザかルートのどちらかに所有され、 その所有者のみが書き込み可能でなければなりません。 .maildelivery ファイルが見つからなかったり、 メッセージを配信する動作が実行されなかったときには、 /usr/new/lib/mh/maildelivery ファイルが同じ規則に従って読み込まれます。 このファイルは、ルートに所有され、 ルートにのみ書き込み可能でなければなりません。 このファイルが見つからなかったり、 メッセージを配信する動作が実行されない場合には、 ユーザのメールドロップ(/usr/spool/mail/$USER)に 標準的な配信が行なわれます。
 
.maildelivery ファイル中の引数は、 空白またはコンマで区切られます。 ダブルクォートが有効なので、 これらの文字は、ひと続きの引数をダブルクォートで囲んでおけば、 単一の引数にすることができます。 ダブルクォートは、バックスラッシュを前置きすることによって 引数に含めることができます。
 
総括して、ここに例をあげてます。
 

#fieldpatternactionresultstring
# lines starting with a ’#’ are ignored, as are blank lines
#
# file mail with mmdf2 in the “To:” line into file mmdf2.log
Tommdf2fileAmmdf2.log
# Messages from mmdf pipe to the program err-message-archive
FrommmdfpipeAerr-message-archive
# Anything with the “Sender:” address “uk-mmdf-workers”
# file in mmdf2.log if not filed already
Senderuk-mmdf-workersfile?mmdf2.log
# “To:” unix − put in file unix-news
ToUnix>Aunix-news
# if the address is jpo=mmdf − pipe into mmdf-redist
addrjpo=mmdf|Ammdf-redist
# if the address is jpo=ack − send an acknowledgement copy back
addrjpo=ack|R“resend −r $(reply-to)”
# anything from steve − destroy!
FromstevedestroyA−
# anything not matched yet − put into mailbox
default−>?mailbox
# always run rcvalert
∗−|Rrcvalert

 
4つのプログラムが現在のところ、有用でしょう。 rcvdist(受信したメッセージをさらに別の受信者に再配布する)、 rcvpack(受信したメッセージを packfd ファイルにセーブする)、 そして、rcvtty(受信したメッセージのユーザを通知する)です。 4番目のプログラムである rcvstore(1) は別に述べます。 これらはすべて /usr/new/lib/mh/ ディレクトリに帰属します。
 
rcvdist プログラムは、メッセージのコピーを、 そのコマンド行にあげられているすべてのアドレスに再送信します。 rcvdist は、mh−format(5) に 記述されているフォーマット文字列を使用します。
 
rcvpack プログラムは、メッセージのコピーを、 そのコマンド行にあげられているすべてのファイルに付け加えます。 .maildelivery のおかげで、 このプログラムを使用することは旧式になってしまいました。
 
rcvtty プログラムは、メッセージを標準入力とし、 指定されたファイルを実行します。 そして、その出力結果は、ユーザのターミナルに表示するよう、 ターミナルアクセスデーモンに送られます。 もし、ターミナルアクセスデーモンを ユーザのシステムで使うことができない場合、 “world−writable” パーミッションがあれば、 rcvtty は出力をユーザのターミナルに書き込みます。 ファイルが指定されていなかったり、間違っていたりすると、 rcvtty プログラムはターミナルアクセスデーモンに 一行スキャンリストを送ります。

関連ファイル

/usr/new/lib/mh/mtstailorテーラーファイル
$HOME/.maildeliveryローカル配達管理ファイル。
/usr/new/lib/mh/maildelivery標準ファイルの代わりに用いられる

関連事項

rcvstore(1)

コンテクスト

なし

歴史

MH の古いバージョンとの互換性について言えば、 slocal がユーザの .maildelivery ファイルを見つけられない場合、 ユーザの $HOME ディレクトリにある旧形式の rcvmail フックの実行を試みます。 特に、最初に
 

.mh_receive file maildrop directory user
 
の実行を試み、それがだめなら、
 

$HOME/bin/rcvmail user file sender
 
を実行してみて、ユーザのメールドロップに書き込みます。
 
さらに付け加えると、フックもしくはプロセスが起動されると、 ファイルディスクリプタ3(3) が メッセージを標準入力に加えてセットします。
 

バグ

2つのリターンコードだけが意味を持ちます。 それ以外も意味を持つべきでしょう。

NEWS-OSRelease 3.3

Typewritten Software • bear@typewritten.org • Edmonds, WA 98026