最終更新日: 2004-03-11 (公開日: 2002-10-24)
scmail は Scheme で書かれたメールフィルタです。メールが届い た瞬間の自動振り分けと、フォルダの中のメールの自動振り分けを 行えます。ベイズ検定によるスパムフィルタ scbayes も含まれています。
scmail のインストールは次のように実行して行います。
% gzip -dc scmail-1.2.tar.gz | tar xvf - % cd scmail-1.2 Password: (rootのパスワードを入力) # make # make install
~/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-rules ファイルに定義します。 dot.scmail/deliver-rules.sample をコピーして準備してください。
Sendmail や Postfix などのメールサーバで は ~/.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-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
サンプルを参考にして修正してください。
;; -*- 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"))))
;; -*- 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のドキュメントを参照してください
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 (参加メッセージ)