我有一台包含多个域的服务器。如何清除特定域的所有 Postfix 队列消息?
答案1
更新2021-04-18:
mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ($8 ~ /@example\.com/ && $9 == "") print $1 }' | tr -d '*!' | postsuper -d -
而$7
=sender, $8
=recipient1, =recipient2。您还可以根据需要$9
调整其他收件人的规则 ( )。$9
该命令基于以下示例postsuper 手册页这是一个匹配完整收件人邮件地址的示例命令:
mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ($8 == "[email protected]" && $9 == "") print $1 }' | tr -d '*!' | postsuper -d -
旧内容:
此命令将删除所有以 结尾的地址发送或接收的邮件@example.com
:
sudo mailq | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com$/ { print $1 }' | tr -d '*!' | sudo postsuper -d -
答案2
Grep 解决方案
mailq | grep example.com -B1 | grep -oE "^[A-Z0-9]{10,11}" | sudo postsuper -d -
假设 ID 介于 10 到 11 位数字之间(基于 inode)
答案3
我曾在 ubuntu 12.04 中尝试过这个解决方案,但它不起作用:
sudo mailq | tail +2 | awk 'BEGIN { RS = "" } / @example\.com$/ { print $1 }' | tr -d '*!' | sudo postsuper -d -
我需要改成这样:
postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com/ { print $1 }' | tr -d '*!' | postsuper -d -
答案4
我想给出一个“更现代”的答案来解析json
的输出postqueue -j
。它取决于包jq
来过滤输出,并且更易于理解(和调试):
postqueue -j | jq -rc 'select(.recipients[].address | match(".*@example\\.com$"))["queue_id"]' | postsuper -d -
# For an exact Mail match
postqueue -j | jq -rc 'select(.recipients[].address == "[email protected]")["queue_id"]' | postsuper -d -
除了可读性之外,此解决方案的另一个不太相关的论点是它的易于适应性:
# Filter on delay_reason being "Connection timed out"
postqueue -j | jq -rc 'select(.recipients[].delay_reason | match(".*Connection timed out$"))["queue_id"]' | postsuper -d -
# Filter on arrival_time being older than certain age
postqueue -j | jq -rc 'select(.arriveal_time < 1710265065)["queue_id"]' | postsuper -d -
# Filter on the size of messages
postqueue -j | jq -rc 'select(.message_size > 100000)["queue_id"]' | postsuper -d -
这是完整的 json,显示所有可过滤的值:
{
"queue_name": "deferred",
"queue_id": "4TwLyJ4Gpyz2xVB",
"arrival_time": 1710407000,
"message_size": 15932,
"forced_expire": false,
"sender": "MAILER-DAEMON",
"recipients": [
{
"address": "[email protected]",
"delay_reason": "delivery temporarily suspended: connect to mail.example.com[111.222.333.444]:25: Connection timed out"
}
]
}