用 imaplib 只取信件头会取到乱码,取整封信则正常

2016-06-03 14:09:40 +08:00
 quadpixels

最近用 Python 的 imaplibemail 从一个 gmail 信箱中取信。

因为信可能有很多,而我只想取特定发件人发来的信,所以就只先取信头(通过类似 rv, data = self.M.fetch(num, '(BODY[HEADER])') 的方式),如果发件人符合,再取整封信(rv, data = self.M.fetch(num, '(RFC822)'))。

于是我就遇到了这么样封信。如果我只取信头,那么取到的信件发件人是:

'"\xce\xa2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc5\xb6\xef\xbf\xbd" <weixinteam@qq.com>'

它是乱码:

>>> print '"\xce\xa2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc5\xb6\xef\xbf\xbd" <weixinteam@qq.com>'.decode("gbk")
"微锟斤拷锟脚讹拷" <weixinteam@qq.com>

而如果取整封信,则信件标题是:

'"\xce\xa2\xd0\xc5\xcd\xc5\xb6\xd3" <weixinteam@qq.com>'

这个标题则是正常的:

>>> print '"\xce\xa2\xd0\xc5\xcd\xc5\xb6\xd3" <weixinteam@qq.com>'.decode("gbk")
"微信团队" <weixinteam@qq.com>

这个乱码,可以这么重现……
把这个字串直接(应该是用 utf-8 解码)印到控制台里,然后把输出的内容再用 utf-8 编码一遍,就变成了那第一串长字符串;特别地,\xef\xbf\xbd 其实就是 utf-8 编码的“问号标志”

>>> print '"\xce\xa2\xd0\xc5\xcd\xc5\xb6\xd3" <weixinteam@qq.com>'
"΢���Ŷ�" <weixinteam@qq.com>
>>> '"΢���Ŷ�" <weixinteam@qq.com>'
'"\xce\xa2\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xc5\xb6\xef\xbf\xbd" <weixinteam@qq.com>'

不知大家遇到过一样的情况吗?

p.s. 如果搜索“锟斤拷锟解”,还能得到更壮观的结果…比如这个…锟斤拷锟解:圣锟斤拷锟斤拷锟斤拷没锟叫达拷锟斤拷锟斤拷锟斤拷矛锟杰和诧拷锟届?

4105 次点击
所在节点    Python
4 条回复
18600491593
2016-06-03 14:24:32 +08:00
头是不是加密了
quadpixels
2016-06-03 14:36:03 +08:00
@18600491593 应该没有吧,如果加密了的话,不应该能看到发件人的邮件地址的
knightdf
2016-06-03 14:47:20 +08:00
http://tools.ietf.org/html/rfc3501.html#section-6.4.5 我原来做过很多,现在忘了,我记得每个邮件提供商都有点不一样,当时有个指令 Gmail 和 qq 之类的就不一样,要自己试
cxe2v
2016-06-03 14:53:33 +08:00
看到"锟斤拷锟解"这种字符莫名就要笑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/283242

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX