Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2518939
  • 博文数量: 867
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 9800
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-27 14:44
文章分类

全部博文(867)

文章存档

2007年(6)

2006年(861)

我的朋友

分类: LINUX

2006-08-12 21:16:53


邮件服务器运作原理
既然要使用 e-mail ,当然就需要邮件主机服务器啰 ( Mail Server )!不然你的信要怎样寄出去呢?事实上,mail server 的原理说难不难,但是说简单吗~似乎又有点难以理解ㄋㄟ~,所以,底下我们要来谈一谈他的原理部分,然后再针对主机的设定来进行说明咯!底下,我们首先要讲的,就是『Mail server 系统与 DNS 系统有什么关连性?』这个部分新手最容易被搞混哩,是否要架设 mail server 就『宿命』的一定得架设 DNS 主机在你的主机上面吗

Mail 与 DNS 系统的相关性:
一直以来,Mail server 与 DNS 系统就是分不开的,怎么说呢?今天如果你要寄电子邮件的话,那么就得藉由邮件主机帮你将信件送出去,对吧!那么我们在 那个篇幅里面也谈到了相当多的概念了,就是,人脑实在无法记忆住计算机网络的 IP 数据,因此,才会有所谓的 Domain Name System, DNS 主机,这个 DNS 主要的功能之一,就是将主机名称转译成为 IP ,我想,这里您应该也已经了解了,对吧!如果是『不了解』,那么不要往下看了,请前往 去瞧一瞧,瞧完了再回来继续吧!OK!好了,既然如此的话,那么使用邮件主机来寄信,并且不想要背主机所在的 IP ,那蛣M就一定需要让你的主机名称可以经由 DNS 系统来找到你的 IP 啰!对吧!没错,如果你真的要提供一个 Internet 上面的邮件主机,最好还是注册一个,比较好记忆ㄋㄟ~
好了,接下来要讨论的就是,既然我的主机需要 DNS 来转译主机名称使成为 IP ,那么我真的就得必须要架设 DNS 吗?当然不是!要注意的是,我们刚刚提到的是『我就得在 Internet 上面注册一个合法的主机名称来对应 IP 』而不是『一定得要架设 DNS 在我的主机上面!』这个很重要,因为有太多的新手被 mail server 与 DNS server 的关系搞错乱了!如果到这里又混乱了!那么请,真的,一定,回到那篇去慢慢的再从头读一次,否则.....也就是说,我们需要的是『合法注册过的主机名称』就是了!所以,你可以使用动态 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. Step 1 使用者利用 MUA 寄信到 MTA 上面:通常我们使用 MUA ( 例如 Outlook express ) 写信的时候,你总是要定义出几个咚咚:
    • 发信人与发信网站:对啦,总是要有这个信息才行的嘛!这个发信网站就是等一下 Step 2 接收信件的那个 MTA 啦;
    • 收信人与收信网站:是的,就是 account@e-mai.server 的样式啦!那个 account 就是该 e-mail.server 里面的账号啦!
    好了,你在左上角的那部机器上面,也就是『本地端用户使用计算机』利用 MUA 的功能 ( 例如 Outlook express 好了 ) 写好了信之后,按下 MUA 的那个『传送』的按键,MUA 就会依据你所定义的主机地址将信发送到 MTA 上面;
     
  2. Step 2 MTA 收到自己的信件,交由 MDA 发送到该账号的 MailBox 当中:如果在 Step 1 所收到的信件中,那个 e-mail.server 就是 MTA 自己,此时 MTA 会将该信件交由 MDA 去处理,将信件放置在收进者的信箱中;
     
  3. Step 3 MTA 将信再转送出去:如果由 Step 1 来的信件的收件人并不是 MTA 的内部账号,那么该封信将会被再转送出去!由 Step 1 及 Step 3 的动作,我们也称为 Relay (邮件转递) 的功能喔!
     
  4. Step 4 远程 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 的 port 110 将信件由 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 不稳定啰!
 
我们底下将介绍使用 这种密码验证的认证机制啰!好了!底下我们将要介绍一下目前邮件服务器占有率上面应该依然是第一的 sendmail 这个 mail server 的架设!

套件安装:
使用 来安装 Sendmail 实在是『快乐得不得了~』太简单了~目前提供 Sendmail 做为邮件主机服务器的主要为 Red Hat 这个 Linux distribution ,至于其它的 Linux distribution 是否提供 Sendmail 就得请您自行到该上面查询一下啰!底下我们主要是以 Red Hat 7.x 以及 Red Hat 9 的 Linux 系统做为 Sendmail 的介绍,此外, OpenLinux server 3.1.1 亦是使用此一相关功能套件的喔!那么需要安装哪些套件呢?还记得我们在 里面谈到的几个基本的协定吧?亦即是 SMTP 与 POP3 这两个,此外,由于 Sendmail 必须『读入』一些数据库格式,所以也必须要安装相关的数据库的函式库喔!
 
不过,如果您的系统是比较老旧的,例如 Red Hat 6.x 以前的版本,又或者是您的系统本来就不存在 Sendmail ,例如 Mandrake 等其它版本的 Linux distribution 时,那么您就得使用 的方式来安装了! ( 事实上,几乎所有的 Linux distribution 都会纳入 sendmail ,只是有些套件,例如 Mandrake 预设是安装 postfix 就是了! ) 安装 Tarball 的 Sendmail 真是一件很『雪特』的苦差事,而且安装的不够好的话,还有可能产生一些设定上的困扰,此外,安装的过程当中,使用到很多的『天书一般的设定档案与牛屎一般的一大沱设定数据』,这些数据如果没有一定程度的 Sendmail 架构知识,是无法安装起来的,还有还有, Tarball 安装的话,最好是所有的 Sendmail 相关套件都一起安装,而不是分开来安装,所以,鸟哥将 放在最后面,希望您至少看完『』该节的完整内容,以及浏览过『关于邮件主机安全的设定』之后,再来尝试以 Tarball 完整的安装起属于您自己的 Sendmail 邮件主机喔!
 
好了,底下我们就来安装 Sendmail 及 POP3 这两个邮件服务器上面的组件吧!

使用 RPM 安装 sendmail ( 适用于原本 Linux 就是使用 sendmail )
如果您是使用 Red Hat 7.3 以前的版本,例如 Red Hat 7.1, 7.2, 7.3 ,或者是 Open Linux Server 3.1.1 的话,那么请先确定一下底下的套件是否已经安装上去了呢?
 
[root@test root]# rpm -qa | grep sendmail
sendmail-cf-8.11.6-3
sendmail-8.11.6-3
# 若有属性相依的问题时,请将您的原版安装光盘拿出来, mount 上去后,
# 仔细的,一个一个的将相依的套件安装上去啰! ^_^
[root@test root]# rpm -qa | grep m4
m4-1.4.1-5
[root@test root]# rpm -q mailx
mailx-8.1.1-22
 
那个 sendmail 就是主要的邮件服务器程序 sendmail-cf 是一些设定档案, 这两个套件是『一定』要安装的!至于那个 m4 的套件,则是转换 sendmail 设定文件的一支程序啰!也要安装喔!而那个 mailx 就是提供最简单的 mail 这支寄信与收信的套件啦!由于我的测试系统是 Red Hat 7.2 ,所以使用的算是比较旧一点点的 sendmail 8.11.6 版,如果您想要换装新版的 sendmail 8.12.xx 的话,请参考底下『Tarball 完整安装 Sendmail 服务器』的步骤!不过,这里我们先还是玩一玩这个预设的版本即可!记得喔!安装完毕之后,请到 Red Hat 的网站上面去下载更新的 RPM 来更新吧 !或者是台湾的映射站喔!
 

使用 RPM 安装 IMAP 套件
这个 IMAP 套件,就是负责收信的 POP3 那个协定啦!请使用 RPM 确认他已经安装在您的系统上面啰!
 
[root@test root]# rpm -qa | grep imap
imap-devel-2001a-1.72.0
imap-2001a-1.72.0
 
那个 imap 就是我们主要的 POP3 那个协议的套件啰!如果您是使用 Open Linux 的话,那么设定档应该会是在 /etc/inet.d 内,而如果是使用新的 xinetd 的话,那么设定档就会是在 /etc/xinetd.d 里面啰!等一下我们再来好好的谈一谈啦! ( 注:本章节并没有谈到 imap 这个协议的设定与应用,事实上, imap 这个套件同时提供了 pop2, pop3, imap 等协议的设定与相关功能喔! )

主机的设定:
知道如何安装 Sendmail 之后,接下来,我们得了解一下在邮件服务器架设之前,您需要先进行什么样的工作呢?
  • 若想要架设的邮件主机未来是对 Internet 提供服务的,那么请确定您已经申请了『主机名称』或者已经具备有『经过合法授权的 DNS 主机』的服务了!重要的地方在于你的主机必须能够让大家在 Internet 上面查询的到啊!
  • 虽然有 A 这个 DNS 的标志就可以架设 Mail server ,不过,毕竟有 MX 标志还是比较好的,所以,特别提醒大家,如果要架设 Mail Server ,最好(非必要)还是请您的上层 DNS 主机帮您设定 MX 标志,或者,您自己拥有 DNS 主机管理权时,可以自行设定 MX 这个标号才好!
好了,既然是玩 Sendmail ,那么就得了解一下 sendmail 的相关档案与说明啰!
 

Sendmail Server 的档案架构与基础说明
 
Sendmail 几乎所有的设定档都安置在 /etc/mail 底下,不过,如果你是以 RPM 安装的话,那么还有所谓的 sendmail-cf 的设定档,这个就是使用 M4 在进行 sendmail.cf 设定的程序!由于 Sendmail Server 所使用到的套件并不少,这包括有 sendmail, imap 以及 m4 等等,我们针对这些套件来谈一谈每个目录与档案下的数据吧!
  • 设定档
    Sendmail 的设定档几乎全部都在 /etc/mail 底下,但是也不一定!因为还需要看当初你建立 sendmail.cf 这个主要设定档时,将各个档案放置的地点而定!这部份可以使用 RPM 的方式来反查出你的设定档案的路径。Sendmail 与相关套件的设定档与相关的说明为:
     
    • /etc/mail/sendmail.cf 或 /etc/sendmail.cf:这个就是 sendmail 的主要设定档,所有的参数都是他在管理的!但是,这个档案内的各个设定被号称为『天书』,所谓的天书就是『非一般人看的懂得!』,就连 sendmai 官方网站自行开发出来的设定程序也都『告诫大家不要手动编辑这个档案』,所以这里我们也不谈这个档案的内容啦!但是既然这个是主要设定档,那么又不要让大家手动编辑,那我要怎样进行 sendmail 设定的修改呢?这个时候就需要使用到 M4 这个指令了! m4 可以将简单的一些环境设定参数,重新以内定的函式库或者函式定义来『制作』 sendmail.cf 这个设定档呢!sendmail 预设的 sendmail.cf 放置在 /etc/mail/sendmail.cf ,但是某些 Linux distributions 则将他改放在 /etc/sendmail.cf 这里~
     
    • /usr/share/sendmail-cf/cf/xxxx.m4 :刚刚我们提过那个 sendmail.cf 对吧!而由于这个档案最好不要手动修改,所以需要使用到 m4 这支程序。 m4 可以将一个简单的环境设定档转成 sendmail.cf ,那个环境设定档就是 sendmail-cf 这个套件所提供的啦。在 Red Hat 7.x 的系统中,主要的环境设定档就是 /usr/share/sendmail-cf/cf/redhat.mc 这个档案喔!不过,在 Red Hat 7.3 以后的所有 Red Hat Linux 版本当中,这个档案被移动到 /etc/mail/sendmail.mc 了!至于其它的 Linux 版本则请参考你的 sendmail-cf 套件的内容!
     
    • /etc/mail/local-host-names :这个档案主要用来处理一个主机同时拥有多个主机名称时候的收发信件主机名称问题。这个档案的用途可大了!当你的主机拥有多个 HOSTNAME 的时候,例如我的主机拥有三、四个主机名称,那么是否每个名称都可以用来做为收受信件的主机名称 ( To: .. ) 呢?并非如此!如果你的主机名称为 test1.your.domain 以及 test2.your.domain ,而且这两个 hostname 您都希望可以用在收受电子邮件,果真如此,那么,你就必需将这两个名字都写入 local-host-names 这个档案当中,一个主机名字占用一行。注意:没有写入这个档案的『你的主机名称』,那信件将无法正确的寄达这部主机喔~例如:、vbird.adsldns.org这两个主机名称的 ip 都是相同的,也就是指向同一台机器上。假设这台主机名称预设为 vbird.adsldns.org,那在预设情况下,寄给 userid@vbird.adsldns.org 都是 ok 没有问题的!但是寄给 userid@ 就会出现错误。其中原因是因为没有告诉 MTA 除了 vbird.adsldns.org 这个主机名称外,还有 也是指向这台主机上。所以寄给 userid@ 会出现错误,通常就是 mail loop to me,要不然就是不允许 relay 的错误情况。
     
    • /etc/mail/access.db :这个是『规定谁可以或不可以使用本邮件服务器的数据库』,要转成这个数据库需要藉由 makemap 以及 /etc/mail/access 档案的配合!这个档案可以说是 Sendmail 里面最重要的『使用者权限管理』的数据了!在后面我们会继续说明。
     
    • /etc/mail/aliases.db 或 /etc/aliases.db :这个 aliases.db 是用来设定『信箱别名』的一个咚咚!你可以藉由这个档案的设定来规范你的『群组收信』喔!不过,还需要藉由 aliases 及 newaliases 来做成这个档案才行!
     
    • /etc/mail/statistics :这个档案在记录 Sendmail 收发信件的相关信息喔!
  • 执行档
    Sendmail 的执行档也不少,得说一说:
     
    • /usr/sbin/sendmail:就是 sendmail 的主要执行档啦!他会读取 sendmail.cf 这个档案的设定内容喔。你在发送信件时,就是使用这支程序啦!启用这支程序之后,预设的启用的 port 是 25 咯。
     
    • /usr/sbin/ipop3d:sendmail 的功能是在处理寄信问题,而 ipop3d 就是处理 client 的收信问题啦!如果你的 Mail Server 希望提供客户端使用 Netscape 或 OutLook express 来收信,那么就需要提供这个服务才行!这个服务的设定档在 Red Hat 当中是在 /etc/xinetd.d/ipop3 ,如果是 Open Linux server 3.1.1 的话,那就会变成在 /etc/inet.d/imap 这个档案中。注意: pop3 是由 imap 套件所提供的,并没有包含在 sendmail 套件之中喔!
     
    • /usr/sbin/makemap:主要将 access 转成 access.db 的数据库制作的执行文件;
     
    • /usr/sbin/mailstats:将 /etc/mail/statistics 档案读出来的一支程序!可以查看到目前为止 Sendmail 工作共传送、接收多少邮件啰!
     
    • /usr/bin/newaliases:将 /etc/mail/aliases 转成 /etc/mail/aliases.db 的执行档!
     
    • /usr/bin/mailq:用来观察 /var/spool/mqueue 这个邮件暂存目录的数据情况的指令!
     
    • /usr/bin/m4:这个就是将 *.mc 档案转成 *.cf 档案的主要执行档啰!需要搭配 sendmail 原始码,或者是 sendmail-cf 这个套件才行!注意: m4 是也需要额外的安装的一个套件喔!sendmail 原本套件中并未包含 m4 这个套件!
  • 邮件相关目录
    sendmail 接收下来的邮件放置在哪里呢?
     
    • /var/spool/mail :这个是邮件『收受下来之后,每个使用者信件放置的目录』,一个账号会使用掉一个档案,例如你的账号为 test ,那么你的信在 Server 中时,就是 /var/spool/mail/test 这个档案了!此外,你的 POP3 的协议亦是使用这个目录中的 mailbox 做为预设的邮件取得的档案数据。
     
    • /var/spool/mqueue:当邮件由于对方主机的问题,或者是网络的问题,而无法送出去时,那么该封邮件将会暂时的存放在这个目录下,然后主机会每隔大约 30 ~ 60 分钟重新尝试传送一遍,通常设定在五天内该封信件还寄不出去,那就会退给原发信者了!
     
    • /var/spool/clientmqueue:这是新的 sendmail 8.12 版本才会出现的队列目录 (您如果想要以 tarball 安装 sendmail 的话,请务必参考本章底下的说明,这个目录的权限设定相当的重要喔!) 。
    大致上的档案就是这样啦!接下来谈一下如何设定 sendmail 吧!

使用 m4 来简易设定 sendmail
 
一般来说,只要您在安装完了 sendmail 之后,您的 Mail Server 就可以正式的来启动了!但是不幸的是,在 Red Hat 7.xx 以后的版本中(包含 Red Hat 9),为了杜绝广告信件的问题,所以在预设的情况下,您的 sendmail 将『只会监听 127.0.0.1 这个接口的收发信件需求!』至于非 Red Hat 版本的 sendmail 则可以正常的来启动喔!为了解决这个问题,所以我们势必要针对 sendmail.cf 这个设定档案来进行修订,但是这个档案原本即建议需要由 m4 来进行修改,所以,我们就得了解一下使用 m4 来转换成为 sendmail.cf 的设定档 file.mc 的相关参数啰!

  • 建立 M4 参数档:
    m4 的参数档通常档名均取为 filename.mc 这样的附档名格式,你可以在 /usr/share/sendmail-cf/cf 里面找到相当多的范例档案喔!例如 Red Hat 的设定范例文件为 /usr/share/sendmail-cf/cf/redhat.mc (如果是 Red Hat 7.3 以后版本,含 Red Hat 9 ,这个档案则放置在 /etc/mail/sendmail.mc 喔!)。这个环境参数设定文件的设定项目很多,其格式为:
       
      设定组件(`设定项目', `参数一', `参数二')
       
    仔细看到上面的例子当中,在设定的组件后面接上小括号,而小括号内则为该设定组件的项目内容,以及该项目内容的参数!而将设定项目与各参数包起来的『并不是单引号』,要注意的是,在『设定项目』左右两边的:
    1. 左边的是 quod ,也就是键盘上面数字键 1 的左边那个按键『`』;
    2. 右边的才是单引号『'』。
    这里很容易被搞错!请特别注意,而每个设定项目与参数之间,则是以逗号『,』来做为分隔喔!底下我们谈一谈几个主要的设定组件与各个设定组件底下的设定项目吧!
     
    • divert :这个组件仅是在于提供『是否要将说明数据(或者是批注数据)写入输出的档案中』而已,如果在 filename.mc 档案当中具有批注符号时,(注意, *.mc 的批注符号可以是 # 也可以是 dnl 这个字符串!)而你输出资料时不想将这些说明资料也输出,那就可以使用 divert (-1) 。反之,如果你想将这些说明数据同时输出,那就使用 divert (0)。由于我们不想要手动修改 sendmail.cf ,所以输出的数据当然就不太需要注明啦!只要在环境设定档 *.mc 里面说明清楚即可!因此,你应该会常常在档案当中看到 diver (-1) 才对!范例为:
         
        divert (-1)
     
    • OSTYPE:这个组件功能在设定使用的操作系统类别! Sendmail 预设提供数种操作系统的模式,你可以在 /usr/share/sendmail-cf/ostype 这个目录当中找到所支持的操作系统模式。因为我们是使用 Linux ,所以范例为:
       
        OSTYPE(`linux')
         
    • define:这个组件的作用比较多喔!他可以定义出许多有用的 sendmail 需要的参数,举个例子来说,如果我要将邮件别名设定档放置在 /etc/aliases 底下,那么我可以使用底下的范例:
         
        define(`ALIAS_FILE', `/etc/aliases')
         
      那个 ALIASE_FILE 就是主要的设定项目啦!而这个项目主要规定邮件者别名的档案所在地,所以啰,后面就直接接上完整的文件名称啦!更多详细的 define 说明,可以参考您计算机中的 /usr/share/sendmail-cf/README 这个档案喔!
       
    • undefine:恰恰与 define 相反啦! Sendmail 预设会支持定义很多的项目,而如果您不需要定义该项目,则可以使用 undefine 来将他移除掉喔!例如:
         
        undefine(`UUCP_RELAY')
         
    • FEATURE:这个组件 FEATURE 字面上的意思是『特征、特色』,那也就是说,这个组件里面会规定出 sendmail 所额外新增的一些任务啦!这些任务的支持必需要 sendmail 有提供才可以!你可以在 /usr/share/sendmail-cf/feature 这个目录当中找到 sendmail 所提供的各个功能喔!举个例子来说,如果我们要规定 sendmail 存取权限设定的档案,也就是 /etc/mail/access.db 时,你可以这样写:
         
        FEATURE(`access_db',`hash -o /etc/mail/access.db')
         
      注意:上面 access_db 是某个任务的项目,而后面接的 hash 是数据库格式,至于 sendmail 所使用的数据库则是 /etc/mail/access.db !更多的 FEATURE 相关设定项目可以参考 /usr/share/sendmail-cf/README
       
    • MAILER:这个组件在设定所使用的邮件主机传送邮件(递送, delivery)的代理人,一般而言,我们的代理人都是 smpt 协议啊,不过,如果我们主机内的用户(主机 /etc/passwd 存在的实体用户)想要使用 sendmail 来寄信,那是否仍然要透过 smtp 这个代理人呢?不太需要的, sendmail 本身就提供发信的功能,而要让主机上面的实体用户可以在登入主机环境的中使用 sendmail ,那你就必需要启动 local 这个本地端的邮件递送功能啦!因此,通常这个组件会设定为:
         
        MAILER(local)
        MAILER(smtp)
         
      如此一来,当 sendmail 发现信件来自于主机内部,那就会使用 local 来传送信件,当信件来自于主机外部时,那才会使用 smpt 协议来寄信喔!未来还可以新增 procmail 这个 MDA 呢! sendmail 支持的 MAILER 可以在 /usr/share/sendmail-cf/mailer 这个目录中查询的到!
       
    各个设定组件我们先介绍到这里,至于更详细的说明,请务必到 /usr/share/sendmail-cf/README 这个档案当中寻找!至于其它更完整与新鲜的 M4 设定项目,请到 查询喔!底下我们来聊一聊这个环境参数档设定完毕之后(或者称为 M4 scripts ),要怎样来『制作』sendmail.cf 呢?
     

  • m4 程序的执行
     
    m4 程序在执行的时候,必需要先读入相关的参数项目才行,这个参数项目在 /usr/share/sendmail-cf/m4/cf.m4 这个档案当中,因此,如果你的 *.mc 档案里面没有这一行:
       
      include(`/usr/share/sendmail-cf/m4/cf.m4')
       
    那么你就必需要执行两个档案的 m4 转换,否则只要执行一个即可!假设您的 m4 script 档名为 redhat.mc ,那么您可以这样转换 sendmail 所需要的 sendmail.cf :
     
    Red Hat 7.2 以前版本:
    1. 若 redhat.mc 里面没有 include 的项目,则:
    [root@test root]# cd /usr/share/sendmail-cf/cf
    [root@test cf]# m4 /usr/share/sendmail-cf/m4/cf.m4 \
    >  redhat.mc > redhat.cf
     
    2. 若 redhat.mc 里面已经包含了 include 的项目,则:
    [root@test cf]# m4 redhat.mc > redhat.cf
      
    Red Hat 7.3 (含 Red Hat 9) 以后版本:
    1. 若 sendmail.mc 里面没有 include 的项目,则:
    [root@test root]# cd /etc/mail
    [root@test mail]# m4 /usr/share/sendmail-cf/m4/cf.m4 \
    >  sendmail.mc > redhat.cf
     
    2. 若 sendmail.mc 里面已经包含了 include 的项目,则:
    [root@test mail]# m4 sendmail.mc > redhat.cf
     
    上面制作而成的 redhat.cf 就是 sendmail.cf 的内容啦!然后请将你的 sendmail.cf 备份,举个例子来说, Red Hat 的 sendmail.cf 在 /etc/ 底下,所以我可以这样做:
     
    [root@test cf]# mv /etc/sendmail.cf /etc/sendmail.cf.old
    [root@test cf]# cp redhat.cf  /etc/sendmail.cf
    # 若是 Red Hat 7.3 以后版本,则
    [root@test mail]# cp redhat.cf  /etc/mail/sendmail.cf
     
    这样就成功啦!
     

  • 修改 Red Hat 7.x 以后版本 ( 含 Red Hat 9 )的设定档:
     
    我们说过, Red Hat 7.x 以后版本的设定档里面已经将邮件来源的接口定义为『仅来自 127.0.0.1 这个界面』,所以我们必需要开放监听的界面才行!请注意,这里仅开放『监听』而不是开放 Relay 喔!如果您使用 Red Hat 7.1/7.2 ,那么请修改您的 /usr/share/sendmail-cf/cf/redhat.mc ,如果是 Red Hat 7.3 ,则修改 /etc/mail/sendmail.mc !我们这里都以 sendmail.mc 为主来说明,如果您是使用 Red Hat 7.2 以前版本,请记得搜寻相关的档案喔!至于非 Red Hat 系统,例如 Open Linux ,则可以略过这个步骤喔!
     
    1. 寻找档案的内容
    [root@test root]# cd /etc/mail
    [root@test mail]# vi sendmail.mc
    找到下面这一段:
    DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
    将他改成
    DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')
    储存后离开

    2. 重新制作档案:
    [root@test mail]# m4 sendmail.mc > redhat.cf
    [root@test mail]# mv sendmail.cf sendmail.cf.old
    [root@test mail]# cp redhat.cf sendmail.cf

     
    这样就大功告成啰!

启动 Mail Server
 
Mail Server 的启动是相当的简单的,在 Red Hat 的系统当中,你可以依序启动 sendmail 以及 POP3 这个服务喔:
 
1. 启动 sendmail
[root@test root]# /etc/rc.d/init.d/sendamil start
Starting sendmail:                                         [  OK  ]

2. 启动 POP3 这个协定
[root@test root]# cd /etc/xinetd.d
[root@test xinetd.d]# vi ipop3
# 找到下面这一行:
disable = yes
# 将他改成
disable = no
# 储存后离开!至于更详细的说明,可以参考『的』喔!

[root@test cf]# /etc/rc.d/init.d/xinetd restart
[root@test cf]# netstat  -tl
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:pop3                  *:*                     LISTEN
tcp        0      0 *:smtp                  *:*                     LISTEN

 
看到了吗?这样我们的 Mail Serve 就已经启动了!他已经可以进行收信与送信的工作啰!事实上,如果您曾经以 vi 检查过 /etc/rc.d/init.d/sendmail 这个档案的话,你会发现他其实就是使用 /usr/sbin/sendmail 这支程序在工作的啦!他通常的指令下达方式为:
 
[root@test root]# /usr/sbin/sendmail -bd -q30m
参数说明:
-bd : 表示将 sendmail 以 daemon (可以想成常驻内存的类型) 的类型启动!
-q  : queue 的意思,后面接的是时间参数,时间参数有:
    s (秒) m(分) h(小时) 及 d(天)
    -q30m 表示每隔三十分钟,会将放置在邮件队列 ( 一般是在 /var/spool/mqueue ) 
    的邮件尝试寄出一次!所以,上面的例子当中,说的是将 sendmail 以 daemon 
    的类型启动之后,并且每 30 分钟去将邮件队列(为寄出的邮件)尝试寄出一次!
 
而 Red Hat 针对邮件队列寄送邮件的时间,则是设定在 /etc/sysconfig/sendmail 这个档案里面喔!
 
注:
如果您在启动 sendmail 的时候,出现类似这段文字:
*** Warning: File `virtusertable.db' has modification time in the future (2003-01-13 11:57:26 > 2003-01-13 06:04:40)
make: warning: Clock skew detected. Your build may be incomplete.
这表示您在安装 Linux 的时候,可能发生一些时间上面的错误判断了!导致于你的 sendmail 相关的设定档竟然比目前的时间还要新,也就是该档案乃『来自未来』~这个时候你可以使用:
touch /etc/mail/*
来将档案的时间更新为目前的时间,那就可以顺利的启动 Sendmail 啰! ^_^
 

设定主机名称
 
启动了 Sendmail 之后,还需要规定你的主机名称喔,这样,你的邮件主机才能正常无误的开始工作吶!假设您的主机 IP 可以在 Internet 上面以 DNS 系统查询到,以我为例,我的机器上面有 及 tsai.adsldns.org 两个主机名称,并且这两个主机名称均指向我家里的那一部机器,那么假如我只要 tsai.adsldns.org 具有收信的资格,如果人家寄信到 则不予以接受,并将该封信件退回去时,可以这样做:
 
[root@test root]# cd /etc/mail
[root@test mail]# vi local-host-names
tsai.adsldns.org
 
在该档案里面仅存在一个主机名称即可!那么万一我有三个主机名称,分别是 tsai.adsldns.org, 及 tsai.linux-site.net,而且我这三个主机名称都希望可以收到信件时,那么你就必需要这样修改啰:
 
[root@test root]# cd /etc/mail
[root@test mail]# vi local-host-names
tsai.adsldns.org

tsai.linux-site.net
 
每一行有一个主机名称!请记住,未来如果您的主机新增了不同的 HOSTNAME ,并且你希望该主机名称可以用来收发信件,那么要修改 local-host-names 喔!那么什么时候不要将所有的主机名称都给他写到这个 local-host-names 里面去呢?!由于目前的广告信件实在是太多了,他们会主动的在 Internet 上面搜寻一些主机名称,然后随机四处发送垃圾邮件。如果您的主机有四个名称,每个主机名称都写到 local-host-names 去的话,呵呵!很可能一封广告信您会『收到四次』,因为四个主机名称嘛!所以啰!有的时候还是不要让全部的主机名称都可以收信是比较好的吶!
 

设定邮件服务器使用权限 /etc/mail/access
 
在你启动了 Sendmail 以及设定好主机名称 ( local-host-names )之后,那你就可以利用『在你的主机上面利用你的主机来寄信』了!为什么要加上『在你的主机上面』呢?还记得我们在前面有提过,为了杜绝广告与垃圾信件,所以预设的情况中, Sendmail 是关闭 Open Relay 的对吧!但是为了主机使用者的方便,所以我们预设是有启动 local 这个 Mailer ,也就是说:
  1. 只有使用者是在主机上面发信的,例如使用 后,以 mail 这个指令来发信;
  2. 又或者使用者直接在主机上面使用 X-Window System 里面的邮件代理人,亦即是 Netscape 或者是 Kmail 等软件来发信
的时候,我们的 Sendmail 才会帮使用者『寄信』喔!至于其它的计算机来源的『寄信』邮件,Sendmail 一概将他退信回去!那么如果我想要在其它的计算机上面使用我这部 Mail Server 来寄信呢?这个时候就要编辑『/etc/mail/access』这个信任网域设定的档案啦!假设一个例子好了:
  • 我的 Sendmail 主机想要支持我内部网域的所有计算机来寄信,而我内部网域的计算机 IP 网段为 192.168.0.0/24 这一段;
  • 还有,我另外有一个公共 IP ( Public IP )为 140.116.44.125 ,也想要让他可以寄信;
  • 此外,我发现 192.168.1.100 计算机使用者都会乱寄垃圾给我的邮件主机,所以我想要挡掉他;
  • 那个 h8h.com 也有问题,我也要挡掉这个网域 (domain) 的来源;
  • 更发现有个使用者叫做 test@testing.domain.name 也是色情广告信业者!
那么我可以怎样设定 Sendmail 的存取权限呢?
 
[root@test root]# vi /etc/mail/access
# 预设情况下有启用的 IP
localhost.localdomain           RELAY
localhost                       RELAY
127.0.0.1                       RELAY

# 想要开放权限的 IP 与网域
192.168.0           RELAY
140.116.44.125         RELAY

# 挡掉的 IP、主机名称与 E-mail
h8h.com       DISCARD
192.168.1.100    DISCARD
test@testing.domain.name  REJECT
# 储存后离开

[root@test root]# makemap hash /etc/mail/access < /etc/mail/access

 
在 /etc/mail/access 当中,只要有加上 # 就是批注内容,所以不会被读入数据库当中!其实真正的 Sendmail 可以读得到的数据库是 /etc/mail/access.db 这个档案,不过,我们必需先在 /etc/mail/access 编辑完毕后,再以 makemap 这支程序将他改写成为数据库!所以,不要忘记 makemap 那个步骤喔!由上面的档案我们就可以知道啦, access 的语法为
规定的范围          规定可以在sendmail上面的动作
IP/不完整IP/主机名称/E-mail   RELAY/DISCARD/REJECT
在『规定范围』与『规定可以在 sendmail 上面的动作』两项目之间最好以 按键来隔开会比较正确!『规定的范围』还可以设定『来源』与『目的』喔!例如:
from:test@your-domain.com.tw  REJECT
to:blah@your-domain.com.tw   REJECT
当信件想要使用我们的邮件主机来进行寄信或者是 Relay 的动作时,首先会传送 mail header 到我们的 mail server 上面,这也就是一些邮件的基本数据(如认证信息、来源IP、目标的 MTA 等等),但并不包含邮件的内容(例如信件本体、附件夹带等等的内容)。也就是说,一封邮件基本上可以分为两大部分,分别是 Header 与 Body ,Header 仅记录邮件基本信息,Body 才是真正的信件内容。当邮件想要进入 MTA 时,会先发送 Header 给 MTA ,MTA 判断这个 Header 的信息是可接受的之后,才后继续接受来源主机的邮件 Body 内容!如果这些基本讯息传送过来的主机信息包括在 /etc/mail/access.db 里面所记录到的主机(或IP)范围时,就可以指定底下这些动作:
  • RELAY:允许该来源主机所传送过来的邮件可以被接受,然后再进行 Relay 的动作。以上面的范例为例,则 192.168.0.0/24 来源的计算机所发送来我们 Mail Server 的邮件将会被接受喔!
  • REJECT:若来源主机的主机名称或 IP 在 REJECT 的情况下,则我们 Mail Server 将不会接受对方的邮件内容(就是 body 部分),『并且会回传一个错误或警告讯息给原发信端』喔!
  • DISCARD:与 REJECT 相似,亦即关闭规定范围内的计算机主机的 RELAY 功能,不过, Sendmail 会直接将该信件『丢弃』而不会『退回』!
通常我们比较建议使用 DISCARD 啦!为什么呢?如果该 IP 来源传送的是广告信件,您又使用 REJECT 的话,那么两方面的邮件主机将会一再地进行 mail header 的传送,也是挺消耗频宽的!所以我们比较建议使用 DISCARD!再来,由于 access 不支持网域的写法,亦即
192.168.0.0/24
192.168.0.0/255.255.255.0
这种类型的网域写法并不能被使用的!所以,只能以 192.168.0 这种写法来达成整个网域的设定了!也就是说, access 里面大概只能支持 A/B/C Class 的网域, subnet 大概就无法达成了!只能一个一个 IP 的 Keyin 啰!编辑完这个档案之后,就可以让你的其它主机使用 Sendmail 的 Relay 功能啰!还不赖吧!
 

重要观念:一封信件的收受流程
 
OK!到目前为止的 Sendmail 主机设定而言,你的 Mail Server 应该已经能够应付一个小型的企业单位了,不过,为了让您能够更清楚的知道『我要如何控制我的 Mail Server 』,我们底下将会以 Sendmail 收受一封信件的流程,来介绍信件的传送方向,好让您更清楚的了解到你的 Mail Server 在干啥好事喔!一般而言,当你的 Sendmail 收到一封信件时,他是怎样判断这封信件要怎样传送的呢?我们先谈一谈如果 Sendmail 收到一封『非本机端送出的来信』时,他是怎样处理这封信件的?
  1. 当 MTA 收到一封邮件,并且该邮件的『信件收件者』为 MTA 本身的用户账号时,此时将会以本机端 ( local ) 的收件规则来进行收件,如果 /etc/mail/access.db 没有针对来源 IP 或者 host 或者 e-mail 抵挡时,则该封信会被我们的 MTA 收下来,并且储存到 /var/spool/mail 里面。例如,当我的 tsai.adsldns.org 收到一封给 vbird@tsai.adsldns.org 的邮件,并且 /etc/mail/access.db 没有针对来源抵挡 ( 在不考虑 procmail 的情况下 ) ,那么我的 tsai.adsldns.org 这部主机,会立刻将该封邮件存放到 /var/spool/mail/vbird 里面去,而不必经由『认证』或者抵挡的机制。请注意,在这个情况中, Sendmail 并不会去检查送件者是否来自于信任网域喔 ( 只要 /etc/mail/access 没有挡到的主机或IP或其它的 e-mail 信息 )!
     
  2. 如果这封邮件的『信件收件者』并没有 MTA 本身的用户账号时,那么 MTA 会以 SMTP 这个外送规则来传信,此时 MTA 会开始去检查 /etc/mail/access.db 这个数据库里面,任何有关于送件者的 IP、E-mail 以及相关的动作等,如果该封邮件有相关的数据在 /etc/mail/access.db 里面时 ( 不论是 RELAY, REJECT 或是 DISCARD ) 那么该封邮件就会依照 /etc/mail/access.db 里面指定的行为进行邮件的动作(可能是 RELAY 或 DISCARD 等等)!
     
  3. 如果该封邮件经过上面两道手续后,仍然找不到任何有关的动作讯息,那么这封邮件将会退回给原发信者!
上面的信件收受行为是在没有 SMTP 邮件认证以及 procmail 这个 MDA 管理的时候所具备的动作!如果加入 SMTP 或者 procmail 之后,会变成怎样呢?呵呵!先不告诉你,待会继续往下看再说吧!
 
关于广告信的收受
 
很多人常常会发现这样的一件事,就是:『为什么有人利用我的 mail server 寄信给我?』举个例子来说,假如我的一部 Mail server 主机名称为 mta.domain.name ,而他上面有个实体邮件用户为 user@mta.domain.name !这个 MTA 主机并没有对外开放 RELAY 的功能喔!但是有一天, user 这个人还是接到广告信了!更神奇的是,该封广告信的发信者为 someother@mta.domain.name !怪怪!明明我的 mta.domain.name 就是没有 someother 这个用户,怎么还可以用我的主机寄信给我自己呢?
 
好了,现在请仔细的参考一下上面的三个步骤,你会发现一件事情,就是『第一个步骤中,如果发现该封信的收件者有本机的账号时,且 /etc/mail/access 没有抵挡到该封信时,则该封信件就会被接收下来!』对啦!就是因为如此,因此,对方可以用你的 mail server 寄信给你!不过,还好的是,这样的情况中,该封广告信只会在你的 Mail Server 内传送,并不会寄出去外部的!注:因为要寄到外部去,就需要 RELAY 的功能啦!
 
上面提到的是关于『来自 MTA 外部的信件』时的处理动作,那么如果这封邮件是来自于『主机内部』的行为呢?例如:使用者以 后,使用 mail 这个指令来执行寄信的动作,又或者是直接在 MTA 这部主机上面的 X Window System 内的 Kmail 来发信呢?由于我们刚刚在设定 sendmail.mc 这个档案的时候,你会发现一句设定值:
MAILER(local)
或者是
Cwlocalhost.localdomain
这两个设定都代表『本机寄出的邮件可以不用经过 SMTP 的手续,将直接以 sendmail 的功能寄出』,这也就是说,无论如何,来自主机内部的信件都将被传送出去!这也是为什么有的时候明明你的 sendmail 没有正常的启动,但是在主机上面直接以 mail 这个指令却还是可以将邮件送出的原因啦!
 
例题:曾经有朋友发现一个有趣的现象,那就是他的 WWW 网站提供 CGI 的功能 ( 所谓的 CGI 指的是一些动态的网页内容,例如,这些功能很多是利用 perl 语言或者其它语言写成的程序喔!),他所提供的 CGI 程序的功能可以帮助使用者寄信,后来发现很多人便藉由这个 CGI 的网络功能,使用他的 WWW 主机发送大量的广告信,他就很生气的将他自己的 WWW 主机的 Sendmail 关闭,也就是将 smtp 的 port (25) 关掉,以为这样就可以将广告信杜绝啦!但是,广告信却还是一直的发送!并没有停下来!您知道为什么吗?!
答:
原因应该很简单吧!因为 WWW 在 Linux 本机上面跑,而管理员提供的的 CGI 是在 WWW 上面跑,也就是说,这个 CGI 本来就是利用 Linux 的 Sendmail 在传送邮件的,那既然 sendmail 本来就可以不需要透过 smtp 的 port 来传送邮件,自然你的广告信就还是可以自由的发送出去啰!

设定使用者别名 /etc/aliases
 
一、群组寄信的功能:
约略了解了 Sendmail 整体之后,目前你的 Sendmail 应该也可以顺利正常的运作了!不过,还有个重要的课题要来讨论,那就是关于『群组寄信』的问题啦!假设你是在学校单位里面,在这所学校里面的每个同学都有自己的账号,而学校的老师也都是使用同学的电子邮件来联络感情!不过,要记住一个班级 30~50 个同学的电子邮件地址实在不怎么好记,加上未来同学们毕业,新的同学又加进来,哇!岂不头疼~这个时候您可以帮助这些善良的老师们啦!就利用这个『使用者别名设定』的功能即可!怎么作呢?我们可以将一个班级取一个代号,例如预计 92 年毕业的 13 班,就称为 student9213 这样的账号,但是这个账号并非是实体用户喔!他仅是一个别名而已!基本上,他代表了 92 年毕业的 13 班的全体同学的电子邮件!这个功能可以透过编辑 /etc/mail/aliases 来达成喔!( 注:这个档案不一定在 /etc/aliases ,有时会在 /etc/mail/aliases ,完全依照当时使用 filename.mc 定义时的路径而定的! ) 这个 /etc/mail/aliases 的语法有点像这样:
在邮件上面的收件者账号:  真实账号1, 真实账号2, 真实账号3....
birdhouse:          bird1, bird2, bird3, bird4
在上面的例子中,『真实账号1...账号3 中间的所有账号与账号之间都以逗号隔开而已!』你也可以在逗号后面接空格符,这是没有关系的!但是不能只接空格符而没有逗号喔,不然就会造成人名的误判!而 birdhouse 那一行就更清楚啦!当我寄出一封信给 birdhost@tsai.adsldns.org 时,在 tsai.adsldns.org 主机收到这封信之后,会将该封信复制成四封并分别寄给 bird1, bird2, bird3, 及 bird4 四个使用者,所以你只要记住 birdhouse 就行了!所以,如果用在上面学校单位的那个例子时,就可以这样进行:
 
1. 编辑别名设定档:
[root@test root]# vi /etc/aliases
新加入这一行在 aliases 的最底下:
student9213:  st001,st002,st003,st004.st005,st006,st007.....

2. 制作数据库 /etc/aliases.db 
[root@test root]# newaliases

 
要注意的是,与 /etc/mail/access.db 相似的,我们 sendmail 读取的数据库格式其实是 /etc/mail/aliases.db 这个档案,所以当你编辑完成 /etc/mail/aliases 之后,记得一定要使用 newaliases 这个指令来将数据变成数据库喔!否则 sendmail 将不会读取到您刚刚修改完成的变动!这个群组寄信功能相当的不赖,如果你有四个计划在你的 Linux 主机上面,而这四组人都是你管的,但是这四组人又互相没有信息的交流,那么你就可以进行这四组人的邮件群组功能,同时,将你的实体账号分别加入这四个群组中!哈哈!就可以收到这四个群组的信件啰!
 
二、使用者的别名设定与重要邮件备份:
除了群组功能之外, aliases 还可以用来做为一个用户多个邮件名称的设定喔!例如,小老弟我,鸟哥的浑号仅在 Linux 里面通称而已,一般的上班单位里面,仍然主要以我的名字记忆我的邮件的!也就是说,我具有两个账号在我的 tsai.adsldns.org 上面,分别是 vbird@tsai.adsldns.org 及 dmtsai@tsai.adsldns.org !那么我是否还要建造另一个实体使用者账号呢?当然不需要,我只要在 /etc/mail/aliases 里面加入一行:
 
1. 编辑别名设定档:
[root@test root]# vi /etc/mail/aliases
dmtsai:  vbird

2. 制作数据库 /etc/mail/aliases.db 
[root@test root]# newaliases

 
那么未来这两个电子邮件均将寄到我的 /var/spool/mail/vbird 信箱里面去喔!所以,不论是寄给 dmtsai 还是 vbird ,我都可以直接以 vbird 这个账号来取得这两个邮件地址的信件,因为都这两个邮件都放到 /var/spool/mail/vbird 这个信箱嘛!相当的方便吧! ^_^另外,如果我要将某个账号在收信时,顺便备份一份到系统当中时,例如寄信到 vbird 时,顺道寄一份到 testing 时,可以这样做:
 
1. 编辑别名设定档:
[root@test root]# vi /etc/mail/aliases
dmtsai:  vbird
vbird:     vbird,testing

2. 制作数据库 /etc/mail/aliases.db 
[root@test root]# newaliases

 
如此一来,则寄给 vbird 的信件,vbird 自己保留一份之外,也会再寄给 testing 这个人喔!可以做为备份的需要啦!
 
三、外部信件的寄送
另外,如果你的电子邮件想要将该邮件外传的话,要怎么做?这个同样可以做为邮件的『异地备援』之用!怎么说呢?同样用我们的 tsai.adsldns.org 来做说明吧!假设我的账号 vbird@tsai.adsldns.org 送到 tsai.adsldns.org 之后,要再传送一份给 vbird@vbird.adsldns.org ,也就是说,信件传送到 tsai.adsldns.org 这部主机的 vbird 后, tsai.adsldns.org 会主动的再将该信件外传到 vbird.adsldns.org 这一部上面去!怎么做呢?你可以这样搞定:
 
1. 编辑别名设定档:
[root @test root]# vi /etc/mail/aliases
dmtsai:    vbird
vbird:     vbird,vbird@vbird.adsldns.org

2. 制作数据库 /etc/mail/aliases.db 
[root @test root]# newaliases

 
如此一来,任何人寄给 vbird@tsai.adsldns.org 的邮件,都会额外再多寄一份给 vbird@vbird.adsldns.org !就可以达到异地备援的目的啦!很方便吧!此外,你也可以用来做为 Mail list 呢!嘻嘻!
 
四、档案类型的别名 include
再让我们回到第一点『群组寄信』的地方,您会不会觉得,如此一般的设定方法,在经过了几年之后,你的这个 aliases 会变的乱七八糟的!所以这里再让我们学个有用的技巧,就是利用 aliases 里面的 include (包括) 功能,使用档案类型的方法来达成群组寄信的目的!举上面学校相同的例子来说明好了,今天我的 student9213 这个群组账号中,所有的人员都给他写入 /etc/mail/student9213 这个档案当中,然后再以 include 的功能给他写入 aliases 这个档案中~你可以这样做:
 
1. 编辑 /etc/mail/student9213 :
[root@test root]# vi /etc/mail/student9213
st001, \
st002, \
st003, \
st004, \
....
st050
假设共 50 个学生,则最后一个不用加上『 , \』!与变量设定规则相符!

2. 还是要编辑 aliases 的!
[root@test root]# vi /etc/mail/aliases
dmtsai:        vbird
vbird:         vbird,vbird@vbird.adsldns.org
student9213:   :include:/etc/mail/student9213

3. 制作数据库 /etc/mail/aliases.db 
[root@test root]# newaliases

 
整个写法是:
群组账号: :include:使用的档案完整档名
请注意,这个档案类型的格式为『:include:』亦即 include 两边都有冒号,并且,在最前面账号的地方也有冒号喔!不要记错了~至于在 /etc/mail/student9213 这个档案中的写法与 aliases 后面接的账号或 E-mail 类型写法相同,例如:
vbird, vbird@vbird.adsldns.org, userID@host.domain.name
不过,我们也可以利用跳脱字符『\』来加以格式美观化,会比较整齐画一喔!但是,仍然不要忘记了那个可爱的『逗号』喔!例如上面表格里面的 st001, .... 说明的样式!这部份如果不太明了的话,请拿出,好好的看一看 里面介绍的变量设定规则吧! ^_^!
 
上面提到的都是关于系统管理员设定的数据部分,那么预设的 aliases 里面有什么东西呢?通常有这些数据存在的喔:
 
[root@test root]# vi /etc/mail/aliases
# 基础 sendmail 资料!由于 sendmail 预设使用 mailer-daemon 与
# postmaster 做为数据发送者,或者是信件被退回时的账号!但是我
# 们的系统并没有这两个账号,因此,必需要使用 aliases 的功能!
# 如果是使用 sendmail ,那么底下这两行『务必存在』才行!
mailer-daemon:  postmaster
postmaster:     root

# pseudo accounts. 也就是系统的账号,这些账号是给系统来使用的,
# 基本上,这些账号并无法登入主机,但是偏偏某些程序进行时,产生
# 的错误讯息可能会寄给该系统账号,但该账号无法登入,所以会让系统
# 无形之中遗失许多的信息,所以啰,这些账号也需要来做 aliases 
# 并且将收件者交给系统一定会有的人物! root 是耶!通常这些账号
# 常见的有 bin, daemon, adm, lp, sync, shutdown, halt, mail, news
# uucp, operator, games, gopher, ftp, nobody, named, xfs, system, 
# 等等等等!
bin:            root
daemon:         root
adm:            root
lp:             root
sync:           root
shutdown:       root
....(略).....

# trap decode to catch security attacks 有些攻击者在攻击你的主机时,
# 该相关的信息会寄给你的 decode 这个账号,将他转成 root 吧!
decode:         root

# 这是 root 的收件信者! 由于预设状况中, root 是不能在主机外部
# 的任何一部计算机收信的!如果您想要让你的一般账号可以接收 root 的
# 信件,以实时掌握主机信息,那么底下的 # 将他打开,后面接你的
# 账号吧!
#root:          your_account

 
这些资料在 aliases 当中是必需要的喔!如果你是自行以 Tarball 建立 Sendmail 的话,那么这个 aliases 可是需要加入的吶!
  • 什么是 Mailling list :我们刚刚在 aliases 里面有进行过群组寄信对吧!那么你寄给某个账号时,该账号会将你的来信再寄给该群组账号的所有人员,此外,还可能将该封信件也备份一份在自己的机器上,这个功能就可以称为是 Mailling list 啦!有点像是目前很流行的『电子报』之类的咚咚!也就是说,我们可以用这个很简单的 aliases 这个档案就可以达到 Mailling list 的功能了!

设定邮件转递 ~/.forward
 
了解了 aliases 之后,是否会发现一个问题呢?那就是,虽然 aliases 可以帮我们达到 mailling list 的功能,但是『只有 root 才可以修改该 aliases 档案』,那么万一我并不是网站管理员,怎么办?是否还是可以建立一个 mail 转寄的功能呢?确实还是可以啦!这个时候可以使用邮件转寄 ( mail forward ) 的功能喔!你可以在该账号的家目录之下建立一个档案,档名为 ~/.forward ,利用该档案就可以达到 Mailling list 的功能啦!
 
还是来假设个案例啰:假设我有一个账号,名称为 birdhouse ,而我希望寄信给该 birdhouse 时,就可以将信件分送给该 MTA 主机上面的 bird1, bird2, bird3, 及 bird4 之外,还可以寄给外部的 bird@yahoo.com 及 bird@pchome.com 此外,还记录一份给 birdhouse 这个主要账号!这个时候你可以这样做:
 
[birdhouse@test birdhouse]$ cd ~
[birdhouse@test birdhouse]$ vi .forward
birdhouse
bird1
bird2
bird3
bird4
bird@yahoo.com
bird@pchome.com
[birdhouse@test birdhouse]$ chmod 644 .forward
 
直接将你要寄出去的邮件地址都写到 ~/.forward 里面去,每个地址都占用一行,如此一来,嘿嘿!只要是寄给 birdhouse@tsai.adsldns.org 的邮件,就可以自动的来传送到 ~/.forward 内部所设定的邮件地址啰!同时,这个档案除了可以用来建立类似 mailling list 的功能外,也可以让你自己设定『异地备份邮件』的功能呢!就是在该档案内写入你自己的账号以及外部信件的邮件地址,那么当你的主机收到要给你的信时,除了给你一份外,还会再转一份给你订定的邮件地址!而最大的优点是,『不需要建立数据库或者重新启动 sendmail !』以 vi 设定完,并且储存后,立刻生效!好用的很~
 
不过需要注意的是,由于这个档案是这样的方便设定,万一被某些居心不良的人看到甚至可以修改时,那可就不得了了!你能想象你的信件都会被复制一份到某人的信箱吗?所以啰,这个档案必需只有你能修改,其它人则仅能查阅而无法修改才行喔!亦即这个 .forward 档案的权限必需要:
  1. 该档案所在使用者家目录权限,其 group、other 不可以有写入权限。
  2. .forward 档案权限,其 group、other 不可以有写入权限。

察看信件队列 ( mailq )与 Mailers 状态
 
关于信件队列
对于 Sendmail 设定到目前为止,应该也可以正常的应付蛮多工作的啦!但是我们还是得要了解一下的是:『如果我将邮件送到 Sendmail 主机后,Sendmail 便会帮我将该封邮件传送到目的地的 MTA ,不过,如果目的地 MTA 主机有问题时,这封信会怎么跑?』一般来说,如果 DNS 设定正确的话,也就是说目的地 MTA 有 MX 标志存在时,只是刚好这部主机暂时无法联机,或者是有些问题,导致无法立即接受来自你的 MTA 的邮件,此时这封邮件将会被放置到你的 MTA 主机的队列目录去,通常预设是在 /var/spool/mqueue 当中!然后在一定的周期时间内, Sendmail 会定时的尝试将邮件寄送出去,一般 Sendmail 的预设设定是:
  1. 如果该封信在五分钟之内无法寄出,则系统会发出一封『警告信』给原发信者,告知该封邮件尚无法被寄送出去,不过,系统仍会持续的尝试寄出该封邮件;
  2. 如果在四小时候仍无法寄出,系统会再次的发出警告信给原发信者;
  3. 如果持续进行五天都无法将信件送出,那么该封邮件就会退回给原发信者了!
在 Red Hat 的预设条件中,在 /var/spool/mqueue 当中的信件会每隔 60 分钟由 Sendmail 尝试重新传送一次到目的地去!这个尝试的时间是可以改变的!可以利用 sendmail 的指令或者直接修改 /etc/sysconfig/sendmail 里面的 『QUEUE=时间』来修订!例如,如果你想要让 Sendmail 每隔 30 分钟就帮你尝试传送 /var/spool/mqueue 里面的未寄出的信件时,那么就将 /etc/sysconfig/sendmail 这个档案里面的『QUEUE=1h 』改成『QUEUE=30m 』即可!
 
信件队列的内容
老实说,信件队列的内容是给 Sendmail 看的,不是给人看的,所以我们都不可能看的懂他的讯息!这个时候,只得以 Sendmail 的指令来反查这些邮件队列到底是什么咚咚了!很简单的,只要下达 mailq 或者是 sendmail -bp 就可以这些邮件队列的基本数据!
 
[root@test root]# mailq
                /var/spool/mqueue (1 requests)
----Q-ID---- --Size-- -----Q-Time----- ------------Sender/Recipient------------
h1LEKYR23711    36414 Fri Feb 21 22:20
                 (Deferred: Connection refused by vbird.adsldns.org)
                                      
 
Q-ID:表示此封邮件队列的代表号 ( ID );
Size :这封信有多大容量 ( bytes )的意思;
Q-Time:这封信什么时候进入 /var/spool/mqueue 这个目录的,并且说明无法立即传送出去的原因 (例如上面的 Deferred );
Sender/Recipient:送信与收信者的电子邮件啰!
 
如果您有开放邮件的话,那么记得偶而要去看一看您的邮件队列 ( mailq ) 是否存在大量的未寄出信件喔!好让你知道是否可能被当作转信站啦!
 
关于邮件在 Mailer 中的统计状态 ( mailstats )
除了 记录了在信件队列的信息之外,还有一个档案可以纪录 sendmail 由『开始运作到目前为止,邮件的收发总计资料』喔!预设就是 /etc/mail/statistics 这个属性为 data 的档案,那么我怎么将这个档案的数据读出来呢?很简单啊!就藉由 mailstats 这个小指令来读取即可!读取出来的结果有点像这样:
 
[root@test root]# mailstats
Statistics from Sat Mar 23 21:34:09 2002
 M   msgsfr  bytes_from   msgsto    bytes_to  msgsrej msgsdis  Mailer
 4    50752    9126380K    23617    5425714K     1070     122  esmtp
 9    21329    5919236K    65162   13364494K     1068       8  local
=============================================================
 T    72081   15045616K    88779   18790208K     2138     130
 C    72081                88779                 2655
 
上面共出现七行,第一行只是显示目前的时间而已,至于每个直列的意义为:
  • M     :只是一些邮件工作(Mailer)代号的标题啦!不过,重要的地方在第六行的 T ,那个是『Total 总和』的意思~
  • msgsfr:共有多少封信由这个邮件工作 ( mailer ) 所发出去的呢?以第四行最右边看到的 local 为例,这表示由 local 发出的信件共有 21329 封的意思~
  • bytes_from:表示的是信件数据容量,同样以第四行 local 为例,他发出的 21329 封信,共有 5919236K 喔!
  • megsto:与 msgsfr 类似,只是 msgsfr 是寄出数据,而 megsto 则是『收到的信件封数』以上面的数据来看,则 local 收到的共有 65162 封信!
  • bytes_to:这就不需要解释了吧! ^_^
  • msgsrej:那个 rej 是 reject (拒绝) 的意思,这一列是信件被 deny 的次数;
  • msgsdis:那个 dis 是 discard 的意思,同样是 deny ,只是经由 discard 的程序就是了!
  • Mailer :就是 sendmail 许多 mailers 当中的一个啦!那个 esmtp 主要用来对外,至于 local 则主要针对本机端的 mailbox 啰!
由上面的资料你会发现,哇!怎么鸟哥的信箱 15GB 的信件啊!真可怕~别担心,那个数据是由『 sendmail 开始运作到现今』的结果,我的 sendmail 运作了若干年了,有这样的信件资料量其实不怎么吃惊啦! ^_^

客户端的使用说明
设定 Mail Server 就是要拿来用的!所以,当然要介绍一下怎么使用 Mail Server 啦!我们分为 Linux 与 Windows 稍微做介绍啰!

  • Linux 下使用 mail 功能
    在 Linux 的系统当中,一定会存在的客户端当中的邮件指令就是 mail 这个指令啦!由于这个 mail 指令是直接使用 sendmail 的 local 端的功能,所以使用 mail 时,即使你的 port 25 没有启动,仍然可以寄信喔!(但是在 Red Hat 9 以后,已经将这样的功能取消了!所以您至少需要启动 sendmail 的预设设定,亦即仅监听 127.0.0.1 的 port 25 才行!)早期没有 POP3 这个协议的服务时,用户在使用 mail 都需要登入主机之后,才能以 mail 这个指令来操作邮件呢!现在就幸福多了,可以直接用 Netscape 之类的软件来收发电子邮件说。来谈一谈怎么发信与收信吧!
     
    • 用 mail 直接编辑文字邮件与寄信:
      使用 mail 最简单的方式就是直接的使用在线编辑的方式来将文字数据传送出去啰!假如你要发一封信给 vbird@qqdomain.name 时,你可以使用『 mail user@email.domain.name 』的格式,所以你可以这样做:
      [root@test root]# mail vbird@qqdomain.name
      Subject: This is a test mail
      There are writing area!
      You can't use the Up/Down button in this form...
      you can finish with "."
      <==这个『.』就是结束符号!要正常离开编辑画面就是 . !
      Cc: <==这就是副本!
      如同上面的样式,mail 会主动的显示 Subject 给你,你可以输入这封信的标题在此~然后就进入编辑画面啦!你可以在编辑画面中写入中英文喔!之后,最重要的是,一定要在开头的地方输入那个句号『.』,这样 mail 就会开始将信传送出去。在 Red Hat 的预设状况中,还包含提供了一个副本收受者的邮件地址,就是出现 Cc: 那边,你可以在后面再接上另一个邮件地址,那就是副本啦!这样就将信寄出啰!
       
    • 使用 IP 测试寄信:
      万一你的 Linux server 并没有 domain name 时,是否就无法建置 Mail Server 了呢?当然不是啦!还是可以架设 Mail Server 的啦,还记得我们在前面的网络基础里面有提过啦,既然有内部 lo 的接口,自然就一定可以让我们『测试 tcp/ip 架构』的设定啦!既然如此,我又没有 domain name ,又架设了一个提供只有少数人知道的 mail server 时,那么人家怎么寄信给我啊!呵呵!很简单啊!就利用 IP 来寄信啊!怎么寄出去?
      [root@test root]# mail vbird@[127.0.0.1]
      [root@test root]# mail vbird@[192.168.0.100]
      看到了吗?就是将 domain name (FQDN) 以 IP 来置换,而且,使用中括号将 IP 包起来,这个中括号很重要啊!不要忘记了喔!使用 IP 寄信仅是一个权宜之计,毕竟没有多少人会记得你的主机 IP 啊!并且,若是使用 ADSL 计时制的拨接方式,那么得到的 IP 是 ISP 动态分配的 ( dynamic ),所以可能每次上网的 IP 都不固定~那么不是会搞死人....所以啦,申请一个 domain name ,如果每次上线都会不同 IP 的情况下,也可以申请免费的动态 DNS 系统的领域名称,而使用国内的 ISP 提供的主机名称自动对应 IP 的功能也可以啦!这些名称都可以用来架设 mail server 喔!
       
    • 用 mail 寄出纯文本文件:
      还记得里面的 提到的标准输入 ( < ) 吗?既然我使用 mail 的时候需要用到键盘输入,那么我当然可以利用『』来使档案替代键盘的 Keyin 啰!因为在 mail 的编辑画面中,我们无法使用上下左右按键,而且,如果你刚刚在上一行写错字了,还没有办法回到上一行呢!编辑上面实在不怎么人性化。所以,我可以使用任何的文字编辑软件,将我的信件编辑成档案,请注意,必需是纯文字文件喔!然后再将该档案寄出即可!例如我要将 root 家目录底下的 .bashrc 寄出去给 vbird ,可以这样做:
      语法:
      [root@test root]# mail -s '这里可以接邮件标题' 这里是邮件收件者  <  文件名称
      范例:
      [root@test root]# mail -s 'This is a test mail' vbird < /root/.bashrc 
      需要注意的是,如果 mail 给账号而已,那么就是寄给本机的使用者,如果是以电子邮件地址的写法,才是向外面寄出去的邮件喔!
       
    • 用 mail 接收 mailbox 的信件:
      寄信还比较简单,那么收信呢?同样的啦,收信还是使用 mail ,直接在提示字符之后输入 mail 时,会主动的捉取使用者在 /var/spool/mail 底下的邮件信箱 ( mailbox ),例如我 vbird 这个账号在 shell 的环境中,输入 mail 后,就会将 /var/spool/mail/vbird 这个档案的内容读出来,并且显示给 vbird 看!
      语法:
      [vbird@test vbird]# mail
      范例:
      [vbird@test vbird]# mail
      Mail version 8.1.1 6/6/93.  Type ? for help.
      "/var/spool/mail/vbird": 2 messages 2 new
      >N  1 root@vbird.adsldns.o  Sat Feb 22 13:01  24/945   "test uuencode"
       N  2 root@vbird.adsldns.o  Sat Feb 22 13:12  26/838   "This is a test mail"
      在上面的画面中,显示 vbird 共有两封『新信』此外,底下会附上这两封新信的发信站与标题及时间等。
       
      • 读信:有看到『>』那个符号吧!那表示目前 mail 所在的邮件字段,你可以直接输入 Enter 即可看到该封信件的内容!另外,你也可以在『&』之后的光标位置输入号码,就可以看该封信件的内容了!(注:如果持续按 Enter ,则会自『 > 』符号所在的邮件逐次向后读取每封信件内容!)
      • 显示标题:如果要重新显示每封信的标题,可以输入 h 即可;
      • 回复邮件:如果要回复目前『 > 』符号所在的邮件,直接按下『R』即可进入刚刚前面介绍过的 mail 文字编辑画面啰!你可以编辑信件后传回去啰!
      • 删除邮件:按下『 d## 』即可删除邮件!例如我要删除掉第 2 封邮件,可以输入『d2』如果是要删除第10-50封邮件,可以输入『d10-50』来删除喔!请记得,如果有删除邮件的话,离开 mail box 时,要使用『q』才行!
      • 储存邮件到档案:如果要将邮件资料存下来,可以输入『 s ## filename』,例如我要将上面第一封邮件存下来,可以输入『 s 1 uuencode 』即可将第一封邮件内容存成 uuencode 这个档案!
      • 离开 mail :要离开 mail 可以输入 q 或者是 x ,请注意『输入 x 可以在不更动 mail box 的情况下离开 mail 程序,不管你刚刚有没有使用 d 删除数据;使用 q 才会将删除的数据移除,并且会将所有已读过的信件内容转存到你家目录下的 mbox 档案!』也就是说,如果你不想更动 mail box 那就使用 x 或 exit 离开,如果想要使刚刚移除的动作生效,就要使用 q 啦!不过,使用 q 之后,只有未读的信件才会保留在 /var/spool/mail/accout 里面,其它已读的数据都会被存入 ~/mbox 当中!例如 /home/vbird/mbox 为储存 vbird 已读过的信件!
      • 请求协助:关于 mail 更详细的用法可以输入 help 就可以显现目前的 mail 所有功能!
       
      上面是简易的 mail 收信功能!不过,如果离开 mail 时按下 q ,不是会有信件转存到 ~/mbox 这个邮件信箱吗?那么我要如何读取这个档案内的信件数据呢?可以简单的使用这个方式来读取:
      [vbird@test vbird]# mail -f ~/mbox
      使用『-f file 』规定新的 mail box 档案,如果没有 -f file 的话,就会直接使用 /var/spool/mail 里面的 mailbox 啦!
       
    • 设定检查邮件的间隔时间 MAILCHECK:
      如果在你的 She
阅读(3760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~