How to flush postfix queue one mail at a time?

It's possible to flush one particular email, instead of the whole queue. If you do this for each message in turn, with a two-second sleep between messages, that should do what you ask for.

First, you need to find the queue IDs of the mails in the queue. You can get this by using the command postqueue -p. Here's an example output:

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
6777D6E1E      3517 Mon Jan 25 03:03:02  [email protected]
                                         [email protected]

69F6471CA      2820 Tue Jan 26 03:24:17  [email protected]
                                         [email protected]

What you need is in the first column. You can get all of the IDs by some piping through grep and cut, like so:

[[email protected] ~]$ postqueue -p | grep -v ^- | grep -v "(" | cut -d' ' -f1 |grep -e [[:alnum:]]
6777D6E1E
69F6471CA

Now that you know how to get at the IDs, you can throw them in a bash loop with some sleep:

[[email protected] ~]$ for ID in `postqueue -p | grep -v ^- | grep -v "(" | cut -d' ' -f1 |grep -e [[:alnum:]] `; do postqueue -i $ID; sleep 2; done