使用电子邮件模块的“ parseaddr”中的逗号解析名称

时间:2018-11-08 17:32:40

标签: python email-validation

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)

1 个答案:

答案 0 :(得分:4)

根据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. Smithobs-phrase,而'Smith, Joe A. <smithja@yahoo.com>'是无效的,因为{{ 1}}或atom。相反,您必须使用obs-phrase

quoted-string