Aug 30

[原]Postfix进阶管理-procmail部分 不指定

linuxing , 17:00 , 网络服务 » 邮件系统 , 评论(0) , 引用(0) , 阅读(29123) , Via 本站原创 | |
   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 user@linuxfly.cn  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=, 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


Tags: , ,
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]