2010-10-26 45 views
0

我有一個MIME編碼的消息(在Maildir中),它們都具有base64編碼的頭文件(通過潛伏相關問題解決(Decode an UTF8 email header),decode('MIME-Header',$ val ),主體以純文本和身體編碼數據的文本/無格式的base64;Perl/MIME編碼的文本錯誤

據說,該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中正確顯示。

回答

0

使用像Email::MIME這樣的模塊來完成艱苦的工作。

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

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

FWIW電子郵件::在我測試的一些示例電子郵件中,MIME對我來說似乎很脆弱。電子郵件::分析器工作更好地爲我試圖提取文本/ html或text/plain的片段,可能是用base64(通常有轉移的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); 
0

可悲的是,如果你碰巧寫在UTF8格式的郵件,MIME::Parser barfs,希臘拉姆達而且似乎沒有已知的解決方法 - 甚至沒有編輯的所有文件*.pm,加入use utf8;

嘗試在雷鳥打開一個新的消息,附上一些文件,將該Unicode字符寫入正文並將其保存爲.eml文件。MIME::Parser將引發錯誤。

另請參閱CPAN Bug #105377