!!!概要 日本語対応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' $ 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/]