5

Ich verwende den folgenden Code Dateinamen des Anhangs zu extrahieren:Wie bekomme ich den Dateinamen der Dekodierung mit Python-E-Mail?

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() 

Es funktioniert gut in vielen Fällen, aber irgendwann als image_file_name ich Werte wie =?KOI8-R?B?xsHTLTk2Mi5qcGc=?= oder =?UTF-8?B?REkyeTFXMFNMNzAuanBn?=.

Wie soll ich mit solchen Fällen umgehen?

Antwort

2

Sie an den drei Teile aussehen sollte getrennt, und verwenden Sie die beiden ersten als Anweisungen für das dritte zu behandeln ‚?‘:

Das erste Bit ist die Zeichenkodierung (KO18-R und UTF- 8 in Ihren Beispielen), und das zweite Bit ist ein "B", um die base64-Kodierung anzuzeigen - Q an seiner Stelle würde Anführungszeichen-druckbare anzeigen, also sollten Sie Ihren Code auch darauf vorbereiten.

+0

Dank. Bedeutet es, dass ich es manuell entschlüsseln muss und email.utils hat keine fertige Methode, um verwendet zu werden? –

+0

OK, ich habe den folgenden Code verwendet - 'if Image_Dateiname [: 11] == '=? KOI8-R? B?': Image_Dateiname = Base64.b64Decode (Image_Dateiname [11:]) .Decode ('KOI8-R ') if Bild_Dateiname [: 10] ==' =? UTF-8? B? ': Bilddateiname = base64.b64decode (Bilddateiname [10:]) ' –

6

können Sie verwenden decode_header Funktion wie folgt aus:

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

Ausarbeiten auf @ Antwort von Nikon:

from email.header import decode_header 

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