Ever wanted to delete all messages from Postfix queue by sender email address and recipient domain ?
Today, I did ... and below you can find a handful script for this purpose.
Tools needed: grep, awk, mailq and postsuper.
In a hurry ? Here is the core version:
mailq | tail -n +2 | head -n -2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if (($7 == "sender@example.com") && ($8 ~ "somedomain.com")) print $1 }' | tr -d '*!' | postsuper -d -
And a little bit more elaborate version of the script, with parameters check and user confirmation:
#!/bin/bash
if [ "$#" -eq 0 ]
then
echo "No arguments supplied"
echo "Usage: $0 sender@example.com somedomain.com" >&2
exit 1
fi
read -p "Do you want to delete all queued messages from $1 to $2 ? " -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]
then
echo -e "Postfix Warning: Deleting all queued messages from $1 to $2"
mailq | tail -n +2 | head -n -2 | grep -v '^ *(' | awk -v sender="$1" -v domain="$2" 'BEGIN { RS = "" } { if (($7 == sender) && ($8 ~ domain)) print $1 }' | tr -d '*!' | postsuper -d -
echo "Operation completed ..."
else
echo "Operation aborted ..."
fi
Detailed info ?
Typically, a mailq output looks like (eg, for Yahoo):
D7DA368BDDB 42143 Mon Oct 20 02:12:33 sender@example.com
(delivery temporarily suspended: lost connection with mta6.am0.yahoodns.net[63.250.192.45] while sending RCPT TO)
recipient@yahoo.com
We'll need to strip the second info line (mailq | tail -n +2)
, pipe the output to awk, set awk records separator to space and get the variables:
$1 = MessageID (D7DA368BDDB)
$7 = sender (sender@example.com)
$8 = recipient (recipient@yahoo.com)
In next step we'll check if sender
is our email address
($7 == "sender@example.com")
and the recipient domain
contains our domain
($8 ~ "somedomain.com")
If all conditions are met, print $1
(MessageID) and pipe it to postsuper
for deletion.
Bonus: Delete all MAILER-DAEMON
notifications from Postfix queue:
mailq | tail -n +2 | head -n -2 | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ($7 == "MAILER-DAEMON") print $1 }' | tr -d '*!' | postsuper -d -
Notes:
- Be careful when using this script on a live server. It will delete the messages matching the desired criteria from Postfix queue.
- Script might be extended with additional features (like checking if sender email address and recipient domain are both valid).
Have fun :)