首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中解析"Return-Path:“

在Python中解析"Return-Path:“
EN

Stack Overflow用户
提问于 2013-02-19 08:43:02
回答 2查看 535关注 0票数 1

使用Python解析邮件头并获取"return-path“字段中的电子邮件地址的最佳方法是什么?

代码语言:javascript
复制
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上运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-19 09:08:02

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

我不确定你是如何获得消息的--像stdlib imaplib或gmail API这样的东西给了你一种从正文中分离出头部的方法,但其他方法可能会给你整个消息。无论哪种方式,您都可以将整个过程传递给email.parser.HeaderParser,以解析标头并忽略其他任何内容:

代码语言:javascript
复制
>>> 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 )。

代码语言:javascript
复制
>>> from email.utils import parseaddr
>>> realname, emailaddr = parseaddr(return_path)

现在,realname""emailaddr'bob@example2.com'

之所以有两个部分,是因为这也是完全有效的:

代码语言:javascript
复制
Return-Path: "Bob Example" <bob@example.com>

现在,这可能不是很正确。是否允许有两个Return-Path标头?或者,Return-Path报头是否可以包含多个地址?我不记得了。我可以在相关的RFC中查找它,但我还必须进行一些搜索,以找出是否有任何受欢迎的客户端违反了这些特定的规则。这些我都记不住了。所以,为了方便起见,我通常假设任何东西都可以是多个头和多个值,并这样做:

代码语言:javascript
复制
>>> return_paths = msg.get_all('Return-Path')

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

代码语言:javascript
复制
>>> from email.utils import getaddresses
>>> for realname, emailaddr in getaddresses(returnpaths):
...     print(realname, emailaddr)

如果结果是Return-Path只允许一个值,那么相同的代码就会按原样工作。

票数 3
EN

Stack Overflow用户

发布于 2013-02-19 08:56:50

您可以先使用split()函数,然后使用strip()

代码语言:javascript
复制
line = "Return-Path: <bob@example2.com>"
header, value = line.split(":")
value = value.strip()

PS如果你需要去掉大括号,只需再次使用strip函数:

代码语言:javascript
复制
value = value.strip('<>')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14947929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档