在讨论email服务器以前,理解电子邮件的工作机制是非常重要的。在通常的情况下,一封电子邮件的发送需要经过用户代理,传输代理和投递代理等三个程序的参与。
当用户发送一封电子邮件时,他并不能直接将信件发送到对方邮件地址指定的服务器上,而是必须首先试图去寻找一个信件传输代理,把邮件提交给它;信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序查询到应对这个目标地址负责的邮件传输代理服务器,并且通过网络将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者察看自己的电子信箱。显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件。(发送邮件不受这个限制)。
而投递代理则从信件传输代理取得信件传送至最终用户的邮箱。显然,最终用户只能看到用户投递代理。常见的投递代理包括procmail等。
用户代理接受用户输入的各种指令,将用户的邮件传送至信件传输代理或者通过pop、Imap将信件从传输代理服务器处取到本机上。常见的用户代理有“foxmail”,“outlook express”等邮件客户程序。
可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者提交给最终投递程序。
有许多的程序可以作为信件传输代理,包括qmail、sendmail、postfix等等。
无论什么产品,它们必须支持同样的规范,如传输信件的报文格式,监听的端口等等。一般来说,系统管理员并不需要了解信件传输的命令标准,用户代理会生成正确的命令。但是,了解一些相关信息是重要的。
信件传输代理默认监听25号端口接受请求,当接受用户的请求时,它不需要了解用户的真实身份,或者说不需要身份验证。因此用户不需要提交用户口令就可以发出电子邮件,这意味着任何用户都可以冒充成另外一个用户发出假的电子邮件,这是电子邮件原始设计时导致的一个特点,无法消除。(关于这一点目前有一点说明。许多基于UNIX的系统运行indentd,可以记录客户机器上的用户的登录名字。不过,这个功能实际上用处不大,毕竟大部分人不会用UNIX/Linux作为他的个人机器)。
当邮件服务器程序得到一封待发送的邮件时,它首先需要根据目标地址确定将信件投递给哪一个服务器,这是通过DNS服务实现的。例如,有一封邮件的目标地址是someone@yahoo.com,那么,sendmail首先确定这个地址是用户名(someone)+机器名(yahoo.com)的格式,然后,通过查询DNS来确定需要把信件投递给某个服务器。
DNS数据中,与电子邮件相关的是MX记录,这可以在查询DNS时设置查询类型为mx来得到:
[wanghy@mail ~]$ nslookup
Default Server: www.linuxaid.com.cn
Address: 202.99.11.120
>set q=mx
>yahoo.com
Server: www.linuxaid.com.cn
Address: 202.99.11.120
Non-authoritative answer:
yahoo.com preference = 0, mail exchanger = mx1.mail.yahoo.com
yahoo.com preference = 1, mail exchanger = mx2.mail.yahoo.com
mx1.mail.yahoo.com internet address = 128.11.68.225
mx2.mail.yahoo.com internet address = 128.11.68.217