SEEDS Creator's Blog

qmailの大量キューを送信元や送信先でフィルターして削除する方法

qmail!?って思われるかもしれないですが、勉強会とかいくと結構現役なサーバって多いみたいです。

以前、qmailの大量キューをすべて削除するという記事でqmailのキューをすべて削除する方法を書きましたが、実際の運用では削除すべき大量のメールキューの中に、削除してはいけないキューがあったりします。 今回はqmailの大量キューを送信元や送信先でフィルターして削除する方法を検証しました。

ツール類の準備

下記2つのキュー操作ツールを利用します。 両方サーバーに入れます。 両方、perlのスクリプトなので任意の場所において実行権限を付与したりパスを通したりして下さい。

・qmHandle http://qmhandle.sourceforge.net/

tar zxvf qmhandle-1.3.2.tar.gz

・queue-fast http://www.kawa.net/works/qmail/queue-fast.html

wget http://www.kawa.net/works/qmail/src/queue-fast.20050210.tar.gz
tar zxvf queue-fast.20050210.tar.gz
chmod 755 queue-fast.pl

送信先メールアドレスでフィルターして削除

queue-fastのみで対応可能です。

キューの確認

perl queue-fast.pl

user@domain.name宛のキューを確認

perl queue-fast.pl user@domain.name

user@domain.name宛のキューを削除 キューの削除の際はqmailを落としてください。(キューの整合性が取れなくなる可能性がある為)

perl queue-fast.pl -d user@domain.name

送信元メールアドレスでフィルターして削除

queue-fastとqmHandleを組み合わせて使います。 ※厳密には送信元だけではなく送信先に含まれているものも削除されます

user@domain.nameというアドレスが関連したキューをすべて削除したい場合。 まず、queue-fastでuser@domain.nameに関連したキューのIDを一覧します。

perl queue-fast.pl | grep user@domain.name | cut -d" " -f1 | cut -d"/" -f2

qmHandle の引数にキューIDを渡してあげるとそのキューIDのキューを削除してくれます。

perl qmHandle -d22222

便利に使う為、適当なスクリプトを作成

qmailQueueDelete.sh

!/bin/sh

if [ $# -ne 1 ]; then
 echo "\n"
 echo "qmailQueueDelete.sh \n"
 echo "usage : ./qmailQueueDelete.sh test@example.com \n"
 exit 1
fi

QID=`perl queue-fast.pl | grep $1 | cut -d" " -f1 | cut -d"/" -f2`
for var in ${QID}
do
    if [ ! -z "$var" ] ; then
    perl qmHandle -d${var}
    fi
done

qmailを停止してから、

./qmailQueueDelete.sh user@domain.name

で削除が実行されます。