トップ 一覧 検索 ヘルプ RSS ログイン

日本語対応SpamAssassinインストールの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!概要
日本語対応SpamAssassinのインストール手順です。

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


!!!インストール
!!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'
 $ ./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]]

!!!リンク
*[The Apache SpamAssassin Project|http://spamassassin.apache.org/]
*[Taki Internet Mail Private Lab.|http://www.emaillab.org/] - SpamAssassin関連実験場
*[日本SpamAssassinユーザ会|http://spamassassin.jp/]
*[MeCab|http://mecab.sourceforge.jp/]