用邮件分割和传送大文件,python实现 I1. 限制和解决方案经常有人替我国导演和科幻作者们叫屈,说这样的环境怎么能出好作品呢;也经常有人为自己叫屈,类似他有这样的父母环境怎么能成才呢。不过,我看过一个故事,说法略有不同,名字忘了,应该还是个名篇。故事里说,有个家伙因为被抢劫,捆得很结实,而又刚刚好能动弹一点,能一跳一跳地走。他被救以后,发现能演小丑什么的,留在马戏团工作。因为绳子约束,力量更大,而且能做很多原来完不成的动作。最后,老板想杀他放出狼来,他做好准备放手一搏,觉得胜券在握。老板娘一刀把他身上的绳子割了,喊"那谁,你快跑啊。"然后就没有然后了。这哥们离了绳子啥也不是,后来是不是被狼咬死,我就忘了。这个故事告诉我,限制从来不一定是致命的阻碍,有时更可能是个磨砺人的挑战。包师弟和ZHUMAO聊,说到某单位的网络真是不咋地,下载居然要收费,不过有个漏洞。包师弟说,这个漏洞就是下载邮件的流量不算钱。这倒是也合理,不然就往网络中心或领导的信箱里成天发大附件就行了。同时,从原理上也说得过去,SMTH的时候,不是我乐意的,相当于接听电话不收费;而POP3的时候,已经是内网了。ZHUMAO说,这个漏洞可用。他提到,先把大文件切成几份,然后用邮件发给包师递,包师弟根据一定条件收邮件,然后拼起来。我说:你们应该用PYTHON整。ZHUMAO说:对,你整吧。于是我就整了。没有写容错部分,一共197行,拿出来讨论一下。2. 整体框架整个软件分成两部分,是两个.py文件。一个是发送文件用的,名字叫 zhumao.py,另一个是收文件用的,名字叫 baoyu.py。2.1 zhumao.py发文件的zhumao要顺序执行这样一些操作:* 编码文件用base64或可打印字符,因为邮件是ASCII文本的,而大部分二进制文件都有ASCII控制字符,比如电影。之所以编码,另一个原因是我不想使用附件,实现的时候更麻烦一些,以后也可以改成用附件。* 拆分文件把文件拆成定长的几段,比如10K一段,然后再发送。最后一段可能稍微短一些。* 标记及百分比,发送在邮件的subject上做标记,比如 [来自zhumao,好片子] 这样包师弟接收的时候过滤邮件更容易一些。然后找个SMTH邮件服务器发出去。* 避免被服务器视为垃圾邮件发送者邮件服务器可能会因为你一直发一直发认为你是恶意的,所以发一会要 sleep一会儿。对软件性能的影响,就是没有办法的事了。2.2 baoyu.py收文件这一端,要执行相反的操作,即顺序执行:* 检查用POP3检查所有的邮件头。* 根据标记过滤,下载并删除把符合条件的邮件,比如 [来自zhumao,好片子],下载下来,从服务器端删除。在这里,以后应该支持错误检校,出错重传。现在还没有支持,作为原型,就算对付吧,如果1G文件中间有一个坏的,就得重传全部。* 合并文件把文件从邮件body中析出来,然后拼成编码的文件。有些邮件服务器会在subject 之后加上乱糟的东西,比如 anti-spam
之类的,这破坏了一个通常的假设,即subject之后一行以后全是正文。这导致析出文件稍微麻烦一些。我为了实现简单,在body的最前面加了标记,后面也加了标记。反正邮件不是用人手,而是用zhumao.py发出的,所以这一部分可以视为
zhumao-baoyu 协议。* 解码文件把ascii文件解码为binary。* 接收百分比还要显示接收了多少。同时,因为邮件到达顺序可能与发送的不同,所以zhumao.py在发送的时候还在 subject 中还加入了共几包,当前这封邮件是第几包。2.3 实现列出上述框架以后,我先写zhumao.py,用 thunderbird 和 gmail 检验发送的内容;然后再写
baoyu.py,此时用已经实现的zhumao.py发送测试用例。因为我不熟悉python,很多语法和底层的机制 (如分割字符串)
,都是一边写一边查的。估计有更优雅的实现方案,不过那就不是我这样的初学者能提供的了。所以,大牛们读到此处,已经可以评判 zhumao-baoyu 方案了。初学者们请明天再来,我们继续一起学习吧。此外,这个zhumao-baoyu草稿在计算机网络中也可以视为 smtp-pop3 协议基础上实现的文件传递协议,还可以扩展更多的功能,比如
baoyu 要求列出 zhumao端 提供的文件目录,选择文件下载。在协议之上建立新的协议,VPN中的l2tp、WAN口连接使用的
PPPoE,都与此类似,称为隧道协议。在隧道协议中,表面上我们谈论的是一件事情,而实际上,我们真正想传递的,往往另有深意。就像年终岁尾,大家喝酒的时候,逼你喝酒的那些人,他表达的是:"你应该表达臣服于我,低个头啥的。"请脑补雄性大猩猩拍胸脯的动作。突然想起来北京土著喜欢自称为"爷"的习惯,还有四川土著喜欢口头对别人的"婆娘"不敬这两件事,他们可能还会解释为"啊呀,我就是习惯了,没有恶意。"明知对方的感受,不郑重道歉的就是恶意。坏习惯是病,如果能改就改,如果不能改,就得治。我对四川同学说过,你说别人的媳妇啥都行,对我得例外。期待机会哪天对哪位北京同学喊一嗓子,你TM是谁的爷。终于还是跑题了。--------------------博客会手工同步到以下地址:[http://giftdotyoung.blogspot.com][http://blog.csdn.net/younggift]