【问题标题】:Method for parsing text Cc field of email header?解析电子邮件标题的文本抄送字段的方法?
【发布时间】:2011-07-22 13:23:52
【问题描述】:

我有一个抄送标题字段的纯文本,如下所示:

friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>

是否有任何经过实战测试的模块可以正确解析?

(如果它在 python 中,则奖励!电子邮件模块只返回原始文本,没有任何拆分它的方法,AFAIK) (如果将名称和地址拆分为字段,也有好处)

【问题讨论】:

    标签: python parsing email email-headers


    【解决方案1】:

    有一堆函数可用作标准 python 模块,但我认为您正在寻找 email.utils.parseaddr()email.utils.getaddresses()

    >>> addresses = 'friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>'
    >>> email.utils.getaddresses([addresses])
    [('', 'friend@email.com'), ('John Smith', 'john.smith@email.com'), ('Smith, Jane', 'jane.smith@uconn.edu')]
    

    【讨论】:

    • 这些模块运行良好,但它们都要求您已经将地址拆分为单独的字符串。
    • [ email.utils.parseaddr(a) for a in m.split(',') ] alist 是您在上面发布的地址列表。
    • 是的,我发帖后就想到了。进一步阅读和仔细阅读email.utils.getaddresses() 文档后发现您需要传递一个list,而不是一个string,do'h!所以使用email.utils.parseaddr([alist])
    • 哦! getaddresses() 不需要字符串列表! ..您可以只传递一个列表,其中包含一个包含多个地址的字符串。我现在觉得自己很傻。。
    • 哈哈,你应该觉得有兴趣和学习新东西很聪明 :-) 我上面的描述不是很清楚我猜...
    【解决方案2】:

    我自己没有使用过它,但在我看来你可以很容易地使用csv 包来解析数据。

    【讨论】:

      【解决方案3】:

      波纹管是完全没有必要的。我在意识到你可以传递getaddresses() 一个包含多个地址的单个字符串的列表之前写了它。

      我没有机会查看电子邮件标头中地址的规范,但根据您提供的字符串,此代码应该可以将其拆分为列表,确保忽略逗号(如果它们在其中)引号(因此是名称的一部分)。

      from email.utils import getaddresses
      
      addrstring = ',friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>,'
      
      def addrparser(addrstring):
          addrlist = ['']
          quoted = False
      
          # ignore comma at beginning or end
          addrstring = addrstring.strip(',')
      
          for char in addrstring:
              if char == '"':
                  # toggle quoted mode
                  quoted = not quoted
                  addrlist[-1] += char
              # a comma outside of quotes means a new address
              elif char == ',' and not quoted:
                  addrlist.append('')
              # anything else is the next letter of the current address
              else:
                  addrlist[-1] += char
      
          return getaddresses(addrlist)
      
      print addrparser(addrstring)
      

      给予:

      [('', 'friend@email.com'), ('John Smith', 'john.smith@email.com'),
       ('Smith, Jane', 'jane.smith@uconn.edu')]
      

      我很想看看其他人会如何解决这个问题!

      【讨论】:

        【解决方案4】:

        将多个电子邮件字符串转换为字典(将多个电子邮件名称转换为一个字符串)。

        emailstring = 'Friends <friend@email.com>, John Smith <john.smith@email.com>,"Smith" <jane.smith@uconn.edu>'
        

        用逗号分割字符串

        email_list = emailstring.split(',')

        name 是 key,email 是 value 并制作字典。

        email_dict = dict(map(lambda x: email.utils.parseaddr(x), email_list))
        

        结果如下:

        {'John Smith': 'john.smith@email.com', 'Friends': 'friend@email.com', 'Smith': 'jane.smith@uconn.edu'}
        

        注意:

        如果有相同的姓名但不同的电子邮件ID,则跳过一条记录。

        'Friends <friend@email.com>, John Smith <john.smith@email.com>,"Smith" <jane.smith@uconn.edu>, Friends <friend_co@email.com>'
        

        “好友”重复了 2 次。

        【讨论】:

        • 解析器需要处理名称中带有逗号的地址 - 例如“Smith, Jane”,因为这是电子邮件地址的有效名称。 emailstring.split(',') 命令将把“Smith, Jane”的名字分成两个独立的地址。
        猜你喜欢
        • 2016-02-08
        • 2011-06-25
        • 2011-03-31
        • 2021-03-12
        • 1970-01-01
        • 2012-03-20
        • 1970-01-01
        • 2015-05-03
        相关资源
        最近更新 更多