Postfix进阶管理-procmail部分

postfix自带的黑白名单过滤比较简单,效果和功能都一般。如果使用第三方的验证,在带宽不足的情况下是一个问题。而procmail则是一个比较好的替代方案。其也可以使用正规表达式进行匹配,并可识别邮件头和内容,而根据规则把邮件导向到指定的目录或文件中。

不过,其权限控制似乎有点问题,而且一旦配置错误,会直接影响到整个邮件系统的发送结果。所以,在配置完后,请做仔细的验证工作。另外,网上有很多关于procmail的说明,但似乎有些误解,下面会提及到。

一、安装

在红旗DC Server 5.0上默然安装有procmail:

引用

# rpm -qa|grep procmail

procmail-3.22-14.1AX

没有安装的,请找光盘安装即可。

二、规则

procmail可以支持的检查内容和规则很多,常见的有:

1. 关于检查邮件的部分(第一行),flags 包含有:

引用

  H : 对邮件头的检查(默认值)

B : 对邮件内容的检查

h : 把邮件头的数据放入管道、文件及邮件并导向到后面规则中指定的地方(纯头信息)

b : 把邮件内容的数据放入管道、文件及邮件并导向到后面规则中指定的地方(纯内容)

2. 关于检查内容的部分:

引用

  ! : 这是反向选择的意思

< : 检查 mail 的总长度是否小于设定值 ( bytes )

> : 与 < 相反的选择啰!

3. 关于动作的部分

引用

  | : 开始启用后续的 shell 程序工作

或通过绝对或相对路径,指定一个目录或文件,通过管道写入该地方。

4. 其它的环境变量部分:

引用

PATH    搜寻执行文件的路径

SENDMAIL  系统中sendmail 的路径,也可以是postfix链接的sendmail路径,默认即可。

VERBOSE      打开或关闭详细日志信息

LOGFILE   日志文件!默认为:/var/log/procmail.log

ORGMAIL      用户的登陆目录,默认为:/var/mail/$LOGNAME

DEFAULT      系统放mailbox的地方,默认和$ORGMAIL相同,修改请小心。

MAILDIR      procmail工作和执行的目录,默认为:$HOME/,修改请小心。

5. 与正规表达式相关的部分:

引用

  ^ : 开始(同一行最左边)字符

$ : 本行的结束字符(最右边)的比对

. : 除了新增一行之外的任何字符!

: 跳脱字符

三、使用

procmail可以支持全局的规则,定义在/etc/procmailrc;以及个性化的规则$HOME/.procmailrc。全局的规则对所有进入邮件系统的邮件有效,而个性化的规则只对写入该定义的用户有效。

通常情况下,在现在的邮件系统中,我们都不可能通过shell登陆到邮件服务后台,所以,这里以定义全局的规则说明。个性化的过滤,已经由Webmail部分实现了。

1、/etc/procmailrc的内容:

引用

PATH=/bin:/sbin:/usr/bin:/usr/sbin/:/usr/local/bin:/usr/local/sbin

VERBOSE=off

#在不完全了解系统的环境变量前,请不要修改

#ORGMAIL=/var/spool/mail/$LOGNAME

#MAILDIR=$HOME/

#DEFAULT=$ORGMAIL

#LOGFILE=/var/log/procmail.log

#以过滤病毒邮件为例

#SirCam Virus

#每个:0表示一个规则的开始,用空格和检查的内容隔开

#下面定义邮件内容符合规则的就把邮件放到/dev/null文件夹中。

#(实际上就是直接删除了该邮件)

:0 Bh

*I send you this file in order to have your advice

/dev/null

#Nimda Virus

#下面是过滤附件内容

:0 Bh

* ^Content-Type: audio/x-wav;

* name="readme.exe"

/dev/null

:0 Bh

* ^Content-Type:.*audio/x-wav.*

* name="sample.exe"

/dev/null

#下面是过滤特定的邮件头,并把邮件内容放到指定的/mailhome/box文件中

#请注意b和h的区别,由于H是默认值,当只指定b的时候,其只会把邮件内容放到管道;

#而如果只是指定h的话,则会把邮件内容放到管道中。

:0 b

* ^Subject:.*test

/mailhome/box

#下面使用不指定检查内容,默认就是Hhb,也就是对邮件头过滤,并且把邮件头和内容放到管道

#另外,使用{}号可以把复合的动作括起来执行

:0

* ^Subject:.*Hello

{

0:

/dev/null

}

2、测试前的准备工作

◎创建日志文件

# touch /var/log/procmail.log

# chmod 666 /var/log/procmail.log

我现在还不能确认procmail是以什么用户去写日志的,试过postfix、nobody、root用户,都报错,只能先用666权限了。

◎创建垃圾桶

也就是上面定义的/mailhome/box,符合规则的邮件会写到这里。可以使用文件或目录,或绝对路径或相对于MAILDIR的路径。

使用文件的话,会追加邮件的内容;使用目录的话,会创建类似new/xxx的邮件信息。

※在测试的时候发现一个问题,procmail在写入这个目录或文件的时候,是以寄信人的权限进行的

也就是说,如果你把这里的路径放在$HOME目录下的某个文件或目录,则会报下面的错误:

引用

procmail: Error while writing to "./mailbox"

原因就是,procmail是使用寄信人来写该文件的,而寄信人通常都不能写到收信人的$HOME目录的权限咯。(除非自己寄给自己)

请正确理解该情况。

所以,我是把其放到一个通用目录中:

# mkdir /mailhome/

# chmod 777 /mailhome/

# touch /mailhome/box

# chmod 666 /mailhome/box

※您可以试试用目录来定义,就会发现问题了。

3、测试

$ mail -s 'test' linuxing

日志显示:

引用

From [email protected]  Fri Aug 31 16:33:05 2007

Subject: test

Folder: /mailhome/box

可以查看/mailhome/box获得问题邮件的信息。

四、问题

1、nobody问题

Google可以发现很多涉及nobody的问题:

引用

Aug 30 17:53:16 dc5test postfix/local[7704]: 63B7C8F39: to=<[email protected]>, relay=local, delay=0, status=bounced (can't create user output file. Command output: procmail: Couldn't create "/var/mail/nobody" )

原因有两个:

引用

1、DEFAULT、MAILDIR等变量定义有错;

2、有些文章写动作中的nobody是用户邮箱,实际上应该是文件或目录,如果没有找到这个文件目录,当然或报错啦。

2、帮助

引用

man procmailrc

/usr/share/doc/procmail-3.22/examples/1rmail

/usr/share/doc/procmail-3.22/examples/2procmailrc

/usr/share/doc/procmail-3.22/examples/2rmail

/usr/share/doc/procmail-3.22/examples/3procmailrc