Обработка пустых строк в заголовках электронной почты

Наткнулся на несколько писем, которые не соответствуют RFC.

authentication-results: spf=none (sender IP is ) smtp.mailfrom=**@********.**;

Content-Type: multipart/related;
    boundary="_004_2039b206f2a54788ba6a101978bd3f82DBXPR07MB013eurprd07pro_";
    type="multipart/alternative"
MIME-Version: 1.0

Например, в приведенном выше письме есть пустая строка в заголовке (перед Content-Type). Библиотеки, которые строго соблюдают RFC (например, https://github.com/mikel/mail), выиграли ;t быть в состоянии разобрать их. Apple Mail, Thunderbird справляются с такими письмами.

Пытался просмотреть кодовую базу Thunderbird, будучи незнакомым с C++, мне удалось найти https://github.com/mozilla/releases-comm-central/blob/1f2a40ec2adb448043de0ae96d93b44a9bfefcd1/mailnews/mime/src/mimemsg.cpp

Может ли кто-нибудь указать мне на часть кодовой базы Thunderbird, где происходит синтаксический анализ почты, или на любые библиотеки/приложения с открытым исходным кодом, которые обрабатывают такие письма без жалоб.

ИЗМЕНИТЬ:

Шестнадцатеричный дамп пустой строки. Он содержит пробел.

00013e0: 2a2a 2a2a 2a2a 2e2a 2a3b 0d0a 200d 0a43  ******.**;.. ..C
00013f0: 6f6e 7465 6e74 2d54 7970 653a 206d 756c  ontent-Type: mul
0001400: 7469 7061 7274 2f72 656c 6174 6564 3b0d  tipart/related;.

person nisanth074    schedule 27.06.2014    source источник
comment
Я подозреваю, что строка blank на самом деле не пуста, но имеет пробел, что сделало бы вашу проблему ошибкой в ​​реализации ruby, а не функцией в других реализациях - не могли бы вы добавить восьмеричный/шестнадцатеричный дамп проблемная строка*   -  person Soren    schedule 28.06.2014
comment
@Soren Добавлен шестнадцатеричный дамп, в строке есть пробел   -  person nisanth074    schedule 28.06.2014
comment
Таким образом, пустая строка на самом деле является строкой продолжения из предыдущего заголовка — рубиновый код в mail, вероятно, trims строк перед их синтаксическим анализом — что приводит к сбою кода в синтаксисе продолжения.   -  person Soren    schedule 28.06.2014
comment
@Soren Да, это пустой свернутый заголовок. Несовместимое поведение было представлено в github.com/mikel/mail/commit/. Проблема была поднята на github.com/mikel/mail/commit/.   -  person nisanth074    schedule 28.06.2014


Ответы (1)


Код Ruby в упомянутой библиотеке ruby не соответствует RFC, что позволяет объединять несколько строк в одна строка заголовка. Правило состоит в том, что строка заголовка продолжения (сворачивающиеся заголовки) должна начинаться с пробела — точная информация содержится в RFC 5322, раздел "Складывание пробелов и комментариев".

Наиболее вероятная проблема заключается в том, что код Ruby читает каждую строку и обрезает пробелы перед синтаксическим анализом - таким образом, не удается обнаружить, что дополнительная строка фактически принадлежит предыдущему заголовку - однако дополнительная строка ничего не добавляет к заголовку. (поскольку он содержит только пробел), но это допустимый синтаксис.

ИЗМЕНИТЬ:

Несоответствующее поведение было введено в фиксации 17783f8536fc09b926c7425dbacfc35e0e851ef5. Одним из введенных побочных эффектов является разделение заголовков и тела на пустой свернутый заголовок.

CRLF = /\r\n/
white_space = %Q|\x9\x20|
WSP = /[#{white_space}]/

header_part, body_part = raw_source.split(/#{CRLF}#{WSP}*#{CRLF}(?!#{WSP})/m, 2)

Проблема была поднята в коммите a2a45597bce66ebe788cedaaab848a37bd04b25a, но было принято решение не нарушать существующее поведение.

person Soren    schedule 28.06.2014