1. echo "|/usr/local/bin/procmail" > ~/.forward
这样以后寄给您的邮件将会先交给 procmai 这支程序来处理了
vi ~/.procmailrc , 以下是一个简单的 .procmail 的范例:
PATH=/bin:/usr/bin:/usr/local/bin
MAILDIR=$HOME/Mail
DEFAULT=/var/mail/your_id #your_id 请填您在系上工作站的账号
LOGFILE=$MAILDIR/from
#被系上判定为spam的信会存到档案SPAM中
:0 bhH:
* ^X-Spam-Flag: YES
SPAM
#发件人来源有"john@cs.nctu.edu.tw"字样的信件都会存到档案VIRUS
:0:
* ^From.*john@cs.nctu.edu.tw
VIRUS
#信件标题有"Flame"字样的信件都会被丢掉
:0
* ^Subject:.*Flame
/dev/null
§ 进阶说明
范例中的第1个规则: 被系上判定为spam的信(X-Spam-Flag会等于YES)会存到档案$MAILDIR/SPAM中
Note: $MAILDIR是在之前的环境变量已经设定好的
范例中的第2个规则: 发件人来源有"john@cs.nctu.edu.tw"字样的信件都会存到档案$MAILDIR/VIRUS
也就是说如果发件人是"abcjohn.cs.nctu.edu.tw"
或是"xxxjohn.cs.nctu.edu.tw"等的信件都会被存到档案$MAILDIR/VIRUS中
范例中的第3个规则: 信件标题有"Flame"字样的信件都会被丢掉
也就是说信件标题是"oooFlame"或是"xxxFlame"的信都会被丢掉
那如果有一封邮件都没有符合所有的条件,则会被存到 DEFAULT 环境变量指定的档案
以下是语法的整理:
:0 [flags]
<零行以上的条件式 (one per line)>
<一行 action line>
常用的flags:
c 将邮件复制一份
B 只检查邮件的本体有无符合条件式
H 只检查邮件的标头有无符合条件式 (预设)
2. 其他功能说明:
action line 指明要如何处理邮件,如果指定的是一个档案,则会把邮件加到该档案的最后
如果指定的是一个目录,则会把邮件存到该目录底下的某个文件名,也可以做下列处理:
! mail_addr 转寄给指定的信箱
| program 使用指定的程序来处理
{ } 如果一行写不完可以用大括号括起来
Example:
:0
* From.*@yahoo # 针对来源是 yahoo 的邮件做处理
{
:0 BH # 把从 yahoo 来的广告信丢掉
* 赚钱的好机会
* 广告
/dev/null
:0 BH
* > 20000000 # 有大于 20MB 的信直接丢掉
/dev/null
:0 c
* From.*judy # 如果是 judy 寄来的信..
! mary@yahoo.com # 就"复制(注意 flag: c)"一份并转寄给 mary
}
Posted on 05月 6, 2009, under 配置详解.
说明:
procmailrc档案分别放置于两个地方,分别是
/etc/procmailrc
$HOMEDIR/.procmailrc
前者是全域使用,后者为使用者自行定义。
语法:
:0 [flags] [ : [locallockfile] ]
<zero or more conditions (one per line)> //判别条件
<exactly one action line> //符合前项的处理方式
条件以 * 开始,表示除了开头与最后的空白,之后的字符皆会逐字导向 egrep。
可使用 egrep 接受的正规表示式,egrep 的正规表示式,详细的部分请参考 egrep 的 man page。
Flag 种类:
H 以 egrep 搜寻 mail header (预设)
B 以 egrep 搜寻 mail body
D 指定 egrep 区分英文字母的大小写 (预设不区分大小写)
A 除非前项最后条件 (或是同层的巢状条件) 未符合 “A” 或是 “a” flag,否则这个flag 不会被执行。
a 与 A flag 相同,不过前一条件必须执行并且成功。
E 这个 flag 只有在前面的 flag 没有被执行的状况下才会执行。使用 E flag 时,完成这个 flag 的判别条件之后,不会执行之后的 flag,类似 else if 效果。
e 这个 flag 只有在目前 flag 执行失败的状况下才会执行 (例如:试着执行某行,但是结果是错误 error)
h 传送 mail header 给予 导管 (pipe, |), 档案 (file) 或是邮件递送目的地 (预设)
b 传送 mail body 透过 导管(pipe, |), 档案 (file) 或是邮件递送目的地 (预设)
f 指定导管 (pipe, |) 为 Filter (过滤项目)。
c 复制此邮件,这个复制动作。
w 这个 flag 会等待 filter 或是程序结束并检查程序的结束状态码 (通常是 ignored),如果 filter 程序失败,结束状态将不会是 filtered。
W 和 w flag 相同,不过会隐藏 “Program failure” 讯息。
i 略过在这个 flag 的所有写入错误 (通常是pipe 被提前中断)
r 原始模式,不会于邮件的结尾部分加上空行,保持原状。
条件:
! 条件反意,如果原本条件为“等于A 就删除“,将变为
不等于A 就删除“。
$ 用sh 把双引号间的规则进行改写
? 传递执行后的状态码予指定的程序
< 若邮件大小小于(byte)
> 若邮件大小大于(byte)
处理方式:
! 转送信件到特定e-mail address
| 把信件导往其它程序处理,例如
| /usr/bin/spamc 代表把邮件转给 spamc 处理。
{ } 巢状,可再接另外的过滤条件。
/dev/null 删除
预设的环境变量:
ORGMAIL=/var/spool/mail/$LOGNAME (本机收件者信箱档案)
DEFAULT=$ORGMAIL
MAILDIR=$HOME/ (使用者的 e-Mail 目录)
HOST=主机的hostname
LOCKEXT=.lock
MSGPREFIX=msg.
SENDMAIL=/usr/sbin/sendmail
SENDMAILFLAGS=-oi
procmail的正规表示式:
^ 该行开头
$ 该行结尾
. 表示任意字符 (除了换行字符)
a* 以a为起始第一个字母的句子
a? a加上任意字符或者是只有a
[^-a-d] 除了 换行、-、a、b、c、d 以外的所有字符
. 代表文字 .
< 代表文字 <
> 代表文字