1、邮件传送
- 既然我们己经描述了用户代理和邮件消息,现在己经做好一切准备来进一步考查邮件传输代理如何将邮件从发件人中继给收件人。邮件传送采用的协议是SMTP。移动邮件最简单的方法是建立一个从源机器到目标机器的传输连接,然后在该连接上传输邮件。这是SMTP的最初工作方式。然而,经过多年的发展,邮件的传输逐步区分出了两种使用SMTP 的不同方式。第一种使用方式是邮件提交( mail submission ),这一步表示用户代理把邮件提交给邮件系统。第二种使用方式是邮件传输代理之间的邮件传送。这个序列将邮件从发送邮件传输代理传递到接收邮件传输代理,全程只有一跳。完成最终邮件的交付使用了不同的协议。本节,我们将描述基本的SMTP协议和它的扩展机制。然后,我们将讨论如何利用它完成邮件提交和邮件传送。
SMTP ( 简单邮件传输协议)及其扩展
- 在Internet 上,发送电子邮件的计算机首先与目标计算机的25号端口建立一个TCP 连接,然后在此连接上传送电子邮件。在这个端口上监听的是邮件服务器,它遵守简单邮件传输协议( SMTP, Simple Mail Transfer Protocol)。这个服务器接受入境连接请求、执行某些安全检查,并接受传递过来的邮件。如果一个邮件无法被投递,则向邮件发送方返回一个错误报告,该错误报告包含了无法投递邮件的第一部分。
- SMTP 是一个简单的ASCII 协议。这不是一个弱点,而是一种特性。因为使用ASCII文本,使得协议更加易于开发、测试和调试。通过手动发送命令就可以进行测试,而且记录的消息易于阅读。现在大多数应用程序级的Internet 协议都是以这种方式工作的(比如HTTP )。在建立了与25 端口的TCP 连接后,作为客户端的发送机器等待接收机器首先说话,这个接收机器是作为服务器运行的。服务器开始发送一个文本行给客户端,该行表明了自己的标识,并告诉客户机是否己经准备好接收邮件。如果服务器没有这样做,那么客户端就释放连接,稍后再次尝试与服务器联系。
- 如果服务器愿意接收电子邮件,则客户端声明这封电子邮件来自于谁以及将要交给谁。如果接收方确实存在这样的收件人,则服务器指示客户发送邮件;然后客户发送邮件,服务器予以确认。因为TCP 提供了可靠的字节流传输,所以这里不需要校验和。如果还有更多的电子邮件需要传输,那么现在可以继续发送。当两个方向上所有的电子邮件都交换完毕后,连接被释放。发送邮件会话实例如下图所示,图中还包含了SMTP所使用的数字代码。客户端发送的行用“ C:”标识,而服务器发送的行则用“ S :”标识。来自客户的第一条命令实际意味着HELO 。在HELLO 的各种4 个字符缩写组合中,这种缩写相比于其竞争者而言有诸多优点。随着时间的流逝,为什么所有的命令必须是4个字符的原因现在己经无从追究了。邮件只发送给一个收件人,因此这里只使用了一条RCPT 命令。RCPT命令可以将一个邮件发送给多个收件人。每个邮件被单独确认或拒绝。即使发给有些收件人的邮件遭到了拒绝(由于接收方并不存在这样的收件人),邮件也可以被发送给其他的收件人。
- 最后,尽管客户端命令的语法被严格地限定为4字符,但是回复消息的语法就不那么严格了。实际上,只有数字代码才具有真正的意义。每一种实现都可以在数字代码后面加上它所喜欢的任何字符串。基本SMTP 运作良好,但它在几个方面存在不足。首先它不包括认证。这意味着例子中的FROM 命令可以为所欲为地给出任何发件人的地址。这个特性对于发送垃圾邮件相当有用。其次, SMTP 传输的是ASCII 消息而不是二进制数据。这就是为什么需要B