在Python中解析电子邮件消息的"发件人:"字段

use*_*195 4 python email

我试图将电子邮件中符合RFC 5322的 "发件人:"字段解析为两部分:显示名称和电子邮件地址,在Python 2.7中(显示名称可能为空).熟悉的例子是这样的

John Smith <jsmith@example.org>
Run Code Online (Sandbox Code Playgroud)

在上面,John Smith是显示名称,jsmith @ example.org是电子邮件地址.但以下也是一个有效的"发件人:"字段:

"unusual" <"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com>
Run Code Online (Sandbox Code Playgroud)

在此示例中,display-name的返回值为

"unusual" 
Run Code Online (Sandbox Code Playgroud)

"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com
Run Code Online (Sandbox Code Playgroud)

是电子邮件地址.

您可以使用语法在Perl中解析它(如以下问题中所述:使用正则表达式验证电子邮件地址"现代" 正则表达式的识别能力),但我想在Python 2.7中执行此操作.我曾尝试在Python中使用email.parser模块,但该模块似乎只能分隔那些以冒号区分的字段.所以,如果你做的事情

from email.parser import Parser
headers = Parser().parsestr('From: "John Smith" <jsmith@example.org>')
print headers['from'] 
Run Code Online (Sandbox Code Playgroud)

它会回来

"John Smith" <jsmith@example.com> 
Run Code Online (Sandbox Code Playgroud)

而如果你用上面的代码替换最后一行

print headers['display-name']
Run Code Online (Sandbox Code Playgroud)

它会回来

None
Run Code Online (Sandbox Code Playgroud)

我非常感谢任何建议和意见.

Rob*_*obᵩ 6

headers['display-name']不是email.parserapi的一部分.

试试email.utils.parseaddr:

In [17]: email.utils.parseaddr("jsmith@example.com")
Out[17]: ('', 'jsmith@example.com')

In [18]: email.utils.parseaddr("(John Smith) jsmith@example.com")
Out[18]: ('John Smith', 'jsmith@example.com')

In [19]: email.utils.parseaddr("John Smith <jsmith@example.com>")
Out[19]: ('John Smith', 'jsmith@example.com')
Run Code Online (Sandbox Code Playgroud)

它还处理您的不寻常地址:

In [21]: email.utils.parseaddr('''"unusual" <"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.com>''')
Out[21]: ('unusual', '"very.(),:;<>[]".VERY."very@ "very".unusual"@strange.example.com')
Run Code Online (Sandbox Code Playgroud)