最近有个需求需要批量下载邮箱中某一类型邮件的附件,使用了Python
标准库中的IMAP
以及EMAIL
模块。但是下载下来后总有一些附件的标题是乱码。。。了解了下邮件协议后,终于发现问题所在了。
具体关于邮件协议的分析,可以参考这篇文章。附件在邮件中时一个multipart
段,然后这个段中会有下面两个邮件头
对应着Python
中解析的代码如下
import email |
正常来说按照上面解析邮件附件名应该没有错,但是上面这个邮件头中filename
有些特殊,filename
直接使用了gbk
编码传输。email
标准库中默认处理的编码是大概是下面这种形式,编码后所有的字符都是可打印的并且包含有原始字符的编码信息
=?GB2312?B?MjAxODEwMjW547eixMnLuczYwNbuozG6xUXWpMivzbbXyrv5vfC5wNa1se0=?= |
所以我们不能直接依赖email
库中的处理方式,需要额外进行处理
missing = object() |
那为什么email
标准库不能正确处理呢? 应该是对于8bit编码的传输方式还不支持。邮件中传输的编码默认是7bit的可打印的字符,但是近年来国内的大多数邮件服务器都已经支持8bit了,也就是可以直接支持gbk
编码的传输。