在Postfix / Courier + MySQL虚拟用户上设置对垃圾邮件的Procmail过滤

我一直在寻找如何做到这一点的资源,但没有太多的运气。

我正在运行一个基于Postfix和Courier with MySQL的工作MTA / MUA作为虚拟用户的后端。 我基于我的系统在下面的文章:

https://help.ubuntu.com/community/PostfixCompleteVirtualMailSystemHowto

这是很好的,直到空的部分! 我的SMTP / IMAP设置工作得很好,我设法得到SpamAssassin和ClamAV以及我在网上find的一些单独的文档。

我需要帮助的是设置Postfix使用Procmail作为mailbox_command,以便它可以与虚拟用户一起使用。 我希望能够为每个虚拟用户分别定义不同的Procmail规则。 我读过Postfix文档,据我所知,mailbox_command的默认function只适用于本地(非虚拟)用户。

提前致谢!

更新:

自从这篇文章,我已经认识到,mailbox_command不是成立的。 相反,我find了一个使用transport_maps来做到这一点的方法。 在下面阅读我自己的答案。

创build一个全局procmailrc,并为每个用户制定一个这样的规则:

:0 ^[email protected] | /usr/bin/procmail -m /etc/procmailrcs/someuser 

/ etc / procmailrcs /中的每个文件通常的最终规则应该是通过pipe道传递消息来传递(8)。

如果你有很多用户,并且不想维护这种性质的文件,那么可以考虑编写一个parsing邮件头文件的脚本来找出/ etc / procmailrcs /中的哪个文件,并相应地执行procmail,然后设置脚本作为您的mailbox_command。

这篇文章是有帮助的: http : //www.linuxbackups.org/virtual-procmail 。

我必须克服两个问题。 首先,解决scheme需要一个静态文件来保存用户/传输地图。 我需要一个虚拟解决scheme。 所以,而不是创build/ etc / postfix / transport,我的main.cf说:

 transport_maps = mysql:/etc/postfix/mysql_virtual_transport_maps.cf 

这是我的mysql_virtual_transport_maps.cf:

 user = ****** password = ****** hosts = 127.0.0.1 dbname = postfix table = mailbox select_field = transport where_field = username 

这样就解决了“虚拟”的要求。 另一个问题是我的目录结构不同于procmailrc.common的例子。 这是我的procmailrc.common:

 :0 * RECIPIENT ?? .*@\/.*$ { DOMAIN = "$MATCH" } #added RECIPIENT variable and we extract domain name MAILDIR="$HOME/$DOMAIN/$USER@$DOMAIN" DEFAULT="$MAILDIR/" LOGFILE="./procmail.log" VERBOSE=YES #each user will set his own log file NL=" " WS=" " SWITCHRC="$HOME/$DOMAIN/$USER@$DOMAIN/.procmail" 

希望这有助于其他人可能会尝试做类似的事情。

-AJ