【问题标题】:Parsing names with commas from email module's `parseaddr`从电子邮件模块的 `parseaddr` 中用逗号解析名称
【发布时间】:2019-04-12 06:49:59
【问题描述】:

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

例子:

>>> 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)

【问题讨论】:

    标签: python email-validation


    【解决方案1】:

    正如 RFC 的第 3.2.3 节中所定义的,CFWS 是空格和 cmets,因此它不适用于此处。您想查看以下散布在整个语法中的定义:

    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 &lt;smithja@yahoo.com&gt;' 有效,因为Joe A. Smithobs-phrase,但'Smith, Joe A. &lt;smithja@yahoo.com&gt;' 无效,因为atomobs-phrase 中不允许使用逗号。相反,您必须使用quoted-string

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

    【讨论】:

      猜你喜欢
      • 2015-10-13
      • 2014-07-18
      • 2014-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 2015-09-28
      • 2018-03-28
      相关资源
      最近更新 更多