[ トップページ / メモ書きリスト ]

Mew 3.3 でスパム処理と未読メールの管理


  1. 概要
  2. 設定ファイル
  3. 以降の解説に関する注意
  4. procmail による配送設定 (最低限編)
  5. fetchmail によるメール受信
  6. Mew から fetchmailを利用する
  7. procmail による配送設定 (自動振り分け編)
  8. procmail による配送設定 (未読メール管理編)
  9. mh-biff による未読管理
  10. procmail による配送設定 (本気でスパム対策編)

概要

Mew のバージョン 3.3 で 未読メール管理を行おうと試みた.

そもそもはスパム処理が念頭にあり, 「スパムを別のディレクトリに 入れちゃうのは良いけど, そうするととりあえず誤爆を防ぐための チェックがひどく面倒になりそう…」ってことで未読メール管理が 欲しくなった次第である.

しかし, そもそも Mew では未読と既読の区別をつけようという ポリシーが無いらしく (バージョン 4 からはとりあえず未読マークは 付くようになったらしいが), これはかなり奇特な試みのようである.

(「未読メール管理をしたいのならだったらさっさと別のメーラに 乗り換えりゃ良いじゃん」というのは実にまっとうな意見であるが, 私自身が Emacs や Mew に強く依存してしまっているため, それもなかなかいかんともしがたいのである).

なお, これから紹介する手引きでは Emacs や Mew 以外にも以下のツールを 用いた.

設定ファイル

(ほぼ自分の備忘録の為であるが) 関係する設定ファイルの一覧を記しておく. なお ~ はホームディレクトリをあらわす.

~/.mew.el
Mew の設定ファイル. Mew を使って fetchmail による受信や mh-biff による未読管理を行うので, それに応じた編集が必要である.
~/.procmailrc
procmail による配送制御のための設定ファイルである. これによってスパム処理や機械出力のメールを振り分ける.
~/.fetchmailrc
fetchmail の受信の制御を行う.
~/.mh_profile
MH に関するコマンド ( rcvstore, scan msgchk など) の設定ファイルである.
~/.mh_format
scan で得られる情報の書式設定.

以降の解説に関する注意

以降では Mew で未読メール管理とスパム対策をすべく, その手引き (…というか実は単なる作業のログなのだが) を述べてあるが, 作業が多岐に渡るため, 個々に関しては十分な 解説ができないと思われる. 各節に「参考資料」を用意してあるので 詳しいことはそちらで調べていただけると幸いである.

procmail による配送設定 (最低限編)

procmail とは, メール転送システムの1つで, (いろいろ奥は深いと思うが), とりあえずここではメールのヘッダや本文を見て, 配送先を変更する ために用いる.

シンプルな配送

まず, ローカルホストに ~/.procmailrc を用意する. Mew を使っていることを想定し, 単純に ~/Mail/inbox 以下にメールを配送するのであれば以下のように しておくと良いだろう. hogehoge の部分は自分のメールアドレス に変更して欲しい.

SHELL=/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
ADDRESS=hogehoge@server.domain
LOGFILE=$HOME/.procmail/`date +%Y%m`.log
VERBOSE=off
LOCKFILE=$HOME/.procmail/.lockfile

MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/.

:0 f
|formail -z

これで, (これだけでは何の意味も無いが) 単純に DEFAULT にメールが 配送される ./procmailrc が出来た. (メールの格納形式は 記述の書法によって変化する. 上記は Mew で用いられる MH 形式 だが, Mailbox 形式や他の方法も可能である. <URL:http://www.jaist.ac.jp/~fjt/procmail.html> などを 参照せよ).

procmail のログの出力

なお, ログを出力させるのであれば, 以下のように LOGFILE で 設定したディレクトリを作成しておくこと. 作成しておかない場合は ログは出力されない. 以降のメール送受信のチェックのためにも, 作成しておくことを進める.

mkdir ~/.procmail

procmail の今後 (1)

もちろんスパム処理など行うには, より設定が必要だが, まずは簡単な設定で fetchmail などの配送設定する. 以降の procmail の設定は procmail による配送設定 (自動振り分け編) を参照せよ.

参考資料

fetchmail によるメール受信

fetchmail とは POP, IMAP などの機能を持つサーバからメールを取得する ユーティリティで, 取得だけでなく転送も可能である. 例えば, pop を 用いてリモートのサーバからメールを取得し, それをローカルの .qmail に転送することなどができる.

ここでは, fetchmail で pop サーバからメールを取得し, それを procmail に渡すことでメールを振り分けようとしている.

~/.fetchmailrc の設定

以下が例である.

poll mail.server.domain
  protocol apop
  user hogehoge
  #fetchall                                  # Remove mails on server
  keep                                       # Keep mails on server
  mda "/usr/bin/procmail -m $HOME/.procmailrc" # MDA Setting

簡単に解説すると, 以下のようになる. なお, # 以降 から改行までがコメントになる.

poll
サーバ名
protocol (または proto)
通信の際のプロトコルである. POP3, IMAP, APOP などが可能である.
user
ユーザ名である.
fetchall
サーバのメールを既読・未読関わらず全て受信し, サーバ側の メールを削除する. (上記では安全のためコメントアウトしてある)
keep
サーバ側のメールを削除しない. 上記では有効になっているが, 自身のポリシーに応じて変更して欲しい.
mda
Mail Delivery Agent の略である. 上記では, 先に設定した procmail による送信を行っている.

また, パーミッションは以下のようにしないと有効にならないので注意.

$ chmod 600 ~/.fetchmailrc

送受信のチェック

送受信のチェックを行う. ローカルで以下のようにコマンドする.

$ fetchmail

すると, 以下のようなメッセージが出るので, APOP などの パスワードを入力する.

morikawa@...jp にログインするためのパスワードを入力して下さい :

パスワードが正しければ, メールが受信されるはずである. 上記の設定がうまくいっていれば, メールが procmail を介し, ~/Mail/inbox に送られているはずである. 確認して欲しい. もしも送られていない場合, まずは procmail のログの出力 で作成したディレクトリ内のログを確認し, procmail を介して メールが配送されているかチェックすること.

以降は ssh による暗号化通信の方法なので, 興味が無ければ Mew から fetchmailを利用する へ直行せよ.

ssh を利用した暗号化通信

(ここは必須の作業ではないので注意して欲しい). 通信の安全性を高めるため, ssh による通信を望む場合には, ssh を介してのメール受信も可能である. その場合は ~/.fetchmailrc の先ほどの設定をに以下のように変更せよ.

poll mail.server.domain
  via localhost
  port 12345
  protocol apop
  user hogehoge
  #fetchall         # Remove mails on server
  keep            # Keep mails on server
  mda "/usr/bin/procmail -m $HOME/.procmailrc" # MDA Setting
  preconnect 'ssh -f -P -C -L 12345:mail.server.domain:110 -l morikawa mail.server.domain sleep 15 </dev/null >/dev/null 2>&1'

この設定で fetchmail を起動すると, ssh の Port Forwarding 機能を 用いて一度ローカルホストの 12345 ポートと mail.server.domain の 110 ポートをつなぎ, その上でローカルホストの 12345 ポートに apop アクセスしてメール取得を行う. (…正しいかな?)

利用の際に異なるのは, 先ほどの apop パスワードの後に, さらに ssh アクセスのための認証パスワードを入力する必要が ある点である.

ssh-agent を利用したノンパスワード通信

ssh によるアクセスは安全だが, 毎回 ssh パスワードを入力する作業が 面倒なのも事実である.

(もちろん apop パスワードも面倒であるが, それは以降の Mew から fetchmailを利用する で解決するので ここでは目をつぶる. なお, 上記の ~/.fetchmailrc に記述するという まっとうな(?)方法もあってそれが一番簡単ではあるが, 生のパスワード が直接ファイルに書かれることになるのでちょっと気味が悪い).

そこで, ssh-agent を用いる方法がある. ここでは説明を割愛するが, それに関しては <URL:ssh-agent.txt> を参照して欲しい.

参考資料

Mew から fetchmailを利用する

fetchmail によるメール受信 でメールが受信できることを 確認できたら, 次は fetchmail を Mew から直接利用するための 設定をおこなう.

fetchmail.el の取得

ときのぺーじEmacs のページ に置いてある, fetchmail.el を戴いてくる.

fetchmail_jp.el の作成

上記の fetchmail.el を少々改造する. 改造する点は以下の通り.

パッチは こちら に置いてあるので, これを先ほどの fetchmail.el と同じディレクトリに 置き, 以下のコマンドを実行する.

$ patch <fetchmail_jp.diff

これで fetchmail.el に変更がなされた. 名前も以下のように変えておくこと.

$ mv fetchmail.el fetchmail_jp.el

fetchmail_jp.el を効果的に利用するための .mew.el の設定

~/.mew.el に以下の記述を追加する. なお, ここでは 先の fechmail_jp.el を ~/.site-lisp/fetchmail_jp というディレクトリ 以下に置いていると想定している. 場所に応じて load-path の設定は 変更して欲しい. (既にパスが通っているところならば load-path の 設定は不要である)

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;== fetchmail を mew から利用する設定
;;   * http://www.freedom.ne.jp/toki/emacs_f.html
;;
;; fetchmail を実行するには必ず ~/.fetchmailrc が必要なので注意.
;; fetchmailrc の書式に関しては fetchmailrc(1) を参照せよ.
;;
(setq load-path
      (cons
       (expand-file-name "~/.site-lisp/fetchmail_jp") load-path))

(when (locate-library "fetchmail_jp")
  (require 'fetchmail_jp)

  (autoload 'fetchmail_jp "fetchmail_jp" nil t)
  (setq fetchmail-server-param-alist '())
  (setq fetchmail-default-server "mail.server.domain")
;  (setq fetchmail-window nil) ; fetchmail ウィンドウを表示しない.
  (setq fetchmail-notify-beep nil) ; beep 音を切る

;; パスワードの入力を初回一回で済ませる場合はコメントアウト
;(setq fetchmail-server-omit-passwd-list '("mail.server.domain"))

;;=== メール取得の挙動を mew オリジナルと似せる.
;;
;; mew での「i」(mew-summary-retrieve) と同様に, 「i」で +inbox に移動し,
;; メールを取得後に +inbox を Scan しなおすための設定

  (define-key mew-summary-mode-map "i" 'fetchmail_jp)
  (define-key mew-summary-mode-map "m" 'fetchmail-howmany-mails-message)
  (setq fetchmail-preprocess-hook 'mew-summary-go-inbox)
  (setq fetchmail-postprocess-hook 'mew-summary-mh-biff-check)

  (defun mew-summary-go-inbox()
    (interactive)
    (mew-summary-visit-folder "+inbox" t t)
    (delete-other-windows)
;    (mew-summary-visit-folder "+inbox" t t)
;    (delete-other-windows)
    )

;; メールを取得し終えたら fetchmail のウィンドウは閉じる
  (defun mew-summary-mh-biff-check()
    (interactive)
    (mew-summary-visit-folder "+inbox")
    (fetchmail-close-window))

;; メールの取得後, メッセージの数を表示する.
  (add-hook 'mew-scan-sentinel-hook
            'fetchmail-howmany-mails-message)

;;=== fetchmail プロセスを手動で kill する
;;
;; Ctrl-c k で fetchmail プロセスを kill する
;;
  (define-key mew-summary-mode-map "\C-ck" 'mew-summary-delete-fetchmail-process)
  (defun mew-summary-delete-fetchmail-process()
    (interactive)
    (delete-process fetchmail-process-name)
    )

;;=== fetchmail バッファと行き来する設定
;;
;; Ctrl-c f で fetchmail バッファと行き来する.
;;
  (define-key mew-summary-mode-map "\C-cf" 'mew-summary-goto-fetchmail-buff)
  (define-key fetchmail-mode-map "\C-cf" 'fetchmail-close-window)

  (defun mew-summary-goto-fetchmail-buff()
    (interactive)
    (switch-to-buffer fetchmail-buffer-name)
    )

) ; end fetchmail

この設定で, Mew オリジナルの受信操作「i」で fetchmail による 受信が可能である. パスワードも始めの一回聞かれるが, そこに 正しいパスワードを入力すると以降は Emacs を終了するまで 聞かれなくなる.

なお fetchmail の受信操作を途中で接続するには「Ctrl-c k」, fetchmail から得られるメッセージが表示されるバッファとは「Ctrl-c f」 で行き来できるようになる.

ちなみに, 最終的にはmh-biff.el を効果的に利用するための .mew.el の設定 の部分で上記の mew-summary-check-inbox だけは少々編集する.

参考資料

procmail による配送設定 (自動振り分け編)

Mew からの fetchmail を用いたメールの受信が確認できたら, 今度は procmail による自動振り分けを行ってみる. まだこの段階では未読情報を把握できないので, 簡単なテストのみ行う.

Mail/test の作成

Mew で test フォルダを作成する. ここにテストメールが 振り分けられる予定である.

テスト振り分け配送

~/.procmailrc を以下のように編集する.

SHELL=/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
ADDRESS=hogehoge@server.domain
LOGFILE=$HOME/.procmail/`date +%Y%m`.log
VERBOSE=off
LOCKFILE=$HOME/.procmail/.lockfile

MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/.

:0 f
|formail -z

#テスト用
:0 f
* ^Subject: test
$MAILDIR/test/.

サブジェクトが test であるものを Mail/test に送る設定である.

テストメールを送る

Mew で Subject を test として配送後, fetchmail で受信する. test メールが Mail/test に受信されていれば OK である. もしもダメな場合はログなどをチェックして確認して欲しい.

procmail による配送設定 (未読メール管理編)

次に, mh-biff による未読管理を可能にするため, rcvstore を 用いてメールを格納する.

rcvstore を用いた配送

rcvstore は MH に付随するツールである. そのため標準のパスには 無いかもしれない. 自身でインストールした場合は /usr/local/mh/lib/rcvstore にあるかもしれない. Debian GNU/Linux ならば mh パッケージを インストールすると /usr/lib/mh/rcvstore にあるはずである. 以下ではこの場合を想定して例を挙げる.

未読マーク設定のための .mh_profile の編集

MH のツールの設定ファイルに ~/.mh_profile がある. ここでは未読マークとメールディレクトリの設定をするため, ~/.mh_profile に以下のように記述する

Path: Mail
Unseen-Sequence: unseen

.procmailrc での rcvstore 配送の方法

次に .procmailrc の配送処理の設定を変更する. 先の設定を以下のように変更せよ.

SHELL=/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
ADDRESS=hogehoge@server.domain
LOGFILE=$HOME/.procmail/`date +%Y%m`.log
VERBOSE=off
LOCKFILE=$HOME/.procmail/.lockfile
RCVSTORE=/usr/lib/mh/rcvstore
RCVDEFAULT=+inbox

MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/.

:0 f:
|formail -z

#テスト用
:0: $LOCKFILE
* ^Subject: test
| $RCVSTORE +test

#最終的に inbox へ
:0 w: $LOCKFILE
| $RCVSTORE $RCVDEFAULT

これにより, rcvstore による配送が可能になった. しかし, 基本的に メールの形式は元々 MH 形式だったので, メール本体に変更は無い. その代わり, 新規に届けられたメールに関してはそのフォルダの .mh_sequences に "unseen" というフラグが立つようになっている. これによってそのメールが未読かどうかを判別するのである.

なお, :0: $LOCKFILE など, :0 の末尾に 「: $LOCKFILE」をつけるように なったことに注意して欲しい. この末尾のコロンとファイル名は, ロックファイルを 用いるための指定である. 経験上, rcvstore を用いた配送の場合には ロックファイルを用いないと配送途中のメールがロストしてしまう危険がある *1. なお, コマンドを用いずにメールをフォルダに格納する場合, :0: のようにするだけでデフォルトの $LOCKFILE が 指定されるが, rcvstore など外部コマンドを呼ぶ場合には :0: $LOCKFILE のように明示的にロックファイルを指定する 必要があるらしい.

参考資料

mh-biff による未読管理

未読のフラグを立てることが可能になったので, そのフラグを 認識, 管理する mh-biff を導入する.

mh-biff.el の取得

mh-biff の使い方 から mh-biff.tar.gz を取得する.

取得したら展開して lisp のパスが通ったところに置く. 以下では, パスの通っていない ~/.site-lisp/mh-biff/ 以下に置くので, mew.el の load-path に設定を書き加える.

$ tar xvfz mh-biff-0.97.tar.gz
$ mv mh-biff-0.97 ~/.site-lisp/mh-biff

日本語表示のための .mh_profile の編集

未読マーク設定のための .mh_profile の編集 で設定した ~/.mh_profile を再度編集する. 文字コードを Mew 内の標準 コードにするため, 以下のようにする.

Path: Mail
Display-Coding: ja_JP.EUC
Unseen-Sequence: unseen

なぜか, Unscreen よりも Coding が下の行にあると scan の際にエラーが出力されるので注意. (原因不明)

scan のフォーマット指定ファイル .mh_format の編集

mh-biff では MH 付属の scan というコマンドで未読メールをチェックして 表示する. 例えば, 以下のコマンドを入力すると Mail/inbox 以下の リストが表示されるであろう.

$ /usr/bin/mh/scan +inbox

その際の表示形式を ~/.mh_format で設定する. ただし, この ~/.mh_format はそのままでは読まれないので, 以下のように -form オプションを用いる必要がある.

$ /usr/bin/mh/scan +inbox -form ~/.mh_format

時刻やそのタイムゾーンを表示する場合には以下のように ~/.mh_format に記述する.

%4(msg)%<(cur)+%| %>%<{replied}-%?{encrypted}E%| %> \
%02(mon{date})/%02(mday{date}) \
%02(hour{date}):%02(min{date})(%3(tzone{date}))\
%<{date} %|*%>\
%<(mymbox{from})%<{to}To:%14(hdecode(friendly{to}))%>%>\
%<(zero)%17(hdecode(friendly{from}))%>  \
%(hdecode{subject})%<{body}  ||  %{body}%>

~/mh_format の書式や scan に関しては mh-format(4) や scan(1) を 参照せよ. ./mew3.3_unseen_mail_arrange 以下の mh-format_4.html や scan_1.html も参考になるかもしれない.

なお, 上記の hdecode という関数は簡単に説明すると iso-2022-jp の文字列を上記の ~/.mh_profile で指定された コーディングに変換するものである. Subject や From は iso-2022-jp に変換されることが多いため, このような 変換が必要となる.

ただ, hdecode は, MH に日本語パッチをあてたものの関数なので, 英語のマニュアルには記載されていない可能性が高い.

MH 自体は現状で配布されているものは おそらく日本語パッチはあたっているだろう. 少なくとも Debian GNU/Linux の mh パッケージは hdecode が有効である. hdecode 等に関しては <URL:http://media.laic.u-hyogo.ac.jp/~hayashi/internet/mh-plus/3.02/mhjp-features.html> などを参照のこと.

mh-biff.el を効果的に利用するための .mew.el の設定

~/.mew.el に以下の記述を加える. 上述したように, mh-biff.el は ~/.site-lisp/mh-biff 以下に置いたとする. 他にも環境に依存する部分があるので, mh-biff の使い方 や mh-biff.el 本体を読んで設定する.

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;== mh-biff の設定

;;=== 基本設定
(setq load-path
      (cons
       (expand-file-name "~/.site-lisp/mh-biff") load-path))

(autoload 'mh-biff-scan "mh-biff" "MH biff" t)
(autoload 'mh-biff      "mh-biff" "MH biff" t)

(setq mh-biff-bin-path "/usr/bin/mh")
(setq mh-biff-lib-path "/usr/lib/mh")

;;==== メールを読んだ際の更新
;;
;; .mh_profile の unseen を消すのと, モードラインの更新を行う.
(add-hook 'mew-message-hook
          '(lambda ()
             (and fld msg (not (boundp 'program))
                  (progn
                    (mh-biff-delete-unseen-sequence fld msg)
                    (mh-biff-mode-line-filter t)
                    ))))

;;==== メールを消す際の更新
;; メールを見ないで「d」する場合にも, .mh_profile の unseen を消し,
;; モードラインの更新を行う.
(define-key mew-summary-mode-map "d" 'mew-summary-delete-and-unscreen)
(defun mew-summary-delete-and-unscreen()
  (interactive)
;  (mew-summary-scroll-up)
;  (mew-summary-toggle-disp-msg)
  (mew-summary-delete-one)
  (setq fld (mew-summary-folder-name))
  (setq msg (mew-summary-message-number))
  (and fld msg (not (boundp 'program))
       (progn
         (mh-biff-delete-unseen-sequence fld msg)
         (mh-biff-mode-line-filter t))))

;;==== 常にモードラインを更新するための設定
;;
;; Summary モードに入るときにモードラインを更新.
(add-hook 'mew-summary-mode-hook
          '(lambda () (mh-biff-mode-line-filter t)))
;; Summary モードの `v' の実行が終了する際にモードラインを更新.
(add-hook 'mew-summary-toggle-disp-msg-hook
          '(lambda () (mh-biff-mode-line-filter t)))
;; Summary モードの `s' が終了する際にモードラインを更新.
(add-hook 'mew-scan-sentinel-hook
          '(lambda () (mh-biff-mode-line-filter t)))
;; Summary モードの `s' がフォルダの一覧を取らなかった場合にモードラインを更新.
(add-hook 'mew-summary-ls-no-scan-hook
          '(lambda () (mh-biff-mode-line-filter t)))
;; Summary モードの `x' の実行が終了する際にモードラインを更新.
(add-hook 'mew-summary-exec-hook
          '(lambda () (mh-biff-mode-line-filter t)))

;;=== オプショナル設定
;(setq mh-biff-folders-list '("inbox" "test"))
;(setq mh-biff-message "All \\n Mail. \\f")
(setq mh-biff-folder-message "[\\o \\m]")
;(setq mh-biff-display-time-flag t)
(setq mh-biff-interactive-delete-unseen-flag nil)
(setq mh-biff-scan-formfile "~/.mh_format")
;(setq mh-biff-folder-name-aliases '(("+inbox" . "+I")
;                                    ("+test" . "+T")
;                                    ))
(setq mh-biff-interval-time 10)
;(setq mh-biff-frame-size '((top . 20)
;                          (left . 20)
;                          (width . 80)
;                          (height . 20)))
(setq mh-biff-auto-scan-flag nil)
;(setq mh-biff-first-frame-up-flag t)

;; フレームを利用しない場合
;(setq mh-biff-frame-up-flag nil)

;;=== mh-biff-scan を \C-cs で起動するようセット
;;
(define-key mew-summary-mode-map "\C-cs" 'mh-biff-scan)

;;=== mh-biff 起動 (初期化)
;;
;;各値の設定はこの前で行う必要がある.
;;
(mh-biff)

;;=== 一定時間でのメール監視を行わなくする設定
;;
;;(mh-biff) よりも後で設定する必要がある.
;;
(sleep-for 3)   ; これがないとメモリを無限大にくって崩壊するようだ….
                ; たぶん mh-biff が起動しきるまで待つために必要なのだろう
(delete-process mh-biff-timer-process)

;;=== mh-biff-quit の動作を自分好みに変更
;;
(defun mh-biff-quit ()
  "オリジナルの mh-biff-quit を置き換え. フレームの場合は
   フレームを削除し, ウィンドウの場合は自身のウィンドウを閉じるよう変更."
  (interactive)
  (let ((buffer (get-buffer-create mh-biff-scan-buffer-name))
        (frame (mh-biff-frame-alive-p)))
    (if (one-window-p)
        (progn
          (bury-buffer buffer)
          (replace-buffer-in-windows buffer))
      (delete-window))
    (if mh-biff-window-config
        (set-window-configuration mh-biff-window-config))
    (and frame
         (progn
           (set-window-buffer
            (frame-selected-window frame) mh-biff-scan-buffer-name)
           (delete-frame frame)))
    (mh-biff-mode-line-filter t)
    (run-hooks 'mh-biff-quit-hook)))

さらに, fetchmail_jp.el を効果的に利用するための .mew.el の設定 で設定した関数 mew-summary-check-inbox を以下のように変更する.

;; メールを取得し終えたら fetchmail のウィンドウは閉じる
  (defun mew-summary-mh-biff-check()
    (interactive)
    (mew-summary-visit-folder "+inbox")
    (mh-biff-mode-line-filter t)
    (fetchmail-close-window))

これにより, mh-biff は以下のように動作するようになる. (非常に個人的な趣味が入っているが).

参考資料

procmail による配送設定 (本気でスパム対策編)

未読メールの管理は完了したので, ちょっと気合を入れてスパム対策を 行う. 他にも, システムからのメールは流して良いので直接 inbox 以外のフォルダに放り込む.

SHELL=/bin/bash
PATH=/bin:/usr/bin:/usr/local/bin
ADDRESS=hogehoge@server.domain
LOGFILE=$HOME/.procmail/`date +%Y%m`.log
VERBOSE=off
LOCKFILE=$HOME/.procmail/.lockfile
RCVSTORE=/usr/lib/mh/rcvstore
RCVDEFAULT=+inbox

MAILDIR=$HOME/Mail
DEFAULT=$MAILDIR/inbox/.

:0 f
|formail -z

##################################################
#== SPAM 対策用
#
#=== iso-2022-jp のデコード
#
# サブジェクトがエンコードされていたらデコードして制御文字等を削除
# エンコードされていない場合にも備える
#
# from http://www.jaist.ac.jp/~fjt/procmail.html
:0
* ^Subject:\/.*
{
    :0
    * ^Subject:.*iso-2022-jp
    DECODED_SUBJECT=|echo "$MATCH"|nkf -meZ1|sed 's/[[:space:]]//g'
    :0 E
    DECODED_SUBJECT=|echo "$MATCH"|nkf -eZ1|sed 's/[[:space:]]//g'
}

#=== jp ドメイン以外からの HTML メールは撃墜
:0 HBf
* ! ^From: .*\.jp
* \<html\>
|formail -A "X-Spam: html"

#=== 特定の ML は日本語以外は受け付けない
#:0 f
#* ^TO_hoge-ml
#* ! ^From: .*\.jp
#* ! ^Content-Type: .*iso-2022-jp
#|formail -A "X-Spam: Japanese text only"

#=== Subject が [SPAM で始まるものは撃墜
# 環境によってヘッダに SPAM がつきやすい人は除外
:0 f
* $DECODED_SUBJECT ?? ^\[SPAM
* ! ^From: .*herohero.*
|formail -A "X-Spam: spam subject"

#=== 逆引きできないホストを中継してきたメールは撃墜
:0 f
* ^Received: .*\(unknown \[
|formail -A "X-Spam: from unknown host"

#=== エンドユーザからのメールは撃墜
# 下位ドメインに記号で区切られた数字を含む
:0 f
* ^Received: from .*\(.*[0-9][^0-9\.][0-9].*\.[^\.]+\.[a-z].*\[
|formail -A "X-Spam: from EndUser [Type 1]"

#=== 数字が5個以上並ぶ
:0 f
* ^Received: from .*\(.*[0-9][0-9][0-9][0-9][0-9].*\[
|formail -A "X-Spam: from EndUser [Type 2]"

#=== 下位ドメインに数字(IP アドレス)を含む
:0 f
* ^Received: from .*\(.*\.[0-9][^\.].*\.[^\.]+\.[^\.]+\.[a-z].*\[
|formail -A "X-Spam: from EndUser [Type 3]"

#=== Spam は spam 行き
#:0
#* ^X-Spam
##$MAILDIR/spam/.

#=== Spam は spam 行き (rcvstore による格納)
:0: $LOCKFILE
* ^X-Spam
| $RCVSTORE +spam


##################################################
#== システムメールの自動振り分け
#
#=== epwww
:0: $LOCKFILE
* ^From: .*root@server.domain.*
| $RCVSTORE +from/epwww

#=== メーラーだえもんさん
:0: $LOCKFILE
* ^From: .*MAILER-DAEMON@grey.server.domain.*
* ^To: (epmail-member@grey.server.domain|anonymous@server.domain|root@server.domain|postmaster@server.domain)
| $RCVSTORE +from/mailer-daemon

:0: $LOCKFILE
* ^To: .*MAILER-DAEMON@grey.server.domain.*
| $RCVSTORE +from/mailer-daemon

#=== epnews
:0: $LOCKFILE
* ^From: .*news@mail.server.domain.*
| $RCVSTORE +from/epnews


#最終的に inbox へ
:0 w: $LOCKFILE
| $RCVSTORE $RCVDEFAULT

なお, これはあくまでも procmail を利用した一例である. 以下の参考資料に 様々な「レシピ」があるので, 参考にして欲しい.

procmail は大抵ヘッダを見て判定するが, 他にもベイジアンフィルタである bsfilter / bayesian spam filter / ベイジアン スパム フィルタ を併用する事も可能である. 同ページの サンプルレシピ を参照してもらいたい.

なお, bsfilter と自分で作成した個別判定条件を併用してみた レシピを procmail レシピ で紹介している.

参考資料


*1 想像であるが, おそらくメモリバッファの sync 問題であろうと思われる. ロックファイルを用いない場合にはメモリバッファをディスクに sync する前にプロセスが終わってしまい. そのままメモリも開放されて ディスクに保存されないのだと思われる. ロックファイルを使用すると, 自然にメモリバッファをディスクに sync するため, その際にメールも ディスクへと sync されるのではなかろーか.


Last Updated: 2005/07/04, Since: 2005/06/06 mailto: morikawa_email