トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

日本語対応SpamAssassinインストール

概要

日本語対応SpamAssassinのインストール手順です。

こちらのサイトを参考にさせていただきました。 日本語対応パッチもこちらで公開されています。
Taki Internet Mail Private Lab. - SpamAssassin関連実験場

インストール

 mecab

日本語は英語のように単語毎には分かち書きされていない言語なので、単語毎に解析するには分かち書きプログラムが必要になります。 日本語対応SpamAssassinでは分かち書きプログラムとして形態素解析エンジンmecabを使用します。 mecabはUTF-8版としてコンパイルします。

libiconv

http://www.sunfreeware.com/ でパッケージが提供されているのでこれを使用します。

$ gzip -d libiconv-1.xx-sol10-x86-local.gz
# pkgadd -d libiconv-1.xx-sol10-x86-local

mecab本体

http://mecab.sourceforge.net/ からソースをダウンロードします。 ipadicもここからダウンロードします。
charsetをutf8にしてコンパイルします。

$ tar zxvf mecab-0.93.tar.gz
$ cd mecab-0.93
$ ./configure --with-charset=utf-8 --with-libiconv-prefix=/usr/local \
  LDFLAGS='-L/usr/local/lib -liconv'
$ make
# make install 

configureのとき--with-libiconv-prefixだけだとlibiconvをうまく見つけてくれないのでLDFLAGSを指定しました。

ipadic

mecabが使う辞書です。

$ tar zxvf mecab-ipadic-2.7.0-20060707.tar.gz
$ cd mecab-ipadic-2.7.0-20060707

char.defのASCIIのところを以下のように変更します。

# ASCII
0x0021..0x002F ALPHA
0x0030..0x0039 ALPHA
0x003A..0x0040 ALPHA
0x0041..0x005A ALPHA
0x005B..0x0060 ALPHA
0x0061..0x007A ALPHA
0x007B..0x007E ALPHA

mecab本体と同じくcharsetをutf8にします。 私の環境では、"utf8"ではなくて"utf-8"とハイフンを入れないとiconvが動きませんでした。

$ ./configure --with-charset=utf-8
$ make
# make install

Text::Mecab

mecabをPerlから使うためのモジュールです。mecabの公式サイトにあるmecab-perlとは違うものなのでご注意ください。
CPANではうまくインストールできなかったのでhttp://search.cpan.org/~dmaki/Text-MeCab/からダウンロードしてコンパイルしました。

$ tar zxvf Text-MeCab-0.13.tar.gz
$ cd  Text-MeCab-0.13

Makefile.PLに以下の行を追記します。

CC         => 'gcc',
CCCDLFLAGS => '-fPIC',
LDDLFLAGS  => '-G -L/usr/lib -L/lib -L/usr/sfw/lib -L/usr/local/lib \\
 -R/usr/sfw/lib  -R/usr/local/lib -lstdc++ -lmecab',
LDFLAGS    => '-L/usr/lib -L/lib -L/usr/sfw/lib -L/usr/local/lib \\
 -R/usr/sfw/lib -R/usr/local/lib -lstdc++ -lmecab',
$ perl Makefile.PL
$ make
$ make test
# make install

文字コードを尋ねられたら"utf-8"にします。そのほかはデフォルトで大丈夫だと思います。

なんだかやたらとはまりましたがようやくUTF-8版のmecabをインストールできました。

 SpamAssassin

通常版のSpamAssassinはCPANでインストールできますが、今回は日本語対応パッチを当てるので手動でコンパイルします。

Encode::Detect

日本語対応版ではEncode::Detectが必要になります。 CPANでインストールできるはずがふつうにやってもまずインストールできません。(そんなんばっかり...)

http://mm.apache.jp/pipermail/spamassassin-jp/2006-July/000318.html より引用
--------------------------------------------------------------------
cpan を使って
install Bundle::CPAN
でCPANモジュール&関連モジュールを最新版にする
cpan の再設定(reload cpan では有効にならないモジュールがある模様)
(上記で BuildやYAMLが入ります)
install Module::Build
install ExtUtils::CBuilder
install Data::Dump
そして最後に
install Encode::Detect
を実行してやると入りました

だそうです。 でも私の環境ではやっぱりCPANではインストールできなかったので、依存モジュールをインストール後、以下の手順でインストールしました。

$ tar zxvf Encode-Detect-1.00.tar.gz
$ cd Encode-Detect-1.00
$ perl Build.PL --config cc=gcc \
  --config extra_linker_flags='-L/usr/sfw/lib -lstdc++'
$ ./Build
$ ./Build test
# ./Build install

Mail::SpamAssassin

http://spamassassin.apache.org/ から本体をダウンロードします。

$ tar zxvf Mail-SpamAssassin-3.1.7.tar.gz
$ cd Mail-SpamAssassin

http://www.emaillab.org/spamassassin/ から日本語対応パッチをダウンロードします。

パッチを当てます

$ patch -p1 < spamassassin-3.1.7-normalize-test7.patch

INSTALLを参考に依存モジュールをインストールします。 重要そうなものを挙げておきます。 そのほかのものは好みでインストールしてください。

  • Digest::SHA1 (必須)
  • HTML::Parser (必須)
  • MIME::Base64 (強く推奨)
  • DB_File (ベイジアンフィルタを使うなら必要)
  • Net::DNS (RBLを使うなら必要)

インストール

$ perl Makefile.PL
$ make
$ make test
# make install

ユーザ・グループ作成

# groupadd spamd
# useradd -g spamd -s /bin/false -d /var/spool/spamassassin spamd

ベイジアンフィルタ用のデータを置くためのディレクトリを作っておきます。

# mkdir /var/spool/spamassassin
# chown spamd:spamd /var/spool/spamassassin

rcスクリプト

SpamAssassinの使い方は、スタンドアロンで動かす方法(spamassassinコマンド)と、クライアントサーバ方式で動かす方法(spamd/spamc)があります。 今回はクライアントサーバ方式で動かします。 rcスクリプトのサンプルがspamd/solaris-rc-script.shにありますので少し修正して以下のようにしました。

/etc/init.d/spamd
--------------------------------------------------------------------
#!/sbin/sh
 
LOGFILE=/var/log/spamd.log
PIDFILE=/var/run/spamd.pid
USER=spamd
GROUP=spamd

ECHO=/usr/ucb/echo

case "$1" in
start)
       $ECHO -n "starting spamd ... "
       spamd -d -s $LOGFILE -r $PIDFILE -u $USER -g $GROUP &&
               $ECHO "[ OK ]" || $ECHO "[ NG ]"
       ;;
stop)
       $ECHO -n "stopping spamd ... "
       kill `cat $PIDFILE` && $ECHO "[ OK ]" || $ECHO "[ NG ]"
       ;;
restart)
       $0 stop
       sleep 3
       $0 start
       ;;
reload|refresh)
       $ECHO -n "refreshing spamd ... "
       kill -HUP `cat $PIDFILE` && $ECHO "[ OK ]" || $ECHO "[ NG ]"
       ;;
*)
       echo "Usage: $0 { start | stop | restart | refresh }"
       exit 1
       ;;
esac
exit 0

設定

 設定ファイル

設定ファイルはデフォルトでは/etc/mail/spamassassin以下に置かれます。

local.cfを編集する。

#   Add *****SPAM***** to the Subject header of spam e-mails
#
rewrite_header Subject *****SPAM*****

#   Save spam messages as a message/rfc822 MIME attachment instead of
#   modifying the original message (0: off, 2: use text/plain instead)
#
report_safe 0

#   Set the threshold at which a message is considered spam (default: 5.0)
#
required_score 5.0

# ベイズ学習オプション
bayes_path /var/spool/spamassassin/bayes
bayes_file_mode 0644

# 自動ホワイトリストオプション
auto_whitelist_path /var/spool/spamassassin/auto-whitelist
auto_whitelist_file_mode 0644

分かち書きプログラムの設定

tokenizer.pre
--------------------------------------------------------------------
# Tokenizer::SimpleJA
#
#loadplugin Mail::SpamAssassin::Plugin::Tokenizer::SimpleJA

# Tokenizer::MeCab
#
loadplugin Mail::SpamAssassin::Plugin::Tokenizer::MeCab

サイト独自の設定ファイルはsite/以下に作成しsite.cfというファイルからincludeすることにします。

site.cf
--------------------------------------------------------------------
include site/japanese.cf
include site/rbl.cf
site/japanese.cf
--------------------------------------------------------------------
# 文字コード正規化
normalize_charset 1

## 20_body_tests.cfの再定義
score SUBJECT_EXCESS_BASE64 0
score WEIRD_QUOTING 0

## 20_head_tests.cfの再定義
score FROM_EXCESS_BASE64 0
score GAPPY_SUBJECT 0
score SUBJECT_ENCODED_TWICE 0
score SUBJ_ILLEGAL_CHARS 0

## 20_html_tests.cfの再定義
score HTML_COMMENT_8BITS 0
score OBFUSCATING_COMMENT 0

## 20_meta_tests.cfの再定義
score UPPERCASE_25_50 0
score UPPERCASE_50_75 0

## 20_phrases.cfの再定義
score OBSCURED_EMAIL 0
site/rbl.cf
--------------------------------------------------------------------
# RBL.jp(http://www.rbl.jp/)の設定を追加する
# all.rbl.jp
header    RCVD_IN_ALL_RBL_JP eval:check_rbl_txt('rbl.jp', 'all.rbl.jp.')
describe  RCVD_IN_ALL_RBL_JP Received via a relay in all.rbl.jp
tflags    RCVD_IN_ALL_RBL_JP net
score     RCVD_IN_ALL_RBL_JP 2.0

# url.rbl.jp
urirhssub URLBL_RBLJP url.rbl.jp. A 2
body      URLBL_RBLJP eval:check_uridnsbl('URLBL_RBLJP')
describe  URLBL_RBLJP Has URI in url.rbl.jp
tflags    URLBL_RBLJP net
score     URLBL_RBLJP 4.0

uridnsbl  URLBL_IP_RBLJP url.rbl.jp. TXT
body      URLBL_IP_RBLJP eval:check_uridnsbl('URLBL_IP_RBLJP')
describe  URLBL_IP_RBLJP Has IP URL in url.rbl.jp
tflags    URLBL_IP_RBLJP net
score     URLBL_IP_RBLJP 4.0

# dyndns.rbl.jp
urirhssub URLBL_DYNDNS_RBLJP  dyndns.rbl.jp.    A   4
body      URLBL_DYNDNS_RBLJP  eval:check_uridnsbl('URLBL_DYNDNS_RBLJP')
describe  URLBL_DYNDNS_RBLJP  URL uses Dynamic DNS service
tflags    URLBL_DYNDNS_RBLJP  net
score     URLBL_DYNDNS_RBLJP  4.0

# 日本からのメールをSPAMと誤検知することが多いRBLを使わない
score RCVD_IN_SORBS_BLOCK 0
score RCVD_IN_SORBS_DUL 0
score RCVD_IN_SORBS_HTTP 0
score RCVD_IN_SORBS_MISC 0
score RCVD_IN_SORBS_SMTP 0
score RCVD_IN_SORBS_SOCKS 0
score RCVD_IN_SORBS_WEB 0
score RCVD_IN_SORBS_ZOMBIE 0

 ベイジアンフィルタ学習

SpamAssassinの真骨頂とも言えるベイジアンフィルタの学習を行います。 判定精度を良くするには継続的に学習を行う必要があります。

集めたスパムメールを1メール1ファイル形式で/tmp/spam/に置き、スパムでないメールを/tmp/ham/に置きます。 1000通ほどあると理想的のようです。
sa-learnコマンドで学習を行います。

$ sa-learn --spam /tmp/spam/*
$ sa-learn --ham /tmp/ham/*

/var/spool/spamassassin以下にデータベースが作成されます。 かなり時間がかかりますので気長に待ちましょう。

 追加学習

スパムと判定されるべきメールをスパムでないと誤判定(false negative)されたときは以下のように学習します。

$ sa-learn --spam file

また、スパムでないメール(ham)をスパムと誤判定されたとき(false positive)は以下のように学習します。

$ sa-learn --ham file

使ってみる

 動作テスト

お疲れさまでした。 ようやくSpamAssasssinを実際に使えるところまで来ました。 spamassassinコマンドおよびspamcコマンドは標準入力からメールを読み込んで、X-Spam-Flagなどのヘッダを付けて標準出力に書き出します。 なのでいろいろなプログラムと組み合わせて使うことができます。

とりあえずコマンドラインから起動してみましょう。

$ spamc < メールファイル

としてメールファイルを読み込み、ヘッダが追加されて出力されることを確認してください。 X-Spam-Flag, X-Spam-Level, X-Spam-Statusなどのヘッダでスパムと判定されたかどうかが分かります。

 fetchmail + procmail

fetchmailでPOP3サーバから受信したメールをSpamAssassinでチェックする設定の例です。

.fetchmailrc の例

# configuration for fetchmail

set postmaster [USER]
set nobouncemail
#set logfile /export/home/[USER]/Maildir/fetchmail.log

defaults
protocol pop3
no mimedecode
mda "/opt/sfw/bin/procmail"

poll pop3server
port 995
uidl
user [POP USER]
password [POP PASSWORD]
is [USER] here
ssl
no keep

.procmailrc の例

# configuration for procmail

MAILDIR=$HOME/Maildir
DEFAULT=$MAILDIR/
#LOGFILE=$MAILDIR/procmail.log
LOCKFILE=$MAILDIR/procmail.lock

# すべてのメールをspamcに通す
:0fw
|spamc

 POP3 Proxy

以下のページでDeleGateと組み合わせてスパムフィルタ付きのPOP3プロキシを構築する手順を紹介しています。
DeleGate POP3 Proxy with SpamAssassin

リンク

最終更新時間:2007年05月18日 15時00分45秒