电子邮件标头使用ehtml url编码获取文件名

时间:2018-07-18 07:14:33

标签: python email parsing encoding email-headers

我遇到了解析以html url编码的文件名的问题。

Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0*=utf-8''%48%61%72%6D%6F%6E%6F%67%72%61%6D;
 filename*1*=%32%30%31%38%20%C5%81%75%6B%61%73%7A%65%77;
 filename*2*=%61%20%33%35%2E%70%64%66

在get_filename之后,它返回已经使用扩展ASCII字符解码的文件名。在这种情况下, decode_header 将无法处理。这是例外:

  File "/usr/lib/python2.7/email/header.py", line 73, in decode_header
header = str(header)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0141' in position 26: ordinal not in range(128)

这是获取文件名的一段代码:

for part in msg.walk():
        if part.get_content_maintype() == 'multipart':
            continue
        content = part.get_payload(decode=True)
        if content:
            filename = part.get_filename()
            if filename:
                filename = decode_header(filename)
                [...]

所有其他正常编码似乎都起作用。有什么问题,有时get_filename返回已解码的字符串或已编码。您能建议我如何解决这个问题吗?


当我收到UnicodeError时的确切内容是“ Harmonogram 2018Łukaszewa35.pdf”

第二条消息包含并且有效:

Content-Transfer-Encoding: base64
Content-Disposition: attachment;
filename="To =?UTF-8?b?Y8OzxbwsIMW8ZQ==?= ze Szwecji, to nic,
=?UTF-8?b?xbxl?= ze Szwecji..xlsx"

1 个答案:

答案 0 :(得分:0)

尝试

from email.header import Header,decode_header,make_header
file_name=make_header(decode_header(part.get_filename()))