★postfix+mysql+Dovecot+postfixadmin環境で
 procmailとspamassassinを使いメール振り分け

●参考サイト
http://centossrv.com/postfix-clamav-spamassassin.shtml
http://perl.no-tubo.net/2009/10/14/%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89%EF%BC%88postfix-mysql-dovecot-postfixadmin%EF%BC%89-2/
http://wiki.mmj.jp/index.php?Service/SpamAssassin

http://perl.no-tubo.net/category/%E3%82%B5%E3%83%BC%E3%83%90%E7%AE%A1%E7%90%86/gui%E3%83%84%E3%83%BC%E3%83%AB/postfixadmin/
http://centossrv.com/qmail-vpopmail.shtml


■procmailとspamassassinのインストール。
# yum install spamassassin procmail


■SpamAssassin起動
# service spamassassin start
# chkconfig spamassassin on

■SpamAssassin設定
# vi /etc/mail/spamassassin/v310.pre
-----------------------------------------------------------------------
# TextCat - language guesser
#
loadplugin Mail::SpamAssassin::Plugin::TextCat ← 行頭の#を削除してコメント解除(TextCatプラグイン有効化)
※SpamAssassin設定ファイルok_languagesオプションを有効にするため
-----------------------------------------------------------------------

# vi spamassassin-update
-----------------------------------------------------------------------
#!/bin/bash

# TLEC(http://tlec.linux.or.jp/)よりSpamAssassin設定ファイル最新版ダウンロード
cd /etc/mail/spamassassin
wget -qN http://tlec.linux.or.jp/docs/user_prefs

# 設定ファイル更新時のみSpamAssassin再起動
diff user_prefs user_prefs.org > /dev/null 2>&1
if [ $? -ne 0 ]; then
cp user_prefs local.cf

# スパム判断したメールを添付形式にしないように設定
echo "report_safe 0" >> local.cf

# スパム判断したメールの件名に「***SPAM***」を付加するように設定※受信メールサーバーがPOPの場合のみ
# echo "rewrite_header Subject ***SPAM***" >> local.cf←これは今回コメントアウトした

# SpamAssassin再起動
/etc/rc.d/init.d/spamassassin restart > /dev/null
fi
cp user_prefs user_prefs.org
-----------------------------------------------------------------------

# chmod +x spamassassin-update ← SpamAssassin設定ファイル最新化スクリプトへ実行権限付加
# ./spamassassin-update ← SpamAssassin設定ファイル最新化スクリプト実行
# ll /etc/mail/spamassassin ← SpamAssassin設定ファイル確認 これでlocal.cfが更新させれていたら成功


■Postfix設定
# vi /etc/postfix/master.cf
-----------------------------------------------------------------------
myhostname = mail.example.com ←自メールサーバFQDN
mydomain = example.com ←自サーバドメイン

#mailbox_command = /some/where/procmail
#mailbox_command = /some/where/procmail -a "$EXTENSION"
mailbox_command = /usr/bin/procmail ←追記


local_transport = virtual
# virtual_transport = virtual ←コメントアウト
virtual_transport = procmail ←追記
-----------------------------------------------------------------------

vi /etc/postfix/master.cf
-----------------------------------------------------------------------
最終行に追記
procmail unix - n n - - pipe
flags=R user=vuser argv=/usr/bin/procmail -t -m USER=${user} DOMAIN=${nexthop} /etc/procmailrc
-----------------------------------------------------------------------

■Procmailの設定
procmailのルール、/etc/procmailrcを新規作成する。
# vi /etc/procmailrc

-----------------------------------------------------------------------
SHELL=/bin/bash
PATH=/usr/bin:/bin
DROPPRIVS=yes
MAILDIR=/vmail/$DOMAIN/$USER←ここはサーバの環境に合わせて変更
DEFAULT=$MAILDIR/
SPAM=$MAILDIR/.Junk/
LOGFILE=$MAILDIR/.procmail.log # ログ出力先
#VERBOSE=ON # 詳細ログ出力

# SpamAssassinによるスパムチェック
:0fw
|/usr/bin/spamc -u $USER

# SpamAssassinがスパム判定したメールはスパム専用メールボックスへ配送
:0
*^X-Spam-Flag: YES
$SPAM
-----------------------------------------------------------------------


■スパムメール学習(受信メールサーバーがIMAPの場合のみ)
SpamAssassinが誤って正常メールをスパムメールと判断したり、逆にスパムメールを正常メールと判断してしまった場合、以後の誤認識を防止するためにSpamAssassinに学習をさせ、チェック精度を上げる。

ここでは、受信トレイの既読メールを正常メールとして、Spamフォルダの既読メールをスパムメールとして、定期的にSpamAssassinに学習させるようにする。
※SpamAssassinが誤って配送したメールは、ユーザ自身の操作により正常メールなら受信トレイへ、スパムメールならSpamフォルダへ移動しておくこと
(放置しておくと正常メールをスパムメールとして学習したり、逆にスパムメールを正常メールとして学習してしまう)

# vi spamassassin-learn ← SpamAssassin学習スクリプト作成

-----------------------------------------------------------------------
#!/bin/bash

# スパムメールの学習
#/usr/bin/sa-learn --spam /vmail/ittti.com/*/.Junk/cur #←ここはサーバの環境に合わせて変更
# 通常メールを学習
#/usr/bin/sa-learn --ham /vmail/ittti.co/*/cur #←ここはサーバの環境に合わせて変更
# 受信後一ヶ月経過したスパムメールを削除
#tmpwatch -m 720 /vmail/ittti.co/*/.Junk/cur #←ここはサーバの環境に合わせて変更

PATH=/usr/sbin:/usr/bin:/bin

for user in `ls /vmail/ittti.com/`#←ここはサーバの環境に合わせて変更
do

# 正常メール
hammail=/vmail/ittti.com/$user/cur#←ここはサーバの環境に合わせて変更
dbdir=/vmail/ittti.com/$user/.spamassassin/ #←ここはサーバの環境に合わせて変更
#if [ ! -d $dbdir ]; then
# mkdir $dbdir && chown vmail. $dbdir && chmod 700 $dbdir
#fi

# 正常メール学習
if [ -d "$hammail" ]; then
# 正常メールをSpamAssassinに学習させる
su root -s "/bin/bash" -c "sa-learn --ham $hammail --dbpath $dbdir | \
logger -p mail.info -t 'sa-learn for $user'"
fi

# スパムメール
spammail=/var/vmail/ittti.com/$user/.Junk/cur #←ここはサーバの環境に合わせて変更
dbdir=/var/vmail/ittti.com/$user/.spamassassin/ #←ここはサーバの環境に合わせて変更

# スパムメール学習
if [ -d "$spammail" ]; then
# スパムメールをSpamAssassinに学習させる
su root -s "/bin/bash" -c "sa-learn --spam $spammail --dbpath $dbdir | \
logger -p mail.info -t 'sa-learn for $user'"

# 受信後一ヶ月経過したスパムメールを削除
tmpwatch -m 720 $spammail
fi
done
-----------------------------------------------------------------------
※スパムメール学習結果のログは/var/log/maillogに記録される

# chmod 700 spamassassin-learn ← SpamAssassin学習スクリプトに実行権限付加
# mv spamassassin-learn /etc/cron.daily/ ← SpamAssassin学習スクリプトを毎日自動実行されるディレクトリへ移動


■これでほぼ設定は終了
問題として
・新規アカウント作成時にユーザーメールディレクトリが作成されない
 (パーミッションの変更で対応できるとも書いてあったが現在実現出来ていない)

これは今後上記参考サイトを見ながら調整予定