ネットワークな生活を日々過ごしていると、
仕事関連のメールだけでなく、色々なところから様々なメールが
雨嵐のように降ってくる (苦笑) ようになる (ことが多い^^;;)。
…すると、読む時間もままならなくなったりすることもあって、
届いたメールを開かずにそのままメールスプールディレクトリに残し置いたまま
になる…ということになってしまう。
そうなると、
このディレクトリのあるハードディスクのパーティションが
比較的小さく割り当てられているマシンも多いので、
気がつくとそのパーティションを溢れさせてしまい、自分だけでなく、
同じマシン上のユーザさんにも迷惑をかけてしまう…という危険性もない訳ではない。
また、新規メール到着を知らせる xpbiff や、
~/.cshrc で「set mail=(60 メールスプールファイル名)」などと
一定時間ごとに新規メールをチェックするような設定をしている場合は、
「届いたぞ」「ほらまた届いたぞ」とぴっぴぴっぴ五月蝿いことだろう。
しかも、ようやく溜ったメールを全て inc 出来ても、
+inbox メールフォルダに 色々なところからのメールが何通も何十通も、
下手すると何百通も放り込まれ、そのメールの整理に何時間も費やす羽目になることも
ある。
そこで、『来たメールを自分のメールフォルダに自動的に分類して放り込む』 設定が出来るのである。それが、slocal コマンドである。
しかしこの slocal コマンドについての説明は、man が用意されている (MH-6.7 では man mhook、MH-6.8 では man slocal(1))程度で、 あまり詳しい参考資料もなく、 またちょっと書き間違えると、メールが「迷子」になったり、 下手すると「ロスト」したりしてしまう、危険なコマンドでもある。
そこで slocal を設定するにあたって 何らかの役には立つと思うので、 man だけでなく、ソースを読んだり実際に設定してみて確かめたりした 経験を、失敗談や現在の設定とを合わせてここに紹介する。
slocal を用いるには、
○ ~/.forward ファイルの書き換え
~/.forward ファイルは、 個人用のメール受付をカスタマイズできるものであり、 一般的には「そのアドレスに届いたメールを別のところに転送する、その アドレス」を指定するファイルである。 これにパイプ「|」を利用した記述を行なうと shでコマンドを作動させることも可能なのである (参照: vacation コマンド。man vacation(1))
slocal は通常 MH の Lib path にあり、
"| /usr/local/lib/mh/slocal -user ユーザ名(=自分のアカウント名)"と設定すれば良い。 これにより届いたメールは、~/.forward で オプション「-user hayashi」付きで起動した /usr/local/lib/mh/slocal の 標準入力に受け渡されることになる。 但し、~/.forward ファイルは 勿論 ~/.maildelivery の設定後に変更すること!!
○ ~/.maildelivery ファイルの設定
このファイルは slocal の動作を制御する設定ファイルであり、
その到着したメールをどう処理するかを決定する。
例えば、
~/.maildelivery ファイルの各行は、
# from postmaster From postmaster | A "/usr/local/lib/mh/rcvstore +Pm" To postmaster | A "/usr/local/lib/mh/rcvstore +Pm"
# for Maling List X-Ml-Name 98ml | A "/usr/local/lib/mh/rcvstore +98"これも上記と同様であり、「X-Ml-Name: 98ml」というヘッダを持つメールは 「98」というフォルダに放り込むことを指定している。
# Personal From hal | ? "/usr/local/lib/mh/rcvstore +Hal"ここも基本的に同様。「hal」さんから来る個人メールは、From: ヘッダに 「hal」の文字列が含まれているとして、これをキーワードにして検索をしている。
# default default - | ? "/usr/local/lib/mh/rcvstore +inbox"設定に最低限必要なのは、最後のこの1行だけである。 "default" …全てにマッチする、が、action が "?" 指定なので、 「配送済"でないもの"」について、rcvstore +inbox するのである。 つまりここまでの条件判別のどれもにマッチしていない残り全てのメールは、 「inbox」フォルダに放り込む、という設定である。
以上、この ~/.maildelivery ファイルを色々設定して、 上手に slocal を利用すれば、 送られてきたメールに対して様々な action をすることが可能である。
例で説明した以外にも、
○ ~/.maildelivery ファイルのテスト
前述した様に、この ~/.maildelivery ファイルに誤った記述をして しまうと、メールがロストしてしまう可能性も多い。 テストの間は、
% cat メールファイル | $MHLIB/slocal -verbose -debug -user $USERとしてテストする。verbose オプションをつけることでより詳細な情報が帰って来る
"|/bin/sh -c 'exec >> /tmp/out 2>&1; $MHLIB/slocal -user $USER -verbose -debug'"とし、オプションに対するログを /tmp/out に落すように設定する
To hogehoge | R "set -xv; exec >/tmp/out 2>&1; $MHLIB/rcvstore +hogehoge"とし、 rcvstore に食わせる際のログを落してみる
また、slocal を使用しはじめてからしばらくの間は、誤動作等ないかの確認のために ~/.forwardを
\hayashi, "| /usr/local/lib/mh/slocal -user hayashi"の様に MH (slocal) に喰わすだけでなく、 通常配送も行なうようにしておくとよい であろう。
○ 余談
「~/.forward で プログラム(slocal) にメールを喰わせている」ということは、 sendmail.cf 中のローカル配送指定の Mlocal 行 (通常 /bin/mail) で なくて、Mprog の行 (通常 /bin/sh) が使用されているのである。
以上で slocal が使えるようになった。
届けられたメールは自動的に分類され、
自分の home directory のメールフォルダに放り込まれる。
これで、/var/spool/mail 等の個人メールスプールファイルは、常に 0 のまま
となるので、
そのディレクトリの容量を気にしなくてもよいのだが、
今度は自分のディレクトリが "知らぬ間に" 増えていくので、
常に充分気をつけておく必要が当然ある。
さて、自動的に届けられたのはいいものの、どうやって「メールが届いた」ことを 知ることが出来るだろうか?
それは、前述の ~/.mh_profile に設定した 「Unseen-Sequence: unseen」がここで効いてくるのである。 これを設定すると、各フォルダの .mh_sequences に、
unseen: 1-6というように "未開封" のメールを記録してくれる。 従って、これを grep してやればよい。
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- um.sh
#!/bin/csh -f # # um.sh -- scaning Unseen Mails. # Original: by Haruhisa Hayashi=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-# Modified: by Katsumi Ohta # onintr brk # public setting set fname_pth=`mhpath +` set fname_dir=`folders -fast` set fname_seq=.mh_sequences set seq_name=`grep Unseen-Sequence: $HOME/.mh_profile | sed -e 's/^.*: //'` # set mhform_inbox="unseen2.form" set mhform_other="unseen1.form" @ unseen_num = 0 foreach folder ($fname_dir) grep $seq_name $fname_pth/$folder/$fname_seq >& /dev/null if ($status == 0) then echo "<< Unseen Mail >> in +"$folder if ($folder == "inbox") then set mhform = $mhform_inbox else set mhform = $mhform_other endif scan +$folder $seq_name -form $mhform | tee -a /tmp/scan.$$ endif end if (-f /tmp/scan.$$) set unseen_num = `wc -l < /tmp/scan.$$` switch ($unseen_num) case 0: echo " You've already seen all of your mail." breaksw case 1: echo " You have only one unseen mail." breaksw default: echo " You have $unseen_num unseen mails." breaksw endsw brk: rm -f /tmp/scan.$$ exit 0;
この um.sh は、私が書き殴った(笑)ものを、 友人が汎用に書き直してくれたシェルプログラムである (→ um.sh を get )。 未開封メールが、どのフォルダに何通あるか表示してくれる。
但し、この様に汎用性を持たせると、どうしても実行速度が遅くなるので、 最初から"判っている"場合や、"このフォルダだけを調べたい"などという場合には、 例えば、
# private setting set fname_pth=/home/hayashi/Mail set fname_dir=( inbox 98ml Hal Postmaster ) set seq_name=unseenなどと、直接これらの環境変数に与えておくとよい。
尚、その後これは更に別の友人の手によって perl スクリプトに書き直された。 この方が少し速い (→ um.pl を get )。
考え方は、上述の um.sh と同様に、
これによって、届けられたメールは自動的に分配され、 必要な時にどんなメールが届いているのかを知ることが出来るようになる。 勿論、~/.maildelivery に色々と仕掛け、C-Shell, Perl, Tcl/tk 等のシェルや X のクライアントプログラムを作成し組み合わせることで、 届いた時点で「届いたぞ」と PopUp して通告するなどのシステムも 不可能ではない。 色々と挑戦して貰いたい。
ちなみに「slocal のファイルロック周りは "甘い" ので、
一度に大量のメールが来ると、メールがロストすることもある」
と言われている。
但し残念(?)乍ら、
1日100通程度届くことも多い私個人としては、
今までに一度も経験したことはない。
ちゃんと mail のログ (smtp connection) を tail -f で常時見てるので、
気がつかずにロストしている…ということはない筈。
私的には、MH のコンパイル時に指定する LOCK 関数と、
OS自体の flock/lockf 周りの問題じゃないかと思っているが…。
あと、メールが届く度に Unseen-Sequences を更新するので、 そのメールフォルダの .mh_sequence が勝手に:-)変更される。 これが未読メールを丁度読んでいたりすると、変にぶつかったりすることも 稀にないわけではないので注意。