在 debian 上使用 postfix 2.9 我已经配置了队列前代理过滤器来扫描垃圾邮件和病毒smtpd_proxy_filter=127.0.0.1:27
。我使用的是代理过滤器而不是内容过滤器,因此我可以直接拒绝电子邮件(使用队列后内容过滤器,我只能丢弃电子邮件并选择性地将反向散射发送到伪造的发件人地址)。
我还想使用策略服务来限制每个 SASL 用户名发送的电子邮件数量。这是在smtpd_recipient_restrictions
之前配置的permit_sasl_authenticated
。策略守护程序工作正常,但后缀抱怨它无法保留带有此消息的电子邮件:
warning: access table inet:127.0.0.1:10031: with smtpd_proxy_filter
specified, action HOLD is unavailable
根据这个线程,这是不可能的:
要使用 smtpd_proxy_filter 保留邮件,请在过滤器之后使用 smtpd 进程指定 HOLD 操作。
我已经尝试过了,但是当我将策略服务放在代理过滤器之后的 smtpd 守护程序上时(在我的例子中是端口 26 上的 smtpd),它没有得到任何 SASL 信息(通过 tcpdump 确认)。
smtpd :25 ---> before-queue proxy localhost:27 ---> smtpd localhost:26
那么如何将这两个检查结合起来呢?
编辑:也许嵌套的队列前过滤器会起作用?然后我需要使用不同的程序进行 SASL 检查,或者进行一些过滤器/策略协议重写......
最后,我已经能够提出可以正常工作的解决方案,尽管它是一个两步的方法。
首先,我修改了策略守护程序(后缀线索者 v2)配置以返回PREPEND指令而不是 HOLD。我正在添加一个特殊的标头,稍后将对其进行评估:
PREPEND X-cust-policy: Hold
. 这甚至可以与队列前代理过滤器结合使用。其次,我使用了中的指令来检查我以后添加的内容。此检查由守护程序在邮件进入队列之前进行评估。因此,电子邮件通过包括策略守护程序在内的所有检查后,将通过队列前过滤器,然后由守护程序处理。通常它应该将消息放入传入队列,但是当它找到此标头时,将邮件直接放入保留队列中。
header_checks
pcre:/etc/postfix/header_hold
main.cf
cleanup(8)
cleanup(8)
这是PCRE 表文件的内容
/etc/postfix/header_hold
:唯一需要注意的是,基于标头的检查也会在返回的无法投递的邮件上触发(但从保留队列中释放的邮件会被退回的情况并不常见)。
此外,我还必须更新 cuebringer webui 以支持 Quotas 模块的 PREPEND 操作,尽管守护程序本身已经支持它(Debian wheezy 中的版本)。