É melhor arquivar / mover e-mail baseado no mtime ou ctime?

1

Eu tenho usado um script perl para arquivar e-mails encontrados aqui

O script usa o ctime para processar e decide qual subpasta do mês colocar o email. Na maioria dos casos, isso é bom, já que o ctime = mtime e, portanto, os e-mails são arquivados pelo mês em que foram enviados ou recebidos.

Mas eu encontrei ocasiões em que não é bom executar o script.

Digamos, por exemplo, que um usuário mova o e-mail de volta para a caixa de entrada ou que o e-mail tenha sido recuperado de um backup para a caixa de entrada. Se o script processa o e-mail tocado, ele moverá o e-mail para um mês em que não foi tocado / recebido.

Não é melhor processar emails por mtime?

Em outras palavras, qual é o melhor POSIX que eu deveria usar?

    
por timoto 24.11.2012 / 15:45

2 respostas

5

Eu trabalho com procmail e Dovecot , mas a estrutura maildir é bastante padronizada.

Se você estiver tentando arquivar por data, talvez queira verificar o Date dos cabeçalhos. Lendo a partir do topo dos cabeçalhos a primeira data que você encontrar deve ser muito precisa. Minhas mensagens têm três campos que podem ser usados Delivery-Date: , os cabeçalhos Received: e o cabeçalho Date: . Para mensagens recebidas, o cabeçalho Delivery-Date: ou primeiro Received: terá a data apropriada. Para mensagens enviadas, é provável que você tenha apenas o cabeçalho Date: , que pode refletir a hora do sistema que o criou, não o servidor de e-mail. Você pode sinalizar mensagens que não tenham uma data utilizável nos cabeçalhos.

ctime geralmente deve ser a data da mensagem, mas há casos em que uma nova cópia da mensagem é criada quando é movida ou copiada. Normalmente, essas ações ocorrem ao vincular o arquivo ao diretório correto. EDIT: este script irá imprimir uma lista de mensagens com a primeira data no arquivo. Ele corresponde no formato de data do RFC. O regex pode não ser o melhor.

#!/usr/bin/perl

%months = ( 'Jan'=>'01', 'Feb'=>'02', 'Mar'=>'03', 'Apr'=>'04',
            'May'=>'05', 'Jun'=>'06', 'Jul'=>'07', 'Aug'=>'08',
            'Sep'=>'09', 'Oct'=>'10', 'Nov'=>'11', 'Dec'=>'12' );

foreach $filename (@ARGV) {
    open( MESSAGE, $filename);

    while (<MESSAGE>) {
        if ( m/[A-Z][a-z][a-z], ([1230][0-9]) ([A-Z][a-z][a-z]) ([12][0-9][0-9][0-9])/ ) {
            print "$3-$months{$2}-$1 $filename\n";
            last
        }

        if ( m/^$/ ) {                     # End of header
            print "-No--Date- $filename\n";
            last
        }
    }
    close MESSAGE;
}

# EOF
    
por 24.11.2012 / 18:48
0

Ao ler aqui, a diferença entre ctime e mtime é explicada aqui link . Eu posso lhe contar uma pequena ideia, apenas anote o timestamp para cada e-mail que você armazena, de modo que quando você recuperar a data exata em que foi enviado ou recebido, o que usamos para fazer backups, espero que ajude.

    
por 24.11.2012 / 17:10