我有一个Cc标题字段的纯文本,如下所示:
friend@email.com, John Smith <john.smith@email.com>,"Smith, Jane" <jane.smith@uconn.edu>
有没有经过实战测试的模块可以正确解析它?
(如果它是用python编写的,那就更好了!电子邮件模块只返回原始文本,没有任何拆分方法( AFAIK) (如果它将姓名和地址拆分为to字段,也会有好处)
发布于 2011-03-25 07:35:02
有很多函数可以作为标准的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')]发布于 2011-03-25 07:34:21
我自己还没有用过它,但在我看来,您可以很容易地使用csv包来解析数据。
发布于 2011-03-25 10:58:59
这是完全不必要的。我在意识到可以向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')]我很想看看其他人是如何解决这个问题的!
https://stackoverflow.com/questions/5426789
复制相似问题