我试图将电子邮件中符合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)
我非常感谢任何建议和意见.
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)