同バージョンのSpamAssassinで、生の(i.e. 空白除去処理などを行っていない)
ヘッダに対するチェックを行うには、どうすればよいのでしょう。具体的には
From: "Myname" <myac...@mydomain.com>
のように「From:とその次との間に空白が特定個数(この例では3個)あるかどうか」
をチェックしたいわけです。
試しに
header XXX ALL =~ /\nFrom: \S/
としてみましたが、意図通りには動きません。「From:」のようなヘッダの項目
名の直後の空白は1つだけにされてしまう(それ以外のところにある空白は保存さ
れるのですが)ので、ALLの内容は「…\nFrom: "Myname"…」になり、
/\nFrom: \S/ にはマッチしてくれません。また、
header XXX ALL:raw =~ /\nFrom: \S/
でも同じです。rawはMIMEエンコード部のデコードを防ぐだけで、先頭の空白の
除去処理は防いでくれないようです。
もしかしてSpamAssassinではできないのでしょうか。
の件、一応解決を見ました。
full XXX /^(?:(?:\n?[^\n])+\n)?From: \S/
のように、「full」を使ってマッチさせれば良いようです。fullの内容はメール
のヘッダとボディ全部で、空白のトリミングなどの処理は一切行われていないよ
うなので、上記のように「From:」の直後の空白の数を正確に要求することもで
きます。但し、今回はメールのヘッダ部にだけマッチさせたいので、ボディ部に
マッチしないように「^(?:(?:\n?[^\n])+\n)?」のようなことを書いておく必要
があります。
それから、これだとメール全体とのマッチを行うので、巨大なメールが送られ
た時にメモリを食いまくってやたら重くなります。サイズが大き過ぎるメールに
対しては適用しないなどの工夫が必要でしょう。
SpamAssassinですが、使ってみて、local.cfの記述の自由度の低さにはちょっ
と失望気味です。eximのconfigureファイルの方がよっぽど柔軟な記述ができるっ
てのは何とも。ちなみに今回の「ヘッダのFrom:の次に特定個の空白があったら…」
というのは、今回のSpamAssassin導入前にeximのconfigureファイルに書いてい
たルールで、それをどうせならSpamAssassinの方に移してしまえないかと四苦八
苦していたのでした。eximの方には何の問題もなく書けたのに、です。もちろん、
これまでのspam検出のヒューリスティックが多数蓄積されていること、1つのルー
ルだけで拒絶するのでなく総合スコアで判定できること、ベイジアンフィルタを
持つことなど、SpamAssassinならではの魅力もあるにはあるのですが、…