M.C.P.C. (Mamesibori Creation Plus Communication)

印刷屋から五反田のWeb屋に転職したCLのブログです。

postfixで不達メールキューをメールアドレス指定して一括削除

postsuper -d ALLやると全部消えてしまうから怖い。かといって、postqueue -pでキューリストを取得し消してもいいキュー番号を確認して、postsuper -d {Queue ID}でキュー番号を指定して消せるが数が多すぎて残業代もでるわけもなく死ぬるとき使おう。

具体的には、絶対届かないメールアドレスをフォームにぶっこまれて何百通も送信されてしまうっていうやつ。もしかしたら、WordPress乗っ取りされてLinuxサーバがメール送信踏み台サーバになったときも使えるんじゃないかな(←さりげないサーチエンジン用検索ワードの付加)。

rootユーザで

# postqueue -p | tail -n +2 | head -n -1 | paste - - - - | \grep -e test@example.com | awk '{print $1}' | xargs -r -l postsuper -d

postqueueコマンドの出力を流用するのだけれども、

  • 1行目: カラム説明のヘッダ
    • 2行目: Queue ID, Size, Arrival Time, Sender
    • 3行目: メッセージ
    • 4行目: Recipient
    • 5行目: 空行、以降2行目~5行目を繰り返す
  • 最終行: キュー数とキロバイト数を表示するフッタ

という複数行の形式なので、Recipientで行grepできず、先ずヘッダ行とフッタ行をtail -n +2 | head -n -1 で削り、paste - - - -で4行分を1行にくっつける。それの1カラム目をawkで取り出して行リストができたのをxargsでぶった切ってpostsuperの引数に1つずつ入れて実行してあげます。

このあと、Webアプリ担当君に変なフォーム送信を防ぐような作りにしてもらおう。

pasteコマンドは、複数のファイルの行リストを横に連結するなどにも使える謎の使い勝手があります。使おうとしたときにpasteコマンドなんて忘れているんだけど。