Анализ заголовка Message-ID, возвращаемого imaplib - PullRequest
3 голосов
/ 05 марта 2011

Я получаю сообщение из писем в Gmail через IMAP.

Этот код:

messageid = m.fetch(num, '(BODY[HEADER.FIELDS (MESSAGE-ID)])')
print messageid

возвращает это:

[('1 (BODY[HEADER.FIELDS (MESSAGE-ID)] {78}', 'Message-ID: <actualmessageid@mail.mail.gmail.com>\r\n\r\n'), ')']

Как бы я мог разобрать только фактический идентификатор сообщения?

Ответы [ 2 ]

7 голосов
/ 20 марта 2011

Вы также можете достичь того, что хотите, используя email модуль HeaderParser.parsestr() функцию ( тот же API, что и Parser, но не беспокойтесь о письмеbody ) и функция parseaddr() .

>>> from email.parser import HeaderParser
>>> from email.utils import parseaddr

>>> hp = HeaderParser()

>>> response = [('1 (BODY[HEADER.FIELDS (MESSAGE-ID)] {78}',
                 'Message-ID: <actualmessageid@mail.mail.gmail.com>\r\n\r\n'), ')']

>>> header_string = response[0][1]

>>> header_string
'Message-ID: <actualmessageid@mail.mail.gmail.com>\r\n\r\n'

>>> header = hp.parsestr(header_string)

>>> header
<email.message.Message instance at 0x023A6198>

>>> header['message-id']
'<actualmessageid@mail.mail.gmail.com>'

>>> msg_id = parseaddr(header['message-id'])

>>> msg_id
('', 'actualmessageid@mail.mail.gmail.com')

>>> msg_id[1]
'actualmessageid@mail.mail.gmail.com'

Таким образом:

from email.parser import HeaderParser
from email.utils import parseaddr

hp = HeaderParser()

def get_id(response):
    header_string = response[0][1]
    header = hp.parsestr(header_string)
    return parseaddr(header['message-id'])[1]

response = [('1 (BODY[HEADER.FIELDS (MESSAGE-ID)] {78}',
             'Message-ID: <actualmessageid@mail.mail.gmail.com>\r\n\r\n'), ')']


print(get_id(response))

возвращает:

actualmessageid@mail.mail.gmail.com
0 голосов
/ 06 марта 2011

С RFC 1036, 822 :

Чтобы соответствовать RFC-822, Идентификатор сообщения должен иметь формат: <Уникальный @ full_domain_name>

Таким образом, фактический идентификатор сообщения будет находиться между <и> часть домена является частью идентификатора.

Я бы, вероятно, выделил строку, затем split на символе <</em>, проверил, что он заканчивается на > , а затем вырезал это выключено.

Я не могу действительно найти хорошее решение с вашими данными (в конце есть опечатка?), Но если бы это выглядело следующим образом, я бы проанализировал это примерно так

 # Note: my list does not end with , ")"]
 messageparts = [('1 (BODY[HEADER.FIELDS (MESSAGE-ID)] {78}', 
                  'Message-ID: <actualmessageid@mail.mail.gmail.com>\r\n\r\n')]

 for envelope, data in messageparts:
        # data: the part with Message-ID in it
        # data.strip(): Newlines removed
        # .split("<"): Break in 2 parts, left of < and right of <. Removes <
        # .rstrip(">") remove > from the end of the line until there is 
        # no > there anymore;
        # "x>>>".rstrip() -> "x"
        print "The message ID is: ", data.strip().split("<")[1].rstrip(">")

    # Short alternative version:
    messageids = [data.strip().split("<")[1].rstrip(">") \
                  for env,data in messageparts]
    print messageids

Выход:

The message ID is:  actualmessageid@mail.mail.gmail.com
['actualmessageid@mail.mail.gmail.com']

Я разделил некоторые строки, используя '\', чтобы сделать его немного более читабельным, и код предполагает, что все заголовки действительны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...