摘要:发送邮件好说,接收和下载邮件也好说。所以我们想要解析一封邮件把它拆成人能读懂的标题收发件人内容附件等,就必须得理解这套协议。了解协议,其实主要就是了解邮件的嵌套结构。另一种压缩方式,需要用库函数来解码。
邮件的解析是个大课题,远超一般人的预期。它远比发送邮件和接收邮件要复杂的多的多。
这就是为什么网上中文外文搜邮件的问题,绝大多数都是讲发送的而讲接收的很少。
发送邮件好说,接收和下载邮件也好说。关键是下载下来的邮件是一种比HTML还复杂的嵌套结构
MIME邮件协议参考:阮一峰 - MIME笔记
参考:MIME邮件的组织结构
参考:Parsing email using Python part 2 of 2 : The content
参考:Mozilla - MIME types
先不论Python,也不谈什么邮件发展历史,只论现在:
现在我们要达到通过编程来解析邮件,就绝对避不开这个问题:MIME邮件结构.
MIME是一整套的协议,就像HTTP协议、TCP协议之类的一样,都是解析邮件的一套规则。
所以我们想要解析一封邮件(把它拆成人能读懂的标题、收发件人、内容、附件等),就必须得理解这套协议。
就算有现成的Python处理库也一样要懂了以后才能开始操作。
了解MIME协议,其实主要就是了解邮件的嵌套结构。这个懂了就全懂了。
要知道,我们收到的一封邮件可能是以下这几种不同的结构类型:
简单的几句话,全是文字。 (text/plain)
非常漂亮的网页一样的页面。(text/html)
包括回复另一封邮件的层层嵌套的内容。(multipart/mixed)
带附件的内容,比如一张图片。(multipart/mixed) + (image/jpeg)
当然,这不是全部,只是有代表性的几种文档类型。最重要的是知道:
所有超出简单文字或网页HTML之外的,全都是multiparts。
最难理解的也是这个multiparts。
下面是最复杂的Multiparts邮件,包括了所有能包括的结构。其中每个方块都有自己的Content Type和Body。
简单点的结构图:
[站外图片上传中...(image-8219fc-1548158814349)]
文字型结构图:
multipart/mixed | +-- multipart/related | | | +-- multipart/alternative | | | | | +-- text/plain | | +-- text/html | | | +-- image/gif | +-- application/msword
详细一点的结构图:
[站外图片上传中...(image-36fdd8-1548158814349)]
这里是所有邮件能支持的Content Type文档类型:
text/plain: 纯文本,文件扩展名.txt
text/html: HTML文本,文件扩展名.htm和.html
image/jpeg: jpeg格式的图片,文件扩展名.jpg
image/gif: GIF格式的图片,文件扩展名.gif
audio/x-wave: WAVE格式的音频,文件扩展名.wav
audio/mpeg: MP3格式的音频,文件扩展名.mp3
video/mpeg: MPEG格式的视频,文件扩展名.mpg
application/zip: PK-ZIP格式的压缩文件,文件扩展名.zip
编程上需要明确的是:要读取嵌套结构,必须用递归的方法。
Content-Disposition 附件的存在方式对于附件,有两种存在方式:
inline: 嵌入在文字里的,比如HTML格式邮件中显示的图片
attachment: 是附在结尾的,多带带的一部分
一般我们只需要处理attachment格式的附件,而inline的东西就让它保存在inline里吧。
邮件里面要获取这个部分的格式,需要找到这个参数:Content-Disposition。其它并拍的参数还要Content-Type和Content-ID等。
这个只针对text/plain & text/html类型的文本有用。
这个是每封邮件的必须数据,它必须要指出每段文本的传输编码方式,有的可以压缩传输(base64),有的可以原文传输(8bit或7bit),有的可以内置base64图片可直接打印(quoted-printable)。
正因为每封邮件都可能采用不同的传输编码策略,所以我们解析内容之前必须要判断是哪种方式才能正确解码为原文的内容。
目前常见的传输编码方式有:
8bit或7bit:这个最简单,直接是原文,不需要转码。
base64:内容全文用base64压缩,所以需要用base64.b64decode()库函数来解码。
quoted-printable:另一种压缩方式,需要用quopri.decodestring()库函数来解码。
获取当前内容的传输编码方式的代码如下:
encoding = part.get("Content-Transfer-Encoding")
其中part可以是库email.message.Message的实例或者其中multipart多部分中的sub-part,都可以。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43082.html
摘要:大家好,我是辣条。最先审核没通过,说我脚本涉嫌控制电脑违法违规,经过我再三的沟通之下,完整代码删除了,希望能通过审核。 大家好,我是辣条。 前言 开学没多久,事又多正愁缺写博客的素材,这不马上就来了,憨憨室友又要整活 ,看在友(红)情(包)的份上必须帮忙。 我起初的想法是通过邮箱发送表白...
摘要:在这里真心感谢一直在支持我的那几个粉丝,谢谢你们的持续关注点赞。果然,第三个包也是按的步差来的,而为零不变,也不变。函数里面的话就是个循环咯,当条件不满足时就一直加,知道条件满足为止。我每天都会抽时间给我的粉丝解答,给与一些学习资源。 目录 前言 准备工作 分析(x0) 分析(x1) 分析(...
摘要:源码地址准备一台云服务器写好的脚本效果因为现在一个的客户端启动越来越慢,而且很多自己不感兴趣的东西我只是想看看文章,所以就写了这个小爬虫。因为一个是每天点会更新,所以自己的服务器要做一个定时服务,下自带了定时任务。 源码地址:https://github.com/xcc3641/pySendOneToEmail 准备 一台云服务器 写好的Python脚本 效果 因为现在一个的And...
阅读 3920·2021-11-17 09:33
阅读 3282·2021-10-08 10:05
阅读 3110·2021-09-22 15:36
阅读 1139·2021-09-06 15:02
阅读 2771·2019-08-29 12:45
阅读 1589·2019-08-26 13:40
阅读 3398·2019-08-26 13:37
阅读 419·2019-08-26 13:37