解析电子邮件标题的文本Cc字段的方法?

时间:2011-03-24 23:22:12

标签: python parsing email email-headers

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

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

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

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

4 个答案:

答案 0 :(得分:17)

有许多功能可用作标准的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')]

答案 1 :(得分:0)

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

答案 2 :(得分:0)

波纹管是完全没必要的。我在认识到你可以传递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')]

我有兴趣看看其他人会如何解决这个问题!

答案 3 :(得分:0)

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

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

按逗号分割字符串

email_list = emailstring.split(',')

名称是关键,电子邮件是价值和制作字典。

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

&#34;朋友&#34;重复2次。