我需要通过一个简单的队列后内容过滤器运行所有发往本地域(在 vmail_domains 中定义)的邮件,然后通过 sendmail 将处理后的电子邮件重新注入 Postfix。
我已经成功创建了一个 perl 过滤器,该过滤器基于后缀 FILTER_README 文档中显示的简单队列后内容过滤器的示例:
smtp inet n - n - - smtpd -o content_filter=statusFilter
statusFilter unix - n n - - pipe user=mailFilter argv=/mydir/filter.pl ${sender} ${recipient}
不幸的是,该过滤器仅过滤通过互联网到达的邮件,并错过了所有本地传送的邮件,例如 Postfix 退回邮件,而我特别需要处理退回邮件,无论它们如何到达。
是否有某种方法可以使用简单的队列后过滤器过滤所有发送到本地 Postfix 域的电子邮件,无论它是来自本地源还是远程源,同时永远不会过滤任何发送到远程(互联网)域的邮件?
答案1
不幸的是,该过滤器只能过滤通过互联网到达的邮件,而漏掉了所有本地传送的邮件,例如 Postfix 退回邮件、来自其他本地用户的消息以及通过 sendmail 来自本地脚本的消息。
这是其中之一局限性来自简单的内容过滤器。引自Postfix 文档
第一个例子设置起来很简单,但有很大的局限性,将在第二个例子中解决。Postfix 使用 smtpd(8) 服务器从网络接收未过滤的邮件,并使用 Postfix pipe(8) 投递代理将未过滤的邮件投递到内容过滤器。内容过滤器使用 Postfix sendmail(1) 命令将过滤后的邮件重新注入 Postfix,以便 Postfix 可以将其投递到最终目的地。
这意味着通过 Postfix sendmail(1) 命令提交的邮件不能进行内容过滤。
解决方案是使用高级内容过滤器。它使用 SMTP 与 postfix 通信,而不是使用管道。由于您当前的脚本无法与 SMTP 通信,因此您可以按照描述使用 smtpprox在文档中
对于不支持 SMTP 的内容过滤软件,Bennett Todd 的 SMTP 代理实现了一个不错的 PERL/SMTP 内容过滤框架。请参阅:http://bent.latency.net/smtpprox/。
它也是用 perl 编写的,但它是十多年前发布的。Jesse Norell 也在github 存储库。
是否有某种方法可以使用简单的队列后过滤器过滤所有发送到本地 Postfix 域的电子邮件,无论它是来自本地源还是远程源,同时从不过滤任何发送到远程(互联网)域的邮件?
Postfix 本身在执行时无法区分本地/远程域content_filter
。内容过滤决定是在清理守护进程电子邮件路由之前完成的另一种方法是手动检查 perl 脚本上的域。