Reconstruindo arquivos de mensagens de correio

1

Eu corro um servidor de e-mail no qual tenho mensageiro imap e pop3 em execução. Recentemente, mudei algumas mensagens locais da minha máquina (baixadas anteriormente com pop3) para o servidor, para que eu pudesse usar o imap. Eu usei o Mail.app no Mac OS X 10.5.8 para fazer isso.

Isso resultou em uma série de arquivos no servidor de email que se parecem com isso:

1324697191.M91227P15574V000000000000CA00I0004B07D_556.hostname,S=5622:2,S
1324697192.M322096P15574V000000000000CA00I0004B07F_557.hostname,S=225691:2,RS
1324697196.M144018P15574V000000000000CA00I0004B081_558.hostname,S=7702:2,RS
1324697197.M715598P15574V000000000000CA00I0004B083_559.hostname,S=15741:2,S
1324697199.M327587P15574V000000000000CA00I0004B085_560.hostname,S=8744:2,RS

Os tempos recebidos dessas mensagens, na mesma ordem listada acima, são:

01/15/2010
01/09/2009
07/13/2010
02/21/2010
05/06/2010

Agora, isso não é um problema para os clientes de e-mail da área de trabalho - eles simplesmente buscam todas as mensagens, classificam-nas e tudo está bem. Várias pesquisas no Google sobre este assunto produziram tópicos em que as pessoas tentavam colocar as mensagens na ordem correta e o remédio sugerido era "classificá-las no lado do cliente".

Infelizmente, no iOS 5.0.1, o aplicativo de e-mail supõe que a ordem das mensagens obtidas do servidor imap já está classificada por data. Devido às mensagens neste exemplo terem um nome de arquivo que não corresponde ao registro de data e hora de recebimento, mas, em vez disso, ao registro de data e hora de seu upload, isso significa que as mensagens aparecem na ordem errada em um dispositivo iOS. Para corrigir isso, tenho que carregar TODOS os e-mails tocando no botão "Carregar mais mensagens" várias vezes.

Gostaria de poder simplesmente reconstruir esses arquivos de mensagens, de modo que o registro de data e hora no nome do arquivo (que parece ser o primeiro conjunto de dígitos antes do período) corresponda ao registro de data e hora de recebimento. Eles seriam então classificados na ordem correta para quando um dispositivo iOS tentar carregá-los. Não sei o suficiente sobre como o mensageiro organiza as mensagens - posso simplesmente escrever um script que substitua o primeiro conjunto de dígitos no nome do arquivo pelo carimbo de data / hora unix do tempo de recebimento da mensagem?

Obrigado!

    
por Devin Lane 24.12.2011 / 19:05

1 resposta

1

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.

    
por 25.12.2011 / 22:25