对于我目前正在进行的一个项目,我们收到了一个“动态”邮件附件大小限制的要求。对于 Postfix(我们目前使用的),这可以通过配置选项轻松实现message_size_limit
。然而,这会阻止用户发送带有附件的电子邮件。我们的用例需要两个不同的限制。在某些情况下,会应用较低的限制,但这对用户来说应该是透明的。他们仍然应该能够发送带有小于最大限制的附件的电子邮件。
因此,我们希望防止出现“邮件过大”的拒收邮件,而是将邮件排队,以便稍后重新尝试发送。这样,当附件的大小限制再次增加时,邮件仍会发送给收件人。
背景
我们需要这种能力,因为船只有时可以连接到慢速卫星上行链路,有时可以连接到高速上行链路。对于高速上行链路,大型附件(<20MB)不是太大的问题,但对于带宽非常低的卫星连接,这就会成为一个问题,所以我们想限制附件大小。然而,这不应该对用户可见,因为他不知道当前的上行链路类型。
答案1
这里我假设你有一个监控服务器上行链路状态的机制。当上行链路发生变化时,你需要运行下面描述的脚本。
Postfix 仅在将消息排队之前检查消息大小。操作可以是200 接受或者5XX 拒绝。没有自定义操作,例如“嘿,postfix,请保留这条大消息,直到我们连接到高速上行链路”。
因此,我们需要同伴。您可以使用后发为您检查邮件大小。当您的邮件超出 postfwd 的限制时,您可以定义自定义操作,例如抓住行动。根据man 5 访问,当 HOLD 操作应用于消息时
抓住可选文本...
将消息放入保留队列,直到有人将其删除或释放以供传送。如果指定,则记录可选文本,否则记录一般消息。
因此,这里的想法是:
- 当您连接到慢速上行链路时,将下限放在 postfwd 中。当用户发送的消息超过下限时,postfix 将保留该消息。该消息留在队列中,postfix 不会费心发送它。
当您连接到高速上行链路时,脚本会将上限放在 postfwd 中。然后必须发出脚本后超级命令
root
从 HOLD 队列中释放电子邮件。postsuper -H ALL
注意,此时 postfwd 限制必须大于
message_size_limit
postfix 中的限制。否则,postfix 不会拒绝大消息,而是将其保留。当您再次连接到慢速上行链路时,将下限放在 postfwd 中。
postfwd 的示例规则是
# replace 192.168.1.0/24 with your local network and 12345 with limit size
id=RULE001
client_address=192.168.1.0/24
size=12345
action=HOLD exceed slow link limit