SPAMASSASSIN, qmail, procmail で迷惑メール削除(その2) |
---|
sed & awk デスクトップリファレンス
シェル&Perl入門―bash/tcsh/grep/se...UNIX & Information Science
詳説 正規表現 第2版
先日同様のタイトルで紹介したのだが、いまいちな部分があるので全面的に書き直した。
spamassassin, qmail, procmail がインストールされていて動作するのが前提条件である。
ディレクトリ構成 |
---|
この例では仮に Linux user = ichiro とする。
なのでディレクトリ構成は
/home/ichiro/
/home/ichiro/.spamassassin/ <-- 作ってください(ユーザ毎設定ファイル保存用)
/home/ichiro/Maildir/new/
/home/ichiro/Maildir/cur/
/home/ichiro/Maildir/tmp/
/home/ichiro/Maildir/spam/ <-- 作ってください(スパムメール保存用)
/home/ichiro/Maildir/log/ <-- 作ってください(procmail ログ保存用)
/home/ichiro/Maildir/log/procmail.log <-- touch で作成してください
/home/ichiro/Maildir/script/ <-- 作ってください(誤判定メール復活スクリプト保存用)
/home/ichiro/Maildir/script/spamctr <-- シェルスクリプト。あとで説明します。
qmailユーザとしては
ichiro
ichiro-spam (スパム通知用。必須ではない)
ichiro-spamctr (スパム誤判定復活用。これも必須ではない)
★ procmail 設定ファイル( $HOME/.procmailrc ) |
---|
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Maildir
LOGFILE=$HOME/Maildir/log/log
VERBOSE=off
DEFAULT=$MAILDIR/
# Local LOCKFILE
LOCAL_LOCK_FILE=lock_for_saving_spam
# My script directory
SCRIPTDIR=$MAILDIR/script
# E-mail to inform the arrival of spam mail
EMAIL=ichiro-spam
#
# spamassassin を実行する。
#
# 設定ファイル
# マシン共通: /etc/mail/spamassassin/local.cf
# ユーザー毎: $HOME/.spamassassin/user_prefs
#
:0fw
*!^X-Spam.*
| /usr/local/bin/spamc
#
# spamassassin 実行した結果以下フラグが YES の場合
# 指定したユーザにそのスパムメールのヘッダの一部を送信して
# 要/不要の判断材料を提供する
# と同時に spam 保存ディレクトリに保存する
# スパムと思われるものも誤判定を考慮して即削除はしない。
#
# X-Spam-Flag: YES
#
:0
* ^X-Spam-Flag: YES
{
:0 hbcw:$LOCAL_LOCK_FILE
| $SCRIPTDIR/spamctr save SPAMASSASSIN $EMAIL
:0
spam/.
}
#
# ichiro-spamctr 宛メール受信で
# SPAM 判定したメールを復活させる
# 取得するためのキーは Message-ID である。
# 該当の Message-ID のメールが存在しない場合は何もしない
#
:0
* ^TO.*ichiro-spamctr@yourdomain\.com
{
:0 B
* cmd get
* ^[> ]*Message-Id: \/.*
| $SCRIPTDIR/spamctr get "$MATCH" $EMAIL
:0 B
* cmd summary today
| $SCRIPTDIR/spamctr summary today $EMAIL
:0 B
* cmd summary yesterday
| $SCRIPTDIR/spamctr summary yesterday $EMAIL
:0 B
* cmd summary \/20[0-9]+
| $SCRIPTDIR/spamctr summary "$MATCH" $EMAIL
:0 E
/dev/null
}
#
# SPAM Status が -80 ~ -199 だったら
# 安全なメールと判断して通常の配信を行う。
#
:0
* ^X-Spam-Status: No, score=-1?[89][0-9]\..+
new
#
# ヘッダ部に X-ML-Name を設定するメーリングリストも
# 安全なメールとして判断し通常の配信を行う。
# 例)linux-users や vine-users など
#
:0
* ^X-ML-Name: (linux-users|vine-users)
new
#
# To: Cc: Subject: 等に自分のメールアドレス(一部でも)入ってない
# システムからのメールやエラー通知メールでない。
# distribute, fml, CMLD等を使ったメーリングリストからのメールでない
#
:0
* !(^TO|^Subject:|Cc:)(.*)(chiro@nifty\.com|ichiro|webmaster|root|)
* !(^From)(.*)(linux\.or\.jp|nmda\.or\.jp|struts-user|rbbtoday\.com|deodeo\.co\.jp|nikkeibp\.co\.jp|dti\.ne\.jp)
* !^FROM_DAEMON
* !^FROM_MAILER
* !(^X-Sequence|^X-ML-Name).+
{
:0 hcw:$LOCAL_LOCK_FILE
| $SCRIPTDIR/spamctr save 'Not include my e-mail in To: or Cc:' $EMAIL
:0
spam/.
}
#
# DRUG, VIAGRA 関係のメール
#
# いや、本当は spamassassin の設定ファイルでちゃんとルール作成
# してください。以下の条件だと一発スパム判定ですから…(^^;
# とりあえずボクのところにはこういうメールがたくさん来るので…
#
:0 B
* (valium|xanax|xalatan|xenical|viagla|medications|pain|soft tab|erection| meds|medicine|pharmacy|medical|drugstore| sex|muscle| relaxants|allergies|hiv|antidepressants|p[il1][l1][l1]s)
{
:0 hcw:$LOCAL_LOCK_FILE
| $SCRIPTDIR/spamctr save DRUG $EMAIL
:0
spam/.
}
#
# 海賊版ソフト関係のメール
#
# これも同様に本当は spamassassin の設定ファイルでちゃんとルール作成
# してください。以下の条件だと一発スパム判定ですから…(^^;
# とりあえずボクのところにはこういうメールがたくさん来るので…
#
:0 B
* (micros0ft|m[!|1]crosoft|w1ndows|wind0ws|Wnd0w's|professi0nal|D[o0][l|/][l|/]ar|stock is limited|same day sh[i1l]pp[i1l]ng|pr!ce|\$[0-9]+ |Adobe (Photoshop|Pagemaker))
{
:0 hcw:$LOCAL_LOCK_FILE
| $SCRIPTDIR/spamctr save Software $EMAIL
:0
spam/.
}
SPAM 制御シェル ( $HOME/Maildir/script/spamctr ) |
---|
#!/bin/sh
# $1: 'save' スパム判定メールのサマリーを作成し、同時に本文を保存
# 'get' スパム判定メールを指定メールアドレスに送信
# 'summary' スパム判定メールのサマリーを指定メールアドレスに送信
#
# $2: $1='save' スパム判定理由
# $1='get' スパム判定メール指定のキー(Message-Id)
# $1='summary' 'today' 本日指定、'yesterday' 昨日指定
#
# $3: 送信先メールアドレス
#
# システム時刻、本日、昨日日付を取得
#
tstamp=`date +%Y%m%d.%H%M%S`.$$
today=`date +%Y%m%d`
yesterday=`date --date '1 day ago' +%Y%m%d`
# スパムメールの保存ディレクトリを取得
#
spmdir=$HOME/Maildir/spam
# 一時ファイル、本日、昨日ファイル
#
tmpfile=$spmdir/tmp.$tstamp
todayfile=$spmdir/spam.$today
yesterdayfile=$spmdir/spam.$yesterday
case $1 in
'save')
(cat) > $tmpfile
date >> $todayfile
echo "Reason: $2" >> $todayfile
cat $tmpfile | sed '/^$/q' | egrep -i '^From:|^Subject:|^To:|^Cc:|^Message-ID:' | nkf -s >> $todayfile
cat $tmpfile | sed -n '/^X-Spam-Status/,/^[^[:space:]]/p' | egrep '^(X-Spam|[[:space:]])' >> $todayfile
echo '' >> $todayfile
cat $tmpfile | sed -n '/^---- -/,/^$/p' | sed -e '/^---- -\|^$/d' >> $todayfile
echo '---------------------------------------------------------------------------------' >> $todayfile
rm -f $tmpfile
;;
'get')
spm_message=`grep "$2" $spmdir/[0-9]* | sed 's/:.*//' | tail -1`
if [ -z $spm_message ]
then
echo 'no message identified message-id' | mail -s "spam mail summary" $3
else
new_message=$tstamp
cp $spm_message $spmdir/../new/$new_message
fi
;;
'summary')
if [ 'today' = $2 ]
then
msg="spam mail summary : $today"
if [ -f "$todayfile" ]
then
cat $todayfile | mail -s "$msg" $3
else
echo 'no spam messages' | mail -s "$msg" $3
fi
elif [ 'yesterday' = $2 ]
then
msg="spam mail summary : $yesterday"
if [ -f "$yesterdayfile" ]
then
cat $yesterdayfile | mail -s "$msg" $3
else
echo 'no spam messages' | mail -s "$msg" $3
fi
else
msg="spam mail summary : $2"
if [ -f "$spmdir/spam.$2" ]
then
cat $spmdir/spam.$2 | mail -s "$msg" $3
else
echo 'no spam messages' | mail -s "$msg" $3
fi
fi
;;
*)
echo "Usage: $0 {save|get|summary}"
;;
esac
exit 0;
ログローテーション、古くなったスパムメールの自動削除 |
---|
私の場合以下のファイルにログローテーション設定を記述
★/etc/logrotate.d/mylog
/home/ichiro/Maildir/log/procmail.log {
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
★古いSPAMメール自動削除&昨日のスパムメール一覧報告
/var/spool/cron/ichiro を編集、もしくは該当ユーザで crontab -e
10 04 * * * find $HOME/Maildir/spam -mtime +14 -exec rm -f '{}' \;
10 00 * * * $HOME/Maildir/script/spamctr summary yesterday ichiro-spam
この例だと2週間(14日)経ったスパムメールが自動削除され、一日に一度スパムメールの概要が送られてくる。
最後に |
---|
★ スパムと誤判定されたメールを取り戻す場合
ichiro-spamctr@yourdomain.com に以下のメールを送る。
-------> ここから…
cmd get
Message-Id: *********************@************
<------ ここまで…
★ 本日のスパムメール概要を取り寄せる場合
ichiro-spamctr@yourdomain.com に以下のメールを送る。
------->
cmd summary today
<------
★ 昨日のスパムメール概要を取り寄せる場合
ichiro-spamctr@yourdomain.com に以下のメールを送る。
------->
cmd summary yesterday
<------
★ 指定日のスパムメール概要を取り寄せる場合
ichiro-spamctr@yourdomain.com に以下のメールを送る。
たとえば 2005/01/09 の場合
------->
cmd summary 20050109
<------