scmail: a mail filter written in Scheme

Last Modified: 2004-03-11 (Since: 2002-10-24)


What's scmail?

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.

What's new?

Requirements

Characteristics

Installation

To install scmail, run the following commands.

% gzip -dc scmail-1.2.tar.gz | tar xvf - 
% cd scmail-1.2
Password: (enter root's password)
# make
# make install

Components

Configuration

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
   )

Using scmail-deliver

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

Using scmail-refile

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

Filtering rules

You can edit sample files.

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!)

Using a spam filter

Please see scbayes's documentation.

FAQ

How does scmail handle a huge mail?

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.

What happens if a rule file has syntax errors?

scmail uses rules read correctly and broken rules are ignored. Messages of syntax errors are reported in ~/.scmail/log.

Download

scmail is a free software with ABSOLUTELY NO WARRANTY under so called "BSD licence".

References

Links


Satoru Takabayashi