2

我想知道如何修改下面的代码以去除=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 行的语法错误,靠近 "}"(可能是runaway multi-line << string 从第 25 行开始) x.pl 的执行由于编译错误而中止。

我不确定为什么,因为语法看起来不错。

4

2 回答 2

3

我猜这些实例=20都在消息的正文中。阅读一点Mail::Message 的文档就会发现这个有用的说明:

请注意,这会返回一个可能已编码的对象:使用 decoded() 获取包含可用数据的主体。

因此,不要$msg->body在循环中调用,只需调用$msg->decoded->string.

使用时完成排序应该是最容易的Mail::Message::timestamp

...
for my $msg ( sort { $a->timestamp <=> $b->timestamp } $folder->messages) )
...
于 2008-12-15T13:07:18.507 回答
0

我建议查看MIME::Base64模块,其中包括 MIME::QuotedPrint::Perl 模块来解码 QP 主体。

于 2008-12-15T13:05:40.757 回答