2007年10月22日星期一

Procmail的使用

       Procmail 是一个邮件过滤工具,可以根据邮件的发信人、主题、长度以及关键字 等对邮件进行排序、分类、整理等工作,特别是在你订阅了邮件列表的时候显得 非常有用。
 

Procmail 的配置文件是 ~/.procmailrc 。配置非常简单,首先是一些选项,后 面则是一些过滤规则,如:

# -*- Conf -*-
MAILDIR=$HOME/Maildir/
ORGMAIL=/var/mail/$USER
LOGFILE=$HOME/.maillog
SHELL=/bin/zsh
LOCKFILE=$HOME/.lockmail
VERBOSE=no

# webmaster always sends junk mail~~
:0
* ^From:
webmaster@st\.zju\.edu\.cn
/dev/null

# all other mail goes to inbox
:0:
inbox/

Procmail 使用 recipe 来决定处理哪些邮件以及如何处理他们。一个 recipe 有这种格式:
:0 [flags] [ : [locallockfile] ]
<zero or more conditions (one per line)>
<exactly one action line>
conditions 以 * 开头,为其后到行尾的所有内容,当然除去头和尾的空格。它会送入 egrep 做正则表达式匹配。若conditions以 ! 开始,表示其后条件的反;若以 $ 开始,表示其后的部分要用sh来扩展;若以 ? 开始,表示使用其后跟的命令的返回值做判断;若以 < 或 > 开始,表示邮件长度。

接下来是 action line 。如果以 ! 开头,则对邮件进行 forward 到指定的地 址;如果是以 | 开头则是启动相应的程序;以 { 开头则可以指定嵌套的 recipe ;其他情况则被视为本地邮箱,如果是一个目录,则表示 maildir 格式, 否则是 mbox 格式。

flags 具体可以参见 man procmailrc ,后面如果加上冒号则表示对文件进行锁 定,这样可以避免同时运行几个 Procmail 操纵相同的文件的时候造成混乱。这里给出几个: D 表示大小写敏感模式;c 表示处理邮件的复件,在一个嵌套的recipe块中可以产生连续处理的效果。
 
几个常用的环境变量,具体的请参考man手册。
MAILDIR :当前目录
DEFAULT :缺省的mailbox文件
LOGFILE :信息记录文件
SENDMAIL :指定forward用的程序:处理的命令其实是: "$SENDMAIL" $SENDMAILFLAGS "$@"
LINEBUF:指定一行可以容纳的最多字符数
 
还有一些预定义好的表达式可以用:
^TO_ :匹配收件人包含后面跟的address
^TO :匹配收件人包含后面跟的word
^FROM_DAEMON :可以匹配大部分的自动邮件,
^FROM_MAILER :可以匹配大部分的系统产生的邮件
 
在表达式中,若有 \/ 出现,则这个表达右边的匹配部分会放入变量 MATCH 中。
 
几个好的例子:
 

# DISPLAY from and subject ON THE SCREEN!
:0 c
* ^Subject:.*\/.*
{
    SUBJECT=$MATCH

    :0 ih
    * ^From: .*\/[^<]*
    | echo "$SUBJECT from $MATCH"
}

 

              :0
              * ^From.*peter
              * ^Subject:.*compilers
              {
                 :0 c
                 !
william@somewhere.edu

                 :0
                 petcompil
              }

 

对系统邮件,存入 postm 中
              :0:
              * ^FROM_MAILER
              postm
 

              :0 Whc: vacation.lock
               # Perform a quick check to see if the mail was addressed to us
              * $^To:.*\<$\LOGNAME\>
               # Don't reply to daemons and mailinglists
              * !^FROM_DAEMON
               # Mail loops are evil
              * !^X-Loop: your@own.mail.address
              | formail -rD 8192 vacation.cache

                :0 ehc         # if the name was not in the cache
                | (formail -rI"Precedence: junk" \
                     -A"X-Loop: your@own.mail.address " ; \
                   echo "I received your mail,"; \
                   echo "but I won't be back until Monday."; \
                   echo "-- "; cat $HOME/.signature \
                  ) | $SENDMAIL -oi -t

copy all you mail to your an other account

              :0 c
              * !^X-Loop:
yourname@your.main.mail.address
              | formail -A "X-Loop: yourname@your.main.mail.address" | \
                 $SENDMAIL -oi
yourname@the.other.account

  sends  back at most one file per request, it ignores the body of incoming mails, the Subject: line has to look  like "Subject: send file the_file_you_want" (the blanks are significant), it does not return files that have names starting with a dot, nor does  it allow  files  to be retrieved that are outside the fileserver directory  tree (if you decide to munge this example, make sure you do  not  inadvertently loosen this last restriction).
              :0
              * ^Subject: send file [0-9a-z]
              * !^X-Loop:
yourname@your.main.mail.address
              * !^Subject:.*Re:
              * !^FROM_DAEMON
              * !^Subject: send file .*[/.]\.
              {
                MAILDIR=$HOME/fileserver # chdir to the fileserver directory

                :0 fhw                   # reverse mailheader and extract name
                * ^Subject: send file \/[^ ]*
                | formail -rA "X-Loop:
yourname@your.main.mail.address"

                FILE="$MATCH"            # the requested filename

                :0 ah
                | cat - ./$FILE 2>&1 | $SENDMAIL -oi -t
              }

--
一步一步教你从互联网赚钱 http://www.zqzn.com/index.asp?rid=key480769
投资理财 http://li-cai.blogspot.com/

没有评论: