25

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?

4 Answers4

26

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
Guss
  • 3,080
11

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

84104
  • 13,181
  • 6
  • 49
  • 80
7

To empty the entire Postfix mail queue, you can use the following command:

postsuper -d ALL
0

Purging (deleting contents) of the /var/spool/postfix/{queue-name} folders (on stopped postfix) shall do the trick as well.

Mc Bton
  • 101