§2.3应用层协议之你的邮件是如何传递的?

随着网络的普及,邮件对于几乎已经成为了不可或缺的联系方式。但是你的邮件在网络世界中是如何发出去的呢?邮件经历了哪些过程?

下面从发一封电子邮件的过程进行谈论:

在这里插入图片描述
图片来自网络

  • 首先现代人也并不是人人懂代码,使用命令发邮件肯定是不切合实际的。目前大部分人发邮件都是通过各种各样的邮件客户端。如微软的outlook,foxmail等。这些客户端具有GUI(图形化界面),使用起来比较亲民。这些软件被称作用户代理(User Agent)。它通过图形化界面帮助用户进行日常的邮件撰写、显示、处理(对邮件进行收发、阅后的打印或者删除等操作)、通信(使用邮件发送协议将用户撰写完成的邮件发送至用户使用的邮件服务器)。

  • 使用了用户代理进行邮件编辑之后,就要就是要发出邮件。发送邮件一般都是使用专门的服务器进行发生,而不是客户自己亲自发送。在客户编辑完成之后,客户准备发送出去的邮件通过SMTP(Simple
    Mail Transfer Protocol)协议被送往邮件发送服务器。此时用户被视为SMTP客户,用户的邮件服务器被视为SMTP服务器。

  • 在邮件服务器收到了用户的邮件时,这个时候邮件服务器将该邮件放置在本服务器的发送报文队列里。等到邮件发送队列里的邮件排到了这一封邮件时,邮件服务器调用SMTP协议进行发送至目标的邮件服务器。这里有要注意的一点,**邮件服务器之间是一个所谓的端到端的连接(end to end),即你发送邮件,邮件会被之间送到目标邮件服务器。不会像域名解析系统那样,有一级一级的域名服务器。**如果发送邮件的时候出现了问题,比如说对面的服务器不在线等情况,邮件服务器会稍等一段时间之后再次进行发送尝试,多次失败之后,邮件服务器就会去告知用户代理,邮件发送失败。

  • 对面的邮件服务器收到了邮件之后,就会将邮件放入收件人的邮箱(收件人在邮件服务器里的账号),这样收件人就多了一封未读邮件,等到收件人准备读取邮件的时候,收件人会在本机的用户代理中,选择收取邮件,这个时候会运行POP3或者IMAP协议。将邮件服务器中自己的邮件拉至本地。用户就可以进行阅读了。

下面进行几点说明:

邮件的格式:

邮箱名@邮箱所在主机的域名。
这里的邮箱就是用户在邮件服务器中的账号。为了杜绝网络世界出现同名邮箱的情况,邮件服务器都会保证本地的用户名(或者说的邮箱名)在本域中唯一。如果出现重名情况就会提示重名。常见的域如@qq.com,@163.com等。qq.com一开始使用的是qq号作为邮箱名,保证了邮箱名的唯一。其他的邮箱在出现同名情况会进行提示。
信息的格式:
电子邮件分为信封和内容两个部分。用户首先会填写邮件的首部(如收件人,抄送等),之后邮件系统将其封入信封,用户在邮件主体编写内容,之后封入邮件内容。

SMTP协议:

SMTP协议复制两个通信的SMTP进程之间的信息交互,这里呢,因为是进程之间的交互,进程之间的交互就少不了端口号。**SMTP的端口号一般情况下为25。 SMTP使用命令和响应的工作模式。**即SMTP客户端发送命令,SMTP服务器端进行响应。SMTP里规定了14条命令和21种响应。

SMTP命令都是几个简单的字母,SMTP响应则是一个3位的数字代码,后面可以附上或者不附上文字说明。

SMTP发送邮件的3个阶段:

建立连接阶段:
首先是SMTP服务器(在连接中是SMTP客户)对本邮件服务器中的缓存进行扫描,查看是否有未发生的邮件,如果有,则将使用25号端口域接收方的SMTP服务器进行建立一个连接。建立了连接之后,首先由接收方的SMTP服务器(即SMTP服务器端)进行响应。SMTP服务器端首先发送响应:220 Service ready。

接着发送方的SMTP服务器发送HELO命令(或者是EHLO命令),附上自己的域名地址标志自己。HELO命令是不加密的,用户名和密码使用明文的方式发送,EHLO命令是加密的,用户名和密码使用密文的方式发送。

在接收方的SMTP服务器收到了HELO或者EHLO之后,SMTP服务器查看自己是否有能力进行接收邮件,有则反馈响应:250(后面可以加说明或者不加)。若本身SMTP服务器不可用,则返回421.

传输邮件阶段:

连接建立了之后就可以进行邮件的发送了,下面是邮件发送的几个阶段

1、SMTP客户端首先会介绍一下邮件的发送者。这一步是十分重要的,邮件发送成功了的话,接收方知道谁给自己发的邮件;邮件发送不成功,也方便给邮件发发送者进行信息的反馈。 具体信息包括发送方的用户名和域名。命令如:mail from : 123@123.com

2、在SMTP服务器端收到了mail from命令之后,服务器端查看自己是否能够接收邮件,能够接收的话,一般返回响应250。不能接收的话会返回相应的代码,如451(出错),452(本地没空间了),500(未知命令)等

3、SMTP客户端收到了服务器端的响应,如果响应为250则开始发送RCPT命令。这个命令是决定收件人的。RCPT命令后接收件人地址,主要作用是告知服务器收件人的地址,以及确定对方是否能进行邮件的接收。这一步为什么放着RCPT呢?因为放在MAIL FROM的话,最多只能确定服务器是否准备好,放在这一步,能确定服务器准备好的前提下,确定是否有收件人。万一发了一封巨长的邮件,结果对方的域里没这个人,岂不是白白浪费了网络资源。

4、在服务器端收到了RCPT命令后,服务器开始查看服务运行是否正常,有没有目标用户。正常的话,返回250.如果说没有用户,返回550.

5、在客户端收到了250响应之后,开始使用DATA命令,意味着即将进行邮件内容的传输。

6、服务器端收到了DATA命令后,接收数据并响应354代码。一般为"354 Start mail input: end with ."意思就是,如果客户端发送完毕,请回复回车 点 回车。我便知道了,报文发送完毕。但是真正在显示的时候仅仅显示一个点。

7、邮件收到了之后,没什么问题,服务器端再返回一个250.则整个邮件发送完毕。

释放连接阶段:
在邮件发送完毕之后,SMTP客户端发送QUIT命令,服务器端返回221代码。客户端的意思是可以进行关闭服务器了,服务器端则表示同意释放连接。则邮件传送的全过程结束。

注意点:在发送邮件的过程中有几个要注意的地方,**这个过程一般情况下仅仅是SMTP客户端和SMTP服务器端之间的交互。**这句话有两层意思:1、这个过程仅仅是服务器端和客户端之间的交互,由用户代理屏蔽,对用户透明。2、仅仅是确保了新建完整到达了服务器端,客户并不一定收到,如有时候用QQ邮箱发邮件会乱码,可能是本地的兼容性错误,最坏的情况下,服务器端接收完数据,然后崩了,客户没来得及读邮件,邮件就没有了。
那么为什么服务器端和客户端不直接设置在收发邮件的双方的主机呢?首先服务器端肯定是不行的,客户机一方面不够稳定,另一方面不可能实时在线,有时候好几天不开机,导致错过了邮件。如果像DHCP那样一直开着,也会占用部分资源,显然是不值得的。 客户端直接设置在客户机上面是有先例的,张小龙开发的foxmail提供了“特快专递”服务。这个服务器将会直接由客户机发送邮件,省去了在SMTP服务器里排队的时延。
命令和响应的对话过程:
S:220 xxx.com smtp ready
C:HELO 123.com
S:250 hi,123.com
C:MAIL FROM:123@123.com
S:250 OK
C:RCPT TO :789@123.com
S:250 OK
C:DATA
S: 354 Start mail input: end with .
C:FROM 123@123.COM
C:to 456@123.com
C:MIME-Versinon:1.0
C:Messgae-id:
C:content-type:xxx/xxxx
C:Subject:ni hao
C:hello world
C:.
S:250 OK message accepted
C:QUIT
S:221 closing connection

邮件读取协议

在通过SMTP协议,将邮件顺利的发送至了接收服务器之后,就是用户需要读取邮件的操作了。这里一般使用两个协议,POP3(POP协议的第三版)和IMAP
POP3(Post office Protocal 3):
在使用POP3的时候,客户机通过运行用户代理中的POP3客户程序,收件服务器则运行POP3服务器程序。然后就是开始输入用户名和密码,进而去读取服务器中的邮箱的邮件。POP3的特点是,阅后即毁。邮件在被阅读以后,一般就会进行删除,客户只有看一次的机会,后来POP3进行了扩展,在阅读了邮件之后,会在邮件服务器中为客户保留一段时间的邮件。另一个特点是,POP3习惯于本地操作——即POP3运行之后,是去邮件服务器将邮件下载至本地,用户就可以查看邮件了。如果邮件多,那可能就要慢慢的接收了。

IMAP(Internet Mail Access Protocal):这个协议一般使用第四版,我也不知道为啥大家不写IMAP4,可能是习惯吧。IMAP相对于POP3就变得复杂了。IMAP的第一点就是它功能不仅仅是去下载邮件,而是去控制邮件服务器中用户的邮箱。使用这个协议的时候,用户会登录进邮件服务器,之后用户能看到邮件列表(能看到邮件首部),如果用户对某个邮件感兴趣,则打开该邮件,进而会下载该邮件。即大部分操作,在客户端和邮箱是同步的。
第二个特点是由第一个特点延申得到的,如果网络不佳,或者在使用按流量计费的网络,则可以进行部分下载。附件太大可以先下载正文。这一点是POP3做不到的。
第三点是一个麻烦的地方,因为IMAP保持了客户端和服务器端的同步,进而如果断网了,突然觉得某个邮件比较重要,想下载下来,那是做不到的,想查阅未下载的邮件,必须先上网。POP3则是都给您下载好了。
第四点则是相对于POP3来说,用户不发出删除指令,服务器为用户永久保存邮件。这一点又好又不好。好是因为邮件不删就能找到所有的历史记录。不好就是邮箱的空间是有限的。有时候往往想不起来删邮件。

基于万维网的邮件

所谓基于万维网的协议,实质上是由浏览器取代了客户端,通过访问特定的网站,该网站作为用户代理,就不需要再安装客户端了。大大的方便了移动办公。

MIME

在之前使用的SMTP协议时,SMTP有一些缺点:
1、它仅仅支持ASCⅡ码,其他的类型不支持
2、仅仅能传送7位ASCⅡ码,对于传输中文来说,可能有些麻烦
3、邮件过长会被拒绝
4、部分实现没按照互联网标准。
在合格背景下,MIME出现了,它是对SMTP的补充,并不改变SMTP原本的格式。
其增加了5个邮件首部:
MIME-Versinon:标识版本号
Content-Description:标识邮件主机是多媒体文件还是字符串
Content-id:在多报文的环境中唯一地标识报文
Content-Transfer-Encoding:标识了邮件主体如何编码的。这里引入了不同的编码格式,进而允许了发送多种格式的文件。
Content-Type:标识了内容类型和子类型。所谓内容类型,就是你发的是什么,比较发送文本,图像,视频等。子类型就是你发的是文本中的哪一类,比如txt,html等。图像:jpg,psd等。

Content-Transfer-Encoding:
这里介绍3中编码方式:
对于7位ASCⅡ码。不做任何改变
quoted-printable:对于可以打印出来的ASCⅡ码不进行改变,等号作为例外。对于等号、不可打印的ASCⅡ码、非ASCⅡ码数据。则将每个字的二进制码先用两个十六进制表示,之后在每两个字母前加个等号。如等号是00111101—>3D---->=3D
base64:把内容的二进制码,每24位进行一个划分,24位为一个单元。每个单元分为4组,每组6位。2的6次幂为64.即为0-63.先从大写的A排序,大写拍完之后排小写,小写排完之后接10个数字,最后用+、/分别表示62,63.再用==和=分别表示最后一直代码只有8位或者6位。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值