电子邮件的 SMTP 协议
SMTP
SMTP是电子邮件应用的核心,用于从发送方的邮件服务器发送报文到接收方的邮件服务器。
它限制邮件报文体只能采用简单的7比特ASCII表示。过程:
- 发送方调用邮件代理程序并提供接收方的邮件地址,然后发送报文
- 代理程序把报文发给邮件服务器,报文被放在报文队列中
- 邮件服务器上的SMTP客户端发现了这个报文,就建立一个到接收方邮件服务器的SMTP服务器的TCP连接
- 经过一些初始SMTP握手后,SMTP客户通过该TCP连接发送报文
- 在接收方的邮件服务器上,SMTP的服务端接受该报文,将报文放入接收方的邮箱
- 接收方方便的时候,调用代理阅读该报文

注意:
- SMTP一般不使用中间邮件服务器发送邮件,如果接收方邮件服务器没有开机,则报文会在发送方进行新的尝试,邮件不会再中间的某个邮件服务器保留。
- 该用户如果有另外的报文要发送到该服务器,就在相同的TCP连接上重复这种处理,否则,它将只是TCP关闭连接。也就是说,SMTP是一种持续性连接。
与HTTP的对比
这两个协议都用于从一台主机向另一台主机发送文件,并且都使用持续性连接。
重点关注一下区别:
1、
- HTTP主要是一个拉协议(pull protocol),即用户使用HTTP从服务器拉取信息,特别是tcp连接是由接收方发起的。
- SMTP基本上是推协议(push protocol),发送方把文件推向邮件服务器,该TCP连接是由发送方发起
2、
- SMTP要求报文必须是7比特的ASCII字符
- HTTP则无限制
3、
处理复合型文档时,HTTP把每个对象封装到他自己的HTTP响应报文中,而SMTP则把所有对象放在一个报文中
邮件访问协议
在今天,邮件访问使用了一种客户-服务器体系结构,即用户通过在用户端系统上的客户程序来阅读电子邮件。
那么有一个问题:需要保证及时接收可能在任何时候到达的新邮件,接收端电脑必须不断运行并保持在线,这显然是不太现实的。
典型的用户通常在本地PC上运行一个代理程序,由代理程序访问储存在总是保持开机的共享邮件服务器上的邮箱。
所以发送方并没有把邮件直接发送给接收方,而是发送给他的代理服务器。
那么。。。到此为止,还有一个问题:用户的本地程序是如何从代理服务器取回邮件的呢?需要注意的是用户的程序不能使用SMTP取回报文,因为取报文是一个拉操作,而SMTP是一个推协议。
目前有一些流行的访问协议,包括第三版邮局协议(Post Office Protocol--Version 3, POP3)、因特网邮件访问协议(Internet Mail Access Protocol, IMAP以及HTTP协议
POP3
随着建立TCP连接,POP3按照三个阶段工作:
- 特许(authorization):用户代理明文发送用户名及口令
- 事务处理:取回报文,同时可以对报文做删除标记、取消删除标记、获取统计信息
- 更新:结束POP3会话
IMAP
IMAP将每个报文与一个文件夹联系起来。为用户提供创建文件夹已经将邮件从一个文件夹移动到另一个文件夹的命令。
基于Web的电子邮件
这种情况用户的代理就是普通的浏览器,是用的是HTTP协议。
网友评论