鸟哥的 Linux 私房菜 -- Mail Server -- Sendmail
鸟哥的 Linux ADSL 私房菜


简易 Mail Server 架设 -- Sendmail 设定
最近更新日期:2003/09/12
 
在这个邮件服务器的架设中,我们首先谈论 Mail 与 DNS 的重要相关性,然后依序介绍 Mail Server 的相关名词,以及 Mail Server 的运作基本流程与协议,也会谈到相关的 Relay 与 邮件认证机制 等项目,这些项目对于未来邮件主机的管理与设定是重要的,请不要忽略了这方面问题的讨论喔。当然,主要的目的还是在于架设 Sendmail 这个使用最为广泛的邮件主机服务器软件啰!这里我们以 Red Hat 7.x 以及 Red Hat 9 为主体来说明 Sendmail 的主要架构,要说明的是,虽然本文是以 Red Hat 为主体,但是 Sendmail 的架构仍然可以在其它使用 Sendmail 的 Linux 系统当中成立的。而重头戏则在最后面的 Tarball 安装一套完整的 Sendmail 喔 ( 我是以 Mandrake 9.0 及 Red Hat 7.x 版本来测试的 )!如果您的 Linux 上面本来就没有 Sendmail ,并且您还是习惯 Sendmail 这个套件,那么,这篇文章仍然相当的适合您查阅!
 
前言
邮件服务器运作原理
  1. Mail 与 DNS 系统的相关性
  2. 邮件的传送流程、MUA、MTA、MDA
  3. 使用的协议
  4. 什么是 Relay 与认证机制
套件安装
  1. 使用 RPM 安装 Sendmail
  2. 使用 RPM 安装 IMAP 套件
主机的设定
  1. Sendmail Server 的档案架构与基础说明
  2. 使用 m4 来简易设定 sendmail
  3. 启动 Mail Server
  4. 设定主机名称 local-host-names
  5. 设定邮件服务器使用权限 /etc/mail/access
  6. 重要观念:一封信件的收受流程
  7. 设定使用者别名 /etc/aliases
  8. 设定邮件转递 ~/.forward
  9. 察看信件队列 ( mailq ) 与 mailers 状态
客户端的使用说明
  1. Linux 下使用 mail 功能 ( IP寄信, 夹带档案 )
  2. Linux 下使用 telnet 功能
  3. X-Window 与 Windows 的 MUA 功能
关于邮件主机安全的设定
  0. sendmail 本身的安全设定项目( Sendmail 本身的建议 )
  1. SMTP 认证
  2. 关于 ORDB 抵挡 open relay 邮件主机之机制说明与实作
  3. Procmail 相关说明
以 Tarball 完整安装 Sendmail (含 SMTP 邮件认证、procmail 与 ORGB 的完全安装! )
其它应用说明
  0. 无法寄信时的可能问题说明与解决之道
  1. 关于备份
  2. 关于 quota 的设定与 /var/spool/mail 目录的转移
本章与 LPI 的关系
参考资源
本章习题练习

前言:
电子邮件带来的好处:
在目前的社会当中,没有电子邮件 ( e-mail ) 似乎是蛮奇怪的一件事!。可以说,现在 e-mail 已经成为一个很普遍的人与人之间的沟通管道了,电子邮件可以很快速的帮你将文件或讯息传送到地球上的任何一个有网络存在的角落,当然,你也可以在任何有网络的地方,连上 Internet 去收取你的信件!很快乐不是吗?是的!e-mail 的存在是相当重要的,你可以藉由这个电子邮件取得最实时的一手数据!你也可以利用他帮你联络好朋友,还可以用来把马子哩!君不见前一阵子相当有名的『电子情书, You got a mail』这部电影吗?呵呵!反正,电子邮件真的带给目前繁忙的人们一个相当轻松获得信息的方式!
电子邮件衍生的问题:
不过,遗憾的是,只要是有人类的地方,就会有很多你意想不到的事情会出现了,当然,e-mail 也不例外,怎么说呢? 我们来慢慢的分析一下吧:
  1. 电子邮件夹带病毒:你可以常常听到电子邮 件所夹带的病毒对吧!没错,利用电子邮件以及人们对于电子邮件的漫不经心的态度,使得以电子邮件为媒介的计算机病毒更容易『深入人群』当中吶!这个问题造成 大大小小的伤害,如果发生在大企业当中,那可真是受不了那~那个主管受的了一天到晚计算机重新安装的~而且万一中毒的是大型主机,光是数据的损毁就可能让公 司倒闭了....
  2. 怪客入侵事件:没错! e-mail 也是一个相当不安全的网络协议,你可以轻易的使用怪客软件 ( Cracker ) 就可以取得使用者在利用 e-mail 传送过程当中的,将他的账号与密码撷取下来,分析之后,并进一步的破解对方的邮件主机~哇!真是乱可怕一把的!
  3. 广告与垃圾信件:这个可说是目前各大 ISP 心中永远的痛~这些垃圾信件可以占掉很多那少的可怜的频宽,使得正常使用者联机速度与质量下降,更可能造成网络的停顿~当然,常常收到垃圾信件的你,大概也不好过吧!
  4. 暴力攻击事件:万一你没有将邮件主机设定好,嘿嘿!送信者可以藉由你主机收信的功能,发送大量的信件,让你『一次收个够!』灌爆你的主机硬盘,想要不当机都粉难~
  5. 真实社会的讨厌事情:『黑函』!听到会不会很害怕?当然很害怕啦!偏偏,使用 e-mail 就可以作很多的坏事~这真是太不道德了~
  6. 不实的信件内容:只要注意到消基会的讯息 就可以知道啦,不明来源的电子邮件说的内容,嘿嘿!不要轻易的相信,因为,很多可是以讹传讹,结果,大家都被耍了的~例如,你的朋友收到一封信,认为 『哇!这是大事情』,所以在没有求证的情况下,将信『转寄』给你看,嘿!你的朋友寄给你的,当然要相信他啦!立刻再转寄,如此一再地循环,嘿嘿!这个错误 内容的讯息马上就让大家知道,更可怕的是『还会让大家接受~』所以,看到任何讯息时,请千万要记得求证一下吶!
可怕吧!电子邮件会衍生出这么多的问题说~
网管人员的痛
因为 e-mail 的便利性,与邮件主机的容易受到恶意的攻击,这两个事件真的是很难分的清,怎么说呢?如果为了使用者的便利性而大开便利之门,那么,您的邮件主机大概用不 了多久,就会被列入黑名单之中,进而成为大家的拒绝往来户,呵呵!反而成为笑柄,并且反而造成了使用者的不便~而如果管制得太严格,又显的不够人性化~最 起码,你的主管就会不太满意~怎么办呢?!哈哈!没错啦!邮件主机就是这么回事~让人又爱又怕的一个玩意儿,搞的定他,恭喜你,一切圆满顺利,搞不定他, 主机被当成垃圾信件转运站事小,丢掉工作可就『兹事体大』啦~就因为他是这么重要,但是又这么难以搞定,所以啦,我们可要好好的学一学他吶!

邮件服务器运作原理
既然要使用 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, MTA 与 MDA 之后,再来说到那么如何将信寄出去呢?可以分为底下几个步骤:
  1. Step 1 使用者利用 MUA 寄信到 MTA 上面:通常我们使用 MUA ( 例如 Outlook express ) 写信的时候,你总是要定义出几个咚咚:
  2. 好了,你在图一左上角的那部机器上面,也就是『本地端用户使用计算机』利用 MUA 的功能 ( 例如 Outlook express 好了 ) 写好了信之后,按下 MUA 的那个『传送』的按键,MUA 就会依据你所定义的主机地址将信发送到 MTA 上面;
     
  3. Step 2 MTA 收到自己的信件,交由 MDA 发送到该账号的 MailBox 当中:如果在 Step 1 所收到的信件中,那个 e-mail.server 就是 MTA 自己,此时 MTA 会将该信件交由 MDA 去处理,将信件放置在收进者的信箱中;

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

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

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

使用 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 之后,接下来,我们得了解一下在邮件服务器架设之前,您需要先进行什么样的工作呢? 好了,既然是玩 Sendmail ,那么就得了解一下 sendmail 的相关档案与说明啰!
 

Sendmail Server 的档案架构与基础说明
 
Sendmail 几乎所有的设定档都安置在 /etc/mail 底下,不过,如果你是以 RPM 安装的话,那么还有所谓的 sendmail-cf 的设定档,这个就是使用 M4 在进行 sendmail.cf 设定的程序!由于 Sendmail Server 所使用到的套件并不少,这包括有 sendmail, imap 以及 m4 等等,我们针对这些套件来谈一谈每个目录与档案下的数据吧!
使用 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 的相关参数啰!
启动 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 系统查询到,以我为例,我的机器上面有 www.tsai.adsldns.org 及 tsai.adsldns.org 两个主机名称,并且这两个主机名称均指向我家里的那一部机器,那么假如我只要 tsai.adsldns.org 具有收信的资格,如果人家寄信到 www.tsai.adsldns.org 则不予以接受,并将该封信件退回去时,可以这样做:
 
[root@test root]# cd /etc/mail
[root@test mail]# vi local-host-names
tsai.adsldns.org
 
在该档案里面仅存在一个主机名称即可!那么万一我有三个主机名称,分别是 tsai.adsldns.org, www.tsai.asdldns.org 及 tsai.linux-site.net,而且我这三个主机名称都希望可以收到信件时,那么你就必需要这样修改啰:
 
[root@test root]# cd /etc/mail
[root@test mail]# vi local-host-names
tsai.adsldns.org
www.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. 只有使用者是在主机上面发信的,例如使用 SSH 登入主机后,以 mail 这个指令来发信;
  2. 又或者使用者直接在主机上面使用 X-Window System 里面的邮件代理人,亦即是 Netscape 或者是 Kmail 等软件来发信
的时候,我们的 Sendmail 才会帮使用者『寄信』喔!至于其它的计算机来源的『寄信』邮件,Sendmail 一概将他退信回去!那么如果我想要在其它的计算机上面使用我这部 Mail Server 来寄信呢?这个时候就要编辑『/etc/mail/access』这个信任网域设定的档案啦!假设一个例子好了: 那么我可以怎样设定 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 上面的动作』两项目之间最好以 <tab> 按键来隔开会比较正确!『规定的范围』还可以设定『来源』与『目的』喔!例如:
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)范围时,就可以指定底下这些动作: 通常我们比较建议使用 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.  
  3. 如果这封邮件的『信件收件者』并没有 MTA 本身的用户账号时,那么 MTA 会以 SMTP 这个外送规则来传信,此时 MTA 会开始去检查 /etc/mail/access.db 这个数据库里面,任何有关于送件者的 IP、E-mail 以及相关的动作等,如果该封邮件有相关的数据在 /etc/mail/access.db 里面时 ( 不论是 RELAY, REJECT 或是 DISCARD ) 那么该封邮件就会依照 /etc/mail/access.db 里面指定的行为进行邮件的动作(可能是 RELAY 或 DISCARD 等等)!

  4.  
  5. 如果该封邮件经过上面两道手续后,仍然找不到任何有关的动作讯息,那么这封邮件将会退回给原发信者!
上面的信件收受行为是在没有 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 外部的信件』时的处理动作,那么如果这封邮件是来自于『主机内部』的行为呢?例如:使用者以 SSH 登入后,使用 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, .... 说明的样式!这部份如果不太明了的话,请拿出鸟哥的私房菜 Linux 基础学习篇,好好的看一看 BASH Shell 里面介绍的变量设定规则吧! ^_^!
 
上面提到的都是关于系统管理员设定的数据部分,那么预设的 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 可是需要加入的吶!
设定邮件转递 ~/.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 <gold@tsai.adsldns.org>
                 (Deferred: Connection refused by vbird.adsldns.org)
                                       <qqq@vbird.adsldns.org>
 
Q-ID:表示此封邮件队列的代表号 ( ID );
Size :这封信有多大容量 ( bytes )的意思;
Q-Time:这封信什么时候进入 /var/spool/mqueue 这个目录的,并且说明无法立即传送出去的原因 (例如上面的 Deferred );
Sender/Recipient:送信与收信者的电子邮件啰!
 
如果您有开放邮件的话,那么记得偶而要去看一看您的邮件队列 ( mailq ) 是否存在大量的未寄出信件喔!好让你知道是否可能被当作转信站啦!
 
关于邮件在 Mailer 中的统计状态 ( mailstats )
除了 mailq 记录了在信件队列的信息之外,还有一个档案可以纪录 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
 
上面共出现七行,第一行只是显示目前的时间而已,至于每个直列的意义为: 由上面的资料你会发现,哇!怎么鸟哥的信箱 15GB 的信件啊!真可怕~别担心,那个数据是由『 sendmail 开始运作到现今』的结果,我的 sendmail 运作了若干年了,有这样的信件资料量其实不怎么吃惊啦! ^_^

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

关于邮件主机安全的设定
Sendmail 常常被传成『安全性很差的邮件服务器!』当然, Sendmail 官方网站也很不满的响应说『其实, Sendmail 的问题来自于一些"该死的"档案权限设定错误的状况!』也就是说,其实 sendmail 常常会因为『系统管理员』设定档案或者目录不良的情况下,导致 Mail Server 发生问题啰!所以,底下我们就来说一说这个 sendmail 的安全性与其它相关的安全方面设定吧!

Tarball 的安装方式 ( 适用于原本 Linux 没有 sendmail 或者是认证机制的! )
Sendmail 的安装方面真的是相当的『雪特!』比那个 LAMP 还要麻烦的多~所以,如果你的系统当中主要是以 sendmail 做为你的邮件服务器软件,例如 Red Hat 7.2, Red Hat 7.3 等等的,那么就以你的 distribution 提供的软件来安装!不要直接使用 Tarball 的方式安装,因为要配合的套件实在太多了,鸟哥也说不准是否有什么咚咚忘记给他安装上来ㄋㄟ!所以,除非你是最近释出的 distribution 例如 Mandrake 9.0 ,因为他使用的并非是 sendmail ,或者是 OpenLinux Server 3.1.1 ,因为他的 sendmail 预设没有 认证机制 存在,否则,尽量以你的 distribution 提供的 sendmail ( RPM 版本 ) 来安装你的邮件服务器吧!例如 Red Hat 7.x 版的就直接由 Red Hat 提供的 sendmail 为准吧!
 
如果你是使用 OpenLinux Server 3.1.1 以及 Mandrake 或者是其它并非使用 sendmail 的 Linux distribution 时,由于这些 distribution 不是提供其它的 mail server package 而没有 sendmail ,就是在邮件服务器套件上面缺东缺西的,例如缺乏 procmail, cyrus-sasl....等等的套件,所以,看来您也只好摸摸鼻子,好好的自行加油努力以 tarball 的方式来安装啰!那么与 RPM 版本类似的,你需要的套件有哪些呢?至少需要有底下这几个,邮件服务器的功能才够完整喔: 基本上,我们目前仅安装 sendmail 及 cyrus-sasl 就好了!不过,考虑有些 Linux Distribution 并没有提供相关的功能,所以我们还是安装一下 procmail 好了!因为那个 Cyrus SASL 就是要达成 SMTP 认证的重要工具,而我们的 senmdail 是用他来做认证的,所以两者要一起编译与安装才行吶!!直到目前为止 ( 2003/02/20 ) 我们使用最新的 Cyrus-SASL 2.1.12 版以及 procmail 3.22,至于 sendmail 则使用 8.12.7 版!首先,我们必需先建立密码数据的函式库,亦即 Cyrus SASL 这个套件与 Procmail 喔: ( 注:目前 sendmail 或其它的,例如 postfix 等邮件服务器软件,主要仍以 Cyrus-sasl 1.5.28 这个版本来安装的,包括 sendmail 官方网站的介绍「http://www.sendmail.org/~ca/email/auth.html」亦是使用 1.5.28 来做介绍!不过, Cyrus SASL 的官方网站说, 2.xx 版本的 SASL 比较优良,所以,这里我们参考了 sendmail 官方网站,以及 Cyrus SASL 的官方网站的文章,整理出底下的安装步骤啰! )
 
安装 Cyrus SASL 2.xx 版本!
1. 首先将数据解压缩(假设您将我们网站的档案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/cyrus-sasl-2.1.12.tar.gz
.....(略).....最后建立一个 cyrus-sasl-2.1.12 的目录

2. 再来就是设定你的 cyrus SASL 的参数以及编译啰!
[root@test src]# cd cyrus-sasl-2.1.12
[root@test cyrus-sasl-2.1.12]# ./configure   \
> --prefix=/usr/local/cyrus-sasl2 --enable-login --enable-plain \
> --enable-pwcheck --with-saslauthd=/var/run
# 注意上面的语法!!那个 \ 是跳脱字符喔!后面直接 Enter !
# 不要接任何空白或者是 tab 按键!若有问题,请到 Shell 看看!
# 至于那个 pwcheck 的项目,就是要用来做为密码确认的一个咚咚啰!

[root@test cyrus-sasl-2.1.12]# make clean && make
[root@test cyrus-sasl-2.1.12]# make install
# 上面三个步骤会花去一些时间,请耐心等待~
# 而由于我们刚刚设定了 --prefix=/usr/local/cyrus-sasl2 这个参数,
# 所以, make install 之后,我们有用的函式库会在 
# /usr/local/cyrus-sasl2/lib/sasl2 这个路径当中,但是, cyrus 程序
# 会主动去找 /usr/lib/sasl2 这个目录!所以,我们必需要做连结档!

[root@test cyrus-sasl-2.1.12]# cd /usr/lib
[root@test lib]# ln -s /usr/local/cyrus-sasl2/lib/* .
# 这样就建立起连结档啰!很厉害喔!

3. 准备建立 sendmail 与 cyrus SASL 使用的简易设定档:
[root@test lib]# cd /usr/lib/sasl2
[root@test sasl2]# echo 'pwcheck_method: saslauthd' > Sendmail.conf 
# 注意了!一般来说, sendmail 会使用 SASL 这个函式库里面,
# 在 /usr/lib/sasl2/Sendmail.conf 这个档案的设定做为他的预设使用 SASL 的
# 参数档案,那个 Sendmail 的 S 是大写,请不要写错了!我们使用 SASL 预设的
# saslauthd 这支程序做为密码认证的 daemon 啰!

4. 建立一些需要的参数:
[root@test sasl2]# vi /etc/man.config
# 新增一行:
MANPATH /usr/local/cyrus-sasl2/man

5. 检验 saslauthd 这支程序是否可行!
[root@test sasl2]# /usr/local/cyrus-sasl2/sbin/saslauthd -a shadow
[root@test sasl2]# cd /usr/local/src/cyrus-sasl-2.1.12/saslauthd/
[root@test saslauthd]# make testsaslauthd
[root@test saslauthd]# ./testsaslauthd -u userID -p 'yours.passwd'
0: OK "Success."
# 若显示 OK 的话!那么就是成功啦!很好!我喜欢~

6. 设定开机时启动
[root@test saslauthd]# vi /etc/rc.d/rc.local
# 加入这一行:
/usr/local/cyrus-sasl2/sbin/saslauthd -a shadow

 
安装 Procmail
1. 首先将数据解压缩(假设您将我们网站的档案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/procmail-3.22.tar.gz
.....(略).....最后建立一个 procmail-3.22 的目录

2. 直接给他安装!
[root@test src]# cd procmail-3.22
[root@test procmail-3.22]#  make install
[root@test procmail-3.22]#  which procmail
/usr/bin/procmail

 
这样就大功告成了!接下来准备安装 Sendmail 啰!
 
0. 首先将原有的 sendmail 数据备份例如 /etc/mail 目录底下的档案!
  并且,必需要确定有安装 Berkeley DB 等相关的函式库!这是 makemap 要用的喔!
[root@test root]# mv /etc/mail /etc/mail.old
# 请注意!如果您使用的 Linux Distribution 并非为 sendmail ,那么上面的
# 目录可能不会存在!请详细的参考您的主机上面的说明喔!

[root@test root]# locate libdb.so
/lib/libdb.so
# 这个档案请『务必存在!』可能是 libdb.so 或 libdb.a 的形式!
# 这个档案是 Berkeley 数据库的主要函式库,这是用来做为 makemap 
# 的一些数据库格式所必需要的函式库,如果你的系统不存在,那么请
# 拿出你的原版光盘片来安装!通常这个套件的档名应该是 db3-devel.....
# 或者是 libdb3..... 的文件名称!请以 RPM 来安装吧!
# 基本上,反正你的光盘片上(不管几片,全部拿出来喔!)所有
# 档名为 db#### 及 libdb### 的档案都装上去就对了!
# 至于相关的属性相依问题,请参考 RPM 与 Tarball 的安装一文。

[root@test root]# locate libwrap
/usr/lib/libwrap.a
# 这个档案与等一下我们要建立的 TCP_Wrappers 的支持有关,
# 请确定他的存在喔!如果不存在的话,而你的系统又是 MDK 9.0 时,
# 可以拿出第三片来安装 tcp_wrappers-devel..... 那个 RPM 档案,
# 如果是其它的 distribution 同时又找不到 libwrap.a 时,
# 那底下 site.config.m4 里面的 -DTCPWRAPPERS 及 -lwrap 都拿掉!
# 不要支持也没有关系!

1. 将 sendmail 解压缩,假设您下载的数据在 /root 底下
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/sendmail.8.12.7.tar.gz
.....(略).....会建立一个名为 sendmail-8.12.7 的目录

2. 建立 sendmail 所需要的 Cyrus SASL 支持之设定项目:
[root@test src]# cd /usr/local/src/sendmail-8.12.7/devtools/Site
[root@test Site]# vi site.config.m4
PREPENDDEF(`confMAPDEF', `-DMAP_REGEX')
APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL=2')
APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl2')
APPENDDEF(`confLIBDIRS', `-L/usr/local/cyrus-sasl2/lib')
APPENDDEF(`confINCDIRS', `-I/usr/local/cyrus-sasl2/include')
define(`confMANROOT', `/usr/share/man/man')
# 这个 site.config.m4 是 sendmail 在编译的时候会主动去读取的主机自行设定文件。
# 上面这六行是需要自行建立的!请特别注意, cyrus sasl 的 2.x 与 1.5 版
# 在安装与设定上是不一样的!所以这里请特别留意喔!不要搞错了!
# 第一行:上面第一行与一些正规表示法有点关系,可加可不加!
# 第二行:第二行在设定支持的模式,我们支持了 TCP_Wrappers 及 SASL 身份认证!
#     关于 TCP_Wrappers 请参考前面『简易防火墙』的说明吧!
#     至于 -DSASL=2 则是 SASL 第二版的格式!
# 第三行:第三行与第二行有点关系,使用 TCP 时需要用到 libwrap.a 这个档案,
#     那就是 lwrap 这个标志!至于 -lsasl2 就是 libsasl2.so 那个档案啦!
# 第四行与第五行:这两行 /usr/local/cyrus-sasl2 指的是我的 SASL 的数据库所在目录
# 如果你不是安装在这个目录的话,请依照您刚刚在建立 cyrus sasl 下达的 
# --prefix=/你的/目录 来填写喔!还有其它相关的说明,请参考您主机内的
# /usr/local/src/sendmail-8.12.7/sendmail/README
# 请注意,如果您确定可以支持 TCP_Wrappers 之后,那么你就可以在
# /etc/hosts.deny, /etc/hosts.allow 以底下的样式来抵挡 IP 或主机名称
sendmail: 192.168.0.0/255.255.255.0 :Allow 
sendmail: 192.168.0.100: deny
# 更多的 TCP_Wrappers 信息请参考『认识网络安全

3. 开始编译 sendmail 啰与新增 sendmail 管理员 smmsp 
[root@test Site]# cd /usr/local/src/sendmail-8.12.7/sendmail
[root@test sendmail]# sh Build -c
......(略).....会花很多时间喔!
[root@test sendmail]# groupadd -g 40 smmsp 
[root@test sendmail]# useradd -M -g smmsp -u 40 -d /var/spool/clientmqueue  \
-s /dev/null smmsp 
[root@test sendmail]# mkdir -p /var/spool/clientmqueue
[root@test sendmail]# chown -R smmsp:smmsp /var/spool/clientmqueue 
[root@test sendmail]# chmod -R 770 /var/spool/clientmqueue 
# 新增一个使用者,他无法登入,ID 是 40 号! 这个使用者的家目录是 /var/spool/clientmqueue 
# 主要仅用于邮件的收受与传递!增加这个使用者是 sendmail 8.12 板后新增的功能!
# 主要的目的在于提供更安全的 sendmail 使用环境! 

4. 设定 macro 档案
[root @test sendmail]# cd /usr/local/src/sendmail-8.12.7/cf/cf
[root @test cf]# vi sendmail.mc
# 这个档案的内容是你必需要建立的!如果你要跟我一样的话,就用底下的设定吧!
divert(-1)
dnl ================================================================================
dnl     This file is modified from Red Hat 7.2's redhat.mc file.  VBird 2003/02/20
dnl     The functions of sendmail are as following
dnl            dnl                     ==> Just mark, such as # in shell scripts
dnl             VERSIONID               ==> The version of sendmail and vender
dnl             OSTYPE                  ==> The Operation System type
dnl             define                  ==> difine some usefull functions
dnl             FEATURE                 ==> some functions and files' location !
dnl             other settings          ==> Other settings.
dnl             MAILER                  ==> mail protocol and featurs.
dnl
dnl     The following is the command to macro the *.mc to *.cf !
dnl
dnl             sh Build sendmail.cf
dnl             cp sendmailcf /etc/mail
dnl
dnl ======1. Some informations =====================================================
include(`../m4/cf.m4')
VERSIONID(`Sendmail for Linux using Mandrake 9.0')
OSTYPE(`linux')
define(`confDEF_USER_ID',``8:12'')

dnl ======2. Some settings =========================================================
define(`confTO_CONNECT', `1m')dnl The timeout waiting for an initial connect (1 minute here)
define(`confTRY_NULL_MX_LIST',true)dnl If this host is the best MX for a host and other arrangements haven't been made, try connecting to the host directly; normally this would be a config error.
define(`confDONT_PROBE_INTERFACES',true)dnl About /etc/mail/mailertables !
define(`ALIAS_FILE', `/etc/mail/aliases')dnl About username aliases
define(`STATUS_FILE', `/etc/mail/statistics')dnl
define(`UUCP_MAILER_MAX', `2000000')dnl
define(`confUSERDB_SPEC', `/etc/mail/userdb.db')dnl
define(`confPRIVACY_FLAGS', `authwarnings,novrfy,noexpn,restrictqrun')dnl

dnl ======3. About some other important settings ===================================
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl About procmail settings
define(`confAUTH_OPTIONS', `A')dnl The following three lines are about SASL settings
TRUST_AUTH_MECH(`LOGIN PLAIN')
define(`confAUTH_MECHANISMS', `LOGIN PLAIN')

dnl ======4. important settings here! ==============================================
FEATURE(`no_default_msa',`dnl')dnl Don't generate the default MSA daemon,
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl This must be set because the up line
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl
FEATURE(redirect)dnl About Redirect the address to another one mail server !
FEATURE(always_add_domain)dnl
FEATURE(use_cw_file)dnl useing /etc/mail/local-host-names
FEATURE(use_ct_file)dnl useing /etc/mail/trusted-users
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl about procmail
FEATURE(`access_db',`hash -T<TMPF> -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
FEATURE(`accept_unresolvable_domains')dnl

dnl ======5. About ORDB deny the open relay mail servers ===========================
FEATURE(`dnsbl', `relays.ordb.org', `"Email blocked using ORDB.org - see <http://ORDB.org/lookup/?host="$&{client_addr}">"')

dnl ======6. MAILER settings here ==================================================
MAILER(smtp)dnl
MAILER(procmail)dnl
Cwlocalhost.localdomain
# 重点是上面四行粗体字喔!特别留意了!

5. 开始给他制作 sendmail.cf 这个档案啰!
[root@test cf]# sh Build sendmail.cf <==这个在制作 sendmail.cf 这个档案
[root@test cf]# mkdir -p /etc/mail
[root@test cf]# sh Build install-cf 
# 这个在安装 sendmail.cf 到 /etc/mail 底下去!

6. 开始安装 sendmail 主程序,以及其它相关的程序,例如 makemap 等等的!
[root@test cf]# cd /usr/local/src/sendmail-8.12.7/sendmail/
[root@test sendmail]# sh Build install
[root@test sendmail]# cd ../makemap
[root@test makemap]# sh Build install
[root@test makemap]# cd ../mailstats
[root@test mailstats]# sh Build install

7. 其它档案的建立与修订!
[root@test sendmail]# cd /etc/mail
[root@test mail]# echo 'test.adsldns.org' >> local-host-names
# 这里请输入你的主机名称
[root@test mail]# echo 'localhost    RELAY'  >> access
[root@test mail]# makemap hash access < access
[root@test mail]# touch domaintable
[root@test mail]# makemap hash domaintable < domaintable
[root@test mail]# touch mailertable
[root@test mail]# makemap hash mailertable < mailertable
[root@test mail]# touch trusted-users
[root@test mail]# touch virtusertable
[root@test mail]# makemap hash virtusertable < virtusertable
[root@test mail]# mkdir -p /var/spool/mqueue
[root@test mail]# chown root:wheel /var/spool/mqueue/
[root@test mail]# chmod 700 /var/spool/mqueue
[root@test mail]# touch aliases
[root@test mail]# sendmail -v -bi
/etc/mail/aliases: 0 aliases, longest 0 bytes, 0 bytes total
# 若是出现上面的字样的话(不一定是这样的!但反正就是不会显示错误讯息就是了!)
# 就表示您的 sendmail 应该已经『没问题啦!』
[root@test mail]# sendmail -bd -q30m   <==启动 sendmail 看看吧!
[root@test mail]# telnet localhost 25 <==试看看连的上吗?!
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 test.adsldns.org ESMTP Sendmail 8.12.7/8.12.7; Tue, 18 Feb 2003 21:56:00 +0800
ehlo localhost   <==这里输入测试列!
250-test.adsldns.org Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-ETRN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
quit  <==这里输入离开字样!
221 2.0.0 test.adsldns.org closing connection
Connection closed by foreign host.
# 如果看到出现上面的那行黄色加粗字体,呵呵!那就是 OK 啦!

 
上面的 site.config.m4 及 sendmail.mc 可以在鸟哥的网站上面下载喔(http://linux.vbird.org/download/index.php#sendmail_sendmail)!免得打错字.....基本上, Tarball 的安装方式有点麻烦,此外,又容易发生问题,所以,除非必要,否则建议还是使用原本 Linux distribution 所提供的 RPM 或者其它的套件管理员的方式来安装吧!此外,关于 aliases 与启动 sendmail 的 script 也可以在上面的相关连结下载喔!安装方式中,需要注意的是在您下载完毕之后,请:
  1. Procmail 如果本机上面已经安装了,不需要重新移除后再安装!直接使用本机原有的即可!
  2. 依照上面的方法安装所有的套件;
  3. 将 aliases 放置在 /etc/mail 底下;
  4. 将 procmailrc 放置在 /etc/ 底下;
  5. 在 /etc/logrotate.d 增加 procmail 的 logrotate 数据;
  6. 将 sendmail 放置在 /etc/rc.d/init.d/ 底下
  7. 在 /etc/rc.d/rc.local/ 最底下新增一行即可开机时启动:

  8. /etc/rc.d/init.d/sendmail start
这样就已经安装好整个 Sendmail 啰!设定上是很容易啦!不过,维护上面可就要多费心啰!

其它应用说明:
上面的 Sendmail 说明,如果您都已经详细的参详之后,应该对于你的 Mail Server 管理的能力具有蛮强的认知了!不过,系统管理员无时无刻总是会遇到突发状况的!所以,这里我们来聊一聊一些可能会发生在你我身上的 Mail Server 可能会遇到的问题吧!

无法寄信时的可能问题说明与解决之道
 
虽然 Mail 很方便,但是仍然会有无法将信件寄出的时候!如果您已经设定好 Sendmail 了,但是总是无法将邮件寄出去,那可能是什么问题呢?
  1. 关于硬件配备:无论任何情况之下,如果硬件出问题,那么所有的服务都将不正常啦!所以,请先检查您的硬件是否『怪怪的!』这个先确认 OK 吧!
  2. 关于网络参数的问题:如果连不上 Internet ,那么哪里来的 Mail Server 呢?所以请先确认你的网络已经正常的启用了!关于网络的确认问题,请查阅前几篇『Linux 网络侦错』的内容介绍;
  3. 关于服务的问题:请务必确认 port 25 与 port 110 已经正确的启动了!使用 netstat 指令即可了解是否已经启动该服务!
  4. 关于防火墙的问题:很多时候,很多朋友使用 Red Hat 或者其它 Linux distribution 提供的防火墙设定软件,结果忘了启动 port 25 与 port 110 的设定,导致无法收发信件!请特别留意这个问题喔!可以使用 iptables ( 核心为 2.4.xx 版本 )  或者是 ipchains ( 核心为 2.2.xx 版本 ) 来检查是否已经启用该 port 呢!其余请参考简易防火墙设定那一章喔!
  5. 关于 TCP_Wrappers 的问题:如果你的 sendmail 还有支持 tcpd 这个程序 (或者说是 libwrap 这个函式库 ) 的话,那么在 /etc/hosts.allow 与 /etc/hosts.deny 的设定也会影响到收发信件的正常与否!如果 /etc/hosts.deny 有设定『ALL: ALL』的话,那么请务必在 /etc/hosts.allow 里面加设『 sendmail:  ALL 』喔!
  6. 关于设定档的问题:在 sendmail 8.11 版本中,仅有 sendmail.cf 这个设定档,但是在 8.12 当中多了个 submit.cf 这个寄信功能档案,请务必确定您的 *.mc 设定是正确的!说说鸟哥的经验,有一次在测试的时候,一直发信无法将信件寄出去!明明 sendmail.mc 都没有什么问题,就是 local 无法寄信!后来才发现,因为我更动过 submit.mc 这个档案,重新以 m4 跑过之后,忘记将他给改回来了!结果花了我两天的时间在搞 sendmail.mc ....所以,在作任何一步动作的时候,请千万记住『作笔记』或者『将动作记下来!』
  7. 关于档案权限的问题:一般来说,如果以 RPM 安装 sendmail 会比较没有问题,而如果以 Sendmail 8.12 以后版本手动安装的话,那由于 sendmail 对于安全的要求越来越严格,所以你必须针对每个目录或档案进行检查才行!通常检查的目录为:
  8. 关于使用者的设定问题:一般而言,如果使用者不登入 sendmail 主机进行寄信的动作( local mailer ),那么 /etc/passwd 里面的设定就无关紧要了!不过,如果该使用者想要在 sendmail 本机上面使用 mail 的功能,那么在 8.12 版本当中,您就必须要:
  9. 其它档案的设定问题:
  10. 其它可能的问题:最常发生的就是认证的问题了!这是由于使用者没有在 MUA 上面设定『我的邮件需要认证』的选项啦!请叫你的 client 端用户赶紧勾选吧!
  11. 还是不知道问题的解决方案:一般而言,上面的几个讯息应该可以提供您校正 sendmail 的问题了,不过,如果还是查不出问题的话,那么请务必检查您的 /var/log/maillog (有的时候是 /var/log/mail ,这个要看 /etc/syslog.conf 的设定 ),当你寄出一封信的时候,例如 vbird 寄给 bird2@tsai.adsldns.org 时,那么 maillog 档案里面会显示出两行,一行为 from vbird一行为 to bird2@tsai.adsldns.org,也就是『我由哪里收到信,而这封信会寄到哪里去!』的意思,由这两行就可以了解问题了!尤其是 to 的那一行,里面包含了相当多的有用信息,包括邮件无法传送的错误原因的纪录!如果您对于登录档不熟,请拿出『鸟哥的 Linux 私房菜 -- 基础学习篇』里面的『认识登录档』一文吧!(注:这就是鸟哥为什么老是希望大家能够先看完基础篇的原因,太重要了!)

关于备份
 
不管什么时候,备份总是重要的!那么如果我是单纯的 Mail Server 而已,我需要的备份数据有哪些呢?
  1. /etc/procmailrc 这个档案;
  2. /etc/passwd, /etc/shadow, /etc/group 等与账号有关的资料;
  3. /etc/mail 底下的所有档案数据;
  4. /etc/sendmailcf 或者 /etc/aliases 等等 sendmail 相关档案(因为可能不放在 /etc/mail 当中! )
  5. /home 底下的所有使用者数据;
  6. /var/spool/mail 底下的档案与 /var/spool/mqueue 邮件队列档案;
  7. 如果是 Sendmail 8.12 则可以考虑储存 /var/spool/clientmqueue。
如果真的仅要备份这些资料的话,我可以写一支程序让他每周备份一次喔!假设该程序可以放置在 /usr/local/backup/backup.sh 这里,并且备份的数据也都放置在此!当然,可以的话,应该是要放置在另一颗硬盘,甚至是另一个储存装置,例如 tape 等等比较好的啦!底下提供一个程序范例啰:
 
#!/bin/bash
# 这支程序可以用来备份 mail server 的账号数据喔!
# 撰写者 VBird 2003/02/24

# 0. 设定目录与相关的变量:
dir=/usr/local/backup
[ -z "$dir" ] || mkdir -p "$dir"
[ -f "$dir" ] && echo "$dir exist, but is not a directory, stop here" && exit

# 开始备份一些档案:
cp -a /etc/passwd   $dir
cp -a /etc/shadow   $dir
cp -a /etc/group    $dir
[ -z /etc/procmailrc ]  && cp -a /etc/procmailrc $dir
[ -z /etc/sendmail.cf ] && cp -a /etc/sendmail.cf $dir
[ -z /etc/aliases ]     && cp -a /etc/aliases

# 开始备份目录:
tar -zcvf $dir/home.tar.gz     /home
tar -zcvf $dir/etcmail.tar.gz  /etc/mail
tar -zcvf $dir/varmail.tar.gz  /var/spool/mail
tar -zcvf $dir/mqueue.tar.gz   /var/spool/mqueue
[-z /var/spool/clientmqueue ] &&  \
tar -zcvf $dir/clientmqueue.tar.gz /var/spool/clientmqueue

 
你可以在网站下载(http://linux.vbird.org/download)然后将这支程序改变一下属性『chmod 755 backup.sh』之后,放到 crontab 里面去执行就可以啦!
 

关于 quota 的设定与 /var/spool/mail 目录的转移
 
网络上有很多『免费的电子邮件信箱』空间,一般而言,使用的就是 quota 这个磁盘配额工具!因为我们的 Linux 主机硬盘空间就是这么多!当然啰,使用磁盘配额 (quota) 会是一个对大家比较公平的方法!使用 quota 的技巧已经在『鸟哥的 Linux 私房菜 -- 基础学习篇』里面介绍过了,这里不再重复介绍,要介绍的是几个可能会发生在实际的案例中的一些小技巧:

本章与 LPI 的关系
在 LPI 网站 http://www.lpi.org 里面提到的,关于 Sendmail 的考试题库的地方,只有在 LPI level 1 的 102 ,里面的 topic 113 Networking Services ,第二点当中,简易的 Sendmail 设定。强调的是『应试者必须简单的设定 sendmail (指的应该是 m4 scripts ,不过会很简单!不要担心~)、能够建立 mail aliases 、能够管理邮件队列、能够启动或者是关闭 sendmail 这个服务、了解使用者的邮件转递 ( forward 功能 ),以及简单的 sendmail 除错!此外,应试者也需要了解什么是 Open Relay 与避免 Open Relay 才行!』至于会考的档案与指令可能有这些:

参考资源:
本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
简易 Mail Server 架设 -- Sendmail 设定

2003/02/24:第一次完成
2003/02/25:根据小州与网中人兄的建议,修改一些 Sendmail 相关的说明与内容,建议的内容请参考这里
2003/02/28:加入使用 IP 寄信的方法!
2003/03/01:增加 Tarball 安装时,TCP_Wrappers 的支持!
2003/03/14:增加 mailstats 的说明!
2003/09/12:修改了 procmailrc 的内容、整个版面稍微修订,以及内容的稍微校稿!

2003/02/24以来统计人数



Designed by VBird during 2001-2004.  Aerosol Lab.