2010-09-15 95 views
1

我有一个应用程序引擎应用程序,它接收带有附件的传入邮件。我检查附件文件名以确保扩展名是正确的。如果文件名中有变音符或重音字符,编码会使文件名对我的方法不可读,所以我不知道如何检查文件类型。解析传入邮件的unicode附件名称到Google App Engine

例如,如果我送一个文件名ZumBrückenwirtÜberGrünwaldZurück(2).GPX

,然后打印附件名称是这样的:

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

我得到:

附件名称=?ISO-8859-1?B?WnVtQnL8Y2tlbndpcnTcYmVyR3L8bndhbGRadXL8Y2soMikuZ3B4?=,b4?=

回答

2

这是一个RFC2047编码字。你可以把它与email包部分解码,但它仍然需要事后拼接在一起:

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' 

它,然而,完全不正确要在附件中使用的编码字在filename="..."参数Content-Disposition。 RFC2047明确规定,编码词不能出现在引用参数中。非ASCII参数值应该使用RFC2231的规则进行传输,看起来完全不同(并且非常复杂)。

因此,根据邮件标准,您应该将该文件名字面上看作是“=?ISO-8859-1?B?WnVtQnL8Y2tlbndpc ...”。我相信这是MS Exchange产生这种废话。尽量保持这个处理降到最低限度(例如,仅当字符串被包装在=?...?=中时才进行解码,这对于文件名来说是不太可能的)

相关问题