如何判断通过IMAP获取的邮件是否为Base64编码?
我把整个邮件保存成了xx.eml文件,但有些邮件的内容在第一行提到它是用base64编码的,比如:
charset="utf-8" Content-Transfer-Encoding: base64
charset="gb2312" Content-Transfer-Encoding: base64
我试着去获取body[0][1]
的键,但没有找到content-transfer-encoding这个字段(只有content-type)。
我该如何处理这些邮件呢?
def saveMail(conn, num):
typ, body = conn.fetch(num, 'RFC822')
message = open(emldirPath + '\\' + num + '.eml', 'w+')
message.write(str(email.message_from_string(body[0][1])))
print email.message_from_string(body[0][1]).keys()
#['Received', 'Return-Path', 'Received', 'Received', 'Date', 'From', 'To',
# 'Subject', 'Message-ID', 'X-mailer', 'Mime-Version', 'X-MIMETrack',
# 'Content-Type', 'X-Coremail-Antispam']
message.close()
我找到了问题,实际上并不是解码的问题。
正确的邮件内容如下:
------=_Part_446950_1309705579.1326378953207
Content-Type: text/plain; charset=GBK
Content-Transfer-Encoding: base64
而我程序下载的内容是:
------=_Part_446950_1309705579.1326378953207
Content-Type: text/plain;
charset="utf-8"
Content-Transfer-Encoding: base64
当我的程序保存.eml文件时,它在'text/plain;'后面换行了。
因此,Outlook Express无法解析这封邮件。如果我把这一行改成"Content-Type: text/html;charset="utf-8"",
它就能正常工作了。
现在的问题是:我该如何修改我的程序,让它不要换行呢?
1 个回答
当你发送的邮件是用BASE64编码时,必须设置一个叫做Content-Transfer-Encoding
的东西。不过,你很可能在处理一种叫做MIME/Multipart的邮件(比如同一封邮件里同时有纯文本和HTML内容),在这种情况下,每一部分的传输编码都是单独设置的。你可以用is_multipart()
来检查,或者看看Content-Type
是不是multipart/alternative
。如果是这样的话,你可以使用walk这个方法来遍历不同的部分。
补充一下:发送纯文本时用quoted-printable编码,而发送HTML时用BASE64编码是很正常的。
Content-Type: multipart/alternative; boundary="=_d6644db1a848db3cb25f2a8973539487"
Subject: multipart sample
From: Foo Bar <foo@example.net>
To: Fred Flintstone <fred@example.net>
--=_d6644db1a848db3cb25f2a8973539487
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=utf-8
SOME BASE64 HERE
--=_d6644db1a848db3cb25f2a8973539487
Content-Transfer-Encoding: base64
Content-Type: text/html; charset=utf-8
AND SOME OTHER BASE64 HERE