bogofilterを再インストールする

ぼくのメールアドレス「masaru@erde.co.jp」宛のメールは、会社のLinuxサーバで受け取っており、ここにオフィスからでも自宅からでも出先からでも、ssh(telnetの暗号化版)でログインし、Emacsエディタでメールクライアントmewを起動して読み書きしている。


このメールアドレスには多い時だと1日1000件ぐらいのSPAMがやってくる。たいていは英語だが、日本語もかなり多いし、中国語やキリル文字などというのも少なくない。これらはbogofilterというベイジアン理論を使ったフィルタでSPAMか非SPAMかを判断。procmailというメール振り分けソフトでSPAMならspamフォルダへ、非SPAMはそれぞれのフォルダへと収納し、さらに一部のメールは携帯電話に転送している。
ところが、先日メールフォルダを整理していたらこれらのチェック動作がおかしくなってしまった。
ここ2年ぐらい、メインのメールフォルダにメールをためまくっていたため、動作が遅くなったり、キーワード検索のnamazuがうまく働くなっていた。キーワードがないメールがヒットしたりするようになっていたのだ。
そこで正月休み明けに2007年と2008年のメールはそれぞれのフォルダを作って移動し、メインフォルダには2009年のメールだけにした。さすがにまだ数が少ないのでnamazuも快適に動く。
ところが、この時にどこを失敗したのかbogofilterのデータベースが壊れてしまったらしい。チェックにいったまま返ってこなくなり、POPには到着したのに行方不明のメールが頻出。幸い、procmailの動作を止めたらタイムアウトして配信されたが、今度はSPAMの山である。
そこでデータベースから新しく作り直すことにした。ついでにbogofilterは1.1.4が1.1.7に、bogofilterが使うデータベースであるBerkeley DBは4.5.20が4.7.25にバージョンが上がっていたので、それぞれ最新版をインストールする。いつの間にかBerkeley DBはOracleになっていた。
アプリケーションが動くことを確認したら、まずbogofilterにSPAMメールと非SPAMメールを学習させなければならない。できるだけ多くのメールを読み込ませ、SPAMメールに出てくる単語とそうでない単語を登録するのだ。
ところが、SPAMメールは片っ端から捨てていたので現物がない。数日ほどフィルタ分けの無い状態でSPAMを手動処理する。さらにアダルト系掲示板などでSPAMになりそうな文面を拾ってくる。非SPAMは今年と去年のメールボックスからMail/hamフォルダにコピーする。zipやjpgなど添付ファイルが着いているものは削除。これらのコードを登録しても無駄だから。
spamメールはRFCなんか無視しているものが多く、本文がquoted-printedだったり、base64だったりすることも。 そこでこれらを前処理する必要がある。
まず富永さんのprepare.rbで前処理する。本当はこれだけで日本語わかち書き処理した出力が得られるはずだが、メールによってはうまくいかないのもある。そのため、nkf -eでeucに変換し、kakasi -wでわかち書きに分解し、さらにnkf -wでutfにする。
SPAMならば-sオプション、非SPAMならば-nオプションでbogofilterに登録してやる。
cat 1 | ~/.prepare.rb | nkf -e | kakasi -w | nkf -w | bogofilter -s
のようなスクリプトを書いてspamフォルダの中身を、
cat 1 | ~/.prepare.rb | nkf -e | kakasi -w | nkf -w | bogofilter -n
で非spamフォルダの中身をbogofilterに登録させる。prepare.rbの容量制限を超えるせいか、
cat * ~
とするとquoted-printedの処理がうまくいかない。メールファイルを1本ずつ通したほうが良さそうだ。このスクリプトはunix shellの書き方を知っている人なら、もっとスマートに書けるだろう。
spamフォルダは500件ぐらい、非spamフォルダは1000件ぐらい登録した。
bogoutil -d ~/.bogofilter/wordlist.db
でDBの中身をダンプすると、単語が登録されているのが確認できる。
.procmailrcに
:0fw
| bogofilter -u -e -p -l
:0e
{ EXITCODE=75 HOST }
:0:
* ^X-Bogosity: Yes
spam/.
と記述する。
携帯電話からテスト用のメールを送ってみる。
SPAMメールはちゃんと
X-Bogosity: Yes, tests=bogofilter, spamicity=0.999780, version=1.1.7
となって、spamフォルダに落とされる。だが、非SPAMメールが
X-Bogosity: Unsure, tests=bogofilter, spamicity=0.496456, version=1.1.7
となってしまうのはなぜだろう?
本当は
X-Bogosity: No, tests=bogofilter, spamicity=0.000000, version=1.1.7
となるべきだが。
とりあえず、これで.procmaiが動くようになったので、数時間ごとのメールボックス掃除からは開放される。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください