Парсинг переадресованных писем - PullRequest
10 голосов
/ 30 января 2010

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

Если быть точным, я не знаю, охвачен ли «макет» переадресованных писем каким-либо стандартом или рекомендацией, или он только что развился за прошедшие годы, поэтому в настоящее время большинство почтовых клиентов выдают схожие результаты для текстовой части:

    Begin forwarded message: 

    > From: Me <me@me.me>
    > Date: January 30, 2010 18:26:33 PM GMT+02:00
    > To: Other Me <other-me@me.me>
    > Subject: Unwise question

- и без ума от вложений (и любых других разделов MIME).

Если это все еще не достаточно точно, я проясню это, просто я не на 100% уверен, о чем спрашивать (RFC, Python lib, соглашение или что-то еще).

Ответы [ 4 ]

5 голосов
/ 31 января 2010

В отличие от того, что говорили многие другие, является стандартом для пересылаемых электронных писем, RFC 2046 , «Многоцелевые расширения почты Интернета (MIME), часть вторая: типы медиа», более десятилетний. Специально см. Раздел 5.2 «Тип носителя сообщения».

Основная идея RFC 2046 заключается в инкапсуляции одного сообщения в часть MIME другого типа с именем (к сожалению) message/rfc822 (никогда не забывайте, что MIME является рекурсивным). MIME-библиотека Python может с этим справиться.

Я не отрицал другие ответы, потому что они верны в одном отношении: стандарт не соблюдается каждым почтовиком. Например, почтальон mutt может переслать сообщение в формате RFC 2046, но также и в формате adhoc. Таким образом, на практике почтовый сервер, вероятно, не может обрабатывать только RFC 2046, он также должен анализировать различные другие и недостаточно определенные синтаксисы.

2 голосов
/ 30 января 2010

По моему опыту, почти всегда почтовый клиент перенаправляет / отвечает по-другому. Как правило, в нижней части почтового пакета вы будете иметь текстовую версию и версию в кодировке html. Заголовки почты имеют RFC (http://www.faqs.org/rfcs/rfc2822.html "2822" ), но, к сожалению, содержимое тела сообщения выходит за рамки.

Вам приходится бороться не только с дисперсией почтового клиента, но и с изменением предпочтений пользователя. В качестве примера: Lotus Notes помещает ответы вверху, а Thunderbird - внизу. Поэтому, когда пользователь Thunderbird отвечает на ответ пользователя Lotus Notes, он может вставить свой ответ вверху и оставить свою подпись внизу.

Другая ловушка может быть связана с переносом слов в ответных цепях.

>>>> Внешний ответ, превышающий ограничение и заключенный в слово
почтовый клиент среднего ответчика \ n
>> Тело сообщения среднего ответа
> Предыдущий ответ
Последний ответ

Я бы не стал анализировать сообщение и оставить его пользователю для анализа в его голове. Или я позаимствовал бы код из другого проекта.

2 голосов
/ 30 января 2010

Как уже указывают другие ответы: стандарта нет, и ваша программа не будет безупречной.

Вы можете взглянуть на заголовки, в частности заголовок User-Agent, чтобы увидеть, какой тип клиента использовался, и код специально для наиболее распространенных клиентов.

Чтобы узнать, каких клиентов вы должны поддержать, взгляните на это исследование популярности . Различные перспективы, Yahoo !, Hotmail, Mail.app, почта iPhone, Gmail и Lotus Notes имеют высокий рейтинг. Около 11% писем классифицируется как «необнаружимые», но, используя заголовки переадресованной электронной почты, вы можете сделать это лучше. Обратите внимание, что статистика была собрана путем размещения изображения внутри электронного письма, поэтому результаты могут быть искажены.

Другая проблема - это HTML-почта, которая может включать или не включать текстовую версию. Я не уверен в обычном поведении клиентов в этом отношении.

1 голос
/ 30 января 2010

Стандарт для ответа / пересылки:> перед каждой строкой указывается, сколько раз вложено письмо, в том числе кто отправил первоначальное электронное письмо, клиенту для сортировки. Так что в Python вам нужно просто добавить> в начало каждой строки.

imap Test <imap@gazler.com> Wrote:
>
>twice
>imap Test wrote:
>> nested
>>
>> imap@gazler.com wrote:
>>> test
>>>
>>> -- 
>>> Message sent via AHEM.
>>>   
>>
>

Вложения просто необходимо прикрепить к сообщению или, как вы выразились, «сойти с ума».

Я не знаком с Python, но считаю, что код будет:

string = string.replace("\n","\n>")
...