procmail reader for Wanderlust procmail の出力ログを参照して,Wanderlust でメールを読む Prom-WL 2.7.0 Time-stamp: "2001-09-08" [Prom-WL とは?] procmail を使っていると,届いたメールを自動的に指定したフォルダーに振 り分けてくれるのは便利(*1)なのですが,いざ,そのメールを読もうとすると多 少手間がかかります。 具体的には procmail が出力したログから,どのフォルダーに格納されたのか を見て,フォルダーに移動,そしてメールの内容を見る,という手順が必要にな ります。 そこで,これらの手順を簡単にするために作成したのが Prom です(*1)。そし て Prom-WL は Wanderlust に対応させたものです(*2)。 (*1) これまでに,MH-e に対応した Prom (未公開), Mew に対応した Prom-Mew があります。 (*2) もっとも,Wanderlust には指定したフォルダの未読をチェックす る機能があるため,Prom-WL などは必要なくてもよいです。 Prom-WL を使うことによる利点はチェック時間が短くなるだけで す。 [インストール] prom-wl.el を load-path 上のどこかにおけばいいだけです。さらに byte-compile をしておくとよいです。 [準備] まず,準備として ~/.emacs などに (autoload 'prom-wl "prom-wl" "Prom for Wanderlust" t) (setq proc-log-list (list "~/Mail/from-log" "~/Mail/from-ML")) ;; procmail が出力するログファイル(複数指定可) ;; ~/.procmail の LOGFILE で指定したもの。 (setq proc-keep-log "~/Mail/listlog") ;; ログの保存用ファイル (setq proc-lock-file "~/Mail/.lock") ;; ロックファイル(下記参照) ;; ~/.procmail の LOCKFILE で指定したもの。 と書いておきます。procmail のログを保存しないなら, (setq proc-keep-log nil) と設定して下さい。メールを調べ終るとすぐに削除します。 また,重要な設定として ~/.procmailrc に LOCKFILE=/home/hogehoge/Mail/.lock とグローバルロックファイル名を指定しておきます。このロックファイル名を変 数 `proc-lock-file' に指定します。proc-lock-file のデフォルトは "~/Mail/.lock" ですが,とにかく procmailrc でのロックファイル名と proc-lock-file で指定したロックファイル名を同じにして下さい。 この記述がないと,メールを見落とす事があるかも知れませんので,是非設定 して下さい。 ちなみに,procmail のログは以下の形式のものに対応しています。Subject はなくてもかまいません。 --[begin]--------------------------------------------------------------- From muse@ba2.so-net.or.jp Wed Feb 10 09:00:12 1999 Subject: test Folder: /home/murata/Mail/inbox/2 3412 From owner-FreeBSD-users-jp@jp.freebsd.org Wed Feb 10 09:44:22 1999 Subject: [FreeBSD-users-jp 38571] Re: Message from syslogd. syslog.conf. Folder: ml/freebsd-users-jp/14936 4022 From wl-admin@lists.airs.net Wed Feb 10 11:21:43 1999 Subject: Re: [wish] expire Folder: ml/wl/1065 5510 From wl-admin@lists.airs.net Wed Feb 10 11:43:38 1999 Subject: Re: [wish] expire Folder: ml/wl/1066 3578 --[end]----------------------------------------------------------------- 通常は,~/.procmailrc に --[begin]--------------------------------------------------------------- MAILDIR=/home/murata/Mail ... :0 inbox/. --[end]----------------------------------------------------------------- などのように記述することで,inbox フォルダーにメールが格納されます。また, --[begin]--------------------------------------------------------------- :0 $MAILDIR/inbox/. --[end]----------------------------------------------------------------- のように絶対パスで指定しても構いません。さらに Prom-WL では, --[begin]--------------------------------------------------------------- :0 /tmp/inbox/. --[end]----------------------------------------------------------------- のように MAILDIR 以下ではないパスを記述した場合でもかまいません。 Wanderlust ではこのようなパスも扱えるからです。 もし,この形式以外のログに対応させたい場合は,変数 `prom-get-new-mail-optional-method' に独自に書いた関数を定義します。詳し くは各種の設定の項目をご覧下さい。 [使用方法] メールが届いたら, M-x prom-wl を実行します。新着メールのあるフォルダのみ check されますので,後は普通 に Wanderlust を使用すればよいです。 メールを読んでいる時に新たなメールが届いた時は,Wanderlust を再起動す る(`M-x wl'でもよい)か, 再び M-x prom-wl を実行します。 [各種の設定] 以下にユーザが変更できる変数を示します。この他にも変更可能な変数はあり ますが,それは御自身でハックして下さい(笑)。また,カッコ内はデフォルト値 です。 proc-log-list (nil) procmail が出力するログのリスト。~/.procmailrc で LOGFILE で指定し てある名前。複数記述する事ができる。また,'%' をつけると WL のフォル ダ定義に従い imap server からログを読み込む。ただし,local file 上に あるログには '+' をつけてはならず,絶対パスで指定する。また,local file と imap ファイルは混在してもかまわない。 例: (setq proc-log-list '("~/Mail/from-log" "%Mail/ml-log")) proc-keep-log (nil) procmail が出力するログを読み込んだ後,そのログを保管しておくファ イル。nilならログを保管しない。ローカル上のファイルのみ指定できる。 例: (setq proc-keep-log "~/Mail/listlog") proc-lock-file ("~/Mail/.lock") procmailrc で指定されているグローバルロックファイル名。必ず, ~/.procmailrc で指定されている LOCKFILE と同じ名前にする。 prom-use-lockfile (t) メール調査時にロックを行う時,non-nil なら procmail のソースパッケー ジに付属していた lockfile プログラムを使用する。lockfile 以外のプロ グラムを指定する場合は,`prom-prog-lockfile' を変更する。従来は ln プログラムによるロック処理を行っていたが,既にロックされていた場合は ユーザが再度メールを調べるコマンドを実行しないといけなかった。しかし, lockfile プログラムではロックが解除されるまで待ち状態になり,何度も コマンドを実行しなくても済む。 nil にするか non-nil にするかはお好みに応じて設定して下さい。 lockfile プログラムがなければ nil にするか,`prom-prog-lockfile', `prom-prog-lockfile-arg-list' を設定します。 prom-prog-lockfile ("lockfile") prom-use-lockfile を non-nil にした場合,のロックを行うプログラム 名。 prom-prog-lockfile-arg-list ('("-2" "-r4" "-l10")) prom-use-lockfile を non-nil にした場合,上記 lockfile プログラム に与える引数のリスト。これらの引数の最後に `proc-lock-file' の値が追 加される。 prom-lock-at-exist-log (t) non-nil なら,proc-log-list に指定したログファイルが存在していると きのみ,lock するようになる。nil ならログファイルがなくても prom-wl を起動した時に常にロックを行う。 prom-wl-lock-optional-method (t) prom-get-new-mail-optional-method を設定している場合,non-nil なら その関数を実行している間でも proc-lock-file ファイルによるロックを行 う。 prom-wl-get-new-mail-optional-method (nil) 新たなメールがあるか調べる時(prom-wl-get-new-mail)に,procmail の ログを調査する他に,調べる関数を指定する。例えば,MH の folder にあ る未読メールを調べたい場合は,下記例のように設定する。 例: (setq prom-wl-get-new-mail-optional-method 'prom-wl-check-list-folders) もちろん,ユーザが任意に作った関数を指定してもよく,自分の環境に合 わせて未読メールを調べる事が出来るようになった。また, prom-wl-get-new-mail で指定したプレフィックスアーギュメントをその関 数に渡すようになっているので,それを利用して動作を変える事も出来る。 以上のように任意の関数を指定する場合には,prom-wl-get-proc-log に相 当する関数を指定する。 prom-wl-check-folders (nil) procmail 以外の手段で取得した(ログにない)新規メールを調べるフォル ダを指定する。フォルダのリストを設定する。 prom-wl-keep-log-max-size (nil) proc-keep-log を指定した場合,そのログの最大サイズを指定する。最大 サイズを越えると,前のログを proc-keep-log に ".bak" をつけてファイ ルに移動する。 prom-wl-auto-select-folder (nil) prom-wl でフォルダをチェックした後に新規メールがあれば,即,未読が ある最初のフォルダに移動する。 prom-wl-get-proc-log-hook (nil) procmail のログを処理した後に実行する hook 変数。新着メール (procmail のログ)が存在する場合にのみ呼ばれる。また,このhookが呼ば れる時はロックされている状態である。それに対して, prom-get-new-mail-hook はメールが存在しなくてもメールを調べる際に毎 回呼ばれ,ロックされていない。 prom-wl-folder-prefix-alist ('((imap4 . "%#mh/") (nil . "+"))) ログ内のフォルダの前につける prefix を指定します。たとえばログが "Folder: inbox/6" となっていた場合,'+' をつけて "+inbox" にして WL のフォルダとみなします。ここではこのときの '+' を prefix とします。 現在 proc-log-list には localfile と imap4の2つの種類が指定できます が,それぞれの種類のログに対して別々に prefix が設定できます。 imap4 : imap4 server 上のファイル(デフォルトは "%#mh/") nil : ローカルホスト上のファイル(デフォルトは "+") ローカルホスト上にあるものは 'localdir ではないので注意下 さい。 なお,procmail の代わりに独自のプログラムを用いるなどして, "Folder: =fj/mail/reader/6" のように先頭に [%-+=] がついている場合は prom-wl-folder-prefix-alist を無視して何もつけません。 "=fj/mail/reader" をそのまま WL のフォルダとして扱います。 prom-wl-imap4-read-log-func ('prom-wl-imap4-read-log-by-rename) imap経由でprocmailのログを読み込む場合,その関数を指定します。指定 できる関数には次の2つがあり,特徴は次の通りとなっています。 prom-wl-imap4-read-log * メッセージに flags をつけて,procmail との排他処理を行う。 * ログの内容を削除した後も,ログのサイズが 0 にならない(imap が つけたメッセージが残る)。 * imap4コマンドの実行回数は,ログがある時 4回,ない時 1回。 prom-wl-imap4-read-log-by-rename * ログを rename して procmail との排他処理を行う。 * ログは完全に消去される。 * imap4コマンドの実行回数は,ログがある時 6回,ない時 2回。 もし,biff などでログのサイズをチェックしている場合は, prom-wl-imap4-read-log-by-rename を指定する必要があります。 prom-wl-ignore-not-found-entity (nil) 値が nil の場合,ログを解析後にフォルダが WL 上に存在しない場合, メッセージを表示して確認を求める。non-nil の場合はフォルダが存在しな くても無視する。 prom-wl-lock-localdir-msgdb-create (nil) localdir の msgdb database を作成する場合,procmail とのタイミング によっては msgdb 内の From や Subject などが nil になってしまうこと がある。これを避けるため,この値が non-nil なら localdir の msgdb を 作成するときに lock を行うようにする。 [問題点] imap4 には対応させていますが,UW IMAP4rev1 (v11.237) 版でのみ動作確認 をしています。Cyrus版の imapd では動作しないかもしれません。 また,procmail との排他(ロック)処理も十分なテストが行われておらず,不 具合があるかもしれません。つまり,新着メールがあるのにそのフォルダをチェッ クしない可能性もあるため,定期的に全フォルダ(または全imapフォルダ)をチェッ クすることをお勧めします。 その他の問題として,imap 経由で procmail のログを取得すると,先頭の "From " 行が取得できません(メッセージの Envelope From とみなされるため)。 しかし,Wanderlust でのチェックには全く必要のない情報ですので,ログ解析 前にダミーの "From ????" をつけています。そのため,proc-keep-log で指定 したログには "From ????" が保存されてしまいますが,これはバグではありま せん。 [開発環境] Mule 2.3 (based on 19.28, 19.34) Emacs 20.7 XEmacs 21.4.4 Wanderlust 2.7.0 上記以外の環境では動作確認はしていません。 Prom-WL のバージョンはその時に動作確認を行った Wanderlust のバージョン 番号に合わせていますので,Wanderlust はできれば Prom-WL のバージョン番号 に近いものを使用して下さい。Wanderlust のバージョンが Prom-WL のバージョ ン番号よりも新しい場合は動作する可能性が高いです。なお,最新版の Wanderlust は以下のWebページより入手できます。 http://www.gohome.org/wl/ [最新版の情報] Prom-WL の最新版は下記の場所で入手できるかも知れません。ただし,突然下 記の場所にアクセスできなくなったり,別の場所に移動したりするかも知れませ ん。あらかじめご了承下さい。 http://www02.so-net.ne.jp/~murata/ http://www02.so-net.ne.jp/~murata/software/prom-wl.html [取り扱い] COPYING を参照下さい。 Local Variables: mode: text fill-column: 72 time-stamp-format: "%y-%02m-%02d" End: