Perl/MIME编码文本故障

Perl/MIME编码文本故障,perl,mime,Perl,Mime,我有一个MIME编码的消息(在Maildir中),它有base64编码的头(通过潜伏相关问题()解决)、解码('MIME-Header',$val)、纯文本的主体和正文中的文本/纯base64编码的数据 据说base64数据是用utf-8编码的。 然而,当我这样做时: use MIME::Base4; .. $decoded = decode_base64($block_from_line_array); # MIME body extracted from message's $msgtext

我有一个MIME编码的消息(在Maildir中),它有base64编码的头(通过潜伏相关问题()解决)、解码('MIME-Header',$val)、纯文本的主体和正文中的文本/纯base64编码的数据

据说base64数据是用utf-8编码的。 然而,当我这样做时:

use MIME::Base4;
..
$decoded = decode_base64($block_from_line_array); # MIME body extracted from message's
$msgtext .= $decoded;
..
print decode('utf-8', $msgtext);
似乎该块的解码不正确

print decode('utf-8', $msgtext); works ok, when message body is in utf-8
附上:

X-Priority: 3
X-Mailer: PHPMailer (phpmailer.sourceforge.net) [version 2.0.4]
X-Mailer: http://www.we.praise.buggy.php.scripts.what.we.do.when.we.dont.do.us
X-MessageID: 140
MIME-Version: 1.0
Content-Type: multipart/alternative;
 boundary="b1_16819d4d69564bfc0185ed5b9508ad31"

<Here the body begins -- mhambra>
--b1_16819d4d69564bfc0185ed5b9508ad31
Content-Type: text/plain; charset = "utf-8"
Content-Transfer-Encoding: base64
<MIME BLOCK>
X优先级:3
X-Mailer:PHPMailer(PHPMailer.sourceforge.net)[版本2.0.4]
X-Mailer:http://www.we.praise.buggy.php.scripts.what.we.do.when.we.dont.do.us
X-MessageID:140
MIME版本:1.0
内容类型:多部分/备选;
boundary=“b1䆳D4D69564BFC0185ED5B9508AD31”
--b1_16819d4d69564bfc0185ed5b9508ad31
内容类型:文本/普通;charset=“utf-8”
内容传输编码:base64
消息在GMail中被正确显示。

使用类似的模块来完成这项艰巨的工作

use strict;
use warnings;
use Email::MIME;

my $msg = Email::MIME->new($message_text);
print $msg->body;

在我测试的一些示例电子邮件中,FWIW Email::MIME对我来说似乎很脆弱。Email::Parser在尝试提取可能在base64中的text/html或text/plain段(通常具有传输编码base64/utf-8)时效果更好

use MIME::Parser;
use MIME::Base64;

sub flatten_parts {
    my ($mimePart, $fh) = @_;
    $fh or $fh = select;
    my $part;
    no strict 'refs';
    if($mimePart->mime_type =~ /text\/(plain|html)/i){
        my $base64=join('',@{$mimePart->body}); # This will be the base64 we're after.
        my $encoding = $mimePart->head->mime_encoding;
        if($encoding eq 'base64'){
                my $plainContent=MIME::Base64::decode_base64($base64);
                print $plainContent;
        }
    }   
    ### walk the parts:
    my @parts = $mimePart->parts;
    foreach $part (@parts) {
        flatten_parts($part, $fh);
    }
}
### Create a new parser object:
our $parser = new MIME::Parser;
### Parse an input filehandle:
$entity = $parser->parse(\*STDIN);
flatten_parts($entity);

不幸的是,如果您碰巧在UTF8格式的邮件中编写了一个希腊lambda,
MIME::Parser
barfs,并且似乎没有已知的解决方法 — 甚至不编辑所有
*.pm
文件,添加
使用utf8;

尝试在Thunderbird中打开新邮件,附加一些文件,在正文中写入unicode字符并将其另存为
.eml
文件。
MIME::Parser
将抛出错误

另见