2005-08-29 (月)
■ bsfilter の使用感 [fetchmail][procmail]
elisp だけで実装したスパムフィルタ mew-spam-stat.el でスパム除去し
ていたが、スパム判定洩れが多くなってきたので、評判が良い bsfilter
を使ってみることにする。
【環境】
OS: RedHat Linux 7.2
メール受信: fetchmail + procmail
フィルタ: bsfilter
fetchmail で外部の POP サーバーからメールを収集し、procmail でロー
カルマシンに配送。その際、bsfilter を使って SPAM メールを指定ディレ
クトリに移動してしまおう、というのがねらい。
まず、fetchmail、procmail、bsfilter をインストールする。
bsfilter は、http://bsfilter.org/ から入手できる。
[bsfilter のインストール]
上記 bsfilter のサイトから入手した bsfilter-X.Y.Z.tgz 内の
bsfilter/bsfilter を、/usr/local/bin などにコピーするだけ。
[bsfilter の育て方]
最初、bsfilter は、どれが SPAM で、どれがクリーンなファイルなのか分
からないので、教えてあげないといけない。具体的には以下のようにする。
% find $HOME/Mail/inbox -type f ! -name ".mew-*" | xargs bsfilter --add-clean % find $HOME/Mail/spam -type f ! -name ".mew-*" | xargs bsfilter --add-spam % bsfilter --update
もちろんこれに先だって、$HOME/Mail/inbox の中の SPAM メールを
$HOME/Mail/spam ディレクトリに移しておく。
[fetchmail の設定]
$HOME/.fetchmailrc に、たとえば以下のように記述。
poll pop.nifty.com
proto apop
user xxxxx
pass yyyyy
no rewrite
no mimedecode
fetchall
mda "/usr/bin/procmail -d zzzzz"
上の設定の場合、POP サーバーは pop.nifty.com でユーザーアカウントは
xxxxx パスワードは xxxxxx。そして、ローカルマシンのアカウント
zzzzz に、procmail を使って配送している。
[procmail の設定]
$HOME/.procmailrc は、以下のように記載する。
PATH=/usr/local/bin:/usr/bin:/bin
MAILDIR=$HOME/Mail
:0 HB:
* ? bsfilter --auto-update
* ? touch $MAILDIR/spam/.mew-mtime
spam/.
この場合、bsfilter で SPAM と判定されたメールは POP のスプールには
送られず、直接 $HOME/Mail/spam にコピーされる。
今のところ、動きは上々。
不愉快なメールに悩まされることが少なくなることを期待している。
(URL: http://k-ishik.seesaa.net/article/6166960.html)
2007-07-31 (火)
■ 重複メール [procmail]
To: masutaka at example.com
Cc: 加入しているメーリングリスト
という宛先でメールが来ると、同じメールが 2 通来てしまう。
procmail 付属の formail を使えば Message-ID が同じメールを削除してくれる。詳細は割愛。
でも削除は怖いから、どこかのディレクトリに待避したいなあ。Notes のメールは Message-ID が重複しているし...。
あとは、メール本文が同じかどうかでも判断するようにしたい。MD5 でハッシュを計算すれば、負荷は少ないはず。
2007-10-19 (金)
■ 重複メール [procmail][Mew]
[2007-07-31-1] で話題にした重複メールの件。
To: masutaka at example.com
Cc: 加入しているメーリングリスト
という宛先でメールが来ると、同じメールが 2 通来てしまう。
procmail 付属の formail をうまくを使えば、スマートに削除できることが分かった。
以下は ~/.procmailrc の該当の設定。
PATH=$PATH:/usr/local/bin
MAILDIR=$HOME/Mail.local
DELETEDIR=$HOME/.trash/Mail/delete
:0
* ? formail -D 8192 msgid.cache
* ? touch $DELETEDIR/.mew-mtime
$DELETEDIR/.
formail が Message-ID を msgid.cache というファイルに 8192byte 蓄え、
重複メールかの判断をしている。そう判断されたメールは $DELETEDIR に振り
分けられる。msgid.cache は $MAILDIR に作られる。どちらのディレクトリとも
メールサーバから見える場所を指定すること。$HOME が無難。
ディレクトリはあらかじめ掘っておき、適切なパーミッション(2700等)をかけておくこと。
.mew-mtime を touch しているのは、Mew から $DELETEDIR を見たときに
スキャンが走るようにするため。
2009-12-13 (日)
■ Subject も本文も存在しないメールはスパムフォルダに振り分け [procmail]
最近 1 日に 10 通程度、毎回違う From で Subject も本文も存在しない
スパムが来るのですが、bsfilter で捕捉できません。仕方がないので、そ
のようなメールは問答無用でスパムフォルダに振り分けることにしました。
以下が ~/.procmailrc のレシピです。touch しているのは、Mew でスパム
フォルダを訪問した時に自動でスキャンを走らせるためです。
PATH=${HOME}/bin:${PATH}
MAILDIR=${HOME}/Mail
:0
* !^Subject:
{
:0 HB:
* ? mail-body-empty
* ? touch ${MAILDIR}/spam/.mew-mtime
${MAILDIR}/spam/.
}
mail-body-empty は自作の Ruby スクリプトです。~/bin に置きました。
以下にコピペします。
#!/usr/bin/ruby
# 標準入力から渡されたメールの本文が空だったら 0、空でなかったら 0 以外を返す。
# メール本文が空行のみ、または空行の連続を「空」と定義する。
mode = :header
STDIN.each do |line|
case mode
when :header
if /^$/ =~ line
mode = :body
end
when :body
unless /^$/ =~ line
exit 1
end
end
end
exit 0
### End of file
最初は "* ? mail-body-empty" でなく "* < 1" と書いていたのですが、
うまくいかなかったのでこのスクリプトを作りました。どうやら "<" は
ヘッダと本文の合計サイズを評価する仕様のようです。
最終更新時間: 2010-07-27 06:00


