解析imaplib返回的Message-ID标头

时间:2011-03-05 17:21:24

标签: python imaplib email-headers

我是通过IMAP从Gmail中的电子邮件中获取消息ID。

此代码:

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'), ')']

我如何解析其中的实际消息ID?

2 个答案:

答案 0 :(得分:7)

您还可以使用email moduleHeaderParser.parsestr() function与Parser相同的API但不担心电子邮件的正文)和{{{}来实现您的目标。 3}}

>>> 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

答案 1 :(得分:0)

来自RFC 1036, 822

  

为了符合RFC-822,   消息ID必须具有以下格式:         &LT;独特@ full_domain_name&GT;

因此,实际的消息ID将介于&lt;和&gt;域部分是ID的一部分。

我可能剥离字符串,然后在&lt; 字符上拆分,验证它以&gt; <结尾/ 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']

我使用'\'分割了一些行,使其在这里更具可读性,代码假定标题都是有效的。