0. procmail とは
簡単に書くとメールの振り分けを行うソフトで、ヘッダーの From、To、Subject や本文に書かれている文字列を
条件に色々な処理ができる。
1. 目的
今回は procmail を使って簡単なスパムフィルターを作成した。基本的なレシピの書き方は詳しく説明しているドキュメントが
Web に多数あるのでここでは具体的な内容を中心に書いていく。
2. 設定
2.1 .qmail
.qmail に以下のように記述する。
|preline procmail
procmail の方でメールボックスに振り分けるので
./Mailbox や ./Maildir/ といった行は不要になる。
ただし、設定ファイルの編集中に届いたメールが消えてしまう可能性があるので
あらかじめメールの配送を停めておく事を推奨する。
$ chmod +t ~/.qmail で配送停止
$ chmod -t ~/.qmail で配送再開
2.2 .procmailrc
2.2.1 環境変数の定義
$HOME/.procmailrc が procmail の設定ファイルとなる。まずいくつかの環境変数を定義する。
SHELL=/bin/bash PATH=/bin:/usr/bin:/usr/local/bin ADDRESS=hoge@foo.orz LOGFILE=$HOME/.procmail/`date +%Y%m`.log LOCKFILE=$HOME/.procmail/.lockfile MAILDIR=$HOME/Maildir DEFAULT=$MAILDIR/inbox/. |
2.2.2 スパムフィルター ~基礎編~
以降に具体的な処理を記述していく。基本的な書き方やオプションの説明はリファレンスに示す。
スパムフィルターの作り方は色々あるが、ここではある条件を満たした場合に
新しいヘッダーを付け加えていき、最後にそのヘッダーがついているメールを
まとめてゴミ箱行きにする方法を紹介する。
誤爆の恐れもあるので使用する際には自己責任で。
以下に撃墜率と誤爆率を添えたレシピを紹介する。
# ヘッダーを整形する # 値が空のヘッダーは削除される :0 f |formail -z # jp ドメイン以外からの HTML メールは撃墜 # 撃墜率:高 # 誤爆率:低 :0 HBf * ! ^From .*\.jp * \<html\> |formail -A "X-Spam: html" # 特定の ML は日本語以外は受け付けない # 撃墜率:中 # 誤爆率:低 :0 f * ^TO_hoge-ml * ! ^From .*\.jp * ! ^Content-Type: .*iso-2022-jp |formail -A "X-Spam: Japanese text only" # Subject が空なら撃墜 # 撃墜率:低 # 誤爆率:低 :0 f * ! ^Subject: |formail -A "X-Spam: no Subject" # MUA が空なら撃墜 # 撃墜率:高 # 誤爆率:高 # Web メールやシステムが返すメールは # MUA がついていないケースが多いので注意 :0 f * ! ^(X-Mailer|User-Agent|X-Mail-Agent): # yahoo メールは許可 * ! ^From .*yahoo\.co\.jp # 携帯からのメールは許可 * ! ^From .*(docomo|ezweb|vodafone)\.ne\.jp |formail -A "X-Spam: no MUA" # 逆引きできないホストを中継してきたメールは撃墜 # 撃墜率:高 # 誤爆率:低 :0 f * ^Received: .*\(unknown \[ |formail -A "X-Spam: no Domain" # Spam はゴミ箱行き :0 * ^X-Spam: $MAILDIR/trash/. |
2.2.3 スパムフィルター ~応用編~
上記のフィルターを使うだけでたいていのスパムを撃墜する事ができるがさらに撃墜率を上げたいのならこんなレシピがある。
ただし、これらのレシピはまだテスト中なので効果は高いが
誤爆のリスクも高い. 使用する際は自己責任で。
なお、このレシピのアイディアは 阻止率99%のスパム対策方式の研究報告
から頂いたもので、上記の付録にある Postfix 用のフィルターの一部を
procmail 用に書き換えたものである。
## エンドユーザから直接発送されるメールを撃墜 # Type 1 : 最下位ドメインが文字で区切られた数字を含む # ex1 : cpe-69-204-48-234.rochester.res.rr.com # ex2 : c8e799b4.sts.virtua.com.br :0 f * ^Received: from .*\([^\.]*[0-9][^0-9\.]+[0-9].*\[ |formail -A "X-Spam: from EndUser [Type 1]" # Type 2 : 最下位ドメインが 5 個以上連続する数字を含む # ex : cuscon10512.tstt.net.tt :0 f * ^Received: from .*\(.*[0-9][0-9][0-9][0-9][0-9].*\[ |formail -A "X-Spam: from EndUser [Type 2]" # Type 3 : 下位2ドメイン以内が数字から始まる(上位3ドメインは判定対象外) # ex1 : 67.110.162.227.ptr.us.xo.net # ex2 : onesixtytwo.206.omne.uk.net :0 f * ^Received: from .*\(([0-9]|[^\.]+\.[0-9]).*\.[^\.]+\.[^\.]+\.[a-z].*\[ |formail -A "X-Spam: from EndUser [Type 3]" # Type 4 : 最下位ドメインが連続で数字で終わる (上位2ドメインは判定対象外) # ex : cm206.epsilon90.maxonline.com.sg :0 f * ^Received: from .*\([^\.]+[0-9]\.[^\.]+[0-9]\..*\.[^\.]+\.[a-z].*\[ |formail -A "X-Spam: from EndUser [Type 4]" |
3. リファレンス
Procmail の紹介とレシピの書き方procmailを利用したメールの自動処理
Procmailの活用
Procmail と SmartList
プロックメールの使い方
阻止率99%のスパム対策方式の研究報告