提取电子邮件已收到:带有Python电子邮件包的标题

时间:2014-12-12 19:01:58

标签: python email

我想从邮件中提取最终已收到:电子邮件标头。我从email.message_from_file()返回了消息。

使用Message.get()Message.get_item()方法无法保证我将获得多个Received:标头中的哪一个。 Message.get_all()全部归还,但不保证订单。有没有办法保证得到最后一个?

3 个答案:

答案 0 :(得分:2)

Received:标头带有时间戳:

Received: from lb-ex1.int.icgroup.com (localhost [127.0.0.1])
by lb-ex1.localdomain (Postfix) with ESMTP id D6BDB1E26393
for <hd1@example.com>; Fri, 12 Dec 2014 12:09:24 -0500 (EST)

所以,不管您认为合适,请messageInstance.get_all()sort结果列表,以及如何执行此操作的示例:

import email.utils
import operator
def sort_key(received_header):
    received_date = email.utils.parsedate_tz(received_header)
    return received_date

received_header_list.sort(key=sort_key)

如果它不起作用,请发表评论,我会很乐意进一步研究。

答案 1 :(得分:1)

在python 3.6.7中,对get_all()方法的注释明确指出,值的返回顺序与消息中的返回顺序相同,因此messageInstance.get_all('Received')应该可以正常工作。

def get_all(self, name, failobj=None):
    """Return a list of all the values for the named field.

    These will be sorted in the order they appeared in the original
    message, and may contain duplicates.  Any fields deleted and
    re-inserted are always appended to the header list.

    If no such fields exist, failobj is returned (defaults to None).
    """

答案 2 :(得分:0)

email.parserHeaderParser实现类似字典的界面,但实际上似乎按照您期望的顺序返回标题。

from email.parser import HeaderParser

headers = HeaderParser().parse(open_filehandle, headersonly=True)
for key, value in headers.items():
    if key == 'Received':
        ... do things with the value

parse method有一个姐妹parsestr method,它接受​​一个字节字符串而不是一个类似文件的对象。

如果通过&#34; final&#34;你的意思是&#34;最新的&#34;,这将是第一个与if匹配的,所以你可以在阅读之后简单地break。如果通过&#34; final&#34;你的意思是其他东西,你可以用你认为合适的方式在if内实现。

这改编自this answer to a related question