WanderlustでS25R的なspam判定をやってみた。
;; http://www.gabacho-net.jp/anti-spam/paper.html のpostfix用の例をemacs用にしたもの (setq s25r-rules '( ; [rule 0] "unknown " ; [rule 1] ; ex: evrtwa1-ar3-4-65-157-048.evrtwa1.dsl-verizon.net ; ex: a12a190.neo.rr.com "[^n.]*[0-9][^n0-9.]+[0-9].*\." ; [rule 2] ; ex: pcp04083532pcs.levtwn01.pa.comcast.net "[^n.]*[0-9][0-9][0-9][0-9][0-9]" ; [rule 3] ; ex: 398pkj.cm.chello.no ; ex: host.101.169.23.62.rev.coltfrance.com "\([^n.]+\.\)?[0-9][^n.]*\.[^n.]+\..+\.[a-z]" ; [rule 4] ; ex: wbar9.chi1-4-11-085-222.dsl-verizon.net "[^n.]*[0-9]\.[^n.]*[0-9]-[0-9]" ; [rule 5] ; ex: d5.GtokyoFL27.vectant.ne.jp "[^n.]*[0-9]\.[^n.]*[0-9]\.[^n.]+\..+\." ; [rule 6] ; ex: dhcp0339.vpm.resnet.group.upenn.edu ; ex: dialupM107.ptld.uswest.net ; ex: PPPbf708.tokyo-ip.dti.ne.jp ; ex: dsl411.rbh-brktel.pppoe.execulink.com ; ex: adsl-1415.camtel.net ; ex: xdsl-5790.lubin.dialog.net.pl "\(dhcp\|dialup\|ppp\|[achrsvx]?dsl\)[^n.]*[0-9]" )) ;; 自分のメールサーバのReceived:ヘッダーにひっかかるようにする。 (setq s25r-received-prefix "from [^ nt(]* *( *") (setq s25r-received-suffix "\(.\|n\)+[ nt]by [^ nt]+\(自分のサーバ名\)") ;; 正規表現 prefix ( rule1 | rule2 | ... | rule6) suffix を作る。 (setq s25r-rules-regex (mapconcat (lambda (x) (concat "\(" s25r-received-prefix x s25r-received-suffix "\)")) s25r-rules "\|")) ;; 正規表現によるスパムフィルタ (setq elmo-spam-scheme 'header) (require 'wl-spam) (setq elmo-spam-header-good-alist '( ("Received" . "gmo-media\.jp") ;;free-ml )) (setq elmo-spam-header-spam-alist `(("From" . "[VVv][IIi1][AAa][GGg][RRr][AAa]") ("Subject" . "^Dear k-aki@") ("Received" . ,s25r-rules-regex) ))
s25r-received-suffixの部分がちょっと苦しい。elmo-spam-header-spam-alistでは最初のReceivedヘッダーのみ(自メールサーバに対するもののみ)を判定する方法が無いみたいなので、「by 自分のサーバ名」という部分も含めて正規表現を作る必要があった。
この方法で、私のところに来るspamはそれなりに良い確率で判定できているようだ。
過去のメールで試していると、いくつか正規のメールをspamと誤判定してしまうことに気がつく。特に自分と同じサーバを使っているユーザーからのメールはやっかいそうだ。他のサーバを中継しないため、そのユーザーの動的IPアドレスのホスト名がReceivedに乗ってしまう。