mbox形式のMailboxからMaildir形式への変換

mbox形式からMaildir形式への変換に、mb2mdperfect_maildir.plという
スクリプトを使用したりしますが、IMAPではなくPOP3で使用していると
UIDLが変わってしまう為、次回のメール受信時にサーバ上に保存していた
メールを再度受信する事になります。

1000件とか保存していると悲しい事になるので、perfect_maildir.pl用に
uidlを変更しない様にする(Maildir/dovecot_uidlファイルを作成する)
パッチを作ってみました。

uidlフォーマットを"%v.%u"で使用している事を前提としています。

--- perfect_maildir.pl.orig     2004-11-01 04:55:03.000000000 +0900
+++ perfect_maildir.pl  2007-11-12 08:01:48.000000000 +0900
@@ -60,6 +60,7 @@
 my $time = time;
 my $date;
 my $delivered_time;
+my $uidvalidity = '';

 repeat:

@@ -67,6 +68,9 @@
 my $headers = '';
 my $flags = '';
 my $subject = '';
+my $ximap = '';
+my $ximapbase = '';
+my $uid = '';
 while (my $line = <STDIN>) {
   # detect end of headers
   last if $line eq "\n";
@@ -85,6 +89,9 @@
   $flags .= $1 if $line =~ /^Status: ([A-Z]+)/;
   $flags .= $1 if $line =~ /^X-Status: ([A-Z]+)/;
   $subject = $1 if $line =~ /^Subject: (.*)$/;
+  $ximap = $1 if $line =~ /^X-IMAP: (.*) .*$/;
+  $ximapbase = $1 if $line =~ /^X-IMAPbase: (.*) .*$/;
+  $uid = $1 if $line =~ /^X-UID: (.*)$/;
 }

 $num++;
@@ -113,6 +120,16 @@
 if (($num == 1 and $subject eq "DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA") || (!$headers)) {
        $file = '/dev/null';
        $num--;
+       $uidvalidity = $ximap;
+}
+
+if ($num == 1 and $subject ne "DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA" and $uid ne '') {
+       if ($ximapbase ne '') {
+               $uidvalidity = $ximapbase;
+       }
+       open (FILE, ">$maildir/dovecot-uidlist");
+       print FILE "1 $uidvalidity $uid\n";
+       close (FILE);
 }

 open(FILE, ">$file");