使用Python解析邮件头并获取"return-path“字段中的电子邮件地址的最佳方法是什么?
Return-Path: <bob@example2.com>
Date: Sat, 16 Feb 2013 14:14:32 -0500
Subject: Hello World!
From: Robert Jones <robert.jones@example2.com>
To: Steve <steve@example.com>附言:我是一个Python的n00b,这段代码需要在AppEngine上运行。
发布于 2013-02-19 09:08:02
首先,您可能希望使用stdlib的email包来解析消息。
我不确定你是如何获得消息的--像stdlib imaplib或gmail API这样的东西给了你一种从正文中分离出头部的方法,但其他方法可能会给你整个消息。无论哪种方式,您都可以将整个过程传递给email.parser.HeaderParser,以解析标头并忽略其他任何内容:
>>> from email.parser import HeaderParser
>>> msg = HeaderParser().parsestr(header) # or parsestr(msg) if you have the whole msg
>>> return_path = msg.get('Return-Path')现在,return_path是字符串"<bob@example2.com>",您可以将其解析为电子邮件地址(如果没有电子邮件地址,则解析为None )。
>>> from email.utils import parseaddr
>>> realname, emailaddr = parseaddr(return_path)现在,realname是"",emailaddr是'bob@example2.com'。
之所以有两个部分,是因为这也是完全有效的:
Return-Path: "Bob Example" <bob@example.com>现在,这可能不是很正确。是否允许有两个Return-Path标头?或者,Return-Path报头是否可以包含多个地址?我不记得了。我可以在相关的RFC中查找它,但我还必须进行一些搜索,以找出是否有任何受欢迎的客户端违反了这些特定的规则。这些我都记不住了。所以,为了方便起见,我通常假设任何东西都可以是多个头和多个值,并这样做:
>>> return_paths = msg.get_all('Return-Path')这将返回list ["<bob@example2.com>"]。(如果没有Return-Path标头,这样会得到一个空的list,而不是None。)您可以一次性解析所有内容,以获得名称、地址对的list,而不只是一个:
>>> from email.utils import getaddresses
>>> for realname, emailaddr in getaddresses(returnpaths):
... print(realname, emailaddr)如果结果是Return-Path只允许一个值,那么相同的代码就会按原样工作。
发布于 2013-02-19 08:56:50
您可以先使用split()函数,然后使用strip()
line = "Return-Path: <bob@example2.com>"
header, value = line.split(":")
value = value.strip()PS如果你需要去掉大括号,只需再次使用strip函数:
value = value.strip('<>')https://stackoverflow.com/questions/14947929
复制相似问题