postfix自带的黑白名单过滤比较简单,效果和功能都一般。如果使用第三方的验证,在带宽不足的情况下是一个问题。而procmail则是一个比较好的替代方案。其也可以使用正规表达式进行匹配,并可识别邮件头和内容,而根据规则把邮件导向到指定的目录或文件中。
不过,其权限控制似乎有点问题,而且一旦配置错误,会直接影响到整个邮件系统的发送结果。所以,在配置完后,请做仔细的验证工作。另外,网上有很多关于procmail的说明,但似乎有些误解,下面会提及到。
一、安装
在红旗DC Server 5.0上默然安装有procmail:
procmail-3.22-14.1AX
没有安装的,请找光盘安装即可。
二、规则
procmail可以支持的检查内容和规则很多,常见的有:
1. 关于检查邮件的部分(第一行),flags 包含有:
B : 对邮件内容的检查
h : 把邮件头的数据放入管道、文件及邮件并导向到后面规则中指定的地方(纯头信息)
b : 把邮件内容的数据放入管道、文件及邮件并导向到后面规则中指定的地方(纯内容)
2. 关于检查内容的部分:
< : 检查 mail 的总长度是否小于设定值 ( bytes )
> : 与 < 相反的选择啰!
3. 关于动作的部分
或通过绝对或相对路径,指定一个目录或文件,通过管道写入该地方。
4. 其它的环境变量部分:
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的内容:
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、测试前的准备工作
◎创建日志文件
# chmod 666 /var/log/procmail.log
我现在还不能确认procmail是以什么用户去写日志的,试过postfix、nobody、root用户,都报错,只能先用666权限了。
◎创建垃圾桶
也就是上面定义的/mailhome/box,符合规则的邮件会写到这里。可以使用文件或目录,或绝对路径或相对于MAILDIR的路径。
使用文件的话,会追加邮件的内容;使用目录的话,会创建类似new/xxx的邮件信息。
※在测试的时候发现一个问题,procmail在写入这个目录或文件的时候,是以寄信人的权限进行的
也就是说,如果你把这里的路径放在$HOME目录下的某个文件或目录,则会报下面的错误:
原因就是,procmail是使用寄信人来写该文件的,而寄信人通常都不能写到收信人的$HOME目录的权限咯。(除非自己寄给自己)
请正确理解该情况。
所以,我是把其放到一个通用目录中:
# chmod 777 /mailhome/
# touch /mailhome/box
# chmod 666 /mailhome/box
※您可以试试用目录来定义,就会发现问题了。
3、测试
日志显示:
Subject: test
Folder: /mailhome/box
可以查看/mailhome/box获得问题邮件的信息。
四、问题
1、nobody问题
Google可以发现很多涉及nobody的问题:
原因有两个:
2、有些文章写动作中的nobody是用户邮箱,实际上应该是文件或目录,如果没有找到这个文件目录,当然或报错啦。
2、帮助
/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
[解]处理auxpropfunc error no mechanism available错误
Postfix进阶管理-MDA部分
Postfix进阶管理-MTA部分
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/linux/112721.html