2007/02/25

sylpheedとbogofilterによるフィルタリング

元々メールはsylpheedを使っていたけれど、年始の休暇に使い始めたbogofilterはなかなかいい感じ。
使っている組み合せ:

  • sylpheed 2.2.10
  • bogofilter 1.1.3
  • prepare.rb 1.7 (kakasiの出力をUTF-8に再変換する修正を加えた)
  • nkf 2.0
  • kakasi 2.3.4
bogofilterは単語を空白で切り出してから頻度をチェックするからkaksiで日本語に空白を追加する例が良く知られている。

いろいろ試したけれど、bogofilterのunicodeサポートを止めてコンパイルしたりしても、

  • nkf -eでEUC_JPに変換
  • さらにkakasiで処理し
  • bogofilterに渡す
という流れだとうまく行かないところがあった。 RHEL4だからLANG=ja_JP.UTF-8だったりしたし、これが原因だろう。

いまの処理はだいたい次のような流れになっている。

  1. nkfでISO-2022-JPやASCIIなメールをEUC_JPに変換
  2. kakasiで分かち書きされた状態に変換
  3. 全体をUTF-8に再変換
  4. bogofilterでチェック、学習
ちなみにbogofilterはUTF-8のサポートを有効にしている。

で、これを行なうシェルスクリプトを作ってsylpheedに追加した。

#!/bin/ksh

PATH=${HOME}/bin:/usr/local/bin:$PATH
export PATH

cat $1 | prepare.rb | bogofilter
prepare.rbは~/binに、bogofilterなどはxstowを使っていて、/usr/local/bin にシンボリックリンクがある。 他にもallow用、deny用にスクリプトが必要なので最後を"bogofilter -n"に書き換えたりしたスクリプトをsylpheedに登録している。

prepare.rb (Kazuto Tominagaさん作)は、いろいろ欲しい機能があったので最後にnkf -wでUTF-8に変換するだけの改造を入れて使わせて頂いています。 どれくらいこの効果があるのか計る事は難しいけれど、base64でエンコードされたスパムメールは確かに来ている。
いま確認したところだと、全体がbase64されていてcatしても内容がわからない日本語メールを、そのままbogofilterに渡してもspamだと判定しちゃうので、すぐに効果があるとか、ないとかはいえないかな。 だけど、spamと判定されない条件もあるように思えて、これをbogofilterの前段で展開してくれる機能は大切だと思う。 bogofilterでbase64を展開して、単語を切り出そうとしても、kakasi使わないと役には立たないだろうし。
スパムメールを十分に学習したいまでは、受信したメールをまずbogofilterで処理するようにすることができて楽になった。

万が一間違ってspamボックスにメールを送り込んだ時のために、定期的にspamボックスをチェックして既読マークをつけているけれど…。 いままでのところは一件だけ間違って家のブロードバンドルーターが定期的に送ってくる通過したポート別のアクセス先、アクセス元のIPアドレスのリストだけがspamボックスに入っていた。

便利だけれど、使い始めからいきなりbogofilterに処理を先にさせてはいけない。 まずはルールベースでメールを振り分けるようにして順番に。
いまのところDBも爆発的な大きさになっていないし、何も考えずに使った最初はbase64のコードをそのまま読み込んでいるようにも見えて、収集つかなくなっちゃったけれど、いまは快適です。


$ du -ks ~/.bogofilter/wordlist.db
6052    /home/yasu/.bogofilter/wordlist.db

0 件のコメント: