5

我用下面的代碼以提取附件的文件名:如何使用python電子郵件獲取解碼附件文件名?

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?=

我該如何處理這種情況?

回答

2

你應該看看相隔三個部分,使用前兩種爲如何對待第三指令「?」:

的第一位是字符編碼(KO18-R和UTF-的8在你的例子中),第二位是一個'B'來表示base64編碼 - Q在它的位置將表明引用可打印,所以你應該準備好你的代碼。

+0

謝謝。這是否意味着我必須手動解碼並且email.utils沒有準備好的方法來使用? –

+0

好的,我用了下面的代碼 - '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:]) –

6

可以使用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]) 
0

在闡述@尼康回應:

from email.header import decode_header 

filename = part.get_filename() 
fname, charset = decode_header(filename) 
if charset: 
    filename = fname.decode(charset) 
相關問題