Иногда письма застревают в моей очереди postfix, когда удаленный сервер говорит: «Слишком много соединений, замедление». Я уже настроил свой постфикс для определенных доменов, чтобы отправлять только одно письмо в секунду, но иногда этого кажется недостаточно.
я знаю postqueue -f
, но он отправляет все письма одновременно, и письма остаются в очереди с тем же статусом.
Я хотел бы очистить очередь постфикса по одному письму за раз, скажем, одно письмо каждую секунду (или 2, или больше).
Можно очистить одно конкретное письмо, а не всю очередь. Если вы сделаете это для каждого сообщения по очереди, с двухсекундным сном между сообщениями, это должно сделать то, о чем вы просите.
Во-первых, вам нужно найти идентификаторы очередей писем в очереди. Вы можете получить это с помощью команды 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
Все, что вам нужно, находится в первом столбце. Вы можете получить все идентификаторы, пропустив конвейер через grep и вырезав, например:
[jenny@sameen ~]$ postqueue -p | grep -v ^- | grep -v "(" | cut -d' ' -f1 |grep -e [[:alnum:]]
6777D6E1E
69F6471CA
Теперь, когда вы знаете, как получить идентификаторы, вы можете бросить их в цикл 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