Мы используем 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 <[email protected]>');
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?=<[email protected]>
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 закодировано только слово "Blödman" с UTF-8 German Umlaut, сам почтовый адрес оставлен в покое .
Как это исправить?
По крайней мере, в Encode v2.84 присутствовало "старое" поведение отсутствия кодирования To:
. Но документация и поведение изменились, и (теперь) говорится: _Однако его нельзя использовать напрямую для всего заголовка с именем поля или для полей структурированного заголовка, таких как From
, To
, Cc
, Message-Id
и т. Д ... _, поэтому Я рекомендую вам просмотреть свой код и адаптироваться к нему. Разница с 2,84 до текущего: metacpan.org/diff/file?target=DANKOGAI/Encode-2.98/…
Вывод в 5.16.2 не следует за RFC2822, и только Perl может проанализировать его до исходного заголовка.
Вместо этого используйте Электронная почта :: MIME :: Заголовок :: Список адресов:
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
use Email::MIME::Header::AddressList;
my $unicode_addresses = 'Blödmann <[email protected]>, Großmann <[email protected]>';
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?= <[email protected]>, =?UTF-8?B?R3Jvw59tYW5u?= <[email protected]>
См. Кодировать :: MIME :: Заголовок о том, как правильно использовать кодирование с MIME- *.
Вы еще не просмотрели исходный код Encode, чтобы попытаться определить, когда было внесено изменение, вводящее это новое поведение?