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:
的“旧”行为。但是文档和行为发生了变化,它(现在)说_但是,它不能直接用于具有字段名称的整个标题或结构化标题字段,如From
、To
、Cc
、Message-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 编码的主要内容,如果未能解决你的问题,请参考以下文章
通过管道在 gdb 的 MI 输出上级别触发的 epoll_wait() 不通知“(gdb)\n”行的存在