代码之家  ›  专栏  ›  技术社区  ›  Brad Solomon

从电子邮件模块的“parseaddr”解析带有逗号的名称`

  •  0
  • Brad Solomon  · 技术社区  · 7 年前

    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 回复  |  直到 7 年前
        1
  •  4
  •   jwodder    7 年前

    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 或 . 相反,您必须使用 quoted-string :

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