2010-09-15 96 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產生這種廢話。儘量保持這個處理降到最低限度(例如,僅當字符串被包裝在=?...?=中時才進行解碼,這對於文件名來說是不太可能的)

相關問題