Подтвердить что ты не робот

Разбор электронной почты с помощью Python

Я пишу Python script для обработки писем, возвращенных из Procmail. Как было предложено в этом question, я использую следующую конфигурацию Procmail:

:0:
|$HOME/process_mail.py

My process_mail.py script получает электронное письмо через stdin следующим образом:

From hostname Tue Jun 15 21:43:30 2010
Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400
Received: from mail-fx0-f44.google.com (209.85.161.44)
by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400
Received: by fxm19 with SMTP id 19so170709fxm.3
for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15
Jun 2010 18:47:33 -0700 (PDT)
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
Date: Tue, 15 Jun 2010 20:47:33 -0500
Message-ID: <[email protected]>
Subject: TEST 12
From: Full Name <[email protected]>
To: [email protected]
Content-Type: text/plain; charset=ISO-8859-1

ONE
TWO
THREE

Я пытаюсь разобрать сообщение таким образом:

>>> import email
>>> msg = email.message_from_string(full_message)

Я хочу получить поля сообщений, такие как "От", "Кому" и "Тема". Однако объект сообщения не содержит ни одного из этих полей.

Что я делаю неправильно?

4b9b3361

Ответ 1

Вы должны убедиться, что строки не случайно сломаны (поскольку они выше, хотя трудно сказать, была ли проблема с копированием) - с неповрежденным сообщением, например:

Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400
Received: from mail-fx0-f44.google.com (209.85.161.44) by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400
Received: by fxm19 with SMTP id 19so170709fxm.3 for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
Date: Tue, 15 Jun 2010 20:47:33 -0500
Message-ID: <[email protected]>
Subject: TEST 12
From: Full Name <[email protected]>
To: [email protected]
Content-Type: text/plain; charset=ISO-8859-1

ONE
TWO
THREE

затем

msg = email.message_from_string(msgtxt)
print msg['Subject']

печатает TEST 12 по желанию.

Ответ 2

Похоже, что у вас есть переводы строк без пробелов, добавленных к дополнительным строкам, которые согласно RFC 2822 §2.3.2 являются незаконными:

Каждое поле заголовка логически представляет собой одну строку символов, содержащую имя поля, двоеточие и тело тела. Для удобства
однако, и иметь дело с ограничениями 998/78 символов на строку,
часть тела поля поля заголовка может быть разделена на несколько линейное представление; это называется "складыванием". Общее правило: что везде, где этот стандарт позволяет складывать пробелы (не
просто символы WSP), CRLF может быть вставлен перед любым WSP. Для
Например, поле заголовка:

    Subject: This is a test

может быть представлена ​​как:

    Subject: This
     is a test

Он должен выглядеть примерно так:

From hostname Tue Jun 15 21:43:30 2010
Received: (qmail 8580 invoked from network); 15 Jun 2010 21:43:22 -0400
Received: from mail-fx0-f44.google.com (209.85.161.44)
    by ip-73-187-35-131.ip.secureserver.net with SMTP; 15 Jun 2010 21:43:22 -0400
Received: by fxm19 with SMTP id 19so170709fxm.3
    for <[email protected]>; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
MIME-Version: 1.0
Received: by 10.103.84.1 with SMTP id m1mr2774225mul.26.1276652853684; Tue, 15
    Jun 2010 18:47:33 -0700 (PDT)
Received: by 10.123.143.4 with HTTP; Tue, 15 Jun 2010 18:47:33 -0700 (PDT)
Date: Tue, 15 Jun 2010 20:47:33 -0500
Message-ID: <[email protected]>
Subject: TEST 12
From: Full Name <[email protected]>
To: [email protected]
Content-Type: text/plain; charset=ISO-8859-1

ONE
TWO
THREE

Ответ 3

Я отвечаю себе.

Я обнаружил ошибку в коде, который создает сообщения. Он добавляет линейные разрывы между некоторыми строками, предотвращая правильную работу парсера.