Email诞生记(下)

讲述了小王和老周如何解决电子邮件系统中添加附件的问题,通过定义邮件内容类型和使用Base64编码,解决了文本与二进制文件的兼容性,并扩展了邮件系统的功能。

上次在《Email诞生记》说到小王和老周设计了电子邮件的系统, 但是不能支持附件 -- 这也是本文要解决的重点。 

3

附件

小王回去后想了很久, 怎么才能给在邮件中加上附件呢?  邮件的正文是文本格式的, 但图片,word这些文件是二进制的,完全不同啊?


小王躺在床上翻来覆去很久才睡着, 甚至做了一个Email的梦 :-)


第二天小王找到了师傅老周讲了自己的困惑。 


老周说: "我们搞计算机行业的,遇到问题解决方法通常有两个: 1. 增加一个抽象层  2. 分而治之。"


小王不满的心想: 这不等于什么都没有说嘛!


老周笑了:你想想, 我们把原始问题划分成两个子问题来解决: 1.  如何让邮件正文和附件区分开来。   2. 如何把二进制的数据加入到邮件中。 


小王说: “第一个问题我觉得很简单, 在正文中画一道分隔线不就行了, 上面是正文 ,下面是附件”


“你犯了一个错误,小王,  你把计算机当成人了 , 其实计算机很笨,你需要精确的定义那个分隔线到底是什么, 我们还得精确的告诉计算机,这个邮件分为多个部分, 有些是正文,有些是附件”


小王不好意思的笑了: “的确是, 我们要不这样,先定义一个邮件的内容类型,例如Content-type=plain-text , 那这个邮件就是纯文本的, 如果Content-type=mixed, 就代表是有文本就有附件”


老周想了想说:“这样的话扩展性不好, 我们把Content-type 分为主类型/子类型, 像这样:” 


老周说着在白板上画了起来:

Content-type = 主类型/子类型

其中主类型和子类型都可以扩展。 

现阶段:如果主类型是Text , 那子类型可以是 plain, 代表纯文本,  也可以是别的东西, 现在我也不知道, 可以扩展。


如果主类型是Multipart , 就代表这个文件有多个部分组成, 那子类型可以是mixed, 即多个部分是混合的。


例如:  

Content-type=text/plain   : 这是个纯文本邮件

Content-type=multipart/mixed  : 这是一个由正文和附件混合组成的邮件。


(码农翻身注: text 除了plain之外,还支持html ,   multipart 还支持alternative, related  , 为了简化,这里不再展开 )


小王说:师傅你考虑的可真是长远啊, 但是这个文本和附件之间的分隔符怎么弄? 


老周说: “我们可以让发邮件的客户端,像我们的Quickmail 自己来选择, 但是选择以后要告诉我们, 我想可以在Content-type后面加个分隔符的属性


Content-type=multipart/mixed;  

boundary="----=_NextPart_AEDGREGREWGREWGFDSFGSGFDSFTTRFSGGFD_001_0051_01A";


只要这个boundary的属性和邮件中的数据不冲突就可以 。”


小王说:“我试着设计一个包含附件的正文, 师傅你看看。 ”


//定义这是一个混合的邮件, 每个部分的分隔符由boundary定义。 为了便于阅读, 我把这个boundary故意写的很简单, 实际复杂的多


Content-type=multipart/mixed;  

boundary="--A001_0051_01A";


//以分隔符来开始邮件正文

----A001_0051_01A


//这是“为了庆祝产品发布, 今晚在海底捞聚餐”的base64编码的结果

5Li65LqG5bqG56Wd5Lqn5ZOB5Y+R5biD77yMIOS7iuaZmuWcqOa1t+W6leaNnuiBmumkkA==


----A001_0051_01A

Content-type:audio/wav

name:"fly.wav"

<这里是附件1的数据>


----A001_0051_01A

Content-type: image/jpg

name:"sky.jpg"


<这里是附件2的数据>

//整个邮件结束的标记

----A001_0051_01A


老周说: 怪不得老板夸你说你一点就透,果然是啊, 你都能想到给每个附件加个名称和类型了


“还是师傅你考虑的周到,这个Content-type可以随便扩展啊, 想写成啥写成啥。 那第二个问题:附件的内容怎么办? ”


“刚才你写那个邮件正文的base64编码的时候,没有给你启发吗? ”老周反问到


“啊,对了, 这些附件无非就是二进制的数据, 完全可以像处理汉字那样用base64来编码啊! 为了扩展性, 我们要不给每一个部分加一个编码类型的属性? 例如:”

Content-type: image/jpg

name:"sky.jpg"

encoding: base64


老周满意的说:“没问题,可以的”

4

扩展

小王和老周已经设计了一个收取邮件, 发送邮件的系统, 这个系统还可以支持附件。

 

在老周的带领下, 小王和其他同事经过几个月的时间把这个系统的客户端和服务器端开发了出来,经过同事的使用, 反响非常的好, 现在公司里每个人都可以快速的收发邮件了,工作效率有了极大的提升。

 

有一天老板的朋友来参观公司, 看到了这个神奇的系统,也立刻自己的公司部署了一套,包括一个QuickMail服务器和多个客户端,  发现真是好用。

 

Email 系统就这么一传十,十传百的传开了。 


小王所在的MSHP公司仅仅靠出售QuickMail 系统,每年都活的非常滋润。 


但是很快大家就遇到了一个问题: Email 在一个公司内运转的良好, 但是两个公司之之间还是没法发送邮件, 商务合作就不顺畅了。 


小王想:既然我们的QuickMail 客户端和邮件服务器可以通过SMTP来通信 ,那两个邮件服务器之间是否也也可这么通信呢?


小王找到师傅提出了这个问题。 


老周说:当然可以, 比方说吧, 有两个公司, 他们的邮件服务器分别是mailA.com   和 mailB.com  , 当userA@mailA.com 给 userB@mailB.com发信的时候, 我们可以这么处理:


1.  用户userA通过SMTP把邮件发给mailA.com  这个邮件服务器


2.  mailA.com  发现目标用户userB@mailB.com 并不在 自己的服务器上, 它就把信件暂时放到队列里。


3.  mailA.com 从队列中取出邮件, 然后尝试向mailB.com 投递 ,也是通过SMTP, 如果发送失败, 就给userA 发一个投递失败的消息。


4.  mailB.com 接收到以后, 存到userB的邮箱里, userB 就可以通过POP3 协议进行收取了 


这里唯一做的变化就是让邮件服务器可以暂存邮件, 转发邮件。 


于是他们发布了QuickMail 的第2版, 大受欢迎, 很快全世界的邮件服务器都连起来了。 


小王和老周由于设计和实现了电子邮件的系统, 在IT界声名鹊起。

5

创业

时间过得很快,90年代初, 有个叫做蒂姆·伯纳斯·李的家伙发明了WWW 互联网, 之前大家只是通过主机相连, 通过telnet , email, bbs 等交流信息, 没想到html ,http以及浏览器出现以后,互联网能够如此的多彩多姿。 


小王( 不, 这时候已经是老王了)看到了其中的商机: 既然大家都习惯用浏览器上网, 为什么不把Quickmail 也搬到互联网上去呢?  


我可以开发一个基于Web 的邮件系统, 任何想要的人都可以分配一个免费的电子邮件账户 ! 并且在浏览器中使用 !


老王去找老板, 可是老板一直觉得之前的Quickmail 卖的这么好,是公司的主要现金流来源,  搞个免费的Web系统, 那不是革了自己的命吗?  所以一直不支持。 


老王感慨于老板的短视, 于是联合老周出来创业了, 有了之前的系统做基础, 他们很快搞出了一套叫做coolmail 的web系统, 在推广上, 他们创造性的采用了一种叫做“病毒营销”的策略: 


系统刚开始的时候不接受公开注册申请,而是通过自己的员工等首批成功注册的用户对外发出测试邀请。


即每个用户拥有若干个coolmail账号发放的权限,以邀请的形式发给若干个朋友,幸运者加入后各自也将拥有几个邀请资格,发放给更多的朋友。


试想想,全球每天有多少人接收了coolmail邀请,又有多少人在将他的邀请当作礼物一样发放出去,不需要自己费时费力做推广,业务就像病毒曼延一样由用户自动传播开去,每个参与者都在帮自己宣传。


当然coolmail本身产品质量也是非常过硬的。 


coolmail 用户群迅速的爆炸式的增长, 到了1998年, 已经有了几亿的用户, 这引起了想进入互联网的大鳄 microhard 公司的注意, 经过若干轮的谈判, 老王和老周把coolmail 以5亿美金卖了出去,  两人摇身一变成了亿万富豪, 从此就退休了。 


后记

2001年, 我在中科院计算所做本科的毕业实习, 做的就是一个基于Web的Email 系统, 虽然很简陋, 但真的学到很多的东西, 尤其是第一次觉得这些协议和系统没什么神秘的,自己也能实现一套出来,那种成就感是无与伦比的。 


回想起那时候啃RFC英文协议的痛苦, 以及调试SMTP,POP3客户端程序时的挣扎, 真是感慨万千。 


特以此文作为纪念。 


扩展阅读:

给小白的HTTP指南

IE为什么把Chrome和火狐打伤了

我是一个线程

我是一个Java class

Javascript: 一个屌丝的逆袭

CPU 阿甘

Node.js :我只需要一个店小二

假如我是计算机系老师

假如时光倒流,我会这么学Java


0?wx_fmt=jpeg

公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。

内容概要:本文出自罗兰贝格关于工业4.0现状的报告,系统分析了制造业在数字化转型过程中的实际进展与挑战。报告指出,尽管“工业4.0”概念提出已逾十年,但多数企业仍未实现预期的智能化、自组织生产目标,主要受限于技术复杂性、组织孤岛、投资回报周期长及人才短缺等问题。通过对领先制造企业的研究,报告提炼出三大成功要素:一是制定基于现实的工业4.0愿景与全面战略,明确用例优先级;二是建立“中心辐射式”组织架构,设立专职数字化制造部门,推动跨职能协作与规模化落地;三是构建统一的IT/OT目标架构,强化数据生态与系统互操作性。报告特别强调,高价值用例如预测性维护、实时参数优化、视觉检测等已在汽车与半导体行业显现显著成效,企业应聚焦可量化回报的场景,结合资源现实,分阶段推进转型。; 适合人群:制造业企业管理者、数字化转型负责人、工业互联网从业者及政策制定者; 使用场景及目标:①帮助企业评估自身工业4.0成熟度并制定务实发展战略;②为制造企业设计组织架构与IT/OT技术路线图提供参考;③指导资源优先配置于高价值数字化用例,提升投资回报率; 阅读建议:建议结合企业实际生产场景阅读,重点关注“中心辐射式”运营模式与六大高价值用例的适用性分析,同时参考报告中的汽车行业案例,因地制宜地规划数字化路径。
内容概要:本文围绕基于蚁狮优化算法(ALO)在复杂三维动态环境下求解多无人机动态避障路径规划问题展开研究,并提供了完整的Matlab代码实现。该研究旨在解决多无人机系统在存在障碍物和动态变化环境中的高效、安全路径规划挑战,通过引入ALO算法优化飞行轨迹,有效规避障碍并实现路径最优。研究不仅关注算法层面的实现,还涵盖了目标函数设计、约束条件处理、环境建模等关键技术环节,确保路径规划结果兼具可行性与鲁棒性。此外,文档附带丰富的相关科研资源,涵盖路径规划、智能优化算法、机器学习、电力系统等多个领域,为后续拓展研究提供坚实支撑。; 适合人群:具备一定编程基础,熟悉Matlab工具,从事无人机路径规划、智能优化算法或智能系统研究的科研人员及研究生。; 使用场景及目标:①研究复杂三维动态环境下多无人机的协同避障路径规划问题;②掌握蚁狮优化算法(ALO)在路径规划中的应用与实现机制;③为智能交通、无人系统控制、自动化调度等相关课题提供算法参考与代码支持; 阅读建议:建议结合Matlab代码深入理解ALO算法的具体实现流程,重点关注目标函数构建、动态障碍建模与避障策略设计等关键模块,同时可参照文中提及的其他智能优化算法(如PSO、GWO等)进行对比实验,进一步提升算法性能分析与工程应用能力。
代码下载地址: https://pan.quark.cn/s/a4b39357ea24 Git在全球范围内被公认为最为流行的分布式版本控制系统,其在软件开发行业中占据着不可或缺的地位。Git-2.21.0-64-bit 以及 TortoiseGit-2.8.0.0-64bit 是两款专门为Windows操作系统设计的Git相关软件。Git-2.21.0-64-bit 代表了Git的命令行版本,而TortoiseGit则是一个图形化界面工具,它为用户呈现了一种更为直观的操作体验。 Git的主要优势体现在其分布式架构上。每一个通过Git克隆得到的仓库都是一个自给自足的、完整的文件库,其中包含了所有的历史版本记录以及修订追踪详情。因此,即便在缺乏网络连接的环境下,开发者依然能够在本地执行版本控制任务,例如进行提交、切换分支以及合并代码等操作。这种架构设计显著提升了开发效率,特别是在处理大型项目或进行团队协作时更为明显。 Git的分支管理功能是其另一项突出的能力。开发者借助简单的指令即可迅速完成分支的创建、切换和合并,这一特性对于并行开发、试验新功能或解决bug等问题提供了极大的便利。例如,开发者可以开辟一个新分支来实施新功能,在开发完成后将其整合回主分支,而不会对其他团队成员的工作造成干扰。 TortoiseGit是Git的一个补充工具,它将Git的操作指令无缝嵌入到Windows资源管理器中,使得Git的使用体验类似于常规的文件管理操作。TortoiseGit-2.8.0.0-64bit.msi 文件正是这个图形化界面的安装包,它提供了右键菜单的快捷方式,让用户能够更加便捷地进行版本控制活动。与此同时,TortoiseGit-LanguagePack-2.8.0.0...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值