1.10. 邮件分拣

1.10.1. vacation 自动回信
1.10.2. procmail

.forward 配置文件,可以调用外部程序处理邮件,包括邮件杀毒、自动回复、邮件转发、备份、丢弃等等。

sendmail 如果配置了 smrsh,则对调用外部程序有所限制,需要针对 smrsh 作特殊处理,参见:FAQ

1.10.1. vacation 自动回信[6]

在 .forward 文件中设置使用 vacation 处理邮件:

\ric, "|/usr/bin/vacation -a allman eric"

which would send messages to you (assuming your login name was eric) and reply to any messages for ``eric'' or ``allman''.

Vacation returns a message, ~/.vacation.msg by default, to the sender informing them that you are currently not reading your mail. The message is only sent to each sender once per reply interval (see -r below). The intended use is in a .forward file. For example, your .forward file might have:

~/.vacation.msg 范例

Subject: Re:$SUBJECT
From:    Song ( 由 vacation 程式自动回信 )
$FROM 您好:
我目前无法看到这封信。
当我回来上班并看过这封信後,我会尽快给您回信。
谢谢。

如果想在回信中使用 Reply-To:,需要用参数 -r 调用 vacation。

vacation 会把回过信的邮件地址存入 .vacation.db 中,同时在 7 天之中不会再自动回覆相同的邮件地址。7 天是系统预设值,如要修改可在启动时使用 -tN 的参数,N 是天数,如:vacation -I -r -t1 song ,这样隔 1 天就会再自动回覆相同的邮件地址了。

vacation 执行时要用到使用者的 shell,如果使用者的 shell 被设成 /dev/null或是 /bin/false 的话,会有错误出现。

1.10.2. procmail

procmail就是一个用于过滤用户接收到的电子邮件,并能对其自动分类、处理的一个应用软件。

在 .forward 文件中设置使用 procmail 处理邮件:

"|/usr/bin/procmail"

procmail 的配置文件为:/etc/procmailrc,或者用户主目录下的文件 ~/.procmailrc 由环境变量和过滤规则组成。邮件的投递动作由第一个匹配的过滤规则确定。如果没有匹配任何规则,则执行确省的投递动作。

投递规则的格式如下(man procmailrc):


:0 [flags] [ : [locallockfile] ]
<zero or more conditions (one per line)>
<exactly one action line>

冒号——`:',开始一条规则。后面的 0,代表下面列出的条件表达式的个数不限制。

可能用到的标志有:

  • H (确省)

    只对信头进行常规表达式匹配。

  • B

    对信体亦作常规表达式匹配。

  • D

    大小写敏感匹配。确省是大小写不敏感。

  • A, a

    只有当前一个不带A或者a的条件表达式匹配,才进行条件判断。

  • E,e

    相当于 Else If。

  • h(确省)

    将信头送入管道、文件、目的地

  • b(确省)

    将信体送入管道、文件、目的地

  • f

    将管道视为过滤器

  • c

    信件拷贝,即使匹配本条规则,仍去匹配其它规则

接下来是条件部分。条件判断以星号开始——`*',后面跟一个常规表达式。可以有零个或多个条件表达式。如果是多个条件表达式,则需要各个条件均匹配,即 and 的关系。如果没有条件表达式,则结果确省为真。

范例(man procmailex):

  • 处理由crontab出发的邮件。对于不关心的邮件予以删除,对于关心的邮件,发送到邮件列表 list-cron。

    
    :0:
    * ^Subject: Cron .* /bin/sh /www/up.sh
    /dev/null
    
    :0:
    * ^Subject: Cron .*
    list-cron
    
    
  • Forward all mail from peter about compilers to william (and keep a copy of it here in petcompil).

    
    :0
    * ^From.*peter
    * ^Subject:.*compilers
    {
       :0 c
       ! william@somewhere.edu
    
       :0
       petcompil
    }
    
    
  • 等价的表达式

    
    :0 c
    * ^From.*peter
    * ^Subject:.*compilers
    ! william@somewhere.edu
    
       :0 A
       petcompil
    
    
  • 等价的,但是速度稍慢的表达式

    
    :0 c
    * ^From.*peter
    * ^Subject:.*compilers
    ! william@somewhere.edu
    
    :0
    * ^From.*peter
    * ^Subject:.*compilers
    petcompil
    
    
  • Forward all mails shorter than 1000 bytes to my home address (no lockfile needed on this recipe).

    
    :0
    * < 1000
    ! myname@home
    
    

Procmail 的FAQ,参见:Timo's procmail tips and recipes