Perl / MIME编码文本麻烦

时间:2010-10-26 18:03:48

标签: perl mime

我有一个MIME编码的消息(在Maildir中),它们都有base64编码的头文件(通过潜伏相关问题(Decode an UTF8 email header)解码,解码('MIME-Header',$ val),正文中的主体和正文中的text / plain 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>

已知消息在GMail中正确显示。

3 个答案:

答案 0 :(得分:1)

FWIW Email :: MIME在我测试的一些示例电子邮件中对我来说似乎很脆弱。 Email :: Parser对我来说效果更好,试图提取可能在base64中的文本/ html或text / plain段(通常有transfer-encoding 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);

答案 1 :(得分:0)

使用像Email::MIME这样的模块来完成艰苦的工作。

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

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

答案 2 :(得分:0)

可悲的是,如果您碰巧在UTF8格式的邮件中编写希腊语lambda MIME::Parser barfs,并且似乎没有已知的解决方法 - 甚至没有编辑所有*.pm个文件,请添加{{ 1}}等等。

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

另见CPAN Bug #105377