		     procmail reader for Wanderlust

	procmail の出力ログを参照して，Wanderlust でメールを読む

			     Prom-WL 1.1.1

						Time-stamp: "2000-10-04"

[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 を行うようにする。

 -- 1.1.1 以降 --

 proc-folder-regexp (nil)

      procmail のログファイルを解析する際のフォルダ正規表現を指定する。
      必ず1つの "\\(" "\\)" を含む必要があり，かっこで囲まれた部分に
    `prom-wl-folder-prefix-alist' で指定したプレフィックスをつけた文字列
    がWanderlustのフォルダ名となる。

 prom-wl-set-promrc-log-func ('prom-wl-set-promrc-log)

      標準の関数 `prom-wl-set-promrc-log' や変数 `proc-folder-regexp' だ
    けでは対応できないログを解析するための関数を指定する。

[問題点]

  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.2.34

  Wanderlust 1.1.2, 2.3.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

[取り扱い]

  このプログラムを使用して生じたいかなる結果に対しても作者はいっさいの責
任を負わないものとします。しかし，コメントやバグなどがあれば以下のアドレ
スまでご連絡下さい。

						muse@ba2.so-net.ne.jp

Local Variables:
mode: text
fill-column: 72
time-stamp-format: "%:y-%02m-%02d"
End:
