因特网电子邮箱系统主要由用户代理(user agent) 、邮件服务器(mail server) 和简单邮件传输协议(SMTP)组成
 
邮件服务器(Mail Server)
邮箱:存储发给该用户的Email
报文队列(message queue):存储等待发送的Email,如果几天后仍不能成功,服务器就删除该报文并以电子邮件的形式通知发送方
 
SMTP用于从发送方的邮件服务器发送报文到接收方的邮件服务器。
使用TCP进行email消息的可靠传输
每台邮件服务器上既运行SMTP的客户端也运行SMTP的服务器端
Email消息只能包含7位ASCII码,如果某报文包含了非7比特ASCII字符或二进制数据,则该报文必须按照7比特ASCII 码进行编码,传输后解码还原。
传输过程分握手、消息的传输、关闭三个阶段:
S:  hamburger.edu
C: HELO crepes.fr
S: Hello crepes.fr, pleased to meet you
C: MAIL FROM: <alice@crepes.fr>
S: alice@crepes.fr... Sender ok
C: RCPT TO: <bob@hamburger.edu>
S: bob@hamburger.edu... Recipient ok
C: DATA
S: Enter mail, end with "." on a line by itself
C: Do you like ketchup?
C: How about pickles?
C: .
S: Message accepted for delivery
C: QUIT
S: hamburger.educlosing connection
报文体前面通常有一个包含环境信息的首部位, 其必须含有一个From: 首部行、一个To: 首部行,可以包含一个Subject : 首部行以及其他可选的首部行。(首部行是邮件报文自身的一部分)
必须含有一个From: 首部行和一个To: 首部行;一个首部也许包含一个Subject : 首部行以及其他可选的首部行。
SMTP用的是持久性连接:如果发送邮件服务器有几个报文发往同一个接收邮件服务器,它可以通过同一个TCP 连接发送这些所有的报文。对每个报文,该客户用一个新的MAIL FROM:XXXX 开始,用一个CRLF.CRLF指示该邮件的结束,并且仅当所有邮件发送完后才发送QUIT 。
 
与HTTP对比:
HTTP主要是一个拉协议(pullprotocol);SMTP主要是一个推协议(pushprotocol)
都使用命令/响应交互模式,命令和状态代码都是ASCII码
HTTP 把每个对象封装到它自己的HTTP 响应报文中;SMTP 则把所有报文对象放在一个报文之中。
 
STMP协议的扩展协议:MIME协议
MIME协议定义了5种头部,用来加在原始的STMP头部,以便定义参数的转换。
例如:
From: alice@crepes.fr
To: bob@hamburger.edu
Subject: Picture of yummy crepe.
MIME-Version: 1.0 //MIME版本
Content-Transfer-Encoding: base64 //数据编码方式
Content-Type: image/jpeg //多媒体数据的类型、子类型以及参数声明 base64 encoded data ….. //编码后的数据
.........................
......base64 encoded data

邮件访问协议:用于从服务器获取邮件

  • 第三版的邮局协议(Post Office Protocol-Version 3, POP3)
当用户代理(客户)打开了一个到邮件服务器(服务器)端口110上的TCP 连接后, POP3 就开始工作了。
随着建立TCP连接, POP3 按照三个阶段进行工作:特许(authorization) 、事务处理以及更新。
分为下载并删除和下载并保持两种模式。
POP3是无状态的:POP3 服务器并不在POP3 会话过程中携带状态信息
S: +OK POP3 server ready
C: user bob
S: +OK
C: pass hungry
S: +OK user successfully logged on
C: list
S:
S:
S: .
C: retr
S: <message contents>
S: .
C: dele
C: retr
S: <message contents>
S: .
C: dele
C: quit
S: +OK POP3 server signing off
特许阶段,用户代理发送(以明文形式)用户名和口令以鉴别用户。
两个主要的命令: user < user name >和pass < password > ,服务器回答+OK或-ERR
事务处理阶段,用户代理取回报文、对报文做删除标记、取消报文删除标记、获取邮件的统计信息。
用户代理仅使用四个命令: list(列出消息数量)、retr(用编号获取消息)、dele和quit,在处理quit命令后, POP3服务器进入更新阶段,结束该POP3 会话。该邮件服务器删除那些被标记为删除的报文。
  • 因特网邮件访问协议(IMAP)
所有消息统一保存在服务器
把每个报文与一个文件夹联系起来,当报文第一次到达服务器时,它与收件人的INBOX 文件夹相关联。收件人则能够把邮件移到一个新的、用户创建的文件夹(阅读邮件,删除邮件等)中。
为用户提供了创建文件夹、将邮件从一个文件夹移动到另一个文件夹、在远程文件夹中查询邮件的命令
维护了IMAP会话的用户状态信息,例如文件夹的名字以及哪些报文与哪些文件夹相关联。
具有允许用户代理获取报文组件的命令。一个用户代理可以只读取一个报文的报文首部,或只是一个多部分MIME 报文的一部分。
  • 基于Web的电子邮件
用户代理就是普通的浏览器
邮件服务器在与其他的邮件服务器之间发送和接收邮件时,仍然使用的是SMTP协议

计算机网络-应用层(3)Email应用的更多相关文章

  1. 应用层之E-mail服务及javaMail邮件发送的知识总结

    关于Email服务你需要知道的知识点: 概述: 今天来介绍一下应用层的电子邮件服务,我们每天几乎都在用,电子邮件(email)服务也是一种基于C/S模式的服务,它采用的是一种"存储-转发&q ...

  2. 计算机网络-应用层(5)P2P应用

    P2P系统的索引:信息到节点位置(IP地址+端口号)的映射 在文件共享(如电驴中):利用索引动态跟踪节点所共享的文件的位置.节点需要告诉索引它拥有哪些文件.节点搜索索引从而获知能够得到哪些文件 在即时 ...

  3. 计算机网络-应用层之HTTP协议

    1.概念 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写:HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等). ...

  4. [计算机网络-应用层] HTTP协议

    1.HTTP概况 Web的应用层协议是超文本传输协议(HTTP),它是Web的核心. HTTP由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同的端系统中,通过交换HTTP报文进行对话. ...

  5. 计算机网络-应用层(4)DNS协议

    域名系统(Domain Name System, DNS):一个分层的由DNS服务器实现的分布式数据库+一个使得主机能够查询分布式数据库的应用层协议 DNS服务器通常是运行BIND (Berkeley ...

  6. 计算机网络应用层之cookie

    一.生活中的cookie 无论你知不知道Cookie是什么,在你的生活中,肯定有使用过它.还记得你使用浏览器浏览网页时,当你要登陆时,网页上有一个记住密码或自动登陆的选项,当你选择时,你就使用了Coo ...

  7. [计算机网络-应用层] DNS:因特网的目录服务

    我们知道有两种方式可以识别主机:通过主机名或者IP地址.人们喜欢便于记忆的主机名标识,而路由器则喜欢定长的.有着层次结构的IP地址.为了折中这些不同的偏好,我们需要一种能进行主机名到IP地址转换的目录 ...

  8. [计算机网络-应用层] FTP协议

    文件传输协议:FTP 如下图所示:用户通过一个FTP用户代理与FTP交互.该用户首先提供远程主机的主机名,使本地主机的FTP客户机进程建立一个到远程主机FTP服务器进程的TCP连接.然后,该用户提供用 ...

  9. [计算机网络-应用层] P2P应用

    首先我们要先来区分一下下面的几种体系结构: CS:Client/Server 客户-服务器结构BS:Browser/Server  浏览器-服务器结构 P2P:Peer to Peer 对等结构 BS ...

随机推荐

  1. UDP 绑定信息

    """ 建立->绑定本地ip地址和端口号->接收数据->转码输出->关闭客户端 """ from socket im ...

  2. PHP max() 函数

    实例 通过 max() 函数查找最大值: <?phpecho(max(2,4,6,8,10) . "<br>");echo(max(22,14,68,18,15) ...

  3. PHP tanh() 函数

    实例 返回不同数的双曲正切: <?php高佣联盟 www.cgewang.comecho(tanh(M_PI_4) . "<br>");echo(tanh(0.5 ...

  4. json&pickle&shelve

    之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval就不管用了 ...

  5. Python最全pdf学习书籍资料分享

    本人学习Python两年时间,期间统计了一些比较好的学习资料 1.基础资料  下载地址: 链接:https://pan.baidu.com/s/1sjtyYayBbQLsrUdaXWmzkg提取码:1 ...

  6. QString字符串的查找与截取实例

    QString是Qt中封装的字符串类,相对于标准库里的string,使用方法有些不同,个人感觉使用qt习惯后,感觉QString更好用,下面的代码主要是针对QString的字符查找.截取做的测试: # ...

  7. Qt信号参数中使用QVariantList时编译问题

    今天调试代码时遇到一个奇怪的问题,不过一般感觉比较奇怪的问题,最后查到原因时,原因都比较简单! 编译问题 先来看一下qt的编译错误,提示一堆错误: In file included from D:\Q ...

  8. CI4框架应用四 - 第一个页面

    我们来看一下CI4框架的默认页面是如何实现的. 我们先来认识一下路由文件(app\Config\Routes.php),这个文件非常重要,且功能强大,它定义了URL模式及响应处理方法,我们先看一下这个 ...

  9. vue-cookies 使用

    import VueCookies from 'vue-cookies' Vue.use(VueCookies) $cookies.config() 设置默认值 $cookies.config(exp ...

  10. java_Scanner类、Random类、ArrayList 类的使用

    Scanner类 一个可以解析基本类型和字符串的简单文本扫描器. 例如,以下代码使用户能够从 System.in 中读取一个数: Scanner in=new Scanner(System.in); ...