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

Mit*_*tar 2 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}
Run Code Online (Sandbox Code Playgroud)

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

小智 6

添加-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}
Run Code Online (Sandbox Code Playgroud)

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


小智 6

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

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

这允许传递程序将消息标记为无法传递,而不是总是重试。并保留该soft_bounce选项作为调试安全网。

(我很感激你已经有了答案,但我认为这可能对其他发现这个问题的人有用)