Posts about: » キュー

qmailのリモート送信キューを一括削除

Written in 2014年01月15日 by | コメントする( 0件 )

qmailで送信キューが大量にたまってしまったらどうするか。まずは、状況把握。
# /var/qmail/bin/qmail-qstat
これにより、現在のキューの状況がわかる。

messages in queue: 342007
messages in queue but not yet preprocessed: 843

のようにでる。34万件もたまってる。。。

どんなキューかを確認する。

# /var/qmail/bin/qmail-qread

とすると、


15 Jan 2014 04:28:45 GMT #163011079 644 <but@hogehoge.jp> bouncing
remote fugafauga@gmail.com
remote foofoo@yahoo.com
15 Jan 2014 05:27:46 GMT #163386784 568 <zyse@hogehoge.jp>
remote barbar@hotmail.com

のようにでる。
<but@hogehoge.jp>のように<>で囲まれたものが送信元アドレスだ。
#の後の数字がキュー番号。remote のあとにあるのが送信先アドレス。

リモート配信されるキューの情報は、

/var/qmail/queue/remote/*/(キュー番号)
/var/qmail/queue/info/*/(キュー番号)
/var/qmail/queue/mess/*/(キュー番号)
/var/qmail/queue/bounce/*/(キュー番号)

にたまるので、これらを削除していく。
参考: http://d.hatena.ne.jp/japanrock_pg/20090417/1239959873
そのスクリプトが以下の通り。

/bin/qmail-qread | tail -n '+2' \
| grep '#' | grep '@hogehoge.jp>' \
| sed -e 's/^.*#//g' | sed -e 's/ .*$//g' \
| awk 'NF > 0 { system("rm -f queue/remote/*/"$1";rm -f queue/info/*/"$1";rm -f queue/mess/*/"$1";rm -f queue/mess/*/"$1";rm -f queue/bounce/"$1) }'

一行目で、qmail-qreadを使って、先のリストを出力する。
二行目で、キュー番号があり、かつ送信元がhogehoge.jpのドメインのものだけに絞る。
三行目で、#の前を削除し、キュー番号の後の文字列を削除し、キュー番号だけ残す。
(awkで抜き出そうと思ったのだが、なぜかレコードの区切り文字がうまく働かなかった。。。)
四行目で、awkを使って、各キューファイルを削除している。

Postfixで特定の送信元アドレス、送信先アドレスのキューを一括削除する

Written in 2013年10月03日 by | コメントする( 0件 )

mailq を実行すると、

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------

CFC83527CBDA*     851 Thu Oct  3 11:06:56  foo@hogehoge.jp
(delivery temporarily suspended: host smtp.hogehoge.jp[111.222.111.222] refused to talk to me: ・・・・)
recipient1@fugafuga.com
recipient2@foofoo.com
recipient3@barbar.com

のようにキューがリストされる。(上記は一件のみ)

この場合、送信元アドレスはfoo@hogehoge.jpであり、送信先は、recipient1@fugafuga.com、recipient2@foofoo.com、recipient3@barbar.comである。これらの情報を参照し、それを条件としてQueue IDを引っ張ってきて、postsuper –d に渡せばキューを消せる。

そのためのシェルはman postsuperに載っているものを参考にできる。

送信元アドレスを条件にしてキューIDをリストする場合

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $7 == "foo@hogehoge.jp" ) print $1 }'

送信先アドレスを条件にしてキューIDをリストする場合

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $8 == “recipient1@fugafuga.com” || $9 == “recipient1@fugafuga.com” ) print $1 }'

のようにする。$8以降が送信先アドレスである。

特定のドメインのアドレス、という条件にする場合は正規表現を使う。

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $7 ~ "hogehoge.jp" ) print $1 }'

ここで得られるキューIDには*や!がついていたりするので、それを外すため、パイプを追加する。

| tr -d '*!'

そして、これをpostsuper –dに渡す。

| postsuper -d -

完成したシェルは以下の通り。

mailq | tail -n '+2'  | grep -v '^ *(' | awk 'BEGIN { RS = "" } { if ( $7 ~ "hogehoge.jp" ) print $1 }' | tr -d '*!' | postsuper -d -

これで一括削除ができる。