user--Email Server--Email server--user
Email Server——Email server
SMTP (Simple Message Transfer Protocol)
user——Email Server
POP3 (Post Office Protocol)
IMAP (Internet Message Access Protocol)
sendmail是最重要的邮件传输代理程序。理解电子邮件的工作模式
是非常重要的。一般情况下,我们把电子邮件程序分解成用户代理
(MUA),传输代理(MTA)和投递代理(MDA)。
MTA (Mail Transport Agents)
sendmail, postfix, qmail etc.
MDA (Mail Delivery Agents)
sendmail(mail), deliver, and procmail
MUA (Mail User Agents)
elm, pine, /bin/mail, mh, Eudora, and Pegasus
用户代理用来接受用户输入的指令,将用户给出的信件报文传送
至信件传输代理。而投递代理则从信件传输代理取得信件传送至最终
用户的邮箱。显然,最终用户只能看到用户投递代理。
当用户试图发送一封电子邮件的时候,他并不能直接将信件发送到
对方的机器上,用户代理必须试图去寻找一个信件传输代理,把邮件
提交给它。
信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,
然后,根据邮件的目标地址,信件传输代理程序将找到应该对这个目
标地址负责的邮件传输代理服务器,并且通过网络将邮件传送给它。
对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件
的接收者察看自己的电子信箱。
显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服
务器上存储信息的空间(称为信箱)才能接受邮件。(发送邮件不受
这个限制)
可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,
根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之
间传输并且将接收到的邮件缓冲或者提交给最终投递程序。
有许多的程序可以作为信件传输代理,但是sendmail是其中最重要
的一个,事实证明它可以支持数千甚至更多的用户,而且占用的系统
资源相当少。不过,sendmail的配置十分复杂,因此,也有人使用另外
的一些工具,如qmail。当然,基于Windows NT的Exchange Server和
NetScape Message Server也是这种产品的例子。
无论什么产品,它们必须支持同样的规范,如信件传输的报文格式,
监听的端口等等。一般来说,系统管理员并不需要了解信件传输的命
令标准,用户代理会生成正确的命令。但是,了解其他一些信息是重
要的。
信件传输代理运行在25端口接受请求,当接受用户的请求时,它不
需要了解用户的真实身份,或者说不需要身份验证。因此用户不需要
提交用户口令就可以发出电子邮件,这意味着任何用户都可以冒充成
另外一个用户发出假的电子邮件,这是电子邮件设计的一个基础,无
法消除。
当sendmail程序得到一封待发送的邮件的时候,它需要根据目标地
址确定将信件投递给那一个服务器,这是通过DNS服务实现的。例如,
有一封邮件的目标地址是someone@yahoo.com,那么,sendmail首先确
定这个地址是用户名(someone)+机器名(yahoo.com)的格式,然后,
通过查询DNS来确定需要把信件投递给某个服务器。
DNS数据中,与电子邮件相关的是MX记录,这可以在查询DNS时设置
查询类型为mx来得到:
[gmwu@linux gmwu]$ nslookup
Default Server: shg.hnit.edu.cn
Address: 210.45.144.18
> set q=mx
> yahoo.com
Server: shg.hnit.edu.cn
Address: 210.45.144.18
yahoo.com preference = 9, mail exchanger = mx1.mail.yahoo.com
yahoo.com preference = 1, mail exchanger = mx2.mail.yahoo.com
显然,在DNS中说明yahoo.com有两个信件交换(MX)服务器,于是,
sendmail试图将邮件发送给两者之一。preference 值小的MX服务器的优
先级别比较高,因此服务器将试图连接mx2.mail.yahoo.com的25端口,
试图将信件报文转发给它。如果成功,你的smtp服务器的任务就完成
了,在这以后的任务,将由mx2.mail.yahoo.com来完成。在一般的情
况下,mx交换器会自动把信件内容转交给目标主机,不过,也存在这
样的情况,目标主机(比如yahoo.com)可能并不存在,或者不执行smtp
服务,而是由其mx交换器来执行信件的管理,这时候,最终的信件将
保存在mx机器上,直到用户来察看它。
sendmail发送邮件时,如果经过设定的时间后仍然未能将信件投递
到目的主机,它将返回一个错误信息并且休息一段时间,然后重新试
图投递,如果连续多次失败,sendmail最终将放弃投递并将错误信息
投递给postmaster用户。在许多机器上,postmaster用户是root用户
的一个别名(参考下面关于别名的内容),你应该将它设置为邮件的
实际管理员的用户名。
上面说的基本就是sendmail的工作方式,然而仍然有一个很让人迷
惑的东西,就是所谓"信封地址"。简单地说,当sendmail向目标地址发
信的时候,它并不是直接用你的信件内容发送,相反,它依赖于你给
它的命令。例如,你可能会用mail程序向某个地址这样发信:
$mail someone@somedomain.com
To:other@otherdomain.com
Subject:test mail
test
.
那么,当sendmail发信的时候,它是向someone@somedomain.com发
信而不是other@otherdomain.com。相应地,如果你想向两个人发信,
例如你在outlook里面写上:"投递给user1@a.com,抄送user2@b.com",
那么sendmail应该怎么做?直接同时向两个地址发信吗?否,它试图
构造两个包装(称为信封),每个包装上只列出一个投递地址,各投
递一次。虽然邮件正文的头部仍然包含两个地址,但是sendmail不会
看它。
Email服务的工作流程小结:
-MTA接受MUA送来的的邮件信息,生成信封和信体;
-检查目的地是否为本地,如果是则立即交给MDA投递;
-SMTP只支持ASCII方式传输,对于二进制的数据要借助于软件编、
解码(如UNIX的uuencode、uudecode),sendmail不会自动进行
编、解码;
-利用SMTP,进行路由,达到DNS中MX记录所指定的目的地;
-在目的地进行MDA的投递;
-用户使用MUA阅读邮件;
邮件投递过程
最新推荐文章于 2021-11-14 11:44:12 发布