procmail 设置过滤垃圾邮件

 

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

}

procmailrc 设定说明

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 以外的所有字符
. 代表文字 .
< 代表文字 <
> 代表文字