我正在尝试使用以下代码,但我还没有测试,因为我收到以下错误:
#!/usr/bin/perl
use warnings;
use strict;
use Text::Wrap;
use Mail::Box::Manager;
use HTML::Obliterate qw(extirpate_html);
open (MYFILE, '>>data.txt');
binmode(MYFILE, ':encoding(UTF-8)');
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 ( sort { $a->timestamp <=> $b->timestamp } $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->decoded->string;
if ( $msg->isMultipart ) {
foreach my $part ( $msg->parts ) {
if ( $part->contentType eq 'text/html' ) {
my $nohtml = extirpate_html( $msg );
$body =~ s/^>.*$//msg;
$Text::Wrap::columns=80;
print MYFILE wrap("", "", <<"");
\n
From: $from
To: $to
Date: $date
Subject: $subject
\n
$body
}
else {
$body =~ s/^>.*$//msg;
$Text::Wrap::columns=80;
print MYFILE wrap("", "", <<"");
\n
From: $from
To: $to
Date: $date
Subject: $subject
\n
$body
}
}}
所有大括号似乎都匹配,所以我不确定问题是什么
syntax error at x.pl line 46, near "else"
(Might be a runaway multi-line << string starting on line 36)
Missing right curly or square bracket at x.pl line 63, at end of line
syntax error at x.pl line 63, at EOF
Execution of x.pl aborted due to compilation errors.
编辑:
它现在有效,但html没有条纹:而是一些电子邮件,例如
&gt;
&GT;在整个过程中交错,导致它比它应该多得多。有没有更好的方法来做到这一点
答案 0 :(得分:4)
所以第36行似乎是
print MYFILE wrap("", "", <<"");
这意味着perl将包含以下文本,直到有终结符""
(我从不使用这样的混淆项,为了简单起见,我总是使用END或UNTIL_END。)
然后在第45行(空行)找到该终结符,这意味着它处理的下一步是第46行:
else {
这没有意义,因为之前的if
尚未关闭(第44行已经 终结符""
所以它被视为包装的文字.Perl注意到这一点,并且善意地建议你这可能是罪魁祸首:
(Might be a runaway multi-line << string starting on line 36)
您需要将第44行和第45行交换为首先使用终结符""
(空行),然后使用}
关闭if。您的示例中的第二个包装正确执行此操作。
答案 1 :(得分:1)
回答您修改过的问题:
而不是摘除邮件正文,而是取消整个邮件。然后你不要在任何地方使用它。
my $nohtml = extirpate_html( $msg );
$body =~ s/^>.*$//msg;
$Text::Wrap::columns=80;
print MYFILE wrap("", "", <<"");
\n
From: $from
To: $to
Date: $date
Subject: $subject
\n
$body
也许您需要将其更改为:
my $nohtml = extirpate_html( $body );
$nohtml =~ s/^>.*$//msg;
然后将$nohtml
应用为邮件正文。