« メールが受信できない!procmailでエラー Suspicious rcfile .procmailrc (3/20) | トップページ | 『笹塚日記 うたた寝篇』読了 (3/21) »

2005.03.20

mbox(/var/log/mail/)からMaildir 形式へ移行・変換。mbox2maildir(3/20)

Debian Linux 3.0 woody でcourier-imap(Maildir形式)へ転送しているprocmailがとまってしまっていたため、mbox形式の /var/log/mail/(ユーザ名) に転送されてしまったメールをcourier-imap(Maildir形式)でも読めるように変換しました。

Googleで「mbox Maildir」で検索したところ、「mbox2maildir」というPerlスクリプトがあるらしいのですが…。

sendmailからqmailへ移行~マロンくん.NET~
http://www.marronkun.net/linux/mail/qmail_3.html より

変更ツールにはmbox2maildirというツールがあります。Perlで記述しているスクリプトで以下の2種類が存在します。
i) http://www.qmail.org/mbox2maildir
ii) http://untroubled.org/mbox2maildir
よく分かりませんが、i)本家のスクリプトは私の環境ではうまく動作しませんでした。ここではii)のスクリプトの利用について説明します。

ちなみに、i) qmail のソースを見れば分かるのですが、i)のPerlスクリプトの実行には環境変数に「MAIL」「MAILDIR」が設定されていることが前提となります。これが設定されていないと、メールのフォルダが見つからずに

~/$ perl mbox2maildir
fatal:  doesn't exist and can't be created.
~/$

とエラーになります。環境変数 MAILには入力元の「/var/log/spool/(ユーザ名)」、MAILDIRには出力先のフォルダが指定されるように

~/$ export MAILDIR="/home/(ユーザ名)/tmp/mail"

と export などをしておくことが必要です。

私も両者をダウンロードして実行したのですが、両者とも同じ結果で /var/log/mail 配下のmboxがうまく分割されませんでした(泣)。

上記のスクリプトは両方とも、各メールの1行目が「 /^From /」で始まることを前提にしているのですが、私の場合メーリングリストから来たメールなどは1行目が「/^Return-Path:/」「/^Return-path:/」で始まっているので、メーリングリストからのメールの分割は無視され、他のメールの中にくっついてしまうのです。

という規則は分かったので、自分で Perlスクリプトの改造に。Googleでパッチや修正を探したのですが、見つからなかったので。ネットではmbox2maildirの動作実績自体はqmail版よりuntroubled版の方が多かったのですが、改造自体はqmail版の方が単純だったため、こちらに手を入れることに(w

プログラミングの超超超初心者なので変な点はご容赦を。あと元のqmail版、untroubled版のバグ?ロジック?はそのまま生かしています(w

■元のqmail版mbox2maildir から抜粋

open(SPOOL, "<$ENV{MAIL}")
  or die "Unable to open $ENV{$MAIL}\n";
$i = time;
while() {
  if (/^From /) {
    $fn = sprintf("new/%d.$$.mbox", $i);
    open(OUT, ">$fn") or die("fatal: unable to create new message");
    $i++;
    next;
  }
  s/^>From /From /;
  print OUT or die("fatal: unable to write to new message");
}
close(SPOOL);
close(OUT);

■変更後のqmail版mbox2maildirから抜粋

以下、太字が追加・変更部分。

open(SPOOL, "<$ENV{MAIL}")
  or die "Unable to open $ENV{$MAIL}\n";
$i = time;

my $in_return_path = 0;

while() {
#  if (/^From /) {

  if (/^From / || ($in_return_path == 1 and /^Return-Path:/i )) {
    if (/^From /) { $in_return_path = 0; }

    $fn = sprintf("new/%d.$$.mbox", $i);
    open(OUT, ">$fn") or die("fatal: unable to create new message");
    $i++;
    next;
    }

  if ( $in_return_path == 0 and /^Return-Path:/i ) {
    $in_return_path = 1;
  }

  s/^>From /From /;
  print OUT or die("fatal: unable to write to new message");
}
close(SPOOL);
close(OUT);

以上。バグがあったらゴメンナサイ。



|

« メールが受信できない!procmailでエラー Suspicious rcfile .procmailrc (3/20) | トップページ | 『笹塚日記 うたた寝篇』読了 (3/21) »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/49099/3372697

この記事へのトラックバック一覧です: mbox(/var/log/mail/)からMaildir 形式へ移行・変換。mbox2maildir(3/20):

« メールが受信できない!procmailでエラー Suspicious rcfile .procmailrc (3/20) | トップページ | 『笹塚日記 うたた寝篇』読了 (3/21) »