如何使用 sendmail 将扫描的邮件重新注入队列

如何使用 sendmail 将扫描的邮件重新注入队列

我想通过virtual_transport传输spamassassin(main.cf:)传递收到的邮件virtual_transport=spamassassin,然后使用 sendmail 将扫描的邮件重新注入 postfix。

传输如下所示:

spamassassin unix   -    n     n   -   -    pipe
    flags=hu user=vmail:mail argv=/usr/bin/spamc -u ${recipient} -e /usr/sbin/sendmail -f ${sender} ${recipient}

根据postfix 文档

高流量站点应避免使用通过 Postfix sendmail(1) 和 postdrop(1) 重新注入扫描邮件的“简单”内容过滤器。

通过我当前的 sendmail 调用/usr/sbin/sendmail -f ${sender} ${recipient},邮件会循环传递到队列中,然后再返回到 spamassassin 等等。

根据我对 postfix 文档的理解,使用 postfix 传递的邮件sendmail会被放入目录中maildrop,然后使用 拾取pickup。我尝试将 附加-o virtual_transport=dovecot到拾取传输中以避免排队,但这没有帮助。(我想这些选项只能附加到 smtp 传输中)。

我怎样才能将使用 spamassassin 扫描的邮件重新注入队列以进行最终投递而不造成循环?

答案1

我怎样才能将使用 spamassassin 扫描的邮件重新注入队列以进行最终投递而不造成循环?

不,你不能

解释

我理解你使用管道将电子邮件输入 Spam Assassin 的原因virtual_transport。你只想扫描发送给你的电子邮件virtual_mailbox_domain。不幸的是,它不遵循受到推崇的 简单内容过滤器的设置而是使用content_filter参数virtual_transport

为何我无法传递virtual_transport给 pickup 或 smtpd?

一般来说,这里是跨后缀代码的电子邮件旅程

Input  --> cleanup --> qmgr --> Output 
*smtpd                          *local     
*pickup                         *virtual
*qmqpd                          *smtp
                                *lmtp
                                *pipe

cleanup守护进程中,postfix 将“路由”您的电子邮件,无论它们属于虚拟、本地、 smtp 还是其他传输。一种例外是当非空content_filter参数被传递到输入服务(smtpdpickupqmqpd)时。发生这种情况时,postfix 将覆盖消息路由并将电子邮件发送到content_filter

另请注意,默认情况下,所有 Postfix 服务都从中获取参数值,main.cf除非您使用以下命令覆盖它-o 参数=值 。但并非服务使用的master.cf每个参数。例如,man 5 postconf内容过滤器仅由使用pickupsmtpd因此qmqpd你可以把-o content_filter=amavis:[127.0.0.1:10025另一个例子是,把-o smtp_bind_地址因为smtpd此参数仅在smtp服务中使用。

同样的论点也可以应用到你的问题上,“为什么我可以通过-o 虚拟传输pickup?”

以下是适合您设置的几种替代方案

  • 按照 postfix 文档中的说明使用content_filter。缺点是您还会扫描在域外中继的电子邮件。

  • 使用content_filter 通过 ACCESS 表和 FILTER 操作。通过这种方式,您可以有选择地扫描收到的电子邮件。不幸的是,您必须再次在该表中列出您的virtual domain。 。您可以通过将 ACCESS 表小心地放在 之后来避免这种情况permit_mynetworkspermit_sasl_authenticated通过这种方式,外发电子邮件将被允许,并且您只扫描收到的电子邮件。(感谢楼主的评论:) )

  • 使用Postfix 多实例。通过这种方式,您可以保留参数virtual_transport,而 spamc 会将电子邮件注入您的第二个实例。然后您可以virtual_transport在不同的实例中定义不同的。但如果您想保持设置简单,这有点过头了。

相关内容