qmail におけるゴミメールの選別(転送編)

ゴミメールは特定の文字列を含んでいることがあります。 例えば、あるゴミメールフィルターでは、メールヘッダに判定結果を書き込みます。 qmail では、~/.qmail に設定を書き込むことで、 特定の文字列を含むメールを選別することができます。

ここでは、転送する前にゴミメールかどうかを判定し、 ゴミならばゴミアドレスへ、そうでなければ転送するという方法について述べます。

注意

パターンマッチングでゴミメールを選別する方法は、完璧ではありません。 つまり、必要なメールまで「ゴミ」として選別してしまう可能性があります。 必要かどうかは、最終的には人間が判断しなければならない以上、 どの方法でも付いて回る問題だと思いますが、 必要なメールもゴミにしてしまう可能性を認識した上で このページの方法を利用して下さい。

転送メール選別の流れ

まず、Cシェルスクリプトで転送するメールがゴミかどうかを判定します。 ゴミならば 0, ゴミでないなら 1 という返り値を出すような Cシェルスクリプトを作っておきます。 つぎに、.qmail 内で condredirect を使って転送の設定をします。

ゴミメール選別スクリプト

ある文字列を含むメールをゴミメールとして判定するための Cシェルスクリプトは以下の通りです。
set file = tmptmptmphogehoge

set pattern = (\
        'spam-spam'\
        'Spam mail'\
)

cat - > ${file}

@ m = 1
while ( $m <= $#pattern )
        grep "$pattern[$m]" ${file} >& /dev/null && rm -rP ${file} && exit 0
        @ m++
end

rm -fP ${file}
exit 1
  
set pattern の赤文字ところには、 スパムメールと判定できるような文字列を書き込んでおいてください。

このスクリプトは、受け取ったメールがスパム文字列を含んでいたら 0 を、 そうでなければ 1 を返り値として返します。①

スクリプトを作ったら名前を付けて保存し(ここでは spamfilter.sh とします)、 実行権を与えておきます。
chmod 755 spamfilter.sh

ゴミメールの行き先設定

ここでは gomimail というユーザを作って、 ゴミメールはすべてそのユーザのメールボックスに行くようにしておきます。 ユーザ gomimail を作って、Maildir 形式のメールボックスを用意しておいて下さい。 なお、gomimail のメールボックスにゴミメールを貯めておく必要がなければ、 ~gomimail/.qmail に
#
とだけ書いておきます。

.qmail の変更

${HOME}/.qmail を以下のようにします。
./Maildir/
| /var/qmail/bin/condredirect gomimail /home/LocalLibrary/bin/spamfilter.sh (| から1行で書く)
&(転送先のメールアドレス)
condredirect は、condredirect (転送先) (判定条件) という具合使いますが、 判定条件の返り値が 0 のときは転送先に転送して .qmail 内のそれ以降のコマンドを無視します。 判定条件の返り値が 0 以外の場合は転送先には送らないで、 .qmail 内のそれ以降のコマンドを実行します。

これで、

ことになります。

FreeBSD の部屋


Last modified: Wed Apr 20 15:55:00 JST 2011