在Python中解析"Return-Path:
用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还不太熟悉,这段代码需要在AppEngine上运行。
2 个回答
你可以使用 split()
函数,然后再用 strip()
:
line = "Return-Path: <bob@example2.com>"
header, value = line.split(":")
value = value.strip()
另外,如果你想去掉大括号,可以再用一次 strip()
函数:
value = value.strip('<>')
首先,你可能想用标准库里的 email
包来解析消息。
我不太确定你是怎么获取消息的——像标准库中的 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
。)你可以一次性解析这些内容,得到一对对的名字和地址,而不仅仅是一个:
>>> from email.utils import getaddresses
>>> for realname, emailaddr in getaddresses(returnpaths):
... print(realname, emailaddr)
如果最后发现 Return-Path
只允许一个值,那这段代码照样可以正常工作。