SEEDS Creator's Blog

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

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

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

ツール類の準備

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

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

[code] tar zxvf qmhandle-1.3.2.tar.gz [/code]

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

[code] 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 [/code]

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

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

キューの確認

[code] perl queue-fast.pl [/code]

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

[code] perl queue-fast.pl user@domain.name [/code]

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

[code] perl queue-fast.pl -d user@domain.name [/code]

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

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

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

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

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

[code] perl qmHandle -d22222 [/code]

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

qmailQueueDelete.sh

[code]

!/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

[/code]

qmailを停止してから、

[code] ./qmailQueueDelete.sh user@domain.name [/code]

で削除が実行されます。