【问题标题】:How to get decode attachment filename with python email?如何使用 python 电子邮件获取解码附件文件名?
【发布时间】:2014-02-11 19:38:07
【问题描述】:

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

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?= 之类的值。

我应该如何处理这种情况?

【问题讨论】:

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


    【解决方案1】:

    你可以像这样使用 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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢。这是否意味着我必须手动解码它并且 email.utils 没有现成的方法可以使用?
      • 好的,我使用了以下代码 - if image_file_name[:11] == '=?KOI8-R?B?': image_file_name = base64.b64decode(image_file_name[11:]).decode('KOI8-R') if image_file_name[:10] == '=?UTF-8?B?': image_file_name = base64.b64decode(image_file_name[10:])
      【解决方案3】:

      详细说明@Nikon 的回复:

      from email.header import decode_header
      
      filename = part.get_filename()
      fname, charset = decode_header(filename)
      if charset:
          filename = fname.decode(charset)
      

      【讨论】:

      • 在你使用decode_header的那一行,我必须指定[0]。否则,我收到错误ValueError: need more than 1 value to unpack。所以那行应该是fname, charset = decode_header(filename)[0]
      • 这对我来说是最好的解决方案!!
      猜你喜欢
      • 1970-01-01
      • 2011-09-19
      • 2014-07-15
      • 2015-05-28
      • 2011-08-09
      • 2011-08-20
      • 2022-12-13
      • 2020-05-16
      • 2012-03-11
      相关资源
      最近更新 更多