Парсинг электронной почты с Python - PullRequest
13 голосов
/ 16 июня 2010

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

:0:
|$HOME/process_mail.py

Мой сценарий process_mail.py получает электронное письмо через стандартный ввод, как это:

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 <username@domain.com>; 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: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>
Subject: TEST 12
From: Full Name <username@sender.com>
To: username@domain.com
Content-Type: text/plain; charset=ISO-8859-1

ONE
TWO
THREE

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

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

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

Что я делаю не так?

Ответы [ 3 ]

10 голосов
/ 16 июня 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 <username@domain.com>; 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: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>
Subject: TEST 12
From: Full Name <username@sender.com>
To: username@domain.com
Content-Type: text/plain; charset=ISO-8859-1

ONE
TWO
THREE

затем

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

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

4 голосов
/ 16 июня 2010

Похоже, у вас есть перевод строки без пробелов, добавленных к дополнительным строкам, что в соответствии с 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 <username@domain.com>; 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: <AANLkTikFsIjJ3KYW1HJWcAqQlGXNiXE2YMzrj39I0tdB@mail.gmail.com>
Subject: TEST 12
From: Full Name <username@sender.com>
To: username@domain.com
Content-Type: text/plain; charset=ISO-8859-1

ONE
TWO
THREE
2 голосов
/ 16 июня 2010

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

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

...