- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!!概要
日本語対応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/]