hero_picture

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

2015/05/18

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

以前、qmailの大量キューをすべて削除するという記事でqmailのキューをすべて削除する方法を書きましたが、実際の運用では削除すべき大量のメールキューの中に、削除してはいけないキューがあったりします。

今回はqmailの大量キューを送信元や送信先でフィルターして削除する方法を検証しました。

ツール類の準備

下記2つのキュー操作ツールを利用します。

両方サーバーに入れます。

両方、perlのスクリプトなので任意の場所において実行権限を付与したりパスを通したりして下さい。

・qmHandle

http://qmhandle.sourceforge.net/

1tar zxvf qmhandle-1.3.2.tar.gz

・queue-fast

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

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

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

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

キューの確認

1perl queue-fast.pl

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

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

user@domain.name宛のキューを削除

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

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

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

queue-fastとqmHandleを組み合わせて使います。

※厳密には送信元だけではなく送信先に含まれているものも削除されます

user@domain.nameというアドレスが関連したキューをすべて削除したい場合。

まず、queue-fastでuser@domain.nameに関連したキューのIDを一覧します。

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

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

1perl qmHandle -d22222

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

qmailQueueDelete.sh

1!/bin/sh
2if [ $# -ne 1 ]; then
3echo "\n"
4echo "qmailQueueDelete.sh \n"
5echo "usage : ./qmailQueueDelete.sh test@example.com \n"
6exit 1
7fi
8QID=`perl queue-fast.pl | grep $1 | cut -d" " -f1 | cut -d"/" -f2`
9for var in ${QID}
10do
11if [ ! -z "$var" ] ; then
12perl qmHandle -d${var}
13fi
14done
15

qmailを停止してから、

1./qmailQueueDelete.sh user@domain.name

で削除が実行されます。