2009-07-05

Wanderlust用S25R的SPAM判定

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