在Python中解析"Return-Path:

1 投票
2 回答
760 浏览
提问于 2025-04-17 16:19

用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 个回答

0

你可以使用 split() 函数,然后再用 strip()

line = "Return-Path: <bob@example2.com>"
header, value = line.split(":")
value = value.strip()

另外,如果你想去掉大括号,可以再用一次 strip() 函数:

value = value.strip('<>')
3

首先,你可能想用标准库里的 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 只允许一个值,那这段代码照样可以正常工作。

撰写回答