活用編:メールフィルタリング(procmail)

作成日:2007.08.21

procmailを使うと、レシピと呼ばれるルールに基づいて、メールの振り分け(以下フィルタリング)が行えます。
ここでは、簡易スパム対策で個人的に使用しているレシピ「Subject(件名)」またはBody(本文)に特定の文字列が記述されていたら、メールの削除または特定のディレクトリに保存する」を記述しました。
サーバ側で先に削除または別のディレクトリに移動されているので、メーラに入ってこないのが良い点だと思います。

nkf の用意
日本語でフィルタリングを行うため、「nkf」と呼ばれるプログラムを用意します。
ここからダウンロードできます。インストール方法については、ダウンロードファイル内にある説明ファイルをご参照ください。

.procmailrc の作成
レシピを記述するファイルです。ホームディレクトリ直下に作成します。
※ファイルのオーナーとグループはそのユーザを指定してください。

基本部の記述内容
.procmailrc に下記を記述します。

PATH=/bin:/usr/bin
SHELL=/bin/sh
LOGFILE=$HOME/procmail.log

※詳細についてはこちらがとても参考になります。
※3行目はログファイルの設定です(この場合、ホームディレクトリ直下にログができます)。初めはテストでログをとった方が良いかもしれません。

レシピの記述
.procmailrc に必要に応じてレシピ(その1~その5)を記述します。
仮にすべてを記述した場合は、記述した順番に実行されます。
※詳細については同様にこちらがとても参考になります。

レシピで使用している各コマンドの補足)
※各レシピに記述されているnkfのオプション -mw の「m」はMIMEデコードを行います(=?ISO-2022-JP?XXXを人間に分かる文字に変換)。また、「w」はUTF8に変換します(EUCの場合は「e」を指定)。
※各レシピに記述されているsedのオプション 's/[[:space:]]//g' は、スペース・タブを取り除く指定です。
※各レシピに記述されているegrepのオプション -i は、対象文字列に英字が含まれている場合、大文字と小文字を区別しない指定です。また対象文字列を|(パイプ)で区切ることで複数指定できます。

ということで下記がレシピ(例)です。

・レシピ1 - 件名に「テスト」が入っていたら ~/trash/ にメールを移動

:0
* ^Subject:.*/.*
* ? echo "$MATCH" | nkf -mw | sed 's/[[:space:]]//g' | egrep -i 'テスト'
$HOME/trash/.

・レシピ2 - 件名に「未承諾」または「広告」が入っていたら削除

:0
* ^Subject:.*/.*
* ? echo "$MATCH" | nkf -mw | sed 's/[[:space:]]//g' | egrep -i '未承諾|広告'
/dev/null

・レシピ3 - 本文に「テスト」が入っていたら ~/trash/ にメールを移動

:0B
* ? nkf -w | egrep -i 'テスト'
$HOME/trash/.

・レシピ4 - 本文に「未承諾」または「広告」が入っていたら削除

:0B
* ? nkf -w | egrep -i '未承諾|広告'
/dev/null

・レシピ5(おまけ) - コピーを残して指定したメールアドレスに転送

:0 c
! webmaster@shikabo.ddo.jp

※転送先メールアドレスが複数ある場合は、「カンマ」区切りで指定します。

・レシピ6(おまけ ※複合) - 件名に「Logwatch」が入っていたら、コピーを残して指定したメールアドレスに転送

:0 c
* ^Subject:.*/.*
* ? echo "$MATCH" | grep -i 'Logwatch'
! webmaster@shikabo.ddo.jp

※転送先メールアドレスが複数ある場合は、「カンマ」区切りで指定します。

テストメールを送信してみる
初めはログ(procmail.log)を設定した状態で、ワザと件名や本文中にレシピにヒットする文字列を記述してメールテストを行ってみます。
その後ログをみて、削除や指定したディレクトリにメールが移動されていれば、ログ設定を外すなどして運用します。



記事の評価: 星 1 こ星 2 こ星 3 こ星 4 こ星 5 こ (2件)
Loading ... Loading ...

ページTOPへ