I have a server with multiple domains. How can I clear all Postfix queue messages for a specific domain?
6 Answers
UPDATE 2021-04-18:
mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ($8 ~ /@example\.com/ && $9 == "") print $1 }' | tr -d '*!' | postsuper -d -
Whereas $7
=sender, $8
=recipient1, $9
=recipient2. You can also adapt the rule for other recipients ($9
) to your needs.
The command is based on an example of the postsuper manpage which an example command matching a full recipient mail address:
mailq | tail -n +2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ($8 == "[email protected]" && $9 == "") print $1 }' | tr -d '*!' | postsuper -d -
Old content:
This command deletes all mails sent from or to addresses that end with @example.com
:
sudo mailq | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com$/ { print $1 }' | tr -d '*!' | sudo postsuper -d -
Grep solution
mailq | grep example.com -B1 | grep -oE "^[A-Z0-9]{10,11}" | sudo postsuper -d -
assumes ID is between 10 and 11 digits, (based on inodes)
I have tried this solution in ubuntu 12.04, and it doesn't work this way:
sudo mailq | tail +2 | awk 'BEGIN { RS = "" } / @example\.com$/ { print $1 }' | tr -d '*!' | sudo postsuper -d -
I need to change to this way:
postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } /@example\.com/ { print $1 }' | tr -d '*!' | postsuper -d -
Look at pfdel.pl, a mandatory tool to manage the queue. It takes a regexp and remove the mails waiting in queue corresponding to your domain.
When you want to delete messages from or to e-mail addresses at a specific domain, this command works for me:
mailq | \
tail -n +2 | \
awk 'BEGIN { RS = "" } / @example\.com$/ { print $1 }' | \
tr -d '*!' | \
postsuper -d -
Also works for deleting e-mails from or to specific e-mail addresses by supplying for example mail@example\.com$/
instead of @example\.com$/
.
Taken from a comment on howtoforge.com. See there for related solutions and the command in one line. (I used bash line continuation for readability).
A very similar command that allows to make deletion dependent on whether the address appears as sender, recipient etc. is found in man postsuper
, where it says about -d
:
For example, to delete all mail with exactly one recipient [email protected]:
mailq | \ tail -n +2 | \ grep -v '^ *(' | \ awk 'BEGIN { RS = "" } { if ($8 == "[email protected]" && $9 == "") print $1 }' | \ tr -d '*!' | \ postsuper -d -
(The variables mean: $7=sender, $8=recipient1, $9=recipient2. I changed the quote to use tail -n +2
, since their tail +2
does not work any more, at least on some modern systems.)
-
-
1The backslashes at the end of line are not actually necessary; the shell understands that the command continues on the next line if the last token is
|
(or||
or&&
or a bunch of others).– tripleeeOct 26, 2018 at 10:10
I've modified it little bit:
mailq | grep -B1 | grep -oE "^[A-Z0-9]{12}" | xargs -I% postsuper -d %
-
3
-
Running hundreds of instances of
postsuper
is not an improvement at all.xargs
is nice when you use it properly, but this is not one of those situations.– tripleeeOct 26, 2018 at 10:11