Восстановление файлов сообщений курьера

Ping действительно только хорош для тестирования, 'система'. Время отклика является определенным отвлекающим маневром. В некоторых системах ответам ping ICMP дают низкий приоритет, и поэтому это не проблема, если время отклика варьируется. Я также видел, что кто-то волнуется о времени отклика ping, и это оказалось проблемой на его собственном ПК, не системами, по поводу которых он волновался.

Если бы это - единственная вещь, Вы видите, я не волновался бы об этом. Если бы Вы видите другие проблемы, то я посмотрел бы на те проблемы.

1
задан 5 July 2012 в 08:25
1 ответ

Спасибо @mailq. Оказывается, что помимо метки времени в начале имени файла сообщения, courier также смотрит на метку времени модификации самого файла. Мне также пришлось установить это для полученной метки времени.

Вот сценарий, который, учитывая кучу сообщений, копирует их в выходной каталог после переписывания имени файла и времени модификации, чтобы содержать метку времени получения.

#!/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";
    }
}

Используйте сценарий следующим образом:

perl rename.pl cur/*

Когда вы убедитесь, что он будет работать правильно:

perl rename.pl cur/* --output-dir cur_renamed

Тогда вам просто нужно будет заменить cur_renamed на cur , удалите свой courierimapuiddb и, возможно, перезапустите ваши почтовые клиенты. На моем устройстве iOS мне пришлось удалить учетную запись электронной почты, а затем выполнить повторную синхронизацию с iTunes, чтобы она правильно очистила кеш.

1
ответ дан 4 December 2019 в 01:17

Теги

Похожие вопросы