将传入邮件上的unicode附件名称解析为Google App Engine

时间:2010-09-15 20:26:12

标签: python 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?=

1 个答案:

答案 0 :(得分: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产生这种废话。尝试将此处理降至最低(例如,仅在字符串包含在=?...?=时才进行解码,这对文件名来说是不太可能的。