Postfix如何将策略服务与代理filter一起使用

在debian上使用postfix 2.9我configuration了用于扫描垃圾邮件和病毒的前队列代理filtersmtpd_proxy_filter=127.0.0.1:27 。 我使用代理filter,而不是内容filter,以便我可以直接拒绝电子邮件(与队列后内容filter,我只能丢弃电子邮件,并可选地发送后向散射到伪造的发件人地址)。

我还希望使用政策服务来限制每个SASL用户名发送的电子邮件数量。 这是在smtpd_recipient_restrictions之前的permit_sasl_authenticatedconfiguration的。 策略守护进程工作正常,但后缀的抱怨,它不能保持与此消息的电子邮件:

 warning: access table inet:127.0.0.1:10031: with smtpd_proxy_filter specified, action HOLD is unavailable 

按照这个线程 ,这不是直接可能的:

要使用smtpd_proxy_filter保留邮件,请在filter之后使用smtpd过程指定HOLD操作。

我已经试过,但是当我把代理filter(在我的情况下,在端口26上的smtpd)的smtpd守护进程上的政策服务,它不会得到任何SASL信息(确认与tcpdump)。

 smtpd :25 ---> before-queue proxy localhost:27 ---> smtpd localhost:26 

那么我怎么把这两个检查结合起来?

编辑:也许嵌套之前,队列filter将工作? 然后,我需要使用不同的SASL检查程序,或者做一些filter/政策协议重写…

最后,我已经能够想出解决scheme,虽然这是一个两步走的方法。

首先,我修改了策略守护进程(postfix cluebringer v2)configuration,以返回PREPEND指令而不是HOLD。 我将添加一个特殊的标题,稍后将对其进行评估: PREPEND X-cust-policy: Hold 。 即使与前队列代理filter结合使用,也是如此。

其次,我在main.cf使用了伪指令header_checks pcre:/etc/postfix/header_hold来检查我以后添加的内容。 在邮件进入队列之前,由cleanup(8)守护程序评估此检查。 因此,在通过包括策略守护进程在内的所有检查传递电子邮件后,它将通过before-queue筛选器,然后由cleanup(8)守护进程处理。 通常它应该将消息放入传入队列,但是当它find这个头时,邮件就直接放入保留队列。

这是PCRE表文件/etc/postfix/header_hold

 ### PCRE format, no postmap command! # Hold all email with specified header (which is inserted by policy service) /^X-cust-policy: Hold/ HOLD 

唯一需要注意的是,基于标题的检查也会触发返回的无法投递的邮件(但是从保留队列释放的电子邮件将不会反弹)。

此外,我必须更新cluebringer webui来支持Quotas模块的PREPEND操作,尽pipe守护进程本身已经支持它(Debian的版本)。