解析imaplib返回的Message-ID头部
我正在通过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
根据 RFC 1036, 822 的规定:
为了符合RFC-822标准,消息ID的格式必须是:<唯一值@完整域名>
所以实际的消息ID会在<和>之间,域名部分也是ID的一部分。
我可能会先把字符串处理一下,然后用<这个字符来分开,确认它的结尾是>,再把这个部分去掉。
我不太能从你的数据中找到一个好的解决方案(最后是不是有个拼写错误?),但如果它看起来像下面这样,我会用这样的方式来解析:
# 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']
我用反斜杠'\'分开了一些行,这样看起来更清晰一点,代码假设所有的头部信息都是有效的。
7
你也可以使用email
模块中的HeaderParser.parsestr()
函数来实现你想要的功能(这个函数和Parser的用法一样,但不需要处理邮件的内容部分),还有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