2010-09-15 6 views
1

J'ai une application de moteur d'application qui reçoit les messages entrants avec des pièces jointes. Je vérifie le nom de fichier de pièce jointe pour m'assurer que l'extension est correcte. Si le nom de fichier contient des trémas ou des caractères accentués, l'encodage rend le nom de fichier illisible pour mes méthodes, donc je ne sais pas comment vérifier le type de fichier.Analyse des noms de pièce jointe unicode sur le courrier entrant dans Google App Engine

Par exemple, si je vous envoie un fichier avec le nom ZumBrückenwirtÜberGrünwaldZurück (2) .GPX

Et puis imprimer le nom de pièce jointe comme ceci:

attachments = [message.attachments]   
attachmenttype = attachments[0][0][-4:].lower() 
logging.error("attachment name %s, %s" % (attachments[0][0], attachmenttype)) 

Je reçois:

nom de pièce jointe =? ISO-8859-1? B? WnVtQnL8Y2tlbndpcnTcYmVyR3L8bndhbGRadXL8Y2soMikuZ3B4? =, B4? =

Répondre

2

C'est un mot codé RFC2047. Vous pouvez partiellement décoder avec le paquet email, même si elle doit encore assemblant après:

import email.header 
def parseHeader(h): 
    return ''.join(s.decode(c or 'us-ascii') for s, c in email.header.decode_header(h)) 

>>> parseHeader('=?ISO-8859-1?B?WnVtQnL8Y2tlbndpcnTcYmVyR3L8bndhbGRadXL8Y2soMikuZ3B4?=') 
u'ZumBr\xfcckenwirt\xdcberGr\xfcnwaldZur\xfcck(2).gpx' 

Il est, cependant, tout à fait incorrect d'utiliser un mot codé dans le paramètre filename="..." pour Content-Disposition dans une pièce jointe. RFC2047 indique explicitement qu'un mot codé ne peut pas apparaître dans un paramètre cité. Les valeurs de paramètres non-ASCII sont censées être transférées en utilisant les règles du RFC2231, qui sont complètement différentes (et très compliquées).

Donc, selon la norme du courrier, vous devriez traiter ce nom de fichier comme étant littéralement "=? ISO-8859-1? B? WnVtQnL8Y2tlbndpc ...". Je crois que c'est MS Exchange qui génère cette absurdité. Essayez de minimiser ce traitement (par exemple, en décodant uniquement lorsque la chaîne est entourée de =?...?=, ce qui est peu probable pour un nom de fichier.)