这篇文章上次修改于 378 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

计算机网络笔记3——电子邮件

电子邮件

对于电子邮件的发送,我们模拟一个用户A向用户B发送的情况。

其中有个用户代理的概念,我们此处可以将用户代理当做 邮件客户端例如qq邮箱,outlook等

我们引入的角色有用户A,用户B,代理用户A,代理用户B,邮箱服务器A,邮箱服务器B。其中邮箱服务器A管理A的邮件,邮箱服务器B管理B的邮件

  • 用户A先使用代理用户A,完成内容和目标邮箱
  • 代理用户A把A的邮件和目标交给邮箱服务器A(SMTP)
  • 邮箱服务器A把邮件发往邮箱服务器B(SMTP)
  • 代理用户B从邮箱服务器B中获取邮件(POP3/IMAP/HTTP)

SMTP并不经过中间邮件服务器,这个TCP连接会直接连接两方服务器。

其中,如果服务器B是关闭的,服务器A中将会有一个队列,一旦服务器A到B的发送失败,就会进入队列等待下一轮发送。

至于为什么用户A要使用SMTP而不直接给B,是因为我们不能确保用户A能直接访问到用户B。

客户端:  HELO mail.example.com
服务器:  250 Hello mail.example.com
客户端:  MAIL FROM:<sender@example.com>
服务器:  250 OK
客户端:  RCPT TO:<receiver@example.com>
服务器:  250 OK
客户端:  DATA
服务器:  354 Start mail input; end with <CRLF>.<CRLF>
客户端:  Subject: Test email
         This is a test email.
         .
服务器:  250 OK: queued as 12345
客户端:  QUIT
服务器:  221 Bye

CR代表回车 LF代表换行。

SMTP命令

SMTP协议由一系列命令和响应构成,常见的SMTP命令包括:

  • HELO:标识发送方服务器,开始会话。
  • MAIL FROM:指定邮件发送者地址。
  • RCPT TO:指定邮件接收者地址。
  • DATA:表示开始传输邮件内容。
  • QUIT:终止会话。

SMTP与HTTP

  • SMTP是推协议,HTTP是拉协议
  • SMTP要求是ASCII,HTTP无限制
  • SMTP将所有媒体对象放在单一文件,HTTP每个媒体对象会分别通过独立的HTTP请求来获取

邮件报文格式

邮件报文格式不同于SMTP命令

如同HTTP协议

每个首部必须有一个From:和 To: 首部行 例如

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

POP3/IMAP/HTTP

对于用户B要从邮箱服务器B中获取邮件,就不能使用推协议SMTP,需要使用拉协议,例如IMAP, POP3,HTTP

POP3

由RFC 1939进行定义

先在端口110进行TCP连接,经过“authorization”, “transaction”,“update” 三个阶段,分别是授权,事务,更新。

授权阶段

  • 客户端发送USER <username>命令,服务器响应+OK表示用户名有效。
  • 客户端发送PASS <password>命令,服务器响应+OK表示身份验证成功。

事务阶段

状态查询

  • STAT:获取邮件数量和总大小。
  • LIST:获取每封邮件的编号和大小。

邮件操作

  • RETR <msg-number>:下载指定编号的邮件。
  • DELE <msg-number>:标记指定编号的邮件为删除状态。
  • NOOP:空操作,用于保持连接。
  • RSET:重置所有已标记为删除的邮件。

更新阶段

  • 客户端发送QUIT命令。服务器响应+OK,并删除所有标记为删除的邮件。

内容示例:

客户端: telnet mailserver 110
服务器: +OK Welcome to mail server
客户端: USER alice
服务器: +OK
客户端: PASS secret
服务器: +OK

客户端: STAT
服务器: +OK 2 320
客户端: LIST
服务器:
+OK 2 messages
1 120
2 200
.
客户端: RETR 1
服务器:
+OK 120 octets
邮件内容
.
客户端: DELE 1
服务器: +OK

客户端: QUIT
服务器: +OK Goodbye

缺陷:如果有两个设备使用POP3访问一个邮箱,在设备1删除了某个邮件后,设备2就无法下载访问了。

IMAP

允许用户在多个设备上同步和管理电子邮件。与POP3不同,IMAP支持更丰富的功能和更复杂的邮件管理操作。IMAP通常在TCP端口143上运行,使用SSL加密的IMAPS通常在TCP端口993上运行。

主要是文件夹管理,IMAP可以把报文和文件夹联系起来,管理者可以移动邮件到不同的文件夹,并且还可以创建删除,查找等。

IMAP的另一个重要特性是它具有允许用户代理获取报文某些部分的命令,只获取邮件中的部分内容,降低了宽带需求。

IMAP的操作过程也可以分为多个阶段:连接阶段选择阶段操作阶段断开阶段

  1. 连接阶段(Connection State)

客户端与服务器建立TCP连接,并进行初始的握手和身份验证。这是IMAP会话的初始阶段。

  • 连接建立:客户端与服务器建立TCP连接。
  • 身份验证:客户端通过发送用户名和密码进行身份验证,使用命令如LOGIN <username> <password>,服务器响应OK表示身份验证成功。
  1. 选择阶段(Selected State)

在选择阶段,客户端选择一个邮件文件夹进行操作。IMAP支持多种文件夹(如收件箱、发件箱、草稿等),允许用户在不同文件夹之间切换。

  • 选择文件夹:客户端使用SELECT <folder>命令选择一个邮件文件夹,服务器响应OK并返回文件夹的状态信息,如邮件数量、未读邮件数量等。
  1. 操作阶段(Operational State)

在操作阶段,客户端可以执行各种命令来管理和操作邮件。这是IMAP会话的主要阶段。

  • 邮件状态查询:

    • STATUS <folder>:查询指定文件夹的状态信息。
    • SEARCH <criteria>:根据条件搜索邮件。
    • FETCH <sequence> <items>:获取指定邮件的内容和属性。
    • EXAMINE <folder>:类似于SELECT,但以只读方式打开文件夹。
  • 邮件操作:

    • COPY <sequence> <folder>:将指定邮件复制到另一个文件夹。
    • STORE <sequence> <item> <value>:修改邮件的标志(如已读、未读)。
    • EXPUNGE:删除所有标记为删除的邮件。
    • MOVE <sequence> <folder>:将指定邮件移动到另一个文件夹。
  1. 断开阶段(Logout State)

在断开阶段,客户端发送LOGOUT命令,服务器进行必要的更新操作并断开连接。

  • 结束会话:

    • 客户端发送LOGOUT命令。
  • 服务器响应OK,并断开TCP连接。

IMAP命令

以下是一些常用的IMAP命令:

  • LOGIN :进行用户身份验证。
  • SELECT :选择一个邮件文件夹进行操作。
  • EXAMINE :以只读方式选择一个文件夹。
  • STATUS :查询指定文件夹的状态信息。
  • FETCH :获取指定邮件的内容和属性。
  • SEARCH :根据条件搜索邮件。
  • STORE :修改邮件的标志。
  • COPY :将指定邮件复制到另一个文件夹。
  • EXPUNGE:删除所有标记为删除的邮件。
  • LOGOUT:结束会话并断开连接。

HTTP

也就是基于web的电子邮件,可以使用http协议从邮箱服务器拉取自己的邮件,方式更加丰富多样。(发送仍然是STMP)