如何确定是否通过imap base64编码邮件?

时间:2012-02-02 07:03:38

标签: python email base64 imap

我将整个邮件保存为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”“,
它的工作原理

现在的问题是:如何编辑我的程序而不让它改变行?

1 个答案:

答案 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