zoukankan      html  css  js  c++  java
  • [计算机网络-应用层] 因特网中的电子邮件

    下图是因特网电子邮件系统的总体情况,从该图中我们可以看出它有3个重要组成部分:用户代理(user agent)、邮件服务器(mail server)和简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)

    用户代理允许用户阅读、回复、转发、保存和撰写报文。

    邮件服务器组成了电子邮件体系结构的核心。每个接收方在其中的某个服务器上有一个邮箱邮箱包含用户的到达报文、离开(将发送)邮件报文的报文队列;在发送电子邮件报文的邮件服务器之间采用SMTP协议。

    SMTP是因特网电子邮件中主要的应用层协议。它使用TCP可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件。

    SMTP

    ·使用TCP从客户机到服务器可靠地传输电子邮件报文,用端口25
    ·直接传输:发送服务器到接收服务器。
    ·传输的三个阶段:握手 (欢迎)、报文的传输、关闭。
    ·命令/响应交互
      命令: ASCII文本
      响应: 状态码和短语
    ·报文必须以7比特ASCII格式

    为了描述SMTP的基本操作,下面来模拟一下Alice给Bob发送一封简单的ASCII报文的过程:

    1) Alice使用UA写作报文并向 bob@someschool.edu 发送
    2) Alice的UA向其邮件服务器发送报文;报文放置在报文队列中
    3) SMTP的客户机侧打开与Bob的邮件服务器的TCP连接
    4) SMTP通过TCP连接发送Alice的报文
    5) Bob的邮件服务器将该报文放入Bob的邮箱
    6) Bob调用其用户代理来读报文

    大家可使用Telnet与SMTP服务器进行直接对话,使用的命令是 telnet serverName 25

    我曾编写过一个C++程序来通过telnet模拟了一次SMTP回话过程:http://www.cnblogs.com/lca1826/p/6562016.html

    下面来看一下SMTP与HTTP的对比:

    HTTP: 拉协议
    SMTP: 推协议

    HTTP: 每个对象封装在其自己的响应报文中
    SMTP: 所有报文对象放在一个报文中

    SMTP要求全部7位ASCII码格式传输,HTTP无此要求

    两者都有ASCII 命令/响应交互,状态码

    邮件报文格式

    一个典型的报文首部如下:

    From: alice@crepes.fr
    To: bob@hamburger.edu
    Subject: Searching for the meaning of life.
    

    在报文首部之后,紧接着是一个空白行,然后是以ASCII格式表示的报文主体。

    MIME:

      由于在RFC 822中描述的报文首部只适合于发送普通ASCII文本,不能充分满足多媒体报文(如带有图片、音频和视频的报文)或携带有非ASCII文本格式(例如,非英语语言所使用的字符)的报文的需求。为发送非ASCII文本的内容,发送方的用户代理必须在报文使用附加的首部行。这些额外的首部行定义在RFC 2045和RFC 2046中,多用途因特网邮件扩展(MIME)是对RFC 822的扩展。

    支持多媒体的两个关键MIME首部是Content-Type:Content-Transfer-Encoding:

    Content-Type:首部行允许接收用户代理对报文采取适当的动作。

    Content-Transfer-Encoding:首部行提示接收用户代理该报文主体已经使用了ASCII编码,并指出了所用的编码类型。

    接收服务器一旦接收到具有RFC 822和MIME首部行的报文,就在该报文的顶部添加一个Received:首部行;该首部行定义了发送该报文的SMTP服务器的名称(from),接收该报文的SMTP服务器的名称(by),以及接收服务器接收到的时间。

    有时一个邮件有多个Receive:行,这是因为有的邮件在发送方和接收方之间的路径要经过不止一个SMTP服务器转发。

    邮件访问协议

      在上述分析中,有一个疏漏的环节,那就是在Alice向Bob发送邮件的过程中,Bob是如何通过运行在他本地PC上的用户代理,获得位于某ISP的邮件服务器上的他的邮件呢?注意到Bob的用户代理不能使用SMTP来取回邮件,因为取邮件时一个拉操作,而SMTP是一个推协议。因此我们要引入邮件访问协议。

    SMTP: 交付/存储到接收方服务器

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

    ·POP3:第三版邮局协议 [RFC 1939]
    ·IMAP:互联网邮件访问协议 [RFC 1730]
    ·HTTP:Hotmail , Yahoo! Mail等

    下面来主要介绍一下POP、POP3和IMAP的定义和区别:

    POP3
      POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。

    POP与POP3
      POP协议支持“离线”邮件存储转发处理:客户端程序连接服务器,下载所有未阅读的电子邮件;一旦将邮件从邮件服务器端送到客户端上,邮件服务器上的邮件将会被删除。目前的POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP协议。
      POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。

    IMAP
      IMAP全称是Internet Mail Access Protocol,即互联网邮件访问协议,是一个应用层协议(端口是143)。用来从本地邮件客户端(Outlook Express、Foxmail、Mozilla Thunderbird等)访问远程服务器上的邮件。

    IMAP和POP3的区别
      IMAP像POP3那样提供了方便的邮件下载服务,让用户能进行离线阅读。IMAP和POP3是邮件访问最为普遍的Internet标准协议。不同的是:
    (1)IMAP提供Webmail与电子邮件客户端之间的双向通信,客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上(如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的)。而POP3在客户端的操作不会反馈到服务器上。
    (2)IMAP更好地支持了从多个不同设备中随时访问新邮件。
    (3)IMAP提供的摘要浏览功能可以让你在阅读完所有的邮件到达时间、主题、发件人、大小等信息后才作出是否下载的决定。
    (4)POP3需要下载未阅读的邮件,IMAP可以不用把所有的邮件全部下载,而是通过客户端直接对服务器上的邮件进行操作。所有通过IMAP传输的数据都会被加密,从而保证通信的安全性。
    (5)IMAP 整体上为用户带来更为便捷和可靠的体验。POP3 更易丢失邮件或多次下载相同的邮件。

  • 相关阅读:
    Java基础——Java反射机制
    Java基础——Java常用类
    Java基础——多线程
    Java基础——IO流--转换流、标准输入输出流
    Java基础——IO流
    Java基础——枚举与注解
    Java基础——泛型
    codeforces B. Bear and Strings 解题报告
    codeforces A. Black-and-White Cube 解题报告
    codeforces B. Ping-Pong (Easy Version) 解题报告
  • 原文地址:https://www.cnblogs.com/lca1826/p/6561529.html
Copyright © 2011-2022 走看看