北京 切换校区

全国24小时免费热线

400-009-1906

EMail诞生记

时间:2019-01-07   来源:尚学堂   阅读:115
首页> EMail诞生记

  前言:本文主要介绍EMail的原理和协议,人物,公司,情节纯属虚构,请勿对号入座。

  上个世纪80年代初,小王从计算机系毕业了,进入了很多人梦寐以求的MSHP公司,一入职老板就给小王安排了一个导师:资深的程序员老周。

  为每个新人都安排一个导师,也是公司一直以来的好传统。

  老板要求老周带着小王尽快进入工作状态,为公司设计一个简单的电子邮件系统。

  1、初次见面

  周一的早上,小王见到了师傅老周。

  老周拍了拍小王的肩膀:"小王,听说你大学计算机学的不错,老板交代的可是你工作以来第一项任务,一定要好好干啊"

  "可是我实在不知道电子邮件系统是啥啊?!”,小王面露难色。

  "主要是你不了解背景”老周说,“其实是这样的,我们公司有很多IBM刚出的兼容机,甚至都有服务器了,所以老板想设计开发一个系统,让大家都能够像现实中邮局和信箱一样,通过电脑网络快速的发信,收信。这样工作效率就能提高了”

  小王觉得这很不可思议,简直是天方夜谭,因为这才80年代初,个人电脑才刚刚开始兴起。

  "这可能吗?通过电脑来发信,收信,听起来很不可思议啊。"小王问。

  "不难不难,其实我们的电脑已经能联网了,听说过TCP/IP吧,TCP/IP已经能让两个主机进行通信了,我们只要设计一个基于TCP/IP的系统就行。"

  小王了解过TCP/IP,知道这个东西能够在两个机器之间建立一个可靠的连接,通过这个连接,两个机器可以互相发送数据。

  老周说:"小王你想想,要是你来设计这个电子邮件系统,模拟一下咱们人类的邮局,你会怎么办?"

  小王想了想说:“我们可以在个人电脑上写个程序,存储每个人的信件,就像家门口的真实信箱一样,然后把服务器当成邮局。”

  老周问道:那假设我给你写了信,先发给了服务器(邮局),服务器怎么才能发到你的个人信箱呢?

  小王想说服务器可以连接个人电脑,然后把信发过来啊,但转念一想,服务器不可能主动的去连接个人电脑,因为个人电脑可能处于关机状态,并且ip地址会变化,服务器没法主动去连接。

  "奥,对了,服务器一般很稳定,轻易不关机,也不会变化"小王说,"我们不能把邮箱放到个人电脑上,应该放到服务器上,每个人开辟一块空间"

  "这注意不错,咱们给每个人的空间起个名称吧,叫做用户名@服务器名,例如xiaowang@mshp.com,如何?"

  小王暗暗佩服,不愧是老司机,这个@起的太好了,英文发音"at",意义就是在某某地方,关键是@这个字符比较生僻,很少人会用它做用户名。

  小王说:好,我们可以开发一个程序,就叫做QuickMail吧,我可以用QuickMail来向服务器上的你的邮箱发信,你也可以用他从服务器上收信了。

  老周说:不错,我们还得开发一个服务器端的程序,用来接收收件,存储起来,我们叫他QuickMailServer吧,我们来确定一下邮件里有啥东西吧,还可以和真实的信件类比。

  "那肯定有:发件人,收件人,发件人地址,收件人地址,加个邮件标题吧,还有邮件正文。”小王接着说“奥,不对,在电脑的世界里,发件人和发件人地址,收件认和收件人地址都是相等的,都是xxx@xx.com”

  “所以呢,收件人,发件人,标题,正文,足够了”

  老周说:"电脑世界里,我们可以轻松的把一封信发给多个人,所以收件人可以是个列表"

  俩人讨论的热火朝天,没想到老板已经站在他们身后多时了。

  老板说:“我有些信发给某个人,还想抄送多个中层干部,加个抄送人吧,也要支持列表;另外,有时候我想让某个人例如老周悄悄的看到一封信,而别人不知道这个信被老周看了,所以给我加个密送的功能。”

  小王心想:还是老板厉害,深谋远虑啊。

  老周说:今天先到这里吧,你再复习下TCP/IP,我们未来编程要用到,明天咱们确定下协议的事情。

  第一天,小王和老周确定了电子邮件的格式:发件人,收件人,抄送,密送,标题,正文。

  还得到了这样一个设计:

  2、协议

  周二一大早,小王就迫不及待的找师傅老周问:"师傅,你昨天说到的协议是个啥东西?"

  "恩,协议,简单的说就是双方比如两个电脑之间进行沟通的一种约定。"

  举个例子吧,你是PC机(Client),我是服务器(Server),我们之间可以这么约定:

  Client:服务器你好

  Server:你好

  Client:现在几点了?

  Server:北京时间下午3点40分56秒

  Client:再见

  Server:再见

  这就是一种协议,假设你说了一句协议之外的话,例如:

  Client:今天天气如何?

  那我就不能识别了,因为不在协议(约定)中。

  小王说:"我明白了,我来设计一个发送邮件的协议吧。"

  两个小时后,小王拿出了初稿:

  "不错,考虑的挺仔细,首先考虑到了端口问题,这是TCP要求的其次发数据那块儿,我还以为你想不到用什么作为发送数据的结尾呢。“老周说

  ”不过有个小问题,数据在网络上传输,中文是不行的,需要进行编码,把他们变成ASCII码,也就是ABCDEFabcd1234这些字符“

  小王说:"那该怎么办?"

  "我听说过一个叫做Base64的东西,可以把二进制的数据变成小写字母a-z、大写字母A-Z、数字0-9、符号'+'、'/'、'='等字符组成的数据“老周说

  “这是加密吗?”小王问。

  “不是加密,加密一般是用个密钥把一段明文变成密文,没有密钥你是没法把密文还原成明文的,这个Base64只是一种编码而已,规则是已知的,你可以轻松的把编码过的东西还原。”

  老周拿那封信的正文举了个例子,“为了庆祝产品发布,今晚在海底捞聚餐”经过base64编码就会变成这个样子:

  5Li65LqG5bqG56Wd5Lqn5ZOB5Y+R5biD77yMIOS7iuaZmuWcqOa1t+W6leaNnuiBmumkkA==

  这完全是ASCII码了。

  (注:网上有很多在线的Base64编码,解码网站,大家可以试验一下)

  老周说:要不我们把收信的协议也趁热打铁的设计出来吧。

  小王说:“好的”

  两个小时后。。。

  老周说:"看来你考虑了用户登录的问题,这个很重要,自己的邮箱应该是私密的,别人不能访问"

  “那我们发信的时候是不是也要做用户登录啊,如果不是我们系统的用户,就不能发信。”

  "应该加上,如果没有控制,还可能会出现乱发邮件而无法追踪的问题"

  小王说:“好的,我完善下,对了师傅,咱们能不能给这个协议起个名字啊?”

  老周说:“发信就叫"SimpleMailTransferProtocol"简称SMTP,收信叫做PostOfficeProtocol,简称POP吧。”

  小王又问:“我想起了个问题,发信的时候能不能在正文里加上图片,文件这些东西,这样用起来就更方便了。”

  老周:“看来你已经站在用户的角度来思考了,确实需要加上,不过我们明天再来设计吧”

  (注:为了简化起见,此次设计的协议和真实的SMTP和POP3不完全一致,请大家以标准协议为准)

  (未完待续,下次预告:让邮件支持附件,多个邮件服务器,Webmail的创业故事)

相关资讯

  • 北京校区
  • 山西校区
  • 郑州校区
  • 武汉校区
  • 四川校区
  • 长沙校区
  • 深圳校区
  • 上海校区
  • 广州校区
  • 保定招生办

北京海淀区校区(总部):北京市海淀区西三旗街道建材城西路中腾建华商务大厦东侧二层尚学堂
北京京南校区:北京亦庄经济开发区科创十四街6号院1号楼 赛蒂国际工业园
咨询电话:400-009-1906 / 010-56233821
面授课程: JavaEE培训大数据就业班培训大数据云计算周末班培训零基础大数据连读班培训大数据云计算高手班培训人工智能周末班培训人工智能+Python全栈培训H5+PHP全栈工程师培训

山西学区地址:山西省晋中市榆次区大学城大学生活广场万科商业A1座702

郑州学区地址:河南电子商务产业园6号楼4层407
咨询电话:0371-55177956

武汉学区地址:湖北省武汉市江夏区江夏大道26号 宏信悦谷创业园4楼
咨询电话:027-87989193

四川学区地址:成都市高新区锦晖西一街99号布鲁明顿大厦2栋1003室
咨询电话:028-65176856 / 13880900114

网址:http://www.cssxt.com/
咨询电话:0731-83072091

深圳校区地址:深圳市宝安区航城街道航城大道航城创新创业园A4栋210(固戍地铁站C出口)
咨询电话:0755-23061965 / 18898413781

上海尚学堂松江校区地址:上海市松江区荣乐东路2369弄45号绿地伯顿大厦2层
咨询电话:021-67690939

广州校区地址:广州市天河区元岗横路31号慧通产业广场B区B1栋6楼尚学堂(地铁3号线或6号线到“天河客运站”D出口,右拐直走约800米)
咨询电话:020-2989 6995

保定招生办公室

地址:河北省保定市竞秀区朝阳南大街777号鸿悦国际1101室

电话:15132423123

Copyright 2006-2019 北京尚学堂科技有限公司  京ICP备13018289号-19  京公网安备11010802015183  
媒体联系:18610174079 闫老师  

Java基础班,免费试学三周