如何判断通过IMAP获取的邮件是否为Base64编码?

1 投票
1 回答
4694 浏览
提问于 2025-04-17 12:10

我把整个邮件保存成了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 个回答

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

撰写回答