English | Japanese
Last Modified: 2004-07-27 (Since: 2002-10-24)
scmail is a mail filter written in Scheme. scmail can filter an incoming mail when it is received and filter mails in a mailbox. A bayesian spam filter called scbayes is also included.
To install scmail, run the following commands.
% gzip -dc scmail-1.3.tar.gz | tar xvf - % cd scmail-1.3 Password: (enter root's password) # make # make install
Copy a sample file (~/dot.scmail/config.sample) to ~/.scmail/config and edit it.
;; -*- 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 is a command to filter an incoming mail when it is received. scmail-deliver uses Filtering rules defined in ~/.scmail/deliver-rules. You can copy a sample file (dot.scmail/deliver-rules.sample) to ~/.scmail/deliver-rules.
If your mail server is Sendmail or Postfix, you can put the following ~/.forward file to filter an incoming mail when it is received.
| /usr/local/bin/scmail-deliver
If you are using fetchmail to fetch mails from a POP server, you can add the following code into your ~/.fetchmailrc file to use scmailrc-deliver.
poll pop3.example.org
protocol apop
user satoru
mda "/usr/local/bin/scmail-deliver"
no mimedecode
scmail-refile is a command to filter mails in a mailbox. scmail-refile uses Filtering rules defined in ~/.scmail/refile-rules. You can copy a sample file (dot.scmail/refile-rules.sample) to ~/.scmail/refile-rules.
To use scmail-refile, run it on the command line like the following:
% scmail-refile refile: inbox/93 -> ml/enkai@coboler/57 refile: inbox/94 -> ml/linux-zaurus/218 refile: inbox/98 -> ml/linux-zaurus/219 refile: inbox/99 -> ml/ming/42
In this example, the first line in the output messages shows a mail 93 in inbox folder is refiled to ml/enkai@colber as a mail 57. ~/.scmail/log file contains the same report with time information.
% 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
You can edit sample files.
;; -*- 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!)
Please see scbayes's documentation.
Since scmail handles a mail on memory entirely, a huge mail which cannot fit in memory is not supported. So, scmail-deliver perhaps loses an incoming huge mail.
scmail uses rules read correctly and broken rules are ignored. Messages of syntax errors are reported in ~/.scmail/log.
scmail is a free software with ABSOLUTELY NO WARRANTY under so called "BSD licence".