代码之家  ›  专栏  ›  技术社区  ›  kagali-san

Perl/MIME编码文本问题

  •  0
  • kagali-san  · 技术社区  · 15 年前

    我有一个MIME编码的消息(在Maildir中),这两个消息都有base64编码的头(通过隐藏相关问题来解决( Decode an UTF8 email header ),decode('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>
    

    3 回复  |  直到 8 年前
        1
  •  0
  •   mscha    15 年前

    使用类似的模块 Email::MIME 努力工作。

    use strict;
    use warnings;
    use Email::MIME;
    
    my $msg = Email::MIME->new($message_text);
    print $msg->body;
    
        2
  •  1
  •   pacifist    9 年前

    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);
    
        3
  •  0
  •   Paul Roub jim    9 年前

    不幸的是,如果你碰巧用UTF8格式的邮件写了一个希腊字母lambda, MIME::Parser 酒吧,似乎没有已知的解决办法,甚至没有编辑所有 *.pm 文件,添加 use utf8;

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

    另见 CPAN Bug #105377