首页 > 解决方案 > 从电子邮件模块的 `parseaddr` 中用逗号解析名称

问题描述

email.utils.parseaddr似乎无法处理名称以姓氏、名字格式(电子邮件元数据中常见的格式)列出的情况。

例子:

>>> import email.utils

>>> email.utils.parseaddr('Joe A. Smith <smithja@yahoo.com>')  # OK
('Joe A. Smith', 'smithja@yahoo.com')

>>> email.utils.parseaddr('Smith, Joe A. <smithja@yahoo.com>')  # Fails
('', 'Smith')

这是故意设计的吗? email声称遵循 RFC 2822。完整字符串的规范定义为

angle-addr      =       [CFWS] "<" addr-spec ">" [CFWS] / obs-angle-addr

但是我不清楚什么可以构成“CFWS”。返回类型('', 'Smith')是否符合 RFC?


版本信息:

>>> sys.version_info
sys.version_info(major=3, minor=6, micro=6, releaselevel='final', serial=0)

标签: pythonemail-validation

解决方案


正如 RFC 的第 3.2.3 节中定义的那样,CFWS是空格和注释,因此在这里不适用。您想查看以下散布在整个语法中的定义:

name-addr       =       [display-name] angle-addr
display-name    =       phrase
phrase          =       1*word / obs-phrase
word            =       atom / quoted-string
atom            =       [CFWS] 1*atext [CFWS]
atext           = [a bunch of characters not including comma]
obs-phrase      =       word *(word / "." / CFWS)

从这里,我们可以看到它'Joe A. Smith <smithja@yahoo.com>'是有效的,因为Joe A. Smith它是一个obs-phrase,但它是无效的,因为在一个或'Smith, Joe A. <smithja@yahoo.com>'中不允许使用逗号。相反,您必须使用:atomobs-phrasequoted-string

>>> email.utils.parseaddr('"Smith, Joe A." <smithja@yahoo.com>')
('Smith, Joe A.', 'smithja@yahoo.com')

推荐阅读