如何确定是不是通过 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.Generator maxheaderlen 【参考方案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 编码获取邮件?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法确定大数据包捕获的所有base64编码流量?

如何判断一个字符串是不是经过base64加密过

如何将 base64 编码的图像保存到磁盘?

如何通过js将一base64编码的图片显示在html中

如何在 Python 中对 PDF 文件进行 base64 编码

如何在 Ruby 中给定 URL 以 base64 编码媒体