Обработка пустых строк в заголовках писем

Наткнулся на несколько писем, которые не соответствуют 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), не сможет разобрать их. Apple Mail, Thunderbird удается обрабатывать такие письма.

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

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

РЕДАКТИРОВАТЬ:

Hexdump пустой строки. Содержит пробел.

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;.

4

Решение

Рубиновый код в ссылочной рубиновая библиотека не подтверждает 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, но консенсус должен был не нарушать существующее поведение.

3

Другие решения


По вопросам рекламы [email protected]