如何配置 Postfix 来重新排队无法通过管道传送的电子邮件?

如何配置 Postfix 来重新排队无法通过管道传送的电子邮件?

我正在使用 SSH 上的管道将一些电子邮件传送到另一台服务器进行特殊处理,我已经在 master.cf 中进行了配置。

foobar   unix    -   n   n   -   -   pipe
  flags=RF user=foobar:foobar argv=/usr/bin/ssh -T foobar@foobar /usr/local/bin/foobar ${recipient}

我遇到的问题是,如果此服务器不可用(或由于其他原因 SSH 连接失败),整个传递将失败,并且发件人会收到有关该消息。我希望的是,如果失败,该电子邮件将被放回到队列中以供稍后重试。并且只有几天没有进行此传递,发件人才会收到有关该消息的通知。我如何以这种方式配置 Postfix?

答案1

添加-o soft_bounce=yes到中的定义master.cf

例子:

foobar   unix    -   n   n   -   -   pipe
  -o soft_bounce=yes
  flags=RF user=foobar:foobar argv=/usr/bin/ssh -T foobar@foobar /usr/local/bin/foobar ${recipient}

这将使邮件永远保留在延迟队列中(或者直到机器恢复运行并且 postfix 重试它),并且不会在几天后被退回,但这是我能找到的最好的方法(即使它隐藏得很好)。

答案2

如果正在投递的命令pipe返回退出代码 75,则会导致投递被推迟而不是退回。或者,如果输出的第一行似乎具有扩展的 SMTP 状态(例如“4.2.0”),则优先考虑。

我会将 ssh 命令包装在 shell 脚本或类似的东西中,以检测故障并将其转换为正确的输出/退出状态。

这样,投递程序就可以将消息标记为无法投递,而不是总是重试。并将该soft_bounce选项保留为调试安全网。

(我很感激你已经有了答案,但我认为这可能对其他任何遇到这个问题的人来说都是有用的替代方案)

相关内容