如何确定是不是通过 imap base64 编码获取邮件?
Posted
技术标签:
【中文标题】如何确定是不是通过 imap base64 编码获取邮件?【英文标题】:How to determine if a mail fetch by imap base64 encoded?如何确定是否通过 imap base64 编码获取邮件? 【发布时间】:2012-02-24 20:57:14 【问题描述】:我将整封邮件保存为 xx.eml,但有些邮件正文在第一行告诉邮件是用 base64 编码的,例如:
charset="utf-8" Content-Transfer-Encoding: base64
charset="gb2312" Content-Transfer-Encoding: base64
我尝试获取body[0][1]
的key,但是没有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 内容类型:文本/纯文本;字符集=GBK 内容传输编码:base64
我的程序下载什么: ------=_Part_446950_1309705579.1326378953207 内容类型:文本/纯文本; 字符集="utf-8" 内容传输编码:base64
当我的程序保存 .eml 文件时,它会在 'text/plain;' 之后更改行 因此outlook express 无法解析邮件 如果我将行编辑为 ""Content-Type: text/html;charset="utf-8"", 它的工作原理
现在的问题是:如何编辑我的程序不让它换行?
【问题讨论】:
但是你为什么需要对此进行测试呢?只需按原样保存消息,如果您对 base64 进行解码,则以后可能无法打开保存的文件。我的意思是,即使使用 BASE64,您的 .eml 文件也应该可以正常工作。 我的 .eml 文件无法正常工作..,邮件正文不可读。(由 Outlook Express 打开) 你明白了,解码后很难构造邮件。那么如何将整个消息保存为 xxx.eml 以及所有可读的单词? 尝试使用不同的email.generator.Generatormaxheaderlen
。
【参考方案1】:
以 BASE64 传输的电子邮件必须设置为 Content-Transfer-Encoding
。但是,您最有可能处理的是 MIME/Multipart 消息(例如,同一消息中的 text/plain 和 HTML),在这种情况下,每个部分的传输编码都是单独设置的。您可以使用is_multipart()
或Content-Type
是否为multipart/alternative
进行测试。如果是这种情况,您可以使用 walk 来迭代不同的部分。
编辑:使用quoted-printable 发送文本/纯文本和使用BASE64 发送HTML 是很正常的。
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
【讨论】:
是的,我打印“Content-Type”字段,它显示“multipart/alternative”或multipart/mixed,我试试walk() 我现在可以解码payload,但是解码后很难构造邮件,有什么建议吗? 这很大程度上取决于内容是什么,您可以尝试将其编码为quoted-printable 并更改内容传输编码。以上是关于如何确定是不是通过 imap base64 编码获取邮件?的主要内容,如果未能解决你的问题,请参考以下文章