【问题标题】:MIME::QuoterdPrint decodes everything but whitespaces in perl scriptMIME::QuoterdPrint 在 perl 脚本中解码除空格之外的所有内容
【发布时间】:2018-07-12 01:19:37
【问题描述】:

我正在用 Perl 的 Net::IMAP::Simple 模块编写一个简单的 imap 客户端。 我想在标准输出上打印消息主题。主题在 Quoted-Printables 中编码,因此我必须使用 MIME::QuotedPrint decode_qp() 函数对其进行解码。 一切都打印得很好,除了空格,它们保持编码,我不知道为什么。现在的输出如下所示:

[073] =?UTF-8?Q?[Myawesome_subject_topic]?= =?UTF-8?Q?_Сообщение?= =?UTF-8?Q?_номер?=

如您所见,空格位于 ?= 和 =?UTF-8?Q?_ 'tags' 之间。 不知道如何处理它们。相关部分的代码如下

my $nm = $imap->select('INBOX');
for (my $i = 1; $i <= $nm; $i++) {
if ($imap->seen($i)) {
    print '*';
} 
else {
    print " ";
}
my $es = Email::Simple->new(join '', @{ $imap->top($i) } );
my $decoded = $es->header('Subject');
$decoded = decode_qp($decoded);
printf("[%03d] %s\n", $i, $decoded);
}

更新和解决方案

  1. 使用 Encode 模块代替 MIME::QuotedPrint

    use Encode qw(decode);

  2. 像这样解码主题

    $decoded = decode("MIME-Header", $encoded);

以下已接受答案中有关该主题的其他信息

【问题讨论】:

    标签: perl character-encoding decode mime


    【解决方案1】:

    您不能使用quoted-printable 简单地解码完整的主题值,因为不是完整的主题被编码。如果你有类似的东西

     Subject: =?UTF-8?Q?AAAAAAAA?=   =?UTF-8?Q?BBBBBBBB?=
    

    您必须分别获取每个=?CHENC?Q?ENCODED?=,将ENCODED 部分解码为quoted-printable,然后根据字符编码CHENC(即您的特定情况下的UTF-8)解释结果。完成此操作后,将整个=?...?= 部分替换为解码数据。

    有关详细信息,请参阅RFC 2047。对于 Perl 中的现有实现,请参见例如 Encode::MIME::Header。另见Decode an UTF8 email header

    【讨论】:

    • 你活着——你学习。通过您提供的链接的解决方案完美运行。谢谢。必须阅读 rfc 以了解电子邮件规范
    猜你喜欢
    • 2013-05-08
    • 1970-01-01
    • 2018-07-23
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2013-09-08
    相关资源
    最近更新 更多