python - 在Python中解析 "Return-Path:"

标签 python google-app-engine email-parsing

使用 Python 解析邮件 header 并在“返回路径”字段中获取电子邮件地址的最佳方法是什么?

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 上运行。

最佳答案

首先,您可能想使用 stdlib 的 email 包来解析消息。

我不确定你是如何收到这条消息的——比如 stdlib imaplib或者 gmail API 为您提供了一种将 header 与正文分开获取的方法,但其他方法可能会为您提供整个消息。无论哪种方式,您都可以将整个事情传递给 email.parser.HeaderParser 解析 header 并忽略其他任何内容:

>>> 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 header 包含多个地址?我不记得了。我可以在相关的 RFC 中查找,但随后我还必须进行一些搜索,以找出是否有任何受欢迎的客户端违反了这些特定规则。我记不起这一切了。因此,为了方便起见,我通常假设任何内容都可以是多 header 和多值,并以这种方式执行操作:

>>> return_paths = msg.get_all('Return-Path')

这将返回list ["<bob@example2.com>"] 。 (如果没有 Return-Path header ,您将得到一个空的 list ,而不是 None ,这样。)您可以一次解析所有这些,以获得 list 。名称、地址对,而不仅仅是一个:

>>> from email.utils import getaddresses
>>> for realname, emailaddr in getaddresses(returnpaths):
...     print(realname, emailaddr)

如果结果表明 Return-Path 只允许单个值,则相同的代码将按原样工作。

关于python - 在Python中解析 "Return-Path:",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14947929/

相关文章:

python - 名称错误 : name 'K' is not defined

python - 使用 UPDATE FOR 和外键锁定 postgres

python - 如何通过字典进行测试

java.lang.NoClassDefFoundError : Could not initialize class org. apache.commons.logging.LogFactory

google-app-engine - 处理新的 channel 创建限制

java - GWT 主页登录页面到实际应用程序示例重定向问题

c - 如何解析电子邮件和处理各种信息

python - 有没有办法识别 argparse 函数给出的默认值(我使用互斥选项)

Java电子邮件消息解析器?

email - 是否有任何开源工具可以像 Gmail 一样自动 'detects' 电子邮件线程?