python3 / email:解析带有嵌入式逗号的电子邮件地址列表?

时间:2017-10-16 17:21:55

标签: python-3.x split email-headers

我知道如何使用email.utils.parseaddr()来解析电子邮件地址。但是,我想解析多个电子邮件地址的列表,例如此标题的地址部分:

Cc: "abc" <foo@bar.com>, "www, xxyyzz" <something@else.com>

一般来说,我知道我可以拆分像\s*,\s*这样的正则表达式获取单个地址,但在我的例子中,其中一个地址的名称部分包含一个逗号,因此这个正则表达式将拆分标题错误。

我知道如何手动编写基于状态机的代码以正确地将该地址拆分为多个部分,并且我也知道如何编写与每个电子邮件地址匹配的复杂正则表达式。我不是在写这样的代码时请求帮助。相反,我想知道是否有任何现有的python模块可以用来正确拆分这个电子邮件地址列表,所以我不必重新发明轮子&#34;。 / p>

提前谢谢。

3 个答案:

答案 0 :(得分:7)

借用这个问题的答案How do you extract multiple email addresses from an RFC 2822 mail header in python?

System.out.println("DATA DUMP: " + remoteMessage.getData());

产生

msg = 'Cc: "abc" <foo@bar.com>, "www, xxyyzz" <something@else.com>'

import email.utils

print(email.utils.getaddresses([msg]))

答案 1 :(得分:0)

这至少不是优雅的,我相信有人会来这里改进。但是,这对我有用,希望能让您了解如何做到这一点。

我相信分裂方法是你在这里寻找的方法。用最简单的术语来说,你接受字符串并选择一个字符到split。这会将字符串分成一个列表,您可以在假设找到拆分键选择的情况下进行迭代。如果找不到,那么该字符串就是一个元素列表。

emails = 'Cc: "abc" <foo@bar.com>, "www, xxyyzz" <something@else.com>'
emails
Out[37]: 
'Cc: "abc" <foo@bar.com>, "www, xxyyzz" <something@else.com>'
In [38]:
emails = emails.split(' ')
new_emails = []
for e in emails:
    if '@' in e:
        new_email = e.replace('<', '')
        new_email = new_email.replace('>', '')
        new_email = new_email.replace(',', '')
        new_emails.append(new_email)
print(new_emails)
['foo@bar.com', 'something@else.com']

如果你想使用正则表达式做这件事,那些比我更聪明的人将不得不提供帮助。

答案 2 :(得分:0)

我知道我可以做类似以下的事情,但我再次希望已经有一个现有的套餐可以为我做这件事......

#!/usr/bin/python3         

import email.utils

def getaddrs(text):
    def _yieldaddrs(text):
        inquote = False
        curaddr = ''
        for x in text:
            if x == '"':
                inquote = not inquote
                curaddr += x
            elif x == ',':
                if inquote:
                    curaddr += x
                else:
                    yield(curaddr)
                    curaddr = ''
            else:
                curaddr += x
        if curaddr:
            yield(curaddr)
    return [email.utils.parseaddr(x) for x in _yieldaddrs(text)]

addrstring = '"abc" <foo@bar.com>, "www, xxyyzz" <something@else.com>'
print('{}'.format(getaddrs(addrstring)))
# Prints this ...
#   [('abc', 'foo@bar.com'), ('www, xxyyzz', 'something@else.com')]