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に乗ってしまう。