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

如何使用python电子邮件解码附件文件名?,python,google-app-engine,email,python-2.7,email-attachments,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']:

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

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\u file\u name
我会得到类似
=?KOI8-R?B?xshtltk2mi5qgc=?=
=?UTF-8?B?rekyetfxmfnnzaunbn?=


我应该如何处理此类情况?

您应该查看由“?”分隔的三部分,并使用前两部分作为如何处理第三部分的说明:


第一位是字符编码(在您的示例中是KO18-R和UTF-8),第二位是一个“B”表示base64编码-在它的位置上的Q表示引用的可打印,因此您也应该为此准备代码。

您可以像这样使用decode_头函数:

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

详细说明@Nikon的回应:

from email.header import decode_header

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

谢谢这是否意味着我必须手动解码,email.utils没有现成的方法可以使用?好的,我使用了以下代码-
if image\u file\u name[:11]='='=?KOI8-R?B?':image\u file\u name=base64.b64解码(image\u file\u name[11:])。decode('KOI8-R')if image\u file\u name[:10]='='='UTF-8?B?':image\u file\u name=base64.b64解码(image\u file\u[10:]
在使用
decode\u header
的行中,我必须指定
[0]
。否则,我得到了错误
ValueError:需要超过1个值才能解包
。因此该行应该是
fname,charset=decode\u header(filename)[0]