我一直在使用 perl 脚本来归档找到的邮件这里
该脚本使用 ctime 来处理并决定放置邮件的月份子文件夹。在大多数情况下,这很好,因为 ctime = mtime,因此邮件按发送或接收的月份进行存档。
但我发现有时候运行脚本不好。
例如,假设用户将邮件移回收件箱或邮件已从备份恢复到收件箱中。如果脚本处理所触及的邮件,它会将邮件移至所触及的月份,而不是发送/接收的时间。
用mtime处理邮件不是更好吗?
换句话说,我应该使用什么更好的 POSIX qw ?
答案1
我使用procmail
和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
答案2
正如我从这里读到的,ctime 和 mtime 之间的区别解释如下http://cerebro.freeshell.org/log/unix-mtime-vs-ctime/。我可以告诉你一个小想法,只需在你存储的每封邮件上附加时间戳,这样当你检索回邮件时,你就可以知道发送或接收邮件的确切日期,这是我们用于备份的方法。