MIME :: Правильно ли закодированы заголовки сущностей? - PullRequest
2 голосов
/ 01 августа 2011

Я использую модуль MIME :: Entity в Perl для создания сообщения MIME. Некоторые заголовки, кажется, закодированы нормально, в то время как другие, похоже, имеют проблемы со свертыванием.

Код:

use strict;
use Encode;
use MIME::Entity;

my %build_params = (
    'Charset'    => 'UTF-8',
    'From'       => encode('MIME-Header', 'Fantasy Email <vujerldujhgurtelhwgutrwhgunwlhvulhgvnuwlhvuwlnhvgnulwh@gmail.com>'),
    'Subject'    => encode('MIME-Header', "A very long subject that will span on multiple lines in the headers, with a leading sp\
ace at the beginning of each new line."),
    'Type'       => 'multipart/alternative',
);


my $top = MIME::Entity->build(%build_params);

$top->print_header();

Выход:

Content-Type: multipart/alternative;
 boundary="----------=_1312196104-11708-0";
 charset="UTF-8"
Content-Transfer-Encoding: binary
MIME-Version: 1.0
X-Mailer: MIME-tools 5.427 (Entity 5.427)
Subject: A very long subject that will span on multiple lines in the
 headers,  with a leading space at the beginning of each new line.
From: Fantasy Email
 <vujerldujhgurtelhwgutrwhgunwlhvulhgvnuwlhvuwlnhvgnulwh@gmail .com>

Кажется, Subject правильно разделен на несколько строк. From нет, оставляя пробел перед com, но символ новой строки пропал.

Это стандартное поведение или я обнаружил ошибку в MIME :: Entity?

1 Ответ

1 голос
/ 01 августа 2011

Encode :: MIME :: Header (называемый encode('MIME-Header', ...)) выполняет некоторое разбиение строки (называемое свертыванием в RFC 822 ).

К сожалению, MIME :: Entity делает некоторыерасщепление линий тоже, вероятно, по-другому.Это также избавляет от новой строки, сгенерированной Encode :: MIME :: Header.Это оставляет пробелы.

Я был бы счастлив оставить MIME :: Entity для кодирования моих заголовков, но похоже, что он просто выполняет разделение строк.Так что я думаю, что мне все еще нужно кодировать их самостоятельно.

В качестве обходного пути я удалил маркеры разделения строк из моих закодированных заголовков с помощью

 my $encoded_from = encode('MIME-Header', 'Fantasy Email <vujerldujhgurtelhwgutrwhgunwlhvulhgvnuwlhvuwlnhvgnulwh@gmail.com>');
 $encoded_from =~ s/\r?\n\s//g;

(И то же самое для предмета.)

Теперь вывод выглядит следующим образом:

Subject: A very long subject that will span on multiple lines in the
 headers, with a leading space at the beginning of each new line.
From: Fantasy Email
 <vujerldujhgurtelhwgutrwhgunwlhvulhgvnuwlhvuwlnhvgnulwh@gmail.com>

Мне интересно, есть ли более элегантное решение, такое как Encode :: MIME :: Header с режимом совместимости MIME :: Entity иличто-то в этом роде.

...