Я пишу сценарий Python для обработки электронных писем, возвращенных из Procmail. Как предложено в этом вопросе, я использую следующую конфигурацию Procmail:
:0:
|$HOME/process_mail.py
Мой process_mail.py сценарий получает электронное письмо через 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 ; 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:
Subject: TEST 12
From: Full Name
To: username@domain.com
Content-Type: text/plain; charset=ISO-8859-1
ONE
TWO
THREE
Я пытаюсь проанализировать сообщение таким образом:
>>> import email
>>> msg = email.message_from_string(full_message)
Я хочу получить поля сообщения как 'От', 'До' и 'Предмет'. Однако объект сообщения не содержит ни одного из этих полей.
Что я делаю неправильно?
Вы должны убедиться, что строки не были случайно разорваны (как указано выше, хотя трудно сказать, была ли это проблема копирования и вставки) - с неповрежденным сообщением, например:
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']
выводит ТЕСТ 12
по желанию.
Похоже, у вас есть переводы строки без пробелов, добавленные к дополнительным строкам, что согласно RFC 2822 §2.3.2 является недопустимым:
Каждое поле заголовка логически представляет собой одну строку символов, содержащую
имя поля, двоеточие и тело поля. Для удобства
однако, и чтобы справиться с ограничениями 998/78 символов в строке,
часть тела поля заголовка может быть разделена на несколько
линейное представление; это называется «складывание». Общее правило
что везде, где этот стандарт позволяет складывать пустое пространство (не
просто символы WSP), CRLF может быть вставлен перед любым WSP. Для
Например, поле заголовка:Тема: Это тест
можно представить как:
Тема: Это это тест
Это должно выглядеть примерно так:
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
Я отвечаю сам себе.
Я нашел ошибку в коде, который строит сообщения. Он добавляет разрывы строк между некоторыми строками, не позволяя парсеру работать правильно.