如何一次刷新后缀队列一封邮件?

vin*_*t.m 7 email-server postfix queue

有时,邮件会卡在我的 postfix 队列中,远处的服务器会说“连接太多,速度变慢”。我已经将特定域的 postfix 配置为每秒仅发送一封邮件,但有时似乎不够。

我知道postqueue -f,但它同时发送所有邮件,并且邮件以相同的状态保持在队列中。

我想一次刷新一封邮件的后缀队列,假设每秒一封邮件(或 2 封或更多)。

Jen*_*y D 8

可以刷新一封特定的电子邮件,而不是整个队列。如果您依次为每条消息执行此操作,并且消息之间有两秒钟的睡眠时间,那应该可以满足您的要求。

首先,您需要找到队列中邮件的队列 ID。您可以通过使用命令来获得它postqueue -p。这是一个示例输出:

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
6777D6E1E      3517 Mon Jan 25 03:03:02  sender@example.se
                                         recipient@example.com

69F6471CA      2820 Tue Jan 26 03:24:17  sender@example.se
                                         recipient@example.net
Run Code Online (Sandbox Code Playgroud)

您需要的是第一列。您可以通过 grep 和 cut 的一些管道获取所有 ID,如下所示:

[jenny@sameen ~]$ postqueue -p | grep -v ^- | grep -v "(" | cut -d' ' -f1 |grep -e [[:alnum:]]
6777D6E1E
69F6471CA
Run Code Online (Sandbox Code Playgroud)

现在您知道如何获取 ID,您可以将它们放入 bash 循环并稍作睡眠:

[jenny@sameen ~]$ for ID in `postqueue -p | grep -v ^- | grep -v "(" | cut -d' ' -f1 |grep -e [[:alnum:]] `; do postqueue -i $ID; sleep 2; done
Run Code Online (Sandbox Code Playgroud)

  • 几乎完美,只需要排除以“(”开头的行,谢谢!这给出:`for ID in \`postqueue -p | grep -v ^-| cut -d' ' -f1 |grep -e [[:alnum :]]\` | grep -v "("; do postqueue -i $ID; sleep 2; done` (2认同)
  • 首先,祝贺@JennyD 的好主意和@vincent.m 的必要改进(我对你们两个都做了+1)。不幸的是 vincent.m 的答案在错误的位置有反引号。这是在 Debian 8 中测试过的正确命令:`for ID in \`postqueue -p | grep -v ^-| cut -d' ' -f1 |grep -e [[:alnum:]] | grep -v "("\`; do postqueue -i $ID; sleep 2; done` (2认同)