формат python «unflow» = электронная почта в потоке

При отправке

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. 

в электронной почте в одну строку, как указано выше, Thunderbird преобразует ее в это:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy 
eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam 
voluptua.

Я полагаю, это как-то связано с этим заголовком format=flowed:

Content-Type: text/plain; charset=ISO-8859-15; format=flowed
Content-Transfer-Encoding: 7bit

При отображении почты в Thunderbird все выглядит нормально. Строка отображается как одна строка. Однако при разборе с помощью pythons Message.get_payload символы новой строки все еще отображаются, что полностью ухудшает читабельность.

Как я могу заставить python преобразовать эти «текущие» строки текста в обычные?


person Zulakis    schedule 05.08.2013    source источник


Ответы (1)


Используйте formatflowed библиотеку, чтобы преобразовать такой текст в "обычный" текст:

from formatflowed import convertToWrapped

text = convertToWrapped(msg.get_payload(), character_set=msg.get_charset())

Обратите внимание, что вам нужно передать строку байтов, а не значение unicode; библиотека декодирует для вас Unicode.

Обязательный отказ от ответственности: я являюсь автором этой библиотеки, хотя и довольно давно.

person Martijn Pieters    schedule 05.08.2013
comment
Хотя было бы лучше иметь это в ядре python, это выглядит очень круто, спасибо! Я собираюсь попробовать это сейчас. - person Zulakis; 05.08.2013
comment
Поддерживает ли это юникод? Это напрямую сгенерировало эту ошибку для меня: UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 8: ordinal not in range(128) Unicode char 'xf6' - это немецкий умлаут ö. Ничего особенного. Нужно ли устанавливать что-то еще? Я разместил трассировку здесь: pastebin.com/TKJUggxx - person Zulakis; 05.08.2013
comment
Добавьте параметр character_set, указывающий кодек, но передайте строку байтов (IIRC). - person Martijn Pieters; 05.08.2013
comment
Хм, у меня все еще есть небольшие проблемы с этим. Можете ли вы присоединиться ко мне в чате, чтобы мне не нужно было писать так много кода в комментариях? chat.stackoverflow.com/rooms/34864/ - person Zulakis; 05.08.2013
comment
Thunderbird также добавляет разрывы в заголовок subject. Однако при использовании его в заголовке темы он не удалял новые строки. Как я могу заставить это работать? Фрагмент здесь: pastebin.com/tHx8c8pP - person Zulakis; 06.08.2013
comment
Заголовки сообщений никогда не имеют формат format-flowed; они всегда представляют собой обычный текст или используют кодировку с возможностью печати в кавычках, чтобы сделать их обычным текстом. - person Martijn Pieters; 06.08.2013
comment
Это стандартный текстовый заголовок. Заголовки, совместимые с RFC, остаются в пределах ограничения длины строки, разбивая пробелы на несколько строк с добавлением пробелов. Разделите заголовок на [ ]+\n и соедините одним пробелом. ' '.join([line.lstrip(' ') for line in header.split('\n')]) тоже сделал бы это. - person Martijn Pieters; 06.08.2013
comment
Хорошо, я не знал, что это обеспечивается RFC. Никогда не видел его раньше. Спасибо за просвещение ;-) - person Zulakis; 06.08.2013
comment
Это решение работает как шарм, но с оговоркой. convertToWrapped имеет параметр (ширину) со значением по умолчанию 78, что на практике означает, что новые разрывы строки добавляются к символу 78. В результате в выводе convertToWrapped все еще есть разрывы строк там, где их быть не должно. Решением этой проблемы является указание очень большого значения ширины: text = convertToWrapped(msg.get_payload(), character_set=msg.get_charset(), width=10000000000000000000) - person Paulo Malvar; 01.06.2016