邮件服务器|邮件服务器运作原理

转载的转载原地址在此

【邮件服务器|邮件服务器运作原理】
邮件服务器运作原理:
既然要使用 e-mail ,当然就需要邮件主机服务器啰 (Mail Server )!不然你的信要怎样寄出去呢?事实上,mail server 的原理说难不难,但是说简单吗~似乎又有点难以理解ㄋㄟ~,所以,底下我们要来谈一谈他的原理部分,然后再针对主机的设定来进行说明咯!底下,我们首先要讲的,就是『Mail server 系统与 DNS 系统有什么关连性?』这个部分新手最容易被搞混哩,是否要架设 mail server 就『宿命』的一定得架设 DNS 主机在你的主机上面吗?
Mail与 DNS 系统的相关性:
一直以来,Mail server 与 DNS 系统就是分不开的,怎么说呢?今天如果你要寄电子邮件的话,那么就得藉由邮件主机帮你将信件送出去,对吧!那么我们在 DNS 那个篇幅里面也谈到了相当多的概念了,就是,人脑实在无法记忆住计算机网络的 IP 数据,因此,才会有所谓的 Domain Name System,DNS 主机,这个 DNS 主要的功能之一,就是将主机名称转译成为 IP ,我想,这里您应该也已经了解了,对吧!如果是『不了解』,那么不要往下看了,请前往 简易 DNS 服务器 去瞧一瞧,瞧完了再回来继续吧!OK!好了,既然如此的话,那么使用邮件主机来寄信,并且不想要背主机所在的 IP ,那蛣M就一定需要让你的主机名称可以经由 DNS 系统来找到你的 IP 啰!对吧!没错,如果你真的要提供一个 Internet 上面的邮件主机,最好还是注册一个合法的主机名称,比较好记忆ㄋㄟ~
好了,接下来要讨论的就是,既然我的主机需要 DNS 来转译主机名称使成为 IP,那么我真的就得必须要架设 DNS吗?当然不是!要注意的是,我们刚刚提到的是『我就得在 Internet 上面注册一个合法的主机名称来对应 IP 』而不是『一定得要架设 DNS在我的主机上面!』这个很重要,因为有太多的新手被 mail server 与 DNS server 的关系搞错乱了!如果到这里又混乱了!那么请,真的,一定,回到 DNS 服务器那篇去慢慢的再从头读一次,否则.....也就是说,我们需要的是『合法注册过的主机名称』就是了!所以,你可以使用动态 IP 去申请一个动态 IP 的领域名称,也可以使用各大 ISP 提供的各项功能来注册,反正只要能够注册一个领域名称就是了!当然,你也可以自行去注册一个 DNS 主机,并且在你的主机上面建立 DNS 系统,但这并非是必要的!
那么,假设我的主机名称对应 IP 已经成功的在 Internet 上面完成合法注册了,这样就好了吗?是这样没错啦!确实,只要有主机名称对应到 IP ,亦即是有 A ( Address ) 这个 DNS 的标志后,那么就可以架设 mail server 了,并且,一般来说,应该不会有问题的!然而, DNS 系统本身还有其它的功能可以支持 mail server ,使 mail server 更稳定与具有更佳的避免信件遗失功能,所以,就有 MX 这个 DNS 的标志产生啦!MX 这个 DNS 设定中的标志,主要就是要给 mail server 用的,基本上, MX 就是 Mail eXchanger 的缩写,他可以让 Internet 上面的信件马上找寻到 Mail 主机的位置,此外,由于 MX 后面可以接数字,因次,一个 domain 或者是一部主机,可以有多个 MX 标志,这有什么好处呢?主要的好处就是可以让,当主要的 mail server 挂点时,由于有 mx 标号,因此,信件不会直接退回,而是跑到下一个 MX 设定的主机去,并且暂存在该处,等到主要的 mail server 起来之后,这个 MX 设定的主机就会将信件给他传送到目的地!如此一来,甚至可以达到异地备援的功效呢!不只如此喔!MX 的功效还很多!最大的优点就是有点类似 router 的功能,我们或许可以称之为 邮件路由 吧!当有了 MX 标志之后,由于这是 DNS 的设定,所以当你要传送 mail 的时候,那么就可以直接依据 DNS 的 MX 标志直接将信件传送到该设定的 mx 邮件主机,而不需要去寻问到底邮件要寄到哪里去!这功能相当的不错的!因为可以让你的邮件很快的而且正确的送达到目的地呢!此外,由于可以设定多个 mx ,因此,假设『此路不通』,也就是先使用的 mx 邮件主机不通的时候,那么信件就会往下一个 mx 邮件主机传送!这样可以避免信件被退信的机会!当然就更加的稳定啰!不过,这里也要特别强调, MX『一定』要设定正确,否则,呵呵!反而会让你的信件永远在 Internet上面流浪呢!
一般来说,邮件地址的写法为: account@server.name 的写法,在小老鼠 ( @ ) 前面的指的是『账号』,至于 @ 后面的则是主机的名称!当你寄出这样的一封信时,首先,你的邮件主机会先去 DNS 系统寻找 server.name 这个主机名称对应的 IP 与 MX 标志,若有 mx 标志,那么这封 e-mail 将会把信先送到该 mx 主机,然后再由该 mx 主机将信件送达目的地 ( 就是 server.name 这个主机啦 ) ,而如果有多个 mx 标志时,那么这封 e-mail 会送到最优先的 mx 主机去(也有可能这部主机就是目的地主机喔!),然后交给该主机来处理啰!而如果没有 mx 标志的话,那么在查得 IP 之后,信件才会慢慢的送达该邮件主机啰!在送达到邮件主机后,该主机则以前面的『账号』将信件发送到各个使用者的邮件目录下!所以啰,为什么说 mail 与 DNS 系统相关性很高呢?嘿嘿!由上面的说明您应该就不难了解啦! ^_^
邮件的传送流程、MUA、MTA、MDA
约略了解了 DNS 与 mail server 之间的关系之后,在接下来我们要了解的是,那么 mail 到底是如何传送到目的邮件主机的呢?底下我们分成『寄信』与『收信』两个主要的邮件主机使用方式来加以介绍啰!先说明一下关于『寄信』的部分好了,通常我们都是使用桌上型计算机来寄信的,举个例子来说好了,如果你以 Netscape 或者 Kmail 或者 OutLook Express 来寄信的时候,那么那封信到底是怎么送出去的呢?可以参考一下底下的图示来说明:



图一、电子邮件以邮件主机寄送信件示意图

先来说明一下什么是 MUA, MTA 与 MDA 什么的,再来说信件怎么传送的好了!
·MUA( Mail User Agent ):顾名思义, MUA 就是『邮件使用者代理人』,华特(what)?邮件还需要代理人,怎么回事呢?喔!这是由于通常我们 Client 端的计算机都无法直接寄信的(不然干嘛要邮件主机?),所以,需要透过MUA 来帮我们传达信件,不论是送信还是收信,Client 端的用户都需要透过各个操作系统提供的 MUA 才能够使用邮件系统。举个例子来说, Windows 里面的 OutLook Express, Netscape 里面的 mail 功能与 KDE 里面的 Kmail 都是MUA 啦! MUA 主要的功能就是收受邮件主机的电子邮件,以及提供使用者浏览与编写邮件的功能!
·MTA( Mail Transfer Agent ) : MUA 是用在 Client 端上面的软件,那么这个 MTA 就是用在邮件主机上面的软件啦!他也是主要的邮件服务器喔!这个 MTA 就是『邮件传送代理人』的意思。也来顾名思义一下,既然是『传送代理人』,那么使用者寄出的信,与使用者要收信时,就是找他 ( MTA ) 就对啦!因为他要负责帮我们使用者传送嘛!没错!基本上, MTA 的功能有这些:


1. 收受外部主机寄来的信件:既然是邮件主机,那么『接收信件』想必就是主要的功能啰!呵呵,答对了!所以啰, MTA 最主要的功能就是收受外部来的信件,只要这个信件里面有 MTA 内部的账号时,那么这封信就会被 MTA 收下来;
2. 帮使用者传送 ( 寄出 ) 信件:既然可以收信,那么自然也就可以发信啰!没错啦!只要使用者具有合法的使用 MTA 的权力,那么该使用者就可以利用这部 MTA 将他把信传送出去!不过需要注意的是, MTA 会将信件送给目的地的 MTA 而不是目的地的 MUA 喔!不要搞错了!(注:曾经有个朋友跟我说,要我传数据给他,而因为他要接收我的信件,所以他的计算机"指的是 Windows 那个 Client 端的计算机" 得一直开着,真是不方便!听到这句话时,害我吓了一跳~这个观念是不对的~因为使用者使用的是 MUA ,而信件『仅会送达到 MTA 主机上面』而已,收、发信件时,都需要透过 MTA 来帮忙处理的!所以,使用者在使用邮件编辑器"MUA"将数据编辑完毕之后,按下送出,并且成功的送到 MTA 之后,接下来的事情就是 MTA 的工作了,跟使用者的 Client 端这部计算机 "一点关系也没有了" )
3. 让使用者自己的信可以收回去:使用者可以将放置在邮件主机的信件收到自己的个人计算机上面收看。

大致的功能就是这些啦!通常我们所说的 Mail server ( 邮件服务器 ) 就是指 MTA 而言的!
·MDA( Mail Delivery Agent ) : 『邮件递送代理人』主要的功能就是将 MTA 所收受的信件,依照信件的流向 ( 送到哪里去 ) 来将该信件放置到本机账户下的邮件档案中 ( Mailbox )!或者是再经由 MTA 将这个信件送到下个 MTA 去!而如果信件的流向是到本机当中时,这个邮件代理人的功能可不止是将由 MTA 传来的邮件放置到每个使用者的 Mailbox 而已,他还可以具有邮件分析 ( filtering ) 与其它相关的功能呢!这个功能很了不起喔!怎么说呢?具两个例子来说好了:


1. 如果你知道某个广告信件的主旨都是固定的,例如『AV情色XXX』,你想将这种信件直接给他丢掉垃圾桶,可以吗?当然可以啰!透过 MDA 邮件分析的功能,就可以将信件丢弃啦!
2. 如果有一天你要出差去,看样子可能一个星期碰不到电子邮件了,但是你又不想让一些朋友认为你在耍大牌都不回信的....这个时候你就可以利用 MDA 的功能,让邮件主机分析到,当要送给你这个使用者的账号的信出现时,就自动回复一封回信,让寄件者知道你在忙碌中....呵呵!这样的功能是否很不错呢?还不止这样喔!其它的等一下后面再提吧!
·Mailbox :『邮件信箱』说穿了,就是在你主机上面的一个目录下的,某个人『专用』的信件收受档案啦!举个例子来说,系统管理员 root ,在预设的情况下,他会有个信箱,预设的档案是在/var/spool/mail/root 这个档案就是了,一个账号都会有一个自己的信箱喔!然后,当 MTA 收到 root 的信时,就会将该封信件存到 /var/spool/mail/root 这个档案中啰!使用者可以透过程序来将这个档案里面的信件数据读取回去喔!
好了,了解了 MUA, MTA 与 MDA 之后,再来说到那么如何将信寄出去呢?可以分为底下几个步骤:
1.Step1 使用者利用 MUA 寄信到 MTA 上面:通常我们使用 MUA ( 例如 Outlook express ) 写信的时候,你总是要定义出几个咚咚:
o发信人与发信网站:对啦,总是要有这个信息才行的嘛!这个发信网站就是等一下 Step 2 接收信件的那个 MTA 啦;
o收信人与收信网站:是的,就是account@e-mai.server 的样式啦!那个 account 就是该 e-mail.server 里面的账号啦!
好了,你在图一左上角的那部机器上面,也就是『本地端用户使用计算机』利用 MUA 的功能 ( 例如Outlook express 好了 ) 写好了信之后,按下MUA 的那个『传送』的按键,MUA 就会依据你所定义的主机地址将信发送到 MTA 上面;

2.Step2 MTA 收到自己的信件,交由 MDA 发送到该账号的 MailBox 当中:如果在 Step 1 所收到的信件中,那个 e-mail.server 就是 MTA 自己,此时 MTA 会将该信件交由 MDA 去处理,将信件放置在收进者的信箱中;


3.Step3 MTA 将信再转送出去:如果由 Step 1 来的信件的收件人并不是 MTA 的内部账号,那么该封信将会被再转送出去!由 Step 1 及 Step 3 的动作,我们也称为 Relay (邮件转递) 的功能喔!


4.Step4 远程 MTA 收受本地的 MTA 所发出的邮件:远程的 MTA 会收受我们这部 MTA 的信件,并将该信件交给他的 MDA 来处理 ( Step 5 ) ,此时,信件会存放在远程的 MTA 上面,等待使用者登录读取或者下载回去!
整个流程大致上就是这样。这个时候,你由左上角的MUA将信件寄出之后,最后信件将会存放在右边那部 MTA 主机里面喔!还没有到达你的朋友的计算机 ( 就是右边的 MUA 那部计算机 ) !这个时候,就要继续谈到收信的动作了!收信的动作有点像这样:



图二、客户端收受邮件主机的电子邮件示意图

远程用户使用的计算机直接连接到他的 MTA ,跟 MTA 要求察看自己的 mailbox 是否有信件,而 MTA 透过 MDA 去检查之后,如果有信件的话,就会将他传送回使用者的 MUA 中!同时,根据 MUA 的不同设定, MTA 会选择将该 mailbox 清除掉,或者继续保留!若继续保留的话,那么下次使用者再次的接收信件时,保留的信件会再次的被下载,因此,通常使用者 MUA 都是预设删除掉 MTA 上面的Mailbox 内容的!接下来我们得谈一谈,那么寄信与收信使用的是什么协议呢?
使用的协议
总是得了解一下使用的协议吶!我们在寄信的时候,亦即由 MUA 将信件发送到 MTA 的过程中,以及 MTA 将信转递到下一个 MTA 的功能,目前绝大部分的邮件主机都是使用SMTP ( Simple Mail Transfer Protocol ) 这个协议,port number 为 25 啦!在寄信的时候,你的 MUA 会主动的连接 MTA 的port 25 ,然后将信经由 MTA 的 smtp 协议( port 25 ) 而送出去!而邮件主机 MTA 在转递的时候,也是经由下一部 MTA 的 port 25 来将信送出去的!所以啰,不论你是使用什么 MUA 或 MTA 邮件架设软件,只要大家都支持 smtp ,那么信件就可以顺利的流传啰!
收信呢?收信则是 MUA 经由 POP ( Post Office Protocol ) 协议来连接到 MTA 的使用者 Mailbox,以读取或者下载使用者在 Mailbox 当中的信件。,目前常用的 POP 协议为 POP3 ( Post Office Protocol version 3 ),这个协议产生的 port number 为 110 ,所以,你的 MUA 经由 MTA 的 port110 将信件由 MTA 的 mailbox 当中将信件收到本地端的 MUA 上面供你浏览!同样的,只要 MTA 与 MUA 同时支持 POP3 这个协议,那么信件就可以自由的收受了!此外,目前也很流行使用 IMAP 这个协议来收受信件。在 pop3 的收信协议中,一般来说,当 client 端收完了主机端的信件之后,则该信件会主动的被主机端所删除!不过, IMAP则可以避免这个问题! IMAP 具有让使用者 ( client客户端 ) 自行定义信件放置的目录功能,以及是否要储存下载的信件之后,原信件是否保留在主机上面的功能!目前我们常见的 Web 接口的电子邮件使用,大部分就是以 imap 来达成的!
所以我们知道了!通常一部提供收发信件的 MTA (不考虑 Web 接口的邮件主机 ) 至少需要两个协议,分别是 SMTP 与 POP3 !而且,只要你的 MUA 与 MTA 同时均支持SMTP 与 POP3 ,那么彼此就可以沟通啰!这也是为什么你使用 Outlook express 寄出的信,但是你的朋友可以使用 Netscape 收下来的原因!总之,就是『网络协议』的沟通啦!

什么是 Relay 与认证机制
由图一的寄信流程图里面的第三步骤 ( step 3 ) 中,我们知道, MTA 在分析收到的邮件之后,如果收件者不是本身主机的账号,则会将该信件再传送到下一个 MTA 上面,这个由MTA 帮忙转信的功能就称为 Relay 啦。那么在这个功能当中,您有没有发现一件奇怪的事情啊!那就是:『是否任何人都可以使用我的 MTA 邮件主机服务器来传送他的邮件呢?』这个问题涉及到 Mail Server 的设定技巧了!如果设定不良的话,例如早期的 Sendmail 版本中,他就没有针对使用者来进行管制,也就是说,任何人都可以使用这样的一部邮件主机来达到信件传送的目的!这种主机我们称为『Open Relay』的电子邮件主机喔!这里请仔细的思考一下,如果我的 MTA 对于寄信的人没有一个限制的话,结果会如何呢?呵呵!没有错,结果就是任何人都可以使用你的 MTA 来发信了!那有什么好可怕的?我们在前言的地方就已经稍微说过了,那个所谓的『广告信、垃圾信件』的问题,而如果你的 MTA 没有对寄信的人作限制的话,由于任何人都可以使用你的 MTA 来发信,你的 MTA 将会变的『很笨重!』什么意思?那就是,你的 MTA 将会帮任何人寄信,如此一来,你的『网络频宽将会被广告信件所用光!』结果将导致你的 MTA 变成『Open Relay 主机黑名单的一份子~』!!!

为了避免这个问题,所以,目前所有新版的邮件主机服务器架设软件 ( Mail server packages )预设的情况之下,都不会对外完全的开放 Relay 的功能的!预设通常仅『针对主机 ( localhost ) 开放 Relay 的功能!』,不过,这样的 MTA 是可以收受来自 Internet 上面的,注明收件者是我们 MTA 主机内部账号的信件的,因此, MTA 在『收信』上面是没有问题的!

但是关闭了 Relay 之后,虽然可以避免掉我们 MTA 主机被当成广告信发送站,不过如此一来又造成了一些困扰!何解?因为通常我们仅针对主机,或者一些规范的 IP 或者是网段等信任的主机来开放他们的 Relay 的功能,所以在这个设定的范围内的 Client 端计算机可以自由的收发信件,至于没有规范到的 IP 来源的寄信信件,将完全的挡掉。然而万一您使用的是 ADSL 计时制的呢?又或者您是常常在外面出差的大老板,则你的 IP 将『不会固定』,完蛋啦~怎么办?既不能完全开放 Relay ,又没有固定 IP ,无解了吗?呵呵!还好,有所谓的 邮件认证机制 来帮我们解决这个困境啦!

所谓的『邮件认证机制』就是在刚刚我们图一的寄信流程图中,在 MTA 当中加入需要检查发信者的『账号与密码』比对的功能,当 MTA 接到来自 Client 端的传信需求时,会检查来自 Client 端的认证比对(账号密码),如果账号与密码比对正确,则开始接受信件并帮忙转信,如果比对不正确则将该 MTA 并不会接受该封信件,直接在 Client 端显示『不接受您的信件』之类的讯息喔!目前有相当多种的邮件认证机制,这里我们偏向于介绍目前广为使用的SMTP 邮件认证这个机制。

所谓的 SMTP 邮件认证机制,顾名思义,就是在 smtp 这个协定上面动手脚的一个机制啰!亦即是在寄信的时候,(由 MUA 到 MTA 那个 step 1 的步骤中 ),我们的MTA 主机『一定要求检验 MUA 发信者的账号与密码!』这样的功能!果真能做到这一点的话,那么你的 MTA 就可以在经过认证之后,提供认证者的 Relay 功能,而不需要针对某些信任网域或 IP 来分别设定开放 Relay 的功能啦!因为经由『认证』的机制,你的 MTA 会去分析寄信者的相关信息,通过后才会接受信件并帮他们寄信,否则就不接受信件!呵呵!没错!就是这样!透过这样的机制,您将不需要规范 Relay 的 IP 或网段,直接交给SMTP 邮件认证来帮你管理你寄件者的 Relay 功能,从此以后,你的 Clients 就不会常常向你抱怨说 MTA 不稳定啰!

我们底下将介绍使用 cyrus-sasl 这种密码验证的认证机制啰!好了!底下我们将要介绍一下目前邮件服务器占有率上面应该依然是第一的 sendmail 这个 mail server 的架设!


    推荐阅读