メールスプールに溜ったメールを救い出す方法 (OE ユーザ向け)

Windows のメールソフトウェアが調子悪くなって,なぜかメールを受信できなくなっちゃうことがある.今回職場で起こったのもそんなケース.不具合の原因は不明で,メールサーバ側に問題がある可能性もなくはないのだが,他のユーザはみな正常に使えていることと,クライアントマシンにバッドセクタがあったり何かと調子悪いことから,クライアントのせいが濃厚 (だーかーらー早く HDD 換えろと何度(ry



とりあえず管理者な人が,メールサーバのスプールに溜ったメールを退避したとする.今から書くのはこの退避したメールを Windows でどうやって読むかという問題.不具合の解決とかはとりあえず無視ね(ぉ



退避したメールは mbox 形式の一塊のファイルになっている.これを Windows マシンで開く.Meadow かなんかがあれば文字も化けないし最高だが,とりあえずワードパッドで開くようにいう.メモ帳は改行が正しく認識されないので使わない.



たくさんのメール (文字化けしている) が concatenate されていることを説明する.さらに,メールとメールの切れ目が「空行 + From 行」となっていることを説明する.ヘッダの中に埋もれた From 行とかは,空行を伴ってないので無視.で,このデリミタごとにメールを切り出して別々のファイルとして保存させる.



最後に,切り出したファイルの拡張子を eml にする.これで,ファイルをダブルクリックすれば Outlook Express が立ち上がってメールの中身が読める.添付ファイルも普通に開ける.うまく読めない場合は切り出し時に何やら失敗している可能性が高い.

なお,拡張子を eml にするという技は,MH 形式で保存されたメールを Windows で読む時にも便利.



とまあ今回は手動でやってもらったんだけど(ぉ,それはメールがたったの数個だったからで,これが 10 個 20 個とかになったら,スクリプトでも書いたほうが親切というものだろう.

というわけで,書いてみた.早く書けばよかった.

#!/usr/local/bin/perl
# $Id: mbox2eml,v 1.1 2005/11/17 20:53:21 nao Exp $
 
$cnt = 0;
$flag = 1;
 
while( <> ){
    if ( $flag && /^From\ .*/ ){
	close IN if fileno(IN);
	$cnt++;
	open(IN, ">$cnt.eml");
	next;
    }
    print IN;
    $flag = /^$/;
}
 
close IN;

追記 (2007-04-06): 生成された eml ファイルに対してさらに mailutime コマンドをかけるとソートのときさらに便利 (タイムスタンプがメールの受信日時になる).



追記 (2007-08-29): bug fixed.