月曜日, 9月 25, 2006

簡易一般規則

 前回(9月23日)紹介したBecky!用の簡易一般規則は、S25Rの6個の正規表現による一般規則に比べて効力がさほど劣らない振り分け条件を一つの正規表現として書いたものである。
 なぜ一つの正規表現にしたのかというと、正当なメールをごみ箱行きから除外するための条件を追加しやすくするためである。たとえば、一般規則に引っかかる正当なメールのFromヘッダのドメイン名が「example1.co.jp」および「example2.ne.jp」である場合、Becky!では、一般規則の条件の下に「かつFromヘッダにexample1.co.jpがないとき、かつFromヘッダにexample2.ne.jpがないとき(…に、ごみ箱に振り分ける)」という具合に、除外条件を絞り込み条件として追加していく必要がある。一般規則を複数の正規表現で指定すると、除外条件をどの条件の下に追加すればよいのかがわかりにくかったり、複数の条件の下に同じ除外条件を追加しなければならなかったりすることがある。それを避けるために一つの正規表現にしたわけである。
 簡易一般規則を作るにあたっては、S25R方式の一般規則のすべてのルールを盛り込もうとは欲張らず、ほどほど複雑すぎない正規表現で、ほどほど高い効果が得られるように工夫した。もしかしたら、Becky!での利用以外にも、フィルタリングスクリプトを組むのに役立つかもしれないと思ったので、参考のために解説を補足する。

from .*\((unknown|\[|[0-9]|[^.]*[0-9][0-9][0-9][0-9][0-9]|[^.]*[0-9]+(([a-z]|-)+|\.)[0-9]|.*\(may be forged\)).* by mail\.example\.jp

 この正規表現の各部分を以下に説明する。

.*\(
 「Received: from 」に続くHELOアドレスから、それに続く「(」までを読み飛ばす。Postfixとsendmailが記録するReceivedヘッダでは、「(」の次から逆引き名が始まる。
 「Received: from 」の直後に逆引き名が位置するフォーマットの場合(qmailの場合)は、この4文字を削除してください(ブラックリストの指定でも同様である)。

unknown
 Postfixおよびqmailで、逆引きできなかった場合を引っかける。
 sendmailの場合は不要である(削除しなくても支障はない)。

\[
 sendmailでは、逆引きできなかった場合、「(」の直後の逆引き名が空になり、IPアドレスを囲む「[」が直後にいきなり位置する。その場合を引っかける。
 Postfixおよびqmailの場合は不要である(削除しなくても支障はない)。

[0-9]
 逆引きホスト名が数字で始まる場合を引っかける。すなわち、ルール3(逆引きFQDNの上位3階層を除き、最下位または下位から2番目の名前が数字で始まる)の条件のサブセットである。

[^.]*[0-9][0-9][0-9][0-9][0-9]
 逆引きホスト名に、5個以上連続する数字が含まれる場合を引っかける。すなわち、ルール2の条件である。

[^.]*[0-9]+(([a-z]|-)+|\.)[0-9]
 下線で示した部分は、随筆記事「Becky!でスパムメールを自動的に90%以上捨てる方法」で紹介した時には「([a-z]|-)+」だけであった。ホスト名に、英字やハイフン1個以上で分断された数字列が2個以上含まれる場合を引っかける。すなわち、ルール1の条件である。
 ところが、「h146.27.40.69.ip.alltel.net」のようなケースがけっこうすり抜けることがわかったので、数字列を分断するのは最初のドット1個でもよいという条件を付け加えた。ややトリッキーな書き方である。これで、ルール3で引っかかるものの一部がさらに引っかかるようになる。
 ただし、これによって、「mx01.246.ne.jp」(実在するMXだが、メールを送信するかどうかはわからない)のようなケースが引っかかってしまう。S25Rのルール3は、このようなケースを引っかけないように上位3階層を検査から除外しているのだが、同じようにしようとすると正規表現が複雑化するので、やめた。レアケースだと思うので、かんべんしてください。

.*\(may be forged\)
 sendmailで、逆引きのパラノイド検査が不適合になって、逆引き名とIPアドレスの次に「(may be forged)」と付記された場合を引っかける。
 Postfixの場合は、パラノイド検査が不適合になった場合も逆引き失敗の場合と同じく「unknown」と表示されるので、不要である(削除しなくても支障はない)。qmailの場合は確かめていないが、多分不要だと思う。

0 件のコメント: