我想通过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
参数被传递到输入服务(smtpd
、pickup
、qmqpd
)时。发生这种情况时,postfix 将覆盖消息路由并将电子邮件发送到content_filter
。
另请注意,默认情况下,所有 Postfix 服务都从中获取参数值,main.cf
除非您使用以下命令覆盖它-o 参数=值 。但并非服务使用的master.cf
每个参数。例如,man 5 postconf
内容过滤器仅由使用pickup
,smtpd
因此qmqpd
你可以把-o content_filter=amavis:[127.0.0.1:10025另一个例子是,把-o smtp_bind_地址因为smtpd
此参数仅在smtp
服务中使用。
同样的论点也可以应用到你的问题上,“为什么我可以通过-o 虚拟传输在pickup
?”
以下是适合您设置的几种替代方案
按照 postfix 文档中的说明使用
content_filter
。缺点是您还会扫描在域外中继的电子邮件。使用
content_filter
通过 ACCESS 表和 FILTER 操作。通过这种方式,您可以有选择地扫描收到的电子邮件。不幸的是,您必须再次在该表中列出您的。 。您可以通过将 ACCESS 表小心地放在 之后来避免这种情况virtual domain
permit_mynetworks
。permit_sasl_authenticated
通过这种方式,外发电子邮件将被允许,并且您只扫描收到的电子邮件。(感谢楼主的评论:) )使用Postfix 多实例。通过这种方式,您可以保留参数
virtual_transport
,而 spamc 会将电子邮件注入您的第二个实例。然后您可以virtual_transport
在不同的实例中定义不同的。但如果您想保持设置简单,这有点过头了。