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

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

运输看起来像这样:

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

这应该是可能的,根据后缀文档 :

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

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

从我对postfix文档的理解中,使用postfix sendmail发送的sendmail被放在maildrop目录中,然后用pickup 。 我试图追加一个-o virtual_transport=dovecot到皮卡运输,以避免队列,但这并没有帮助。 (这些选项只能附加到SMTP传输我想)。

我怎样才能将用spamassassin扫描的邮件重新input到队列中进行最终交付,而不会导致循环?

我怎样才能将用spamassassin扫描的邮件重新input到队列中进行最终交付,而不会导致循环?

不,你不能

说明

我明白你使用virtual_transport将邮件传送到垃圾邮件刺客的原因。 您只需扫描用于virtual_mailbox_domain的电子邮件。 不幸的是,它不遵循推荐 的简单内容filter设置,即使用content_filter参数代替virtual_transport

为什么我不能通过virtual_transport皮卡或smtpd?

一般来说,这里是通过Postfix代码的电子邮件旅程

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

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

另外请注意,默认情况下,除非您在master.cf使用-o参数=值覆盖它,否则所有后缀服务都将从main.cf获取参数值。 但不是服务使用的man 5 postconf每个参数。 例如,只有pickupsmtpdqmqpd使用的content_filter ,所以你可以把-o content_filter = amavis:[127.0.0.1:10025放在它们上面。 另外一个例子,把smtp_bind_address放在smtpd不明智的 ,因为这个参数只用于smtp服务。

同样的理由可以适用于你的问题,“为什么我可以通过-o virtual_transport pickup

所以这里有几个select你的设置

  • 按照postfix文档中的说明使用content_filter 。 缺点是你也扫描在你的域外传播的电子邮件。

  • 通过ACCESS表和FILTER操作使用content_filter 。 通过这种方式,您可以select性地扫描收到的电子邮件。 不幸的是,你必须再次login你的virtual domain 。 您可以通过在permit_mynetworkspermit_sasl_authenticated之后仔细放置ACCESS表来避免它。 通过这种方式,传出的电子邮件将被允许,您只扫描传入的电子邮件。 ( 感谢OP评论 :))

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