procmail メモ


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%のスパム対策方式の研究報告


2004/06/22 作成