Вопрос по email, perl, utf-8, encoding, subject – Как закодировать тему письма в perl?

5

Как закодировать тему письма в perl?

Теперь я наконец-то нашел что-то, но оно все еще не работает

use MIME::Words qw/encode_mimewords/;
$recipientsubject = encode_mimewords('Votre fichier a bien été envoyé');

Но (прослушанный) результат:

Subject: Votre fichier a bien =?ISO-8859-1?Q?=E9t=E9?= =?ISO-8859-1?Q?envoy=E9?=

Который отображает:

Votre fichier a bien étéenvoyé

(Ест некоторые пробелы)

Обновите свою версию MIME :: Words. Этоbug #5462 in MIME:Tools, которая была исправлена в MIME :: Tools 5.504 в начале 2013 года. Palec

Ваш Ответ

2   ответа
16

использованиешифроватьэто основной модуль.

perl -Mutf8 -MEncode -E 'say encode("MIME-Header", "Votre fichier a bien été envoyé")'

& # X2026; выведет любой из:

=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?=
=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?=

И расшифровать с помощью:

perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?Q?Votre=20fichier=20a=20bien=20?= =?UTF-8?Q?=C3=A9t=C3=A9=20envoy=C3=A9?=")'
perl -C -MEncode -E 'say decode("MIME-Header", "=?UTF-8?B?Vm90cmUgZmljaGllciBhIGJpZW4gw6l0w6kgZW52b3nDqQ==?=")'

Который напечатает:

Votre fichier a bien été envoyé

Если у вас остались те же результаты, вы должны предоставить больше информации о вашей среде Perl. Версия - хороший стартер.

Не могли бы вы предоставить ссылку на эти отчеты / примеры, а также, возможно, альтернативу, которая работает лучше для вас?
Педантичная нота: сdecode если нет конкретной причины для обратного, лучше использоватьMIME-Header, поскольку он может обрабатывать кодировки MIME Q и B.RFC 2047 заявляет, что «программа для чтения почты, которая утверждает, что распознает« закодированное слово », ДОЛЖНА быть в состоянии принять любую кодировку для любого набора символов, который она поддерживает.»
Отлично, большое спасибо ! Я использовал Encode и использовал encode («MIME-q», «Votre fichier a bien» Denis BUCHER
На самом деле, Encode :: MIME :: Header глючит, и, как я видел в багтрекере, автор некомпетентен. Он неоднократно закрывал правильные отчеты об ошибках, даже когда им давали действительные ссылки на RFC. На самом деле, поскольку Encode :: MIME :: Header является основным модулем, многие другие модули полагаются на него, а Perl-скрипт по всему Интернету отправляет испорченную электронную почту.
2

Другой модуль, который обрабатывает MIME-кодирование не-ASCII-строк,Email :: MIME :: RFC2047, Например

use strict;
use warnings;
use utf8;

use Email::MIME::RFC2047::Encoder;
use Email::MIME::RFC2047::Decoder;

binmode(STDOUT, ':utf8');

my $encoder = Email::MIME::RFC2047::Encoder->new;
my $encoded = $encoder->encode_text('Votre fichier a bien été envoyé');
print "$encoded\n";

my $decoder = Email::MIME::RFC2047::Decoder->new;
my $decoded = $decoder->decode_text($encoded);
print "$decoded\n";

печать

Votre fichier a bien =?utf-8?Q?=c3=a9t=c3=a9_envoy=c3=a9?=
Votre fichier a bien été envoyé

Некоторые преимущества Email :: MIME :: RFC2047 перед Encode:

  • It tries hard to use MIME encoding for as few words as possible, also by using quoted strings in phrases.
  • It supports correct decoding of MIME phrases used in To, From, or Cc headers (impossible with Encode).
  • It supports other character sets than UTF-8.
  • It encodes space as underscore in MIME-Q encoded words.
  • It has fewer bugs than Encode (none that I know of).

Disclosure: I am the author of the module.

@Palec Я только проверяю, что слова, закодированные в MIME, не длиннее максимальной длины (75 символов или около того). Затем сгиб строки выполняется модулем, который управляет заголовками, какEmail::Simple.
В описании модуля вы пишете о RFC 822. Это самый старый, устарел RFC 2822, который, в свою очередь, устарел в RFC 5322. Самый последний (из 2008) не поддерживается должным образом, AFAIK, но RFC 2822 (с 2001 года) поддерживается и исправляет, по крайней мере, перенос строки, что не работает в RFC 822. У вас есть причина предпочесть 822 над 2822?
Я расскажу об этом больше когда-нибудь. Вы должны где-то выполнить сворачивание строк, потому что RFC накладывают строгое ограничение на длину строки, содержащей закодированное слово. Если вы не свернете, вы не сможете закодировать произвольно длинный текст.
@Palec Должен признать, что я совершенно не разбираюсь в различиях между RFC. Но я думаю, что мой модуль соответствует RFC 2822 и, возможно, RFC 5322. Основные классы для кодирования и декодирования не складывают линии и работают только сphrase а такжеtext производства.

Похожие вопросы