用procmail做域过滤[1]

[入库:2005年9月21日] [更新:2007年3月24日]

本文简介:


假设qmail虚拟域为wangxu.com,现要整个域针对主题包含test的邮件进行过滤拦截,被过滤拦截的邮件均保存在/home/vpopmail/domains/wangxu.com/spammail目录下,以msg.* 命名的文件中,具体实现过程如下: 

1、cd /home/vpopmail/domains/wangxu.com/ 

touch .procmailrc 

chown vpopmail:vchkpw .procmailrc 

mkdir spammail #被过滤文件的存放处 

chown vpopmail:vchkpw spammail 

touch /var/log/procmail.log 

chown vpopmail:vchkpw /var/log/procmail.log 

建立.procmailrc文件 
vi .procmailrc 

[code:1:31f83bb3df]MAILDIR=./ 

VERBOSE=off 

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

LOGFILE=/var/log/procmail.log 

:;0:; 

* ^Subject:;.*test 

./spammail/ [/code:1:31f83bb3df]

 
注意这里.和
http://www.chinaunix.net/jh/14/194261.html
相比较,会发现域过滤的.procmailrc少了
[code:1:31f83bb3df]:;0 

./Maildir/[/code:1:31f83bb3df]
这一段代码

2.
修改.qmail-default文件
joe  .qmail-default

| preline /usr/local/bin/procmail -t ./.procmailrc 
| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox

 
针对以上信息,系统可以对wangxu.com整个域所接收的邮件进行主题含有test的邮件过滤和拦截.

可以和
http://www.chinaunix.net/jh/14/195027.html
这篇比较一下,应该会很容易看明白实现的思路的

同样也要注意一点.
假如某个用户做了转发或者别名的话,域目录下会生成.qmail-user文件,这样该用户邮件到达时,就会去执行.qmail-user文件的内容,导致无法进行过滤. 

所以需要注意的就是,在设置别名或转发的时候,要在生成的.qmail-user文件里也加上这一句 
| preline /usr/local/bin/procmail -t ./.procmailrc 

保证邮件先进行过滤再分发到用户目录,这样就可以实现了.


以上的这些以及以前写的几篇用maildrop和procmail实现过滤的办法,都在freebsd上测试通过.其他系统应该也一样.

 tomgod 回复于:2003-11-05 17:07:12
如果邮件是给你那里tom用户的,将会直接放在 /var/spool/mail/vpopmail
下,但是| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox 
又将信笺完整投递到了原来的邮箱里(这里好坏且不说),问题在于,即使是那些主题是test的信笺,它依然投递到了原来的用户那里去了,我晕呀

 seacaptain 回复于:2003-11-05 17:13:48
1、| preline /usr/local/bin/procmail -t ./.procmailrc 应该改成
| preline /usr/local/bin/procmail -t -m -p  ./.procmailrc 否则邮件会发到/var/spool目录里了
2、过滤后邮件仞然会收到被过滤的邮件。过滤不过滤有什么用?

 artxing 回复于:2003-11-05 17:15:56
我测试过的.是不会的.

你们都提到了/var/spool目录,可我根本没有设置这个目录,过滤和这个目录有什么关系呢?

 artxing 回复于:2003-11-05 17:22:14
我讲一下原理吧

邮件先在域目录下找有没有.qmail-user文件,如果不存在,就去找.qmail-default执行它的内容

我的.qmail-default的内容:

[code:1:8fec73f8db]| preline /usr/local/bin/procmail -t ./.procmailrc 
| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox[/code:1:8fec73f8db]

则先执行| preline /usr/local/bin/procmail -t ./.procmailrc ,去当前目录下找.procmail过滤规则文件.

.procmail的文件内容:
[code:1:8fec73f8db]MAILDIR=./ 

VERBOSE=off 

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

LOGFILE=/var/log/procmail.log 

:;0:; 

* ^Subject:;.*test 

./spammail/ [/code:1:8fec73f8db]

邮件主题中包含test字符的就被发到./spammail,也就是当前路径下的spammail目录中,而不符合这一过滤规则,即主题中不包含test字符的就不会执行这条过滤规则.转而继续执行.qmail-default文件中的第二条语句.
| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox 

有vdelivermail来决定邮件分发到哪个用户目录或者直接bounce

还有一点,我的procmail是在freebsd中ports编译装的.

 tomgod 回复于:2003-11-05 17:39:36
artxing   ,请教一下,你安装procmail时候有没有修改什么参数?
还是直接的用./configure就开始编译安装了???
因为默认的安装状态下,procmail是将邮件投递到/var/spool 下的,好象需要修改某个文件里的什么参数,才能支持./Maildir的,可是我一直没有修改成功(菜鸟一只,莫怪莫怪)。
还有,在.qmail-default里的程序,
| preline /usr/local/bin/procmail -t ./.procmailrc 
| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox 
好象前后二者都将执行,我晕呀,在我这里,过滤也起作用了,可是后一句也起作用了,依然将文件扔进了我的目录
实在有些不明白,真的希望能有人指点一、二
多谢多谢

 seacaptain 回复于:2003-11-05 17:39:38
我的理解是。所有的邮件都会先被| preline /usr/local/bin/procmail -t ./.procmailrc 处理,
然后在被| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox处理。
2、rpm包安装的版本默认都是处理非maildir格式的邮箱所以会找/var/spool/目录了
procmail[5356]: Couldn't renamebogus "/var/spool/mail/vpopmail" into "/var/spool/mail/BOGUS.vpopmail.h1H"
这是/var/log/procmail.log里的原文

 artxing 回复于:2003-11-05 17:48:01
seacaptain的理解没错的

邮件就是先被| preline /usr/local/bin/procmail -t ./.procmailrc 处理

处理后剩下的就是不符合过滤规则,再去被| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox处理

所以不会出现tomgod说的过滤后的邮件也会到用户目录里的情况

还有就是,我的procmail是在freebsd下的ports装的,所以可能它是自动带了参数编译的.所以不会出现将邮件投递到/var/spool/目录的情况

 liuwping 回复于:2003-11-06 09:41:39
邮件就是先被| preline /usr/local/bin/procmail -t ./.procmailrc 处理 

此时如我在 上面的.procmailrc 中有用 SAFECAT (作用是直接将正在过滤的 暂时电邮 MOVE 到指定的目录可以是MAILDIR 目录) ,有个问题是 正在运行上面那句时 QMAIL的暂存电邮放在哪里呢? 因为电邮在处理前一定有个 TMP 的暂存电邮的!

 peijun.jiang 回复于:2003-11-06 10:08:50
大家有没有看lifewithqmqail的关于procmail的这一段话:

5.1. 关于 procmail
procmail 是一个流行的邮件传送代理( Message Delivery Agent , MDA). MDA的功能是从MTA为特定用户或者邮箱接收邮件, 然后按照用户的要求传送邮件的程序. procmail 可以用来针对邮件主体或者不同的邮件头内容过滤邮件. 举一个例子, 从某个特定的人发来的邮件可以被定向传送到某个专门为这个人准备的邮箱.

在qmail上应用procmail有两个技巧. 第一个, procmail 通常被配置成传送邮件到/var/spool/mail 下的邮箱. 你可以重新设置安装procmail到缺省的$HOME路径下, 或者指导用户不要依赖procmail 投递邮件到默认的mbox位置. 除非你为$HOME邮件投递打补丁, 否则, procmail依然会使用/var/spool/mail 作为临时文件. 

另外一个问题是qmail-command和procmail使用的退出码是不同的. procmail使用的是标准UNIX退出码: 零代表成功, 非零代表失败, 失败的原因由/usr/include/sys/errno.h 定义. qmail-command 使用某个非零码指示永久错误, 其余作为临时码. 解决方式可以应用一个小的shell脚本为 qmail-command 翻译退出码. 这样的一个shell脚本曾经在qmail 邮件列表刊登, 现在被存档在这个位置http://www.ornl.gov/its/archives/mailing-lists/qmail/1998/04/msg00487.html. 

同样的情况, 旧版本的procmail(3.14之前)不能直接传送邮件给maildir格式的邮箱. 最好的办法是升级你的procmail到最新版本. 另外一个解决办法是使用safecat, 这个程序将标准输入的邮件写入指定的maildir格式的邮箱. 用户可以使用 procmail 处方(传送指令)来使用safecat 保存邮件. 也可以完全跳过procmail, 使用maildrop. 

最后, procmail 认为邮件将被接收到mbox格式的邮箱, 常规的qmail传送程序仅仅包括实际的邮件, 而不包括"From"行. 这里可以使用preline 命令来格式化邮件, 以保证procmail的要求. 上面链接的脚本就包括了 preline. 

举一个例子, 假设用户"dave"希望用procmail来处理他的邮件. 他的系统管理员设置procmail来传送邮件到默认的$HOME, 并且已经配置好了上面的退出码翻译脚本程序, 位置在 /usr/local/bin/qmail-procmail, 那么他的.qmail文件应该是这个样子的: 

    |/usr/local/bin/qmail-procmail

 liuwping 回复于:2003-11-06 10:20:23
这个我看过, 但|/usr/local/bin/qmail-procmail  后如跟 PROCMAIL 文件就运行不了 即 |/usr/local/bin/qmail-procmail -P —M  。/。PROCMAILRC 如这样就不起作用了!

 liuwping 回复于:2003-11-06 10:23:05
在qmail上应用procmail有两个技巧. 第一个, procmail 通常被配置成传送邮件到/var/spool/mail 下的邮箱. 你可以重新设置安装procmail到缺省的$HOME路径下, 或者指导用户不要依赖procmail 投递邮件到默认的mbox位置. 除非你为$HOME邮件投递打补丁, 否则, procmail依然会使用/var/spool/mail 作为临时文件. 
PROCMAIL 怎样才可以设定 临时文件在哪里啊  我目前只知 当运行 | /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox 后, 暂时的电邮在 对应的 MAILDIR 下的 \TMP 下,如果没有运行这句之前暂时电邮到底在哪里啊!

 reidstone 回复于:2003-11-06 14:08:50
应该是系统根目录下的/tmp目录下吧

 liuwping 回复于:2003-11-10 18:41:24
在qmail上应用procmail有两个技巧. 第一个, procmail 通常被配置成传送邮件到/var/spool/mail 下的邮箱. 你可以重新设置安装procmail到缺省的$HOME路径下, 或者指导用户不要依赖procmail 投递邮件到默认的mbox位置. 除非你为$HOME邮件投递打补丁, 否则, procmail依然会使用/var/spool/mail 作为临时文件. 

请问这里有讲 为$HOME邮件投递打补丁 怎么打呢,因为我现在也有这个问题存在, 就是总有一封电邮又会返回给我!

 a791223 回复于:2004-02-07 14:14:20
我的情况和tomgod一样,就是产生了过滤但是邮件还是发到用户名的邮箱里。
加上-m -p参数是什么意思呢,请大家帮助。

 a791223 回复于:2004-02-07 15:33:52
我用的是rpm安装包,因如何设置才可以用真的过滤掉。

 chengzhigang 回复于:2004-02-20 11:16:45
我也是啊我的情况和tomgod一样,就是产生了过滤但是邮件还是发到用户名的邮箱里

 十二少 回复于:2004-03-03 12:12:26
过滤是没问题,但是邮件都没有发送到用户的Maildir/new里面,而是都发送到/home/vpopmail/domains/xxx.com/Maildir里面了,怎么解决啊???急!!!

 jackieyuan 回复于:2004-04-24 17:11:23
To install procmail, lockfile and formail: edit Makefile & config.h accordingly and type 'make install'.

Intended configurable options in Makefile are:
        the install-destinations (primarily BASENAME) and the
        LOCKINGTEST directories

本文关键:用procmail做域过滤
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top