python - 从电子邮件模块的 `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)
解决方案
正如 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>'
中不允许使用逗号。相反,您必须使用:atom
obs-phrase
quoted-string
>>> email.utils.parseaddr('"Smith, Joe A." <smithja@yahoo.com>')
('Smith, Joe A.', 'smithja@yahoo.com')
推荐阅读
- java - 在Java文件中查找字符串
- c# - 在 laravel 中实时查看 C# 控制台数据
- widevine - Widevine 许可响应,“invalid_license_challenge” internal_status=106。106代表什么?
- azure-devops - Azure Devops + postman 自动导出集合
- matlab - 如何输出 matlab 图形以在 Latex 中使用?
- acumatica - 是什么导致列表内容被清除?
- c# - EF Core 5.0 - 更改“定义查询”映射实体时是否需要生成迁移?
- qt - 如何在按下 QML 按钮时更改其波纹颜色?
- drop-down-menu - 子目录的 Hugo 列表页面?
- rust - 为什么闭包的可变引用参数不会超过函数调用?