在python中解析IMAP响应

时间:2010-12-16 23:49:58

标签: python imap imaplib

我使用imaplib在python中使用imap,但看起来它没有办法解析IMAP响应的细节。例如,查询如:

   msgdata = connection.fetch(num, "(BODY.PEEK[HEADER.FIELDS (FROM TO CC DATE SUBJECT MESSAGE-ID)] UID)")

其中num是一个邮件服务器可能产生的消息号(例如):

  ('OK', [('1234 (BODY[HEADER.FIELDS (FROM TO CC DATE SUBJECT MESSAGE-ID)] {123}', 'From: ...etc headers'), ' UID 3456)'])

和另一个:

  ('OK', [('1234 (UID 3456 BODY[HEADER.FIELDS (FROM TO CC DATE SUBJECT MESSAGE-ID)] {123}', 'From: ...etc headers'), ')'])

如您所见,消息详细信息不同,UID甚至在不同的元素中。所以问题是 - 是否有一些库可以自动对其进行排序并抽象出特定邮件服务器的功能细节?

3 个答案:

答案 0 :(得分:6)

Doug Hellman的Python Module of the Week entry for imaplib是一个关于这个主题的相当广泛的教程,但在这里复制还很长。

您可能希望使用更高级别的库IMAPClient来隐藏IMAP协议的一些细节。

答案 1 :(得分:0)

看看Imbox,您可能会找到https://pypi.org/project/imbox/

的内容

答案 2 :(得分:0)

您可以使用imap_tools软件包: https://pypi.org/project/imap-tools/

for message in mailbox.fetch():
    message.uid          # str or None, '123'
    message.subject      # str, 'some subject'
    message.from_        # str, 'sender@ya.ru'
    message.to           # tuple, ('iam@goo.ru', 'friend@ya.ru', )
    message.cc           # tuple, ('cc@mail.ru', )
    message.bcc          # tuple, ('bcc@mail.ru', )
    message.date         # datetime.datetime, 1900-1-1 for unparsed, may be naive or with tzinfo
    message.text         # str, 'hi'
    message.html         # str, '<b>hi</b>'
    message.flags        # tuple, ('SEEN', 'FLAGGED', 'ENCRYPTED')
    message.headers      # dict, {'Received': ('from 1.m.net', 'from 2.m.net'), 'AntiVirus-Status': ('Clean',)}
    message.attachments  # [(str, bytes)], 'cat.jpg', b'\xff\xd8\xff\xe0\'
    message.obj          # original email.message.Message object
    message.from_values  # dict or None, {'email': 'sender@ya.ru', 'name': 'Ivan', 'full': 'Ivan <sender@ya.ru>'}
    message.to_values    # tuple, ({'email': '', 'name': '', 'full': ''},)
    message.cc_values    # tuple, ({'email': '', 'name': '', 'full': ''},)
    message.bcc_values   # tuple, ({'email': '', 'name': '', 'full': ''},)
    message.date_str     # original date str, 'Tue, 03 Jan 2017 22:26:59 +0500'