仅适用于本地目的地的Postfix队列后过滤

我需要通过一个简单的队列后内容filter运行所有发往本地域的邮件(如vmail_domains中定义的),然后通过sendmail将处理后的邮件重新注入到Postfix中。

我已经成功创build了一个基于postfix FILTER_README文档中显示的简单的after-queue内容filter的示例的perlfilter:

smtp inet n - n - - smtpd -o content_filter=statusFilter statusFilter unix - nn - - pipe user=mailFilter argv=/mydir/filter.pl ${sender} ${recipient} 

不幸的是,这个filter只能过滤通过互联网到达的邮件,而不能完成所有的本地交付,比如Postfix退回邮件,我特别需要处理退回邮件,而不pipe邮件是如何到达的。

是否有某种方法可以使用简单的队列后filter对所有发往本地Postfix域的邮件进行过滤,无论邮件是从本地源还是从远程源过滤,而不过滤任何发送到远程(Internet)域的邮件?

不幸的是,这个filter只能过滤到达互联网的邮件,并且会丢失所有的本地邮件,如Postfix退回邮件,来自其他本地用户的邮件以及通过sendmail发送的本地脚本邮件。

这是简单的内容filter的限制之一。 从Postfix文档引用

第一个例子很简单,但有一个主要的局限性,第二个例子会解决这个问题。 Postfix通过smtpd(8)服务器接收来自networking的未经过滤的邮件,并使用Postfixpipe道(8)递送代理将未经过滤的邮件发送到内容filter。 内容filter使用Postfix sendmail(1)命令将过滤后的邮件注入Postfix,以便Postfix可以将其发送到最终目的地。

这意味着通过Postfix sendmail(1)命令提交的邮件不能被内容过滤。

解决scheme是使用高级内容filter 。 它使用SMTP来与使用pipe道的后缀交谈。 由于当前脚本无法与SMTP通信,因此可以按照文档中的说明使用smtpprox

对于不支持SMTP的内容过滤软件,Bennett Todd的SMTP代理实现了一个不错的PERL / SMTP内容过滤框架。 请参阅: http : //bent.latency.net/smtpprox/ 。

它也是用perl编写的,但是十多年前发布了。 另外Jesse Norell在github仓库中分出它。


是否有某种方法可以使用简单的队列后filter对所有发往本地Postfix域的邮件进行过滤,无论邮件是从本地源还是从远程源过滤而不过滤任何发送到远程(Internet)域的邮件?

在做content_filter时,Postfix本身无法区分本地/远程域名。 内容filter决定是在清理守护进程电子邮件路由之前完成的一种替代方法是手动检查您的perl脚本中的域。