SPAMASSASSIN, qmail, procmail で迷惑メール削除(その2)

| トラックバック(1)
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
<------

トラックバック(1)

前回、Spamassasinの導入までやりましたが、 それからだいぶほったらかし... 続きを読む

ウェブページ

  • about
Powered by Movable Type 5.2.10

このブログ記事について

このページは、よしが2005年1月 9日 16:50に書いたブログ記事です。

ひとつ前のブログ記事は「電源ユニット(Enermax)修理!」です。

次のブログ記事は「spamassassin に自前ルール追加」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。