基于 mtime 或 ctime 归档/移动邮件更好吗?

基于 mtime 或 ctime 归档/移动邮件更好吗?

我一直在使用 perl 脚本来归档找到的邮件这里

该脚本使用 ctime 来处理并决定放置邮件的月份子文件夹。在大多数情况下,这很好,因为 ctime = mtime,因此邮件按发送或接收的月份进行存档。

但我发现有时候运行脚本不好。

例如,假设用户将邮件移回收件箱或邮件已从备份恢复到收件箱中。如果脚本处理所触及的邮件,它会将邮件移至所触及的月份,而不是发送/接收的时间。

用mtime处理邮件不是更好吗?

换句话说,我应该使用什么更好的 POSIX qw ?

答案1

我使用procmailDovecot,但 maildir 结构相当标准化。

如果您尝试按日期存档,您可能需要Date从标题中进行验证。从标题顶部读取您找到的第一个日期应该非常准确。我的消息有三个可以使用的字段Delivery-Date:Received:标题和Date:标题。对于收到的消息,第一个Delivery-Date:或第一个Received:标头将具有适当的日期。对于发送的消息,您可能只有标Date:头,这可能反映创建它的系统的时间,而不是您的邮件服务器的时间。您可能想要标记标头中没有可用日期的邮件。

ctime通常应该是邮件的日期,但在某些情况下,移动或复制邮件时会创建邮件的新副本。通常,这些操作是通过将文件重新链接到正确的目录来进行的。编辑:此脚本将打印包含文件中第一个日期的消息列表。它与 RFC 日期格式匹配。正则表达式可能不是最好的。

#!/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

答案2

正如我从这里读到的,ctime 和 mtime 之间的区别解释如下http://cerebro.freeshell.org/log/unix-mtime-vs-ctime/。我可以告诉你一个小想法,只需在你存储的每封邮件上附加时间戳,这样当你检索回邮件时,你就可以知道发送或接收邮件的确切日期,这是我们用于备份的方法。

相关内容