获取python getaddresses()来解码encodedword编码

2024-10-03 02:46:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: comparsermessageaddressexampleemailisock
3条回答

谢谢你,加雷斯里斯。你的答案有助于解决问题案例:

Input: 'application/octet-stream;\r\n\tname="=?utf-8?B?KFVTTXMpX0FSTE8uanBn?="'

编码单词周围没有空格导致email.Header.decode_header忽略了它。我对这个太陌生了,不知道我是否只会让事情变得更糟,但是这个kludge加上一个“而不是”的组合,修复了它:

^{pr2}$

是的,email包接口在很多时候并不是很有用。在

在这里,您必须在每个地址上手动使用email.header.decode_header,然后,因为这给了您一个解码令牌的列表,所以您必须再次手动将它们缝合在一起:

for name, address in email.utils.getaddresses(addresses):
    name= u' '.join(
        unicode(b, e or 'ascii') for b, e in email.header.decode_header(name)
    )
    ...

您需要的函数是^{},它返回(decoded_string, charset)对的列表。这取决于您根据charset进一步解码它们,并在将它们传递给email.utils.getaddresses或任何地方之前将它们重新连接在一起。在

你可能会认为这很简单:

def decode_rfc2047_header(h):
    return ' '.join(s.decode(charset or 'ascii')
                   for s, charset in email.header.decode_header(h))

但是,由于消息头通常来自不可信的源,因此您必须处理(1)编码错误的数据;(2)伪造的字符集名称。所以你可以这样做:

^{pr2}$

相关问题 更多 >