Допустимы ли новые строки в заголовках MIME с использованием закодированных слов?

RFC 2047 определяет механизм закодированных слов для кодирование символов, отличных от ASCII, в документах MIME. Он указывает, что символы пробела (пробел и табуляция) не допускаются внутри закодированного слова.

Однако RFC 5322 для разбора документов электронной почты MIME указывает, что длинные строки заголовков должны быть «сложенный». Должна ли эта свертка происходить до или после декодирования закодированных слов?

Недавно я получил электронное письмо, в котором часть заголовка с закодированным текстом содержала новую строку, например:

Header: =?UTF-8?Q?=C3=A5
 =C3=A4?=

Будет ли это действительным?

Конечно, электронная почта может быть недействительной множеством интересных способов, и синтаксический анализатор должен с этим справиться, но интересно узнать «правильный» способ. :)


person Zeedox    schedule 21.09.2018    source источник
comment
Если вы кодируете новую строку, то это уже не свернутый текст заголовка, не так ли?   -  person Justinas    schedule 21.09.2018
comment
@Justinas Извините, я не понимаю вашего вопроса - когда вы говорите кодировать новую строку, вы имеете в виду кодирование как =0A? В моем примере я закодировал текст åä с помощью UTF-8.   -  person Zeedox    schedule 24.09.2018


Ответы (1)


Я неправильно понял вопрос и ответил, как будто это был другой вид пробела. В этом случае внутри слова MIME появляется пробел, а не несколько слов, разделенных пробелом.

Такие вещи явно запрещены. Из введения в формат в RFC2047:

2. Syntax of encoded-words

   An 'encoded-word' is defined by the following ABNF grammar.  The
   notation of RFC 822 is used, with the exception that white space
   characters MUST NOT appear between components of an 'encoded-word'.

И далее в том же разделе:

   IMPORTANT: 'encoded-word's are designed to be recognized as 'atom's
   by an RFC 822 parser.  As a consequence, unencoded white space
   characters (such as SPACE and HTAB) are FORBIDDEN within an
   'encoded-word'.  For example, the character sequence

      =?iso-8859-1?q?this is some text?=

   would be parsed as four 'atom's, rather than as a single 'atom' (by
   an RFC 822 parser) or 'encoded-word' (by a parser which understands
   'encoded-words').  The correct way to encode the string "this is some
   text" is to encode the SPACE characters as well, e.g.

      =?iso-8859-1?q?this=20is=20some=20text?=

   The characters which may appear in 'encoded-text' are further
   restricted by the rules in section 5.

Предыдущий ответ

Такие вещи явно разрешены. Заголовки со словами MIME должны содержать не более 76 символов и при необходимости сворачиваться. Свернутые заголовки RFC822 имеют отступ второй и любых дополнительных строк. Заголовки RFC2047 должны иметь отступ только в один пробел. Пробел между ?= в первой строке и =? должны быть исключены из вывода.

См. пример внизу страницы 12 RFC:

encoded form                                displayed as
---------------------------------------------------------------------
(=?ISO-8859-1?Q?a?=                         (ab)
   =?ISO-8859-1?Q?b?=)

       Any amount of linear-space-white between 'encoded-word's,
       even if it includes a CRLF followed by one or more SPACEs,
       is ignored for the purposes of display.
person Cupcake Protocol    schedule 14.10.2018
comment
Похоже, что в примере есть два отдельных закодированных слова с пробелом между. В моем примере у меня есть одно закодированное слово с пробелами внутри. Это все еще в силе? - person Zeedox; 17.10.2018
comment
Ха-ха, да, так оно и есть. Нет, это конкретно незаконно. Я дам другой ответ. - person Cupcake Protocol; 18.10.2018