procmail

[追記] このファイルはさきほどまで「Last modified: 2004-03-27 14:25:42」でした。十何年も前のもので,最初に書いたのはいつだったかまったくわかりません。

まず "|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #自分のユーザ名" の起源については procmail用の.forward設定の源流を探る という記事をご覧ください。現在では "|/usr/bin/procmail -f-" だけでいいはずのものです。

ほかのprocmailの記事を見ますとPostfixの設定ファイルを書き換えるなどと書いてあるものがありますが,個人のメールを振り分けるだけであれば,ここにあるように,例えば yum install procmail でインストールしたら .forward.procmailrc だけをいじればいいのです。

~/.forward

"|/usr/bin/procmail -f-"

で,~/.procmailrc は,~/Maildir を使っているなら

MAILDIR=$HOME/Maildir/
JUNK=$MAILDIR/.Junk/
# LOGFILE=$MAILDIR/procmail.log

:0
* ^Subject:.* H00kup
$JUNK

のような感じで書きます。ログファイルはすごく大きくなるので,デバッグのため以外は必要ないでしょう。

以下は古いままです。

procmail とは?

procmail を使えばメールの高度なフィルタリングができます。 詳しくは次のページをご覧ください。

Postfix(または Sendmail)と Mew と組み合わせて使う

以下は Vine Linux に含まれる procmail を Postfix と組み合わせて,Mew でメールを読む場合の設定です。

Postfix が自動的に procmail を呼び出す設定になっていないとします。 つまり,/etc/postfix/main.cf に mailbox_command = /usr/bin/procmail といった行があれば消して postfix を再起動し,セキュリティのため /usr/bin/procmail は suid root を外しておきます(Postfix が procmail を呼び出す設定になっており,なおかつ procmail の suid root が外れていると,新ユーザが最初のメールを受け取れないようです)。

procmail が /usr/bin にあることを確認します。

ホームディレクトリに次のような .forward を作ります:

"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #自分のユーザ名"

私なら次のようになります:

"|IFS=' ' && exec /usr/bin/procmail -f- || exit 75 #okumura"

これはオマジナイだと思って二重引用符も含めてまったくこのまま作ってください。

ホームディレクトリに次のような .procmailrc を作ります:

PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Mail
LOGFILE=$MAILDIR/procmail.log

# 未承諾広告※
:0D
* ^Subject:.*=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?[Bb]\?GyRCTCQ\+NUJ6OS05cCIo
junk/.

# 件名が変なもの
:0
* ^Subject:.*(penis|viagra|mortgage|rolex|sexy|prescription)
junk/.

# 件名が中国語のもの
:0
* ^Subject:.*=\?(big5|GB2312)\?
junk/.

# 本文が中国語のもの
:0
* ^Content-Type:.*(big5|GB2312)
junk/.

これで,正常なメールは /var/spool/mail に残り,biff の類がメール到来を知らせてくれます。 引っ掛かったメールは黙って ~/Mail/junk の中に連番で入ります。 Mew で g を押して + の後に junk と打ち込めば見られます。

~/Mail/procmail.log を見て正しく動作しているかチェックしてください。

.procmailrc の詳細

頭の変数設定の部分以降は,次の形式のルールの繰返しです。

:0……
* 正規表現1
* 正規表現2
    ……
* 正規表現n
処理

正規表現の書き方は egrep と同じです。 すべての正規表現がマッチすれば処理が行われます。

:0 で始まるルールは大文字と小文字を区別せずヘッダの中を調べます。

:0D で始まるルールは大文字と小文字を区別します。

:0: のように : を付けるとロックファイルを使って対象ファイルをロックします。 同じファイルを複数のプロセスが更新する可能性のある場合にはロックが必要ですが,Mew のように1メッセージ1ファイルの場合はロックは必要ないと思います。

詳しくは man コマンド等で調べましょう。

日本語を含むルール

日本語は MIME エンコードされているはずですので,そのまま指定してもうまくいきません。 上の例では「未承諾広告※」を次のようにしてチェックしました。

:0D
* ^Subject:.*=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?[Bb]\?GyRCTCQ\+NUJ6OS05cCIo
junk/.

次のようにもできます(.procmailrc を EUC-JP で書いた場合の例です):

:0
* ^Subject:.*=\?iso-2022-jp\?
* ^Subject:\/.*
* ? echo "$MATCH" | nkf -me | egrep '未承諾広告'
junk/.

ここで $MATCH はすぐ上の正規表現で \/ 以降の部分です。

あらかじめ余分なスペース・約物を除くには次のようにします。

* ? echo "$MATCH" | nkf -meZ2 | sed 's/[[:space:][:punct:]]//g' | egrep '未承諾広告'

正規表現は (未|末)承(諾|認)(公|広)告 といった具合に工夫します。

Message-Id: が変なメール

学外からのメールで Message-Id: が本学になっている場合は,ジャンクメールである可能性が高いので,捨てます。

Message-Id: は本来 MUA が付けるものですが(→ 滝澤隆史さんの Message-ID に関する考察),MUA が付けなかった場合,Sendmail 等ではこれを補うのに対し,qmail はデフォルトでは補わず,Message-Id: なしのメールができます。 それを本学の Postfix が受け取った際に,本学の Message-Id: が付くということのようです。 このようなメールがよく来る場合は,例外扱いします。

:0
* ^Message-Id:.*matsusaka-u.ac.jp
* !^From:.*matsusaka-u.ac.jp
* !^Received:.*mie-c.ed.jp
junk/.

生文字を件名に含むメール

通常は件名はBエンコード等でアスキー文字に変換されていますが,中国方面から生の漢字を含むメールがよく来ます。 これらは次のようにして遮断できます。

:0
* ^Subject:.*[\200-\377]
junk/.

上の \200 とか \377 は実際には1バイトの文字(0x80と0xff)です。

ただし,件名も本文も生SJISのメールがときどきあり,それもゴミ箱に行ってしまうので要注意。

誰々からのメールを遮断してほしい

……と Windows ユーザから言われた場合は,次のようにすればいいのでしょうか。

:0
* ^From:.*badguy@somewhere
/dev/null

あるいは念のためどこかに転送するなら:

:0
* ^From:.*\<badguy@somewhere\>
! admin@your.domain

参考


奥村晴彦

Last modified: