Perl 在 5.26 中损坏的邮件标题行的 Mime 编码

Posted

技术标签:

【中文标题】Perl 在 5.26 中损坏的邮件标题行的 Mime 编码【英文标题】:Mime encoding of mail header lines with Perl broken in 5.26 【发布时间】:2019-04-04 10:41:03 【问题描述】:

我们使用 Perl 来编码正确的邮件标题行。新版本v5.26.2遇到如下问题,这里简化几行:

$ cat mime.pl

use strict;
use utf8;
use Encode;

print "$^V", "\n";
my $encoded = Encode::encode('MIME-Q', 'To: Blödmann <guru@sisis.de>');
print "$encoded", "\n";

v5.16.2:

$ /usr/local/sisis-pap/perl5.16.2/bin/perl mime.pl
v5.16.2
To:=?UTF-8?Q?=20Bl=C3=B6dmann=20?=<guru@sisis.de>

v5.26.2:

$ /usr/local/sisis-pap/bin/perl mime.pl
v5.26.2
=?UTF-8?Q?To=3A_Bl=C3=B6dmann_=3Cguru=40sisis=2Ede=3E?=

即在 v5.26.2 中,整行被编码为带引号的可打印(并且 sendmail 不会理解。在 v5.16.2 中,只有带有 UTF-8 德语变音符号的“Blödman”一词被编码,邮件地址本身保持不变。

这应该如何解决?

【问题讨论】:

您是否查看过 Encode 的源代码,并试图确定何时进行了引入这种新行为的更改? 至少在 Encode v2.84 中,存在不编码 To: 的“旧”行为。但是文档和行为发生了变化,它(现在)说_但是,它不能直接用于具有字段名称的整个标题或结构化标题字段,如FromToCcMessage-Id等... _ ,所以我的建议是你审查你的代码并适应它。从 2.84 到当前的差异:metacpan.org/diff/file?target=DANKOGAI/Encode-2.98/… 【参考方案1】:

5.16.2 中的输出不遵循RFC2822,只有 Perl 可以将其解析回原始标头。

改用Email::MIME::Header::AddressList:

#!/usr/bin/perl
use warnings;
use strict;
use utf8;

use Email::MIME::Header::AddressList;

my $unicode_addresses = 'Blödmann <guru@sisis.de>, Großmann <guru@example.com>';
my $mime_encoded_addresses = 'Email::MIME::Header::AddressList'
    ->from_string($unicode_addresses)
    ->as_mime_string();

print "To: $mime_encoded_addresses\n";

输出:

To: =?UTF-8?B?QmzDtmRtYW5u?= <guru@sisis.de>, =?UTF-8?B?R3Jvw59tYW5u?= <guru@example.com>

请参阅Encode::MIME::Header,了解如何正确使用带有 MIME-* 的 Encode。

【讨论】:

以上是关于Perl 在 5.26 中损坏的邮件标题行的 Mime 编码的主要内容,如果未能解决你的问题,请参考以下文章

在主目录中安装perl模块时出现问题

通过管道在 gdb 的 MI 输出上级别触发的 epoll_wait() 不通知“(gdb)\n”行的存在

如何在不使用命令行的情况下运行 Perl 脚本?

如何在 perl 中发送 HTML/纯文本邮件

在 perl 中使用电子邮件 :: MIME 发送多个文件?

perl升级后shutter程序无法运行的修复