我将整个邮件保存为xx.eml,但是有些邮件正文告诉我们邮件是在第一行用base64编码的,例如:
charset="utf-8" Content-Transfer-Encoding: base64
charset="gb2312" Content-Transfer-Encoding: base64
我尝试获取body[0][1]
的密钥,但没有内容传输编码字段(仅内容类型)。
我该如何处理这些邮件?
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
内容类型:text / plain;字符集= GBK
Content-Transfer-Encoding:base64
我的程序下载:
------ = _ Part_446950_1309705579.1326378953207
内容类型:text / plain;
字符集= “UTF-8”
Content-Transfer-Encoding:base64
当我的程序保存.eml文件时,它会在'text / plain;'后改变行
因此outlook express无法解析邮件
如果我将该行编辑为“”Content-Type:text / html; charset =“utf-8”“,
它的工作原理
现在的问题是:如何编辑我的程序而不让它改变行?
答案 0 :(得分:0)
转移为BASE64的电子邮件必须设置Content-Transfer-Encoding
。但是,您最有可能处理MIME / Multipart消息(例如,同一消息中的text / plain和HTML),在这种情况下,为每个部分单独设置传输编码。您可以使用is_multipart()
或Content-Type
multipart/alternative
进行测试。如果是这种情况,您可以使用walk来迭代不同的部分。
编辑:使用BASE64使用quoted-printable和HTML发送text / plain是很正常的。
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