postsuperコマンドでALL以外でキューを削除するにはキューIDを指定しなければいけません。
postqueueコマンドでキューの内容から指定のアドレスを送信先とするIDの一時ファイルを作成してキュー削除をループさせます。
deletequeue
#!/bin/bash
#
# postfix mail queue delete script
# usage : bash deletequeue hoge@example.com
#
FILENAME="queueids.tmp"
if [ $# -lt 1 ];then
echo "an argument mail address is required!"
exit 1
fi
date
postqueue -p
postqueue -p | grep $1 > $FILENAME
sed -i 's/\s.*$//g' $FILENAME
sed -i 's/\*//g' $FILENAME
cat $FILENAME | while read line
do
echo "Remove ${line}"
postsuper -d $line
done
これだけなら簡単ですね。
実行の方法は下記の通り
実行例
bash deletequeue hoge@example.com
これでhoge@example.comから来たメールキューだけ削除することができます。
大量に送信され続けてしまっていて即止めるのが困難な場合はブロックが前提ですがdeferにたまってしまったメールの再送もよけておきたいならワンライナーでこれをしばらく実行し続ければとりあえず暫定対処できます。
deferだから重要なメールがないとも限らないのでその方が安全です。難点はタイミングによって一度送信トライされてしまうところですが。
実行例
while true; do bash deletequeue hoge@example.com; sleep 1; done
コマンドを終了したいときはCtrl+Cで終了します。