事前確認事項

キューを勝手に触っても大丈夫?

削除する前に考慮する事

.qmail-defaultではbounceを返さない設定にする

/home/vpopmail/domains/mta.jp/.qmail-default
| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox
  ↓ これに変えれるかどうか検討してみる
| /home/vpopmail/bin/vdelivermail '' delete

qmailの設定を強化する

/etc/qmail/badmailfrom

@XXX.XXX.XXX
#FROMに上記IPが入っていたら弾く設定

/etc/qmail/badmailfromnorelay

#reject senders withouth @
!@

/etc/qmail/timeoutremote

120
#送り先がresponseしない場合は120秒でtimeoutする

設定箇所

qmailを止める

/etc/init.d/qmail stop

まずどのくらいbounceメールが溜まっているか見てみる(ちょっとクラッとしてみる。)

aya@mta:~$ sudo /var/qmail/bin/qmail-qstat
messages in queue: 125021
messages in queue but not yet preprocessed: 0

queue-fast.plを取得する
queue-fast.pl - qmail のメールキューの閲覧・削除
削除したいメール一覧を取得する

aya@mta:~$ sudo /var/qmail/bin/qmail-qread > /home/aya/qmail.txt

qmail.txtの内容はこんな感じ

12 Mar 2010 17:08:55 GMT  #2346574  2864  <vhrepqmkdxgmh@gmail.com> 
       remote  keally0801@yahoo.com.tw
12 Mar 2010 18:41:37 GMT  #2354072  2990  <caygoap@yahoo.com.tw> 
       remote  0920270091@yahoo.com.tw
15 Mar 2010 11:28:29 GMT  #410227  3814  <> 
       remote  zolqlktnf@gmail.com
12 Mar 2010 22:49:59 GMT  #2373001  2953  <rtrcs@hotmail.com> 
       remote  s101691@yahoo.com.tw

添付ファイルもしくは以下の内容をコピーしたファイルを作成する

<?php
$startNum = 0;
$endNum = $startNum + 10000;
$filename = '/home/aya/qmail.txt';

$p[0] = '/\</';
$p[1] = '/\>/';
$r[0] =  '';
$r[1] = '';
$lines = preg_replace($p, $r, file($filename));

$deleteEmail = array();
for($n = $startNum; $n <= $endNum; $n++) {
       if($n%2 == 0) {
                       $m = $n + 1;
preg_match("/[-\+\w](\\.?[-\+\w])*@[-\+\w]+(\.[-\+\w]+)*(\.[a-zA-Z]{2,4})/",$lines[$m], $toEmail);
                       $deleteEmail[] = $toEmail[0];
       }
}
$string_emails = implode(" ", $deleteEmail);
//echo $string_emails;

$output = system('perl /home/aya/queue-fast.pl -d ' . $string_emails);

echo count($lines);
echo count(' -> ' . $deleteEmail);
?>

必要であれば

$m = $n + 1;

の後に、

$pattern = '/\#\@\[\]/';
preg_match($pattern, $lines[$n], $match);
if($match) {
  preg_match("/[-\+\w](\\.?[-\+\w])*@[-\+\w]+(\.[-\+\w]+)*(\.[a-zA-Z]{2,4})/",$lines[$m], $toEmail);
  $deleteEmail[] = $toEmail[0];
}

という風におかしなメールだけを分岐して削除してもよいかもしれない。
経験値から5000件ぐらいしか一回に処理出来なさげ。サーバのスペックにもよると思うけど。

確認方法

エラー時には

参考URL


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-03-12 (月) 16:54:42 (197d)