代码之家  ›  专栏  ›  技术社区  ›  CoffeeMonster

解码utf8电子邮件头

  •  23
  • CoffeeMonster  · 技术社区  · 17 年前

    我有一个表单的电子邮件主题:

    =?utf-8?B?T3.....?=
    

    电子邮件的正文是utf-8base64编码的,并且已经很好地解码了。 我目前正在使用Perl的email::mime模块来解码电子邮件。

    =的含义是什么?UTF-8分隔符以及如何从该字符串中提取信息?

    5 回复  |  直到 11 年前
        1
  •  34
  •   Palec    11 年前

    这个 encoded-word 令牌 RFC 2047 )可能出现在某些头的值中。分析如下:

    =?<charset>?<encoding>?<data>?=
    

    字符集是utf-8。在这种情况下,编码是 B 这意味着base64(另一个选项是 Q 即引用的可打印文件)。

    要读取它,首先对base64进行解码,然后将其视为utf-8字符。

    还可以阅读各种Internet邮件RFC了解更多详细信息,主要是 RFC 2047 .

    因为您使用的是Perl, Encode::MIME::Header 可能有用:

    简介

    use Encode qw/encode decode/;
    $utf8   = decode('MIME-Header', $header);
    $header = encode('MIME-Header', $utf8);
    

    摘要

    该模块实现了RFC2047mime 头编码。有3种变体 编码名称;mime头,mime-b 和mime-q的区别在于 下面描述

                  decode()          encode()  
    MIME-Header   Both B and Q      =?UTF-8?B?....?=  
    MIME-B        B only; Q croaks  =?UTF-8?B?....?=  
    MIME-Q        Q only; B croaks  =?UTF-8?Q?....?=
    
        2
  •  17
  •   moritz    17 年前

    我认为编码模块用 MIME-Header 编码,请尝试以下操作:

    use Encode qw(decode);
    my $decoded = decode("MIME-Header", $encoded);
    
        3
  •  3
  •   marijne    17 年前

    退房 RFC2047 . “B”表示最后两个“之间”的部分?S是base64编码的。“utf-8”自然意味着解码后的数据应解释为utf-8。

        4
  •  2
  •   Palec    11 年前

    MIME::Words 从mime工具也可以很好地解决这个问题。我遇到了一些关于encode的问题,发现mime::words在一些字符串上成功,而encode没有成功。

    use MIME::Words qw(:all);
    $decoded = decode_mimewords(
        'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
    );
    
        5
  •  1
  •   wnoise    17 年前

    这是标题的字符集标签的标准扩展,在 RFC2047 .