How can I delete all messages from a certain address from the mailqueue?

Solution 1:

The pipeline can be analyzed step by step to see what it does. Try running each command in sequence until you understand them all:

postqueue -p

print the queue

postqueue -p | tail -n +2 

get rid of the first couple lines

postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } / spammer@example\.net/ { print $1 }' 

search for any lines with [email protected]; print the first field of those lines.

postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } / spammer@example\.net/ { print $1 }' | tr -d '*!'

get rid of any *!

This will output a bunch of queue ids.

postqueue -p | tail -n +2 | awk 'BEGIN { RS = "" } / spammer@example\.net/ { print $1 }' | tr -d '*!' | postsuper -d -

The final command tells postfix to delete those queue ids.

Read The Fine Man pages on postqueue, tail, tr, and postsuper. Awk is a more complicated, it's its own little language. you'll need a bit more than a man page to understand its complexity, although in my experience 99% of the awk usage is much like that particular one-liner.

Solution 2:

Sorry to add an answer to an already answered question.

This is for people who have to do this on a daily basis (clients facing spam campaigns).

There's a guy who wrote "pymailq", a tool that can help dealing with this.

I've also forked this tool and added compatibility with zimbra and a few additional features.

Here's the original repo

Here's my fork

Installation goes like this:

git clone
cd pymailq
git checkout dev

virtualenv venv
source venv/bin/activate

python ./ install