如何按日期对mbox文件进行排序?

时间:2008-12-15 12:52:24

标签: perl mbox

我想知道如何修改下面的代码以在多行的末尾删除=20个字符,主要是按时间顺序对消息进行排序,从第一次接收或发送到最后。我不确定这是否是一个内部Perl例程。

#!/usr/bin/perl
use warnings;
use strict;
use Mail::Box::Manager;

my $file = shift || $ENV{MAIL};
my $mgr = Mail::Box::Manager->new(
    access          => 'r',
);

my $folder = $mgr->open( folder => $file )
or die "$file: Unable to open: $!\n";

for my $msg ($folder->messages)
{
    my $to          = join( ', ', map { $_->format } $msg->to );
    my $from        = join( ', ', map { $_->format } $msg->from );
    my $date        = localtime( $msg->timestamp );
    my $subject     = $msg->subject;
    my $body        = $msg->body;

    # Strip all quoted text
    $body =~ s/^>.*$//msg;

    print <<"";
From: $from
To: $to
Date: $date
$body

}

尝试运行时遇到以下错误:

“my”变量$ msg在x.pl第16行的同一范围内屏蔽早期声明。 x.pl第15行的语法错误,靠近“))” x.pl第31行的语法错误,靠近“}”   (可能是一个失控的多行&lt;&lt;字符串从第25行开始) 由于编译错误,x.pl的执行中止。

我不确定为什么,因为语法似乎很好。

2 个答案:

答案 0 :(得分:3)

我猜那些=20的实例都在消息的正文中。只需阅读documentation for Mail::Message中的一点就会发现这个有用的注释:

  

请注意,这会返回一个可能被编码的对象:使用decoding()来获取具有可用数据的正文。

因此,只需拨打$msg->body

,而不是在循环中调用$msg->decoded->string

使用Mail::Message::timestamp

时,最简单的排序应该是最简单的
...
for my $msg ( sort { $a->timestamp <=> $b->timestamp } $folder->messages) )
...

答案 1 :(得分:0)

我建议查看包含MIME :: QuotedPrint :: Perl模块的MIME::Base64模块来解码QP主体。