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