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 == "user@example.com" && $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 -

- 4,313
- 2
- 29
- 47
-
2On Linux, use `tail -n +2` instead of `tail +2`. – Brian Minton Jun 12 '17 at 15:28
-
The `tr -d` can be refactored into the Awk script, too. Replace `{ print $1 }` with `{ r = $1; gsub(/[!*]/, "", r); print r }` – tripleee Oct 26 '18 at 10:07
-
If you copy, edit and paste the example from postsuper `man` page, you'll avoid unwanted side effects. – symcbean Mar 26 '21 at 16:14
-
@symcbean Thanks for the hint, I've updated my answer! – sebix Apr 18 '21 at 10:13
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)

- 7,886
- 3
- 29
- 57
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 -

- 18,236
- 10
- 57
- 106

- 81
- 2
- 1
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 user@example.com:
mailq | \ tail -n +2 | \ grep -v '^ *(' | \ awk 'BEGIN { RS = "" } { if ($8 == "user@example.com" && $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.)

- 666
- 7
- 13
-
-
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). – tripleee Oct 26 '18 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. – tripleee Oct 26 '18 at 10:11