【问题标题】:Parsing Message-ID header returned by imaplib解析 imaplib 返回的 Message-ID 标头
【发布时间】:2011-07-09 11:47:15
【问题描述】:

我正在通过 IMAP 从 Gmail 中的电子邮件中获取 messageid。

这段代码:

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?

【问题讨论】:

    标签: python imaplib email-headers


    【解决方案1】:

    来自RFC 1036, 822

    为了符合 RFC-822, 消息 ID 必须具有以下格式:

    所以实际的消息 ID 将介于 之间。域部分是 ID 的一部分。

    我可能会 strip 字符串,然后 split 字符上,验证它是否以 > 然后把它剪掉。

    我真的无法用你的数据找到一个好的解决方案(最后有错字吗?),但如果看起来像下面这样,我会像这样解析它

     # 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']
    

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

    【讨论】:

    • 是的,我想要那种格式的消息 ID。但是您能否详细说明如何剥离/拆分字符串?
    【解决方案2】:

    您还可以使用email moduleHeaderParser.parsestr() function与 Parser 相同的 API,但不必担心电子邮件的正文)和 parseaddr() function 来实现您想要的。 p>

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

    【讨论】:

      猜你喜欢
      • 2012-03-21
      • 2021-02-28
      • 1970-01-01
      • 2013-03-19
      • 2016-09-06
      • 2019-03-02
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多