msg = \
"""To: =?ISO-8859-1?Q?Caren_K=F8lter?= <ck@example.dk>, bob@example.com
Cc: "James =?ISO-8859-1?Q?K=F8lter?=" <jk@example.dk>
Subject: hello
message body blah blah blah
"""
import email.parser, email.utils
import itertools
parser = email.parser.Parser()
parsed_message = parser.parsestr(msg)
address_fields = ('to', 'cc')
addresses = itertools.chain(*(parsed_message.get_all(field) for field in address_fields if parsed_message.has_key(field)))
address_list = set(email.utils.getaddresses(addresses))
print address_list
看起来好像电子邮件.utils.getaddresses()似乎不会自动处理地址字段中的MIME RFC 2047。在
我怎样才能得到下面的预期结果?在
实际结果:
set([('', 'bob@example.com'), ('=?ISO-8859-1?Q?Caren_K=F8lter?=', 'ck@example.dk'), ('James =?ISO-8859-1?Q?K=F8lter?=', 'jk@example.dk')])
期望结果:
set([('', 'bob@example.com'), (u'Caren_K\xf8lter', 'ck@example.dk'), (u'James \xf8lter', 'jk@example.dk')])
谢谢你,加雷斯里斯。你的答案有助于解决问题案例:
编码单词周围没有空格导致
^{pr2}$email.Header.decode_header
忽略了它。我对这个太陌生了,不知道我是否只会让事情变得更糟,但是这个kludge加上一个“而不是”的组合,修复了它:是的,
email
包接口在很多时候并不是很有用。在在这里,您必须在每个地址上手动使用
email.header.decode_header
,然后,因为这给了您一个解码令牌的列表,所以您必须再次手动将它们缝合在一起:您需要的函数是^{} ,它返回
(decoded_string, charset)
对的列表。这取决于您根据charset
进一步解码它们,并在将它们传递给email.utils.getaddresses
或任何地方之前将它们重新连接在一起。在你可能会认为这很简单:
但是,由于消息头通常来自不可信的源,因此您必须处理(1)编码错误的数据;(2)伪造的字符集名称。所以你可以这样做:
^{pr2}$相关问题 更多 >
编程相关推荐