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

tim*_*oto 1 backup email posix

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

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

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

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

通过 mtime 处理邮件不是更好吗?

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

Bil*_*hor 5

我使用procmailand Dovecot,但 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
Run Code Online (Sandbox Code Playgroud)