[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[postfix-jp: 595] Re: postfixでのメール削除について



柳澤です。

On Wed, 01 Sep 2004 23:25:28 +0900
Fangxiao Zhang <f.zhang@xxxxxxxxxxxxxx> wrote:

> チェックしましたが、mbox形式だと思います。(構築した本人ではなく、一個
> 一個チェックするしかありません。)
> 
> /var/spool/mail/ABC(ファイル) という形になっていて、対象者のメールボ
> ークスファイルをチェックしましたが、同じsubjectとfromとtoのメールは
> 5881通があって、残りの10通だけ違うsubjectとなっています。
> 
> 今の問題はどうやって、その十通だけ残して、残りの5881通を削除できますか
> ?

下記のような操作で削除することができますが、mbox形式は新しいメールを
追記していく形式ですので操作する前に適切なロックを取得する作業を
行わなくてはなりません。
この繁雑さを考えると他の方が提案されているようにmuttなどmbox形式の
ファイルを直接操作できるMUAを使う方法やPOP3/IMAP4サーバーから操作を行う
方法の方が無難かも知れません。

操作手順
(1) ABC.lockファイルを作成することでABC.lockの有無でロックを
    判定しているプログラムからABCへの書き込みを停止させる。
% lockfile /var/spool/mail/ABC.lock
lockfileコマンドが無く、lockfコマンドも無いときはリスクが上がるがtouchで
代用。ロックが取得できるとプロンプトが戻って来る。

なお、lockfがあると次のコマンドで手順(1),(2)を同時にできる。
% lockf /var/spool/mail/ABC.lock vi /var/spool/mail/ABC

(2) ABCをflockすることでfcntl(2)でロックを取得しているプログラムから
    ABCへの書き込みを停止させる。
% vi /var/spool/mail/ABC
ファイルオープン時にロックを取得してくれるエディタならviである必要は
無い。
(なお、このエディタは手順(6)まで終了させてはならない)

(3) /var/spool/mail/ABCを読んで1メールごとに分割。
mbox形式では個々のメールは『From 差出人 月日』というフィールドで
区切られているので例えば次のようなPerlスクリプトに標準入力から
/var/spool/mail/ABCを入れると/tmp/mailtmp以下にメールごとに分けられた
ファイルができる。
% perl 下記のスクリプト < /var/spool/mail/ABC

-- スクリプト --
#!/usr/local/bin/perl
my $i = 0;
my $output_dir = "/tmp/mailtmp";
my $time = time();

open(FILE,"<+/tmp/dummy.$$.$time");
while(<STDIN>) {
        if ($_ =~ /^From /) { &newmail(); }
        print FILE $_;
}
close(FILE);

# newmail
sub newmail {
        print $i."\n";
        close(FILE);
        my $filename = "${output_dir}/${i}";
        open(FILE,">${filename}");
        $i++;
}
-- end スクリプト --

(4) 特定のSubjectのメールのファイルを削除
% grep 'Subject: 消したいSubject' /tmp/mailtmp | \
  awk -F: '{ print $1 }' | xargs rm

(5) vi(手順(2)で使ったエディタ)で開いているABCの内容全てを削除して(4)の
    操作後に残ったファイルの読み込み
(viで開いているABCファイルの内容を全てを削除(:1,$d)し、
 ファイルの挿入操作で読み込む(:r ファイル名))

一通ずつ読み込んでもよいが下記のような操作で残ったファイルをまとめたもの
があると一度の読み込み操作で済むので楽。
% cd /tmp/mailtmp
% ls |sort -n|xargs cat > mboxfile

(6) vi(手順(2)で使ったエディタ)を終了してflockを開放
(viを終了)

(7) ABC.lockを削除して.lockによるロックをしているプログラムへロックを
    開放。
% rm -f /var/spool/mail/ABC.lock


#ロックをしないで済ませるにはPostfixを止めるだけでは不十分で
#POP3サーバーやIMAP4サーバー、はたまた利用者のmuttやmailなどの
#コマンド操作まで止めないといけないんだよなぁ...

-- 
------------------------------------------------------
Yoshisato YANAGISAWA <yanagisawa@xxxxxxxxxxxxxxxxxxx>
Chiba Lab. Dept. of Mathematical and Computing Science
Graduate School of Information Science and Engineering
Tokyo Institute of Technologoy.
_______________________________________________
Postfix-jp-list mailing list
Postfix-jp-list@xxxxxxxxxxxxxxxxxxxx
http://lists.sourceforge.jp/mailman/listinfo/postfix-jp-list

Follow-Ups
[postfix-jp: 603] Re: postfixでのメール削除について, Takahiro Kambe
References
[postfix-jp: 587] postfixでのメール削除について, Fangxiao Zhang
[postfix-jp: 588] Re: postfixでのメール削除について, Yoshisato YANAGISAWA
[postfix-jp: 589] Re: postfixでのメール削除について, Fangxiao Zhang

[検索ページ] [Postfix-JP ML Home]