Obrigado @mailq. Acontece que além do registro de data e hora estar no início do nome do arquivo de mensagens, o correio também examina o registro de data e hora da modificação do próprio arquivo. Eu tive que definir isso para o timestamp recebido também.
Aqui está um script que, com um monte de mensagens, copia-os para um diretório de saída depois de reescrever o nome do arquivo e a hora da modificação para conter o registro de data e hora de recebimento.
#!/usr/bin/env perl
use Email::Simple;
use Date::Parse;
use Getopt::Long;
use File::Path qw(make_path);
use File::Copy qw(copy);
use File::stat;
my $outfolder = "";
$result = GetOptions("output-dir=s" => \$outfolder);
# create directories if needed
if (length($outfolder) > 0) {
make_path($outfolder);
}
foreach my $file (@ARGV) {
my $text = "";
# read file as one string
{
local $/=undef;
open FILE, "$file" or die "Couldn't open file: $!";
binmode FILE;
$text = <FILE>;
close FILE;
}
# use Email::Simple to parse the Received header
my $email = Email::Simple->new($text);
my @received = $email->header("Received");
# Find the latest receive time
my $latestTime = 0;
my $latestTimeStr = "";
foreach my $r (@received) {
if ($r =~ /[^;]*;(.*)$/) {
my $time = str2time($1);
if ($time > $latestTime) {
$latestTime = $time;
$latestTimeStr = $1;
}
}
}
# if this is a sent message, it doesn't have a received header. Use the
# Date header instead.
if ($latestTime == 0) {
my $date = $email->header("Date");
my $time = str2time($date);
if ($time > $latestTime) {
$latestTime = $time;
$latestTimeStr = $date;
}
}
# If we found one, rename or tell about the rename
if ($latestTime != 0) {
if ($file =~ /([0-9]*)(\..*$)/) {
my $newfilename = $latestTime . $2;
if (length($outfolder) == 0) {
print "Would Copy $file ($latestTimeStr) -> \n ";
print "$newfilename\n";
} else {
print "Copied $file ($latestTimeStr) -> \n ";
print "$outfolder/$newfilename\n";
# use the latest received timestamp as the atime and mtime
copy($file, "$outfolder/$newfilename");
utime($latestTime, $latestTime, "$outfolder/$newfilename");
}
}
} else {
print "Couldn't find receive time for " . $file . "\n";
}
}
Use o script assim:
perl rename.pl cur/*
Quando você estiver convencido de que fará a coisa certa:
perl rename.pl cur/* --output-dir cur_renamed
Você só precisará trocar cur_renamed
com cur
, excluir seu arquivo courierimapuiddb
e possivelmente reiniciar seus clientes de e-mail. Para o meu dispositivo iOS, tive que remover a conta de e-mail e depois ressincronizar com o iTunes para que ele limpasse o cache adequadamente.