English | Japanese

scmail: Scheme によるメールフィルタ

最終更新日: 2004-07-27 (公開日: 2002-10-24)


scmail とは?

scmail は Scheme で書かれたメールフィルタです。メールが届い た瞬間の自動振り分けと、フォルダの中のメールの自動振り分けを 行えます。ベイズ検定によるスパムフィルタ scbayes も含まれています。

新着情報

必要なもの

特長

インストール方法

scmail のインストールは次のように実行して行います。

% gzip -dc scmail-1.3.tar.gz | tar xvf - 
% cd scmail-1.3
Password: (rootのパスワードを入力)
# make
# make install

構成

scmail の設定

~/dot.scmail/config.sample を ~/.scmail/config にコピーして設定ファイルを準 備します。

;; -*- scheme -*-
(
 :smtp-host "localhost"
 :log-file  "~/.scmail/log"
 :umask     #o077

 ;; for usual mail filtering
 :refile-rules  "~/.scmail/refile-rules"
 :deliver-rules "~/.scmail/deliver-rules"

 ;; for spam filtering
 :token-table   "~/.scmail/token-table.dbm"
 :digest        "~/.scmail/digest.dbm"

 ;; for MH
 :mailbox   "~/Mail"
 :inbox     "inbox"
 :spam      "spam"   ; a folder for spam mails
 :mailbox-type  mh

 ;; for Maildir
 ;; :mailbox   "~/Maildir"
 ;; :inbox     ""
 ;; :spam      ".spam"   ; a folder for spam mails
 ;; :mailbox-type  maildir
 )

scmail-deliver の使い方

scmail-deliver はメールを届いた瞬間 (受信時) に自動振り分け するツールです。scmail-deliver 用の振り分け規則は ~/.scmail/deliver-rules ファイルに定義します。 dot.scmail/deliver-rules.sample をコピーして準備してください。

SendmailPostfix などのメールサーバで は ~/.forward ファイルに次のような設定を加えると、メール受信 時に scmail-deliver による自動振り分けが行えるようになります。

| /usr/local/bin/scmail-deliver

POPサーバからのメールの受信に fetchmail を使っ ている場合は ~/.fetchmailrc の mda の設定に /usr/local/bin/scmail-deliver を指定します。

poll pop3.example.org
     protocol apop
     user satoru
     mda "/usr/local/bin/scmail-deliver"
     no mimedecode

scmail-refile の使い方

scmail-refile はフォルダの中のメールを自動振り分けするツール です。scmail-refile 用の振り分け規則は ~/.scmail/refile-rules ファ イルに定義します。dot.scmail/refile-rules.sample をコピーして準備し てください。

scmail-refile はコマンドラインから次のように実行します。

% scmail-refile
refile: inbox/93 -> ml/enkai@coboler/57
refile: inbox/94 -> ml/linux-zaurus/218
refile: inbox/96 -> ml/komatsu-project/26
refile: inbox/98 -> ml/linux-zaurus/219
refile: inbox/99 -> ml/ming/42           

実行結果の最初の行は inbox の 93 番のメールが ml/enkai@coboler というフォルダに 57 番のメールとして振り分 けられた、という意味を示しています。~/.scmail/log には同様のレ ポートが時刻付きで記録されます。

% tail -5 ~/.scmail/log
2002-09-26T12:49:31: refile: inbox/93 -> ml/enkai@coboler/57  
2002-09-26T12:49:31: refile: inbox/94 -> ml/linux-zaurus/218  
2002-09-26T12:49:31: refile: inbox/98 -> ml/linux-zaurus/219
2002-09-26T12:49:31: refile: inbox/99 -> ml/ming/42

規則の書き方

サンプルを参考にして修正してください。

dot.scmail/deliver-rules.sample

;; -*- scheme -*-

;;
;; Copy all mails to "inbox-all" folder for backup.
;;
(add-filter-rule!
 (lambda (mail) (copy mail "inbox-all")))

(add-filter-rule!
 ;;
 ;; Forward a mail from "partner@example.net" to "mobile@example.com".
 ;; (a copy of mail remains)
 ;;
 '(from
   ("partner@example.net" (forward "mobile@example.com")))

 ;;
 ;; Redirect a mail from "partner@example.net" to "mobile@example.com".
 ;; (a copy of mail doesn't remain)
 ;;
 '(from
   ("partner@example.net" (redirect "mobile@example.com")))

 ;;
 ;; Drop a mail writtein in unreadable charcodes to "spam".
 ;; For people who cannot read a mail written in Chinese and Korean.
 ;;
 '(content-type
   (#/gb2312|euc-kr|big5|gbk|ks_c_5601/i
	     "spam"))

 ;;
 ;; Drop a Japanese spam mail to "spam" folder.
 ;;
 '(subject
   ((#/[未末]承[認諾]広告[**※]/ #/[!!]広告[!!]/)
    "spam")))

;;
;; Drop a mail containing "viagra" in Subject: and "text/html" in the body
;; to "spam" folder.
;;
(add-filter-rule!
 (lambda (mail)
   (and (mail 'subject "viagra")
        (mail 'body "text/html")
        (refile mail "spam"))))

;; Filter spam mails.
;; Please use scbayes to learn spam and nonspam mails beforehand.
;; (add-bayesian-filter-rule!)

;; Filter spam mails using a white list.
;; (use srfi-1)
;; (use scmail.bayesian-filter)
;; (define white-list
;;   (list "friends@example.net"
;;         "family@example.net"))
;; (add-filter-rule!
;;   (lambda (mail)
;;     (and (not (any (cut mail 'from <>) white-list))
;;          (mail-is-spam? mail)
;;          (refile mail "spam"))))

dot.scmail/refile-rules.sample

;; -*- scheme -*-

(add-filter-rule!
 ;;
 ;; Refile a mail from "foo@example.jp" to "from/foo" folder.
 ;;
 '(from
   ("foo@example.jp" "from/foo"))

 ;;
 ;; Refile a mail to "admin@example.com" to "admin" folder.
 ;;
 '(to/cc
   ("admin@example.com" "admin"))

 ;;
 ;; Refile a mail from a mailing list according to List-Id header.
 ;; e.g. "List-Id: <ml.example.jp>" => "ml/ml.example.jp"
 ;;
 '(list-id
   (#/<([-.\w]+)>/  "ml/\\1"))

 ;;
 ;; Refile a mail from a mailing list according to X-ML-Name header.
 ;; e.g. "X-ML-Name: foo-ml" => "ml/foo-ml"
 ;;
 '(x-ml-name
   (#/([-.\w]+)/  "ml/\\1"))

 ;;
 ;; Refile a mail from satoru@example.jp or satoru@example.org
 ;; to "from/satoru" folder.
 ;;
 '(from
   (("satoru@example.jp" "satoru@example.org") "from/satoru")))

;; Replace unsafe characters with `-' in match data.
(set-match-data-replace-rule! '(#/[^a-zA-Z0-9_-]/ "-"))

;; Filter spam mails
;; (add-bayesian-filter-rule!)

スパムフィルタの使い方

scbayesのドキュメントを参照してください

FAQ

巨大なファイルの処理は?

scmail はメールをすべてメモリ内で処理するため、メモリに入り きらない巨大なメールは処理できません。よって、scmail-deliver で巨大なメールをロストしてしまうことがあるかもしれません。

規則ファイルに文法エラーがあった場合は?

規則ファイルに括弧の閉じ忘れなどの文法エラーがあった場合、正 しく読み込めた部分だけが規則として用いられ、壊れた規則は無視 されます。文法エラーのメッセージは~/.scmail/log ファイルに記 録されます。

日本語の処理がうまくいきません

規則ファイルは Gauche の内部コードに合わせる必要があります。 Gauche の内部コードは次のコマンドで調べられます。

% gosh -e '(print (gauche-character-encoding))' -Eexit
euc-jp

ダウンロード

BSDライセンスに従ったフリーソフトウェアとして公開します。 完全に無保証です。

参考文献

関連リンク集

メーリングリスト

QuickML でメーリングリストを作りました。 参加するには次のようなメールを送ってください。

Subject: 参加します
To: scmail@quickml.com
Cc: satoru@namazu.org

(参加メッセージ)

Satoru Takabayashi