Procmail 介绍

2004年Bill Gates先生预言微软要在2年内消灭垃圾邮件,现在看来这个预言已经落空了。垃圾邮件还是一如既往的猖狂,甚至随着WEB2.0的到来,比以往显得更为猛烈。那么既然Bill不能为我们解决这个难题,我们就只能靠自己了,下面我要介绍的这个小程序可以帮我们抵挡住大部分的垃圾邮件。这就是Procmail。

Procmail用于过滤电子邮件。它可以预整理或者预处理您的大量的来信。您可以用它从邮件列表中挑选中想要的邮件、剔除垃圾邮件、自动回复等等等等。

Procmail一般用来和fetchmail、mutt、sendmail搭配使用。Procmail只是个工具而且,对于它,我们只要大致的明白的它的配置规则即可。下面我贴上我的配置文件,并加以说明。

我的Procmail配置文件:.procmailrc

#################################
#
# charry[at]charry.org
#
#################################

LOGFILE=$HOME/.pmlog
UMASK=000

# 变量定义,这里只是一部分,其他的请参考mannual
NULL=/dev/null
SPAM=/tmp/spam
JUNK=$HOME/Mail/junk
FOO=$HOME/Mail/foo

##### General filter ######

# 标题中带有Ultimate的邮件,保存到$SPAM中
:0b
* ^Subject:.*Ultimate.*
$SPAM

# 标题中带有xxx movie的邮件保存到$SPAM中
# 这里我为什么没有写Subject,因为缺省查找的就是邮件头
# 以下同
:0b
* .*xxx movie.*
$SPAM

# 把标题中带有xxx girl的邮件,拷贝到$FOO中,并且删除(即放到$NULL中)
# 之所以这样做,是因为这样备份的邮件才能被mutt打开,注意,下面的规
# 则只针对”标题”中带有xxx girl的邮件
:0
* .*xxx girl.*
{
:0 c
$FOO

:0
$NULL
}

# 如果标题中包含sex,则保存到$JUNK中
:0b
* ^Subject:.*sex.*
$JUNK

# 如果正文中包含”合肥山舟”,则保存到$JUNK中
:0Bb
* .*合肥山舟.*
$SPAM

# 如果标题中包含software,则保存到$JUNK中
:0b
* ^Subject:.*software.*
$JUNK

# 如果标题中包含foo.com,则保存到$JUNK中
# 经过测试foo.com和foo\.com都可以过滤
# 因为.即表示任意字符,而\.只是表示一个点,前者的范围其实更大
:0b
* ^Subject:.*foo\.com.*
$JUNK

# 正文中带有如下字样的,保存到$SPAM中
:0Bb
* ^Enlarge your penis up.*
$SPAM

# 正文中带有http://reg.sms.ac字样的,保存到$SPAM中
:0Bb
* .*http:\/\/reg\.sms\.ac.*
$SPAM

# 正文中带有http://www.23idc.com字样的,保存到$SPAM中
:0Bb
* .*http:\/\/www\.23idc\.com.*
$SPAM

# 标题中含有Nude Pictures的
:0b
* ^Subject:.*Nude Pictures.*
$SPAM

# 正文中包含Nude Pictures的
:0Bb
* .*Nude Pictures.*
$SPAM

# 正文中包含increase your size的
:0Bb
* .*increase your size.*
$SPAM

# 正文中包括”赚钱”的保存到$JUNK中
:0B:
* .*赚钱.*
$JUNK

# 如果邮件的正文中包含”Visit our site:”则保存到$JUNK中
:0B:
* .*our site:.*
$JUNK

# 如果邮件的正文中包含”Visit our website:”则保存到$JUNK中
:0B:
* .*our website:.*
$JUNK

# 拒收hotmail的邮件
#:0
#* $ ^From:.*\@hotmail\.com
#$NULL

# 拒收 yahoo.com 但收取 yahoo.com.tw
#:0
#* $ ^From:.*\@yahoo\.com
#* $ !^From:.*\@yahoo\.com\.tw
#$NULL

# 把Cron Daemon的错误挡掉
:0
* ^From:.*Cron Daemon.*
$NULL

# 记录所有邮件地址
:0 c:
| formail -zxFrom: -zxTo: -zxCc: >>tmp/capture

概要
看了上面的例子,估计你已经大概的了解了Procmail的配置方法了,下面我少许的说明一下。标准的格式如下:

:0 [参数] [: [锁定文件]
零或者多个条件(每个一行)
动作

下面是个例子

:0:
* ^(From|Cc|To).*sohu
sohu

第二行是它的条件行,它以星号开头,后面是一个正则表达式(regular expression)。在本例中,它表示所有以From或者Cc或者To打头的,并且后面跟着一些字符,然后再跟着’sohu’的字样。如果某个邮件的一部分匹配了这样的条件,则执行下面的动作。在这里表示把它放到一个名为’sohu’的文件中。

正则表达式
正则表达式区分大小写,比如Charry和charry不同。
点’.'匹配任何任何字符,除了新行符(newline)。比如:.harry匹配charry, xharry, pharry等等。
字符后面跟一个星号(*),表示它将出现0或者多次。比如char*y匹配chay,chary,charry,charrrrrrrrrrrrrrrry。可以想象:.*将匹配任何长度的字符串。
字符后面跟一个加号(+),表示它将出现1或者多次。字符后面跟一个问号(?)表示它将出现0或者1次。你可以用括号把字符括起来作为一个整体,比如:B(ob)+表示:Bot, Bobobob等等。
Part [abcd]匹配:Part a, Part b, Part c, Part d
[^aeiou]+匹配所有非元音单词。这里的^表示‘非’
Bob|Joe表示Bob或者Joe
^表示匹配开头,$表示匹配结尾。注意这里^和上面的那个^意义不同。
更多信息请参考专门的正则表达式(regular expression)文档
规则(意译)
我们来看个例子:

# israeline是个邮件列表的名字
:0: # 最后一个冒号表示锁定文件
* ^To:.*israeline
israel # 把所有的邮件放入’israel’文件中

有一件事情必须知道,不要在匹配条件行中加注释,否则这些注释也会被当成匹配条件

下面我们看一下什么是‘锁文件’(lockfile)。假设几乎在同时,有两份israeline的邮件发来。有很大的可能性,系统会启动两个Procmail,而它们都会尝试着去写‘israel’文件。不用我说,你也会知道后果如何,为了避免错误,我们可以用lockfile。这样,第一个Procmail会锁定israel,这样只有它才能有写的权限。其他的Procmail只能等待第一个完成它的操作。

假设你的大学同学Bob喜欢给你发一些网上找的有趣的东西,这些信件通常以“joke”,“funny”作主题。而你却不想把这些邮件和你的工作相关的信件混在一起,你希望把这些信件转发到一个不同的邮箱中,同时你不想把Bob发来的工作相关的信件也被转发。你可以用下面的规则,它用了两个匹配条件。

:0 # 转发邮件到nishizhu@gmail.com
* ^From.*bob
* ^Subject:.*(joke|funny)
! nishizhu@gmail.com

在动作行的开头加一个“!”表示转发邮件。你可能注意到这里没有在From后面加一个冒号(:),因为有的邮件头中,From后面没有冒号(:),所以为了安全起见,你最好不加那个冒号(:)。既然这里是转发邮件,所以我们就不需要锁定文件了。

我在测试中发现,对于标题中带有中文的,类似的匹配并不起作用,不知道是我的写法有误还是Procmail的bug。对于邮件正文的匹配正常,可以处理中文。
下面我们来看一个复杂的例子:

:0: # 转发
* ^From.*bob
* ^Subject:.*(joke|funny)
{
:0 c
! nishizhu@gmail.com

:0
| lpr -Pacsps
}

在动作行,我们用了一个嵌套的块。它可以被看作另一个.procmailrc文件,在这个块中,我们又可定义任意个匹配条件,不过,必须要求其父条件也成立。

第一个条件表示转发邮件,这里用到了一个参数‘c’,它其实是copy的缩写。因为一份邮件通常会被送到第一个匹配条件的目的地,所以这里用‘c’允许我们为一份邮件加上两个匹配条件。

我们把邮件送到一个程序中,得用管道号(|),它的意思是说,把邮件作为下面的这个程序的输入。这里我们把匹配的邮件用打印机acsps打印出来。

我们再来看一个例子

:0 bc: # 打包压缩
* ^To:.*junk
| gzip >> junk-archive.gz

假如我们有个邮件列表或者邮件用来保存一些垃圾。我们可以把它的邮件正文打包压缩,供以后查阅。这里我们用了两个参数,’b'表示下面的动作行只对信件的正文起作用,并不对信件的头起作用。’c'表示我们只是copy一份邮件并对它作相应的处理。然后把邮件传递到下一个规则中。我们之所以这样做,是因为:我们只想在压缩包中保存邮件的正文,而在邮箱(mail inbox)中,我们希望它没什么变化。

其他
对于更为详细的Procmail的介绍,请参考它的联机文档。Procmail的联机文档分为不同的几个部分:

$man procmail
# 程序的基本介绍,参数介绍,在最后还有一些例子

$man procmailrc
# .procmailrc格式的详细介绍。

$man procmailex
# 若干个.procmailrc的例子

$man procmailsc
# 加权过滤,高级的过滤规则。
Procmail的作者是:Stephen R. van den Berg,(RWTH-Aachen, 德国)。最新版的Procmail在
ftp://ftp.informatik.rwth-aachen.de/pub/packages/procmail/

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值