如何使用python电子邮件解码附件文件名?

时间:2014-02-11 19:38:07

标签: python google-app-engine email python-2.7 email-attachments

我使用以下代码提取附件的文件名:

import email.utils

msg = email.message_from_string(self.request.body) # http://docs.python.org/2/library/email.parser.html
for part in msg.walk():
    ctype = part.get_content_type()
    if ctype in ['image/jpeg', 'image/png']:
        image_file = part.get_payload(decode=True)
        image_file_name = part.get_filename()

在很多情况下效果很好,但有时image_file_name我会得到=?KOI8-R?B?xsHTLTk2Mi5qcGc=?==?UTF-8?B?REkyeTFXMFNMNzAuanBn?=等值。

我该如何处理这类案件?

3 个答案:

答案 0 :(得分:9)

你可以像这样使用decode_header函数:

from email.header import decode_header

filename = part.get_filename()
if decode_header(filename)[0][1] is not None:
    filename = str(decode_header(filename)[0][0]).decode(decode_header(filename)[0][1])

使用Python 3:

from email.message import EmailMessage
from email.header import decode_header


def get_part_filename(msg: EmailMessage):
    filename = msg.get_filename()
    if decode_header(filename)[0][1] is not None:
        filename = decode_header(filename)[0][0].decode(decode_header(filename)[0][1])
    return filename

答案 1 :(得分:2)

你应该看看用'?'分隔的三个部分,并使用前两个作为如何处理第三部分的说明:

第一位是字符编码(在你的例子中是KO18-R和UTF-8),第二位是'B'来表示base64编码 - Q在它的位置表示引用可打印,所以你也应该为此准备你的代码。

答案 2 :(得分:0)

阐述@ Nikon的回应:

from email.header import decode_header

filename = part.get_filename()
fname, charset = decode_header(filename)
if charset:
    filename = fname.decode(charset)