How to Clear/Reset a Postfix Queue
I recently discovered that one of our Ubuntu servers was generating dozens of notification emails a minute and throttling the Office 365 relay account it was sharing with a handful of other servers. I stopped the Postfix service on this server and disabled the scripts that were generating all of these alerts (and subsequent cascade of delivery failure messages). However, I didn't account for the Postfix Queue Manager which has retained thousands of these messages and attempts to send them all over again when I restart Postfix.
My first, admittedly bumbling, attempt to clear the queue was to navigate to the queue directory at /var/spool/postfix
and manually remove files from the 'active' and 'incoming' folders. However, when I ran postqueue -p
a ton of emails still showed up in the queue.
What is the best way to completely reset or purge a Postfix Queue?
Solution 1:
You should use the postsuper
command to delete messages from the Postfix queue - The -d <queueid>
option would delete the message with the specified queue ID.
I'm using something like this script to run through all the messages in the mail queue:
mailq | awk '$7~/@/{print$1}' | while read qid; do postsuper -d $qid; done
Solution 2:
Since you've gone an messed with the queue's files directly, you may want to issue a postsuper -p
.
-p Purge old temporary files that are left over after system or software crashes.
Years ago a wrote a small script to better handle some cases in postfix mailqueues, rather than just doing ad hoc one liners. You might find it useful in the future.
$ cat /usr/local/sbin/postclear
#!/bin/bash
usage() {
echo "${0/*\/} --from <address1> [<address2> .. <addressN>]"
echo "${0/*\/} --bounce <address1> [<address2> .. <addressN>]"
echo "${0/*\/} --to <address1> [<address2> .. <addressN>]"
}
if [ $# -lt 2 ]; then
usage 1>&2 ;
exit 1;
fi
case $1 in
--from )
shift
while (( $# )) ; do
postqueue -p | grep -e "$1" | grep -Eo '^[A-F0-9]+' | postsuper -d -
shift
done
exit;;
--bounce )
shift
while (( $# )) ; do
postqueue -p | grep -E -B2 -e "$1" | grep MAILER-DAEMON | grep -Eo '^[A-F0-9]+' | postsuper -d -
shift
done
exit;;
--to )
shift
while (( $# )) ; do
postqueue -p | grep -E -B2 -e "$1" | grep -Eo '^[A-F0-9]+' | postsuper -d -
shift
done
exit;;
* )
echo "Unknown option $1" >&2
exit 1;;
esac