since2012/04/23

     
 
连上 Internet
本文已不再维护,更新文章请参考此处
最近更新日期: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 ( 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.  
  4. Step 3 MTA 将信再转送出去:如果由 Step 1 来的信件的收件人并不是 MTA 的内部账号,那么该封信将会被再转送出去!由 Step 1 及 Step 3 的动作,我们也称为 Relay (邮件转递) 的功能喔!

  5.  
  6. 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 之后,接下来,我们得了解一下在邮件服务器架设之前,您需要先进行什么样的工作呢?
  • 若想要架设的邮件主机未来是对 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 这个档案当中,一个主机名字占用一行。注意:没有写入这个档案的『你的主机名』,那信件将无法正确的寄达这部主机喔~例如:www.vbird.adsldns.org、vbird.adsldns.org这两个主机名的 ip 都是相同的,也就是指向同一台机器上。假设这台主机名预设为 vbird.adsldns.org,那在预设情况下,寄给 userid@vbird.adsldns.org 都是 ok 没有问题的!但是寄给 userid@www.vbird.adsldns.org 就会出现错误。其中原因是因为没有告诉 MTA 除了 vbird.adsldns.org 这个主机名外,还有 www.vbird.adsldns.org 也是指向这台主机上。所以寄给 userid@www.vbird.adsldns.org 会出现错误,通常就是 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 设定项目,请到 http://www.sendmail.org/m4/readme.html 查询喔!底下我们来聊一聊这个环境参数档设定完毕之后(或者称为 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/sendmail 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 主机想要支持我内部网域的所有计算机来寄信,而我内部网域的计算机 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 上面的动作』两项目之间最好以 <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)范围时,就可以指定底下这些动作:
  • 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.  
  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 可是需要加入的吶!
  • 什么是 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 <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
 
上面共出现七行,第一行只是显示目前的时间而已,至于每个直列的意义为:
  • 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 寄出纯文本档案:

    • 还记得鸟哥的 Linux 私房菜 -- 基础学习篇里面的 Bash shell 提到的标准输入 ( < ) 吗?既然我使用 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:

    • 如果在你的 Shell 环境下有新信进来时,通常我们的 bash 会很好心的告诉你有来信了!预设的条件中是 60 秒钟检查一次 /var/spool/mail 当中是否有新信!如果想要改成 30 秒呢?可以的!直接设定『 MAILCHECK 』(大写字母)这个变量即可!
      [vbird@test vbird]# MAILCHECK=30
      或者直接将该变量写入你的 ~/.bashrc 当中亦可!
       
    • 用 mail 夹带档案寄信与收信:

    • 上面的方法都仅提供『纯文本』的寄件而已,如果我想要『夹带档案』在邮件当中呢?可以使用 mail 这个指令来达成吗?呼呼!确实是可行的!不过,单纯的 mail 无法达到这个目的,我们还必需要使用档案译码 ( encode ) 的功能才能达到这个夹带档案的目的喔!不过,要使用 uuencode 的功能,就得要安装 sharutils 这个套件! 如何安装吶?!很简单啊!拿出光盘,直接安装,或者使用 APT 或 YUM 来安装!都可以啦!例如:
      apt-get install sharutils
      yum install sharutils
      寄信:
      [vbird@test vbird]# uuencode 欲夹带的档案文件名 编码的标题 | mail -s 'title' 收件者
      范例:
      [vbird@test vbird]# uuencode ~/.bashrc bashrc | mail -s 'test uuencode' \
      > vbird@tsai.adsldns.org
      这样信件就送出去啦!而且是附件夹带喔!你可以使用 Netscape 或者 Outlook 之类的软件直接收受该档案,如果是在 shell 环境中,你可以这样做:
      1. 储存该邮件使成为档案:
      [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"
      & s 1 testfile
      当前目录下会产生一个 testfile 的新档案

      2. 将捉下来的档案解碼
      [vbird@test vbird]# uudecode testfile -o outfile
                uudecode 读入档案    输出的档案

      如此一来, outfile 就是解碼后的档案内容啦!至于 testfile 内容有点像这样:
      From root@vbird.adsldns.org  Sat Feb 22 13:01:05 2003
      Return-Path: <root@vbird.adsldns.org>
      Received: from vbird.adsldns.org (localhost [127.0.0.1])
              by vbird.adsldns.org (8.12.7/8.12.7) with ESMTP id h1M514Jc022610
              for <vbird@vbird.adsldns.org>; Sat, 22 Feb 2003 13:01:05 +0800
      Received: (from root@localhost)
              by vbird.adsldns.org (8.12.7/8.12.7/Submit) id h1M514dg022608
              for vbird; Sat, 22 Feb 2003 13:01:04 +0800
      Date: Sat, 22 Feb 2003 13:01:04 +0800
      From: root <root@vbird.adsldns.org>
      Message-Id: <200302220501.h1M514dg022608@vbird.adsldns.org>
      To: vbird@vbird.adsldns.org
      Subject: test uuencode
      Status: R

      begin 666 bashrc
      M(R`N8F%S:')C"@HC(%-O=7)C92!G;&]B86P@9&5F:6YI=&EO;G,*:68@6R`M
      M9B`O971C+V)A<VAR8R!=.R!T:&5N"@DN("]E=&,O8F%S:')C"F9I"@I0051(
      M/2]S8FEN.B]U<W(O<V)I;CHO8FEN.B]U<W(O8FEN.B]U<W(O6#$Q4C8O8FEN
      M.B]U<W(O;&]C86PO8FEN.B]U<W(O;&]C86PO<V)I;CHO=7-R+VQO8V%L+V%P
      M86-H93(O8FEN"F5X<&]R="!0051("@IA;&EA<R!L;3TG;',@+6%L?&UO<F4G
      ""@H`
      `
      end

      真正的档案内容是 begin 到 end 的那些粗体字!使用 uudecode 时, uudecode 会主动的分析 begin 开始的字段,然后将 begin 后面的内容解译还原成为原来的档案内容!呵呵!恭喜您!
     

  • Linux 下使用 telnet 功能

  • 我们上面提到的是 mail 使用 sendmail 的默认功能,那是属于 local mailer 的功用!那么我是否可以藉由 smtp 来寄信呢?亦即使用 SMTP 这个服务来寄信!可以的啦,那就必需要使用 telnet 的功能啰!
    1. 寄信:
    [vbird@test vbird]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost (127.0.0.1).
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Sendmail 8.12.7/8.12.7; Sat, 22 Feb 2003 13:52:52 +0800
    ehlo localhost <==必需先跟主机打招呼喔!
    250-vbird.adsldns.org Hello localhost [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
    mail from: "Myname"<vbird@vbird.adsldns.org> 
    这里输入我要寄信的来源邮件地址,请记住,前面""里头是显示在信件表头的说明,
    后面< >里面接的才是你真正的邮件地址喔!
    250 2.1.0 vbird@vbird.adsldns.org... Sender ok
    rcpt to: <root@vbird.adsldns.org> <==输入邮件送达的目的端邮件地址
    250 2.1.5 root@vbird.adsldns.org... Recipient ok
    data <==要开始写信了喔!告知 data !
    354 Enter mail, end with "." on a line by itself
    This is just testing
    .       <==这两行是内容!不要忘记 . 这个咚咚!
    250 2.0.0 h1M5qqJc022990 Message accepted for delivery
    quit<==离开 telnet 程序!
    这样信件就寄出去啦!
    这样就 OK 啦! ^_^!
    注:Linux 下使用 telnet 功能,在 MAIL FROM、RCPT TO 内,后面接的项目若是 e-mail 的话,应该使用 "< >" 包起来,这样子才正确。
      MAIL FROM: usersname<userid@hostname.domainname>
      MAIL FROM: "users  name"<userid@hostname.domainname>
    另外许多 MTA 目前都会限制再使用 MAIL FROM 时要先使用 HELO或者是 EHLO 先打招呼过,要不然会不允许进行后续沟通。
     

  • X-Window 与 Windows 的 MUA 功能

  • Outlook 与 Netscape 会用吧?!由于是全图形接口,所以也没有什么好特别说明的地方,底下就来说一说关于 outlook 的设定方法,其他的 MUA 接口设定的方法都差不多啦!仔细参考一下即可啰!
    鸟哥的 Linux 私房菜 -- 邮件服务器
    1. 开启 OutLook Express,点选『工具』里面的『账号』;
    2. 点选『新增』选择『邮件』来设定;
    3. 输入显示名称:这个名称是别人在收信的时候,可以看到的寄件人称谓;
    4. 接着下来比较重要了,请使用你的 ID@hostname.adsldns.org 登入你的邮件服务器;
    5. 然后,当然邮件服务器收发都是同一个,请使用你的 DNS 申请的名称;
    6. 输入账号与密码,也可以选择『记忆密码』,然后按下一步,就完成了。
    基本上,Windows 这边只要设定如此即可!然后你就可以用你的 Linux 来当邮件服务器啰!!

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

    sendmail 本身的安全设定项目( Sendmail 官方的建议 )
     
    sendmail 本身已经提供相当多的安全项目建议,其中,大部分是在于『目录与档案权限』的设定要求上面!
     
    • 请确定 aliases 这个档案的权限,仅能系统信任的 User 可以存取,通常其权限为 644 ;
    • 请确定 sendmail 读取的数据库 ( 多半在 /etc/mail 底下的 *.db 档案 ),例如 mailertable, access, virtusertable 等等,仅能由系统信任的用户读取,其他一概不能读取,通常权限为 640 ;
    • 系统的队列目录 ( /var/spool/mqueue ) 仅允许系统读取,通常权限为 700 ;
    • 请确定 .forward 这个档案的权限也不能设定成为任何人均可查阅的权限,否则您的 e-mail 数据可能会被窃取~
    • 总之,一般用户能够不用 .forward 与 aliases 的功能,就不要使用!
     
    不过,这样的设定自然不够安全的啦!在 Sendmail 8.12 版本以后,甚至严格的规定系统的操作者为 smmsp 这个使用者呢!会更加的安全一些~如果您有兴趣的话,不妨将您的 sendmail 以底下介绍的 Tarball 的方式升级更新到 sendmail 8.12 版喔!
     

    SMTP 认证
     
    由前面的 Sendmail 的设定说明当中,您是否觉得上面所设定的 Sendmail 已经够用了呢?呵呵!想必是不够的!鸟哥我就觉得,嗯!还是有待加强!怎么说呢?想个例子好了,由于我的 sendmail 为了 Open Relay 的问题,所以势必要关闭所有的 relay ,而仅开放 Mail 本机以及部分网域或者主机的 Relay 使用权!不过,我总有在外面工作的时候吧!我总是有使用计时制 ADSL 这种非固定 IP 的联机模式来上网的时候吧!我的 Mail Server 上面的用户总有使用 notebook 而到处跑得吧!如此一来,这个 /etc/mail/access 的设定势必是不够的~那要怎么办呢?
     
    想象一下,如果我的 sendmail 也跟 pop3 这个收信服务一样,在要求传信的时候,必须提供账号与密码让 Mail 主机来认证,如此一来,不就可以藉由这账号、密码的机制来限制用户的使用了吗?!呵呵!好样的!没错,确实可以使用这样的机制。事实上,目前较常被使用的这种认证机制为 SMTP 邮件认证机制 ( SMTP Authorization ) ,主要透过 cyrus sasl 这个套件来达成邮件的认证动作,那么到底他是如何达到认证的呢?
       

    • Cyrus SASL 的动作:

    • Cyrus Simple Authentication and Security Layer 简称为 Cyrus-SASL ,他最大的功能在提供一些应用程序所使用的认证函式库!这里头最有名的例如 Sendmail 这个邮件服务器了! 应用程序可以透过 SASL 所提供的函式库功能,并且定义出认证的方式,让 SASL 透过与主机的沟通动作,提供应用程序来达到认证的目的!举个例子来说,如果我的 sendmail 已经提供了 SMTP 认证的功能,那当用户进入认证阶段时:
       
      1. 首先, sendmail 会去取用 SASL 的函式库资料;
      2. 此外,由于 SASL 可以进行的认证机制相当的多,所以 sendmail 必须要指定 SASL 的认证方式,一般而言,我们都会直接以 /etc/shadow 里面的账号密码来进行认证!至于针对 sendmail 的 SASL 认证方法则预设设定在 /usr/lib/sasl/Sendmail.conf 或 /usr/lib/sasl2/Sendmail.conf (根据 cyrus SASL 版本的不同而异!)
      3. SASL 根据设定的方法去取用密码与账号内容,并且加以比对,响应给 sendmail 该次比对是否成功!
       
      基础的流程是这样,不过 SASL 除了 Sendmail 的认证模式之外,其实他还提供很多的功能啦!因为 SASL 主要就是一个函式库,而这个函式库还具有额外的提供『密码认证档案』的功能,所以,只要是能够支持 SASL 的应用程序,就可以利用 SASL 所提供的这个认证功能来达到共享同一认证的好处!例如同一个 user 在 LDAP 与 Sendmail 这两个软件中,均可以使用同一组账号与密码!而不需要额外的针对不同的套件来设定额外的账号与密码!
       
      若单纯的指 Sendmail 这个应用程序的话,那么 SASL 至少可以提供使用 /etc/shadow 与 PAM 这两个密码验证机制,不过请特别留意的是, cyrus SASL 目前已经出到第二版了,而现今的 sendmail 大部分还是以 1.5.xx 版本进行设定的。实际上,这两个版本的认证原理与方法虽然一样,但是认证使用的执行档已经不同了!所以在 /usr/lib/sasl2/Sendmail.conf 这个档案当中的设定内容也不一样了!如果您要设定 SMTP 的 AUTH 的话,请特别留意这个不同点喔!
       

    • 实作的流程说明:

    • 由前面的介绍我们知道,要使用 SMTP AUTH 这个功能,你必须要:
       
      1. 你的 Linux Server 必须要已经安装 Cyrus SASL 函式库;
      2. 你的 /usr/sbin/sendmail 这支程序必须要将 SASL 的函式库功能编译在内;
      3. sendmail 配置文件 ( sendmail.cf ) 必须要将 SASL 的功能启动 ( 注:/usr/sbin/sendmail 虽然已经将 SASL 函式库编译在内,但是 sendmail.cf 这个档案仍然要将 SASL 的支持启动之后,才能使用 SMTP );
      4. 必须指定 sendmail 的 SASL 认证模式,通常有 pam 与 shadow 两种模式,在 SASL version 1 当中, sendmail 的 SASL 认证模式配置文件为 /usr/lib/sasl/Sendmail.conf ( S 为大写 ),若为 SASL version 2 则在 /usr/lib/sasl2/Sendmail.conf !而如果 Sendmail 里面设定为 pam 的话,那么 /etc/pam.d 里面亦需存在 smtp 这个档案才行!(所以我们通常都使用 shadow 而已~)
      5. 重新启动 sendmail 即可!
       
      可以看得出来,要让你的 Sendmail 由无到有的支持 SMTP AUTH 的话,那么就必须要重新编译 /usr/sbin/sendmail 这个执行档!哇!那就必须要使用 Tarball 的方式,并且依照上面的动作,一步一步的进行啦!过程还颇为繁复呢!这个动作我们在底下 以 Tarball 完全安装具有 SMTP 的 sendmail 部分再来讲解,如果您的 sendmail 并非为 Red Hat 的话,就得前往 Tarball 安装 sendmail 的章节了,不过,如果是 Red Hat 呢?恭喜您啦!因为 Red Hat 的 Sendmail 预设已经包含了 SASL 的函式库功能,只是默认的参数配置文件 ( sendmail.cf ) 并没有启用这个功能而已~底下我们就先以简单的 Red Hat 的 sendmail 来说明启动 SMTP AUTH 的流程吧!
       

    • Red Hat 的 SMTP 认证启用流程:

    • 很棒的是, Red Hat 的 sendmail ( /usr/sbin/sendmail 执行档 ) 已经支持 Cyrus SASL 了,只要将 sendmail.cf 里面关于 SMTP 认证的功能启动即可!所以,只要去编辑 /etc/mail/sendmail.mc 即可 ( 注:这个档案在不同的版本中,也会有被放在 /usr/share/sendmail-cf/cf/redhat.mc的时候!反正只要找到 sendmail.mc 或 redhat.mc 就对啦! ) :
       
      1. 修改 m4 script :
      [root@test root]# cd /etc/mail/
      [root@test mail]# vi sendmail.mc
      # 找到这几行:
      dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA') 
      # 将他修改成底下这样:
      TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
      DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')

      2. 开始制作 sendmail.cf 档案:
      [root@test mail]# m4 sendmail.mc > redhat.cf
      [root@test mail]# mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
      [root@test mail]# cp redhat.cf /etc/mail/sendmail.cf

      3. 启动 sendmail 与测试 SMTP AUTH
      [root@test mail]# /etc/rc.d/init.d/sendmail restart
      Shutting down sendmail:                                    [  OK  ]
      Starting sendmail:                                         [  OK  ]

      [root@test mail]# telnet localhost 25
      Trying 127.0.0.1...
      Connected to localhost.
      Escape character is '^]'.
      220 test.adsldns.org ESMTP Sendmail 8.11.6/8.11.6; Mon, 24 Feb 2003 11:51:04 +0800
      ehlo localhost  <==输入本机状态的测试
      250-test.adsldns.org Hello tsai.adsldns.org [127.0.0.1], pleased to meet you
      250-ENHANCEDSTATUSCODES
      250-8BITMIME
      250-SIZE
      250-DSN
      250-ONEX
      250-ETRN
      250-XUSR
      250-AUTH LOGIN PLAIN  <==出现这行就对啦!
      250 HELP
      quit

       
      如果出现上面的 AUTH LOGIN PLAIN 那一行的话,就表示 SMTP AUTH 已经正确的启用啦!这个时候,你就可以将 /etc/mail/access 这个档案里面的相关设定给他取消掉!直接以 SMTP 来抵挡啰!不过,无论如何,如果是内部的信件,使用 /etc/mail/access 的设定还是比较简单啦! ^_^
       

    • 客户端 Client 的设定:

    • 既然 SMTP AUTH 是使用用户提供的账号密码来进行身份的确认,那么自然我们就得在 Client 的 MUA 上面进行账号密码的设定啰!如果你的系统是 Windows ,使用的 OutLook 的话,那么应该要勾选底下这个咚咚:
       

       
      如果是 Netscape 的话,那就需要填写发信者姓名啰:
       

       
      这样您就可以使用 SMTP AUTH 带来的方便性啰!
       

     
    那么 SMTP 到底在那个步骤生效的呢?如果我们以前面提到的 一封邮件的收受流程 当中,再加入这个账号与密码的功能时,那信件会变成怎么跑呢?
     
    1. 还是会先判断是否有收件人在本机账号中,若有则收,没有则下一步;
    2. 还是会判断 /etc/mail/access.db 的动作设定,若有则作动作,否则下一步;
    3. 开始启动账号密码的机制判断,若用户提供的账号密码可以通过这个机制,则信件开始 relay ,否则下一步;
    4. 将原信件退给发信者!
     
    大致的流程就是这样啦!所以啰, /etc/mail/access 还是有存在的价值喔!尤其针对内部网域而言~
     
    关于 ORDB 抵挡 open relay 邮件主机之机制说明与实作
     
    什么是 Open Relay 呢?我们还记得在原理说明的地方曾经提过 Relay 这个玩意吧!目前预设的 Mail Server 都已经将 Relay 关闭了,而仅开放部分的信任网域,或者是直接经由类似 SMTP AUTH 的认证机制来进行 Relay 的功能!而如果一个 Mail Server 对于 Client 端的 Relay 需求完全的接受,那就是 Open Relay 啦!如果你的 Mail Server 被测试出有 Open Relay 的情况,那么你的邮件主机将会被当成是『黑名单』的一员,情节较轻者,可能会被停止使用 mail 的权力,情节较重者,则可能被完全停止使用网络的权力!关于台湾地区『学术网络黑名单』的 IP 数据,您可以在底下的网址查询到:
     
    http://140.111.1.22/tanet/spam.html
     
    我们上面介绍了很多的 Sendmail 相关的技巧与设定,可以让我们的主机不至于被当成『黑名单』的一员,不过,由于开放 Open Relay 的邮件主机对于网域内的网络具有相当大的破坏力,因为带宽会被吃光光,所以,如果我们发现有 Open Relay 的主机,其实也可以抵制我们的用户将信送到对方的主机的,以提醒我们的客户端『咦!应该要强迫对方邮件主机管理员进行维护了!』
     
    可不可能达到这样的目的呢?可以的,就使用 Internet 上面提供的 Open Relay 名单数据库来进行『校阅』的动作啦!那么这个方法是如何工作的呢?是这样的:『当我们的 Sendmail 要传送信件到下一个 MTA 时,会先到 Open Relay 黑名单数据库查询该主机 IP 或主机名是否在黑名单中,若不在黑名单中,则进行 Relay ,若在黑名单当中,则停止 Relay 的动作,并将信件退回,且在退回的信件上面注明此信被退回的原因,以提供使用者向网站管理员申诉的意见之用!』那么那个网络黑名单数据库在哪里呢?目前有很多黑名单数据库,鸟哥我使用的是 http://www.ordb.org 这个网站提供的数据库确认喔!
     
    注:如果您以浏览器(Netscape 或 IE)进行 http://www.ordb.org 的浏览时,却出现一片白白的画面,这是编码的问题!请在您的浏览器上面选择编码为『繁体中文(Big5)』就可以看到该网站的内容咯!
       

    • 如何确认一部主机是否具有 Open Relay 的问题?

    • 有 Open Relay 可是很危险的呢!那么如何确定我自己的主机有 Open Relay 呢?
      1. 是否已在黑名单数据库中:确认的方法很简单,直接到『http://www.ordb.org/lookup/』输入您的主机名或者是 IP ,就可以检查是否已经在黑名单当中;
      2. 是否具有 Open Relay :如果要测试你的主机有没有 Open Relay ,直接到『http://www.ordb.org/submit/』这个网页,同样输入主机或者 IP ,就可以将你的 IP 加入 Open Relay 的排程中,此时 ORDB 会主动的寄信给你的 Mail Server ,以确认该主机是否为 Open Relay 呢!
      3. 如何移除:如果被检查出,您的主机已经在黑名单当中,那么请立刻将 Open Relay 的功能关闭,改善你的 Mail Server 之后,再以移除的方法『http://www.ordb.org/submit/』进行检查,如果检查出已经改善了,那就会自动将该黑名单数据库中移除!


       
    在 Sendmail 上面启用 ORDB 网站提供的功能实在很简单,请依照底下的步骤进行即可:
     
    1. 修改 m4 script :
    [root@test root]# cd /etc/mail
    [root@test mail]# vi sendmail.mc
    # 在 MAILER 之前加入这一行,请注意,底下是『同一行』:
    FEATURE(`dnsbl', `relays.ordb.org', `"Email blocked using ORDB.org - see <http://ORDB.org/lookup/?host="$&{client_addr}">"')

    2. 开始制作 sendmail.cf 档案并启动 sendmail:
    [root@test mail]# m4 sendmail.mc > redhat.cf
    [root@test mail]# mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
    [root@test mail]# cp redhat.cf /etc/sendmail.cf
    [root@test mail]# /etc/rc.d/init.d/sendmail restart
    Shutting down sendmail:                                    [  OK  ]
    Starting sendmail:                                         [  OK  ]

     
    千万不要怀疑,这样即刻生效了啦! ^_^
     
    Procmail 相关说明
     
    什么是 Procmail
    什么是 procmail 呢?简单的说, Procmail 可以被视为一个 MDA 啦,也就是说,当 mail server 取得了自家的信之后,会将该封信件交给 procmail 来进行处理,而 procmail 会经由分析该邮件的内容,以及使用者设定的相对应状态,来将信件进一步过滤 ( filter )!举个例子来说,你晓得有一个以『AV情色』为邮件主旨的信件,其实他是一个广告信,那么你想让 mail server 主动的将这种信件『丢掉』的话,那么可以在 procmail 的配置文件当中,加入分析此一邮件主旨,以后,若来信符合这个设定时,就会被 procmail 丢弃了!当然 procmail 的功能还不止于此,这仅是最简单的功能而已~
     
    启用 Procmail 的支援
    基本上,如果你要启动 procmail 的话,就必需要再次的修改您的 m4 scripts 档案,也就是 redhat.mc 那个档案啦!不过, Red Hat 各个版本的 sendmail 预设都已经启动 procmail 啦!所以你可以不需要修改呢!无论如何,我们还是来看一下 与 procmail 有关的 m4 script 设定内容吧!
     
    [root@test root]# cd /etc/mail
    [root@test mail]# vi sendmail.mc
    # 底下仅列出与 procmail 有关的设定
    define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl <==procmail 的执行档完整档名
    FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl <==加入 procmail 之设定
    MAILER(smtp)dnl
    MAILER(procmail)dnl  <==procmail 请放置在 smtp 后面喔!
     
    是的,就是这几行而已,你的 procmail 就已经被支持成为 MDA 啦!如果您是以 Tarball 安装 Procmail 的话,那么请记得将上面那几行对应到你的系统当中喔!切记切记!
     
    开始设定 Procmail 的过滤规则
    刚刚说过, Procmail 是利用『用户定义出的过滤规则』来进行邮件的过滤的,那么这个档案预设放在哪里呢?预设就是放在 /etc/procmailrc 这个档案啦!不过,这个档案预设是不存在的,也就是说,虽然你启动的 procmail 的 MDA 功能,但是你并没有启用任何的规则,所以当然进入 mail server 的邮件,就不需要被『过滤』啦!而如果你定义出规则在 /etc/procmailrc 之后,以后信件就会拿该规则来进行过滤啰!在此需要先介绍一下,一封邮件的内容主要分为两部分:
    1. 表头 ( Header ) 一些基本信息如发件人、标题等等;
    2. 主要内文 ( Body ) 部分
    至于 Procmail 过滤规则的设定方法是这样的:
     
    一组规则设定至少共含有三行:
    :0 [flags] [ : [locallockfile] ]  <==设定要被过滤邮件的检查地方
    <zero or more conditions (one per line)>  <==被检查的规则内容
    <exactly one action line>  <==若符合所定义的规则内容,则邮件要进行的动作!

    参数说明:
    a. 关于检查邮件的部分(第一行),flags 包含有:
      H : Header 的检查
      B : Body 的检查
      h : 提供 Header 的数据,进入 pipe 、 file 及 mail 等的检查
      b : 提供 Body 的数据进入 pipe, file 及 mail 等的检查!
    b. 关于检查内容的部分:
      ! : 这是反向选择的意思
      < : 检查 mail 的总长度是否小于设定值 ( bytes )
      > : 与 < 相反的选择啰!
    c. 关于动作的部分
      | : 开始启用后续的 shell 程序工作!
    d. 其他的环境变量部分:
      PATH    搜寻执行文件的路径
      SENDMAIL  那个 /usr/sbin/sendmail 啰!
      LOGFILE   登录档!通常设定在 /var/log/procmail.log
    e. 与 Regular express 相关的部分:
      ^ : 开始(同一行最左边)字符
      $ : 本行的终止符(最右边)的比对
      . : 除了新增一行之外的任何字符!
      \ : 跳脱字符
    更详细的内容请务必参考:
    man procmailrc
    man procmailex

     
    如果有兴趣的话,可以参考我设定的 /etc/procmailrc 的档案内容喔!你也可以下载(http://linux.vbird.org/download/index.php#sendmail_sendmail)喔!
     
    # History of procmail RC file, 
    # Written by VBird 
    ############ History ############################################
    # Day  Who What
    # ---------- ------ ---------------------------------------
    # 2002/05/04 VBird First build, all is the same with
    #   卧龙小三 ftp://ftp.tnc.edu.tw/pub/Sysop/MAIL/procmailrc
    #   林克敏   http://freebsd.lab.mlc.edu.tw/procmail.htm
    # 2002/05/04 VBird 新增广告信件移除两个!
    # 2002/05/06    VBird   新增 Klez.W32 病毒的针测
    # 2003/09/05 VBird 新增 Sobig 与 MiMail 病毒抵挡!
    #################################################################
    ############ Globle settings ####################################
    LOGFILE=/var/log/procmail.log
    UMASK=000

    ################ Virus scanner ##################################
    ############# 1. KLEZ.G Virus ###################################
    :0b
    * ^Subject:.*(Let's be friends)
    /dev/null

    :0b
    * ^Subject:.*A funny game
    /dev/null

    :0b
    * ^Subject:.*Hello\,.*\,how are you.*
    /dev/null

    :0 B
    * ^Content-Type:.*audio/x-wav.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 B
    * ^Content-Type:.*audio/x-midi.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 B
    * ^Content-Type:.*application/octet-stream.*
    * ^.*name=.*\.(scr|SCR)
    /dev/null

    :0 Bb
    * ^This game is my first work.*
    * ^You\'re the first player.*
    * I.*you would .* it.*
    /dev/null

    :0 Bb
    * Hello,This is a.*
    * I.*you would.*it.*
    /dev/null

    :0 Bb
    * ^This is a.*
    * ^I.*you would.*it.*
    /dev/null

    :0 Bb
    * .*This is a.*patch.*
    * ^I .* you would.*it.*
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="ANTI_CIH.EXE"
    /dev/null

    :0b
    * ^Subject:.*W32.*removal tools$
    /dev/null

    :0b
    * ^Subject:.*Worm Klez.*immunity.*
    /dev/null

    ############# 2. Nimda Virus ####################################
    :0 Bh
    * ^Content-Type:.*audio/x-wav.*
    * name="readme.exe"
    /dev/null

    :0 Bh
    * ^Content-Type:.*audio/x-wav.*
    * name="sample.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="readme.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*multipart/mixed.*
    * name="sample.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*application.*
    * name="readme.exe"
    /dev/null

    :0 B
    * ^Content-Type:.*application.*
    * name="sample.exe"
    /dev/null

    :0 Bh
    * charset="iso-8859-1"
    * name=.*bat
    /dev/null

    :0 Bh
    * charset="iso-8859-1"
    * name=1.*zip
    /dev/null

    ############# 3. SirCam Virus ###################################
    :0 Bh
    * I send you this file in order to have your advice 
    /dev/null

    ############# 4. MMail  Virus ###################################
    :0 Bh
    * name=.*message.zip
    /dev/null

    ############# 5. Sobig  Virus ###################################
    :0 Bh
    * name=.*pif
    /dev/null
     

    #################################################################
    ############# 广告信  ###########################################

    # 来自奇摩与 PCHOME 的都挡掉!
    :0 Bh
    * href\=.*http:\/\/home\.kimo\.com\.tw
    /dev/null

    :0 Bh
    * href\=.*http:\/\/home\.pchome\.com\.tw
    /dev/null

    :0 Bh
    * Subject:.*AV66情色派
    /dev/null

    :0 Bh
    * From:.*创意营销
    /dev/null

    :0 Bh
    * http:\/\/.*etl\.com\.tw
    /dev/null

    :0 BhH
    * http:\/\/f2m\.aac\.com\.tw
    /dev/null

    :0 BhH
    * http:\/\/www\.9895\.com
    /dev/null

    :0 BhH
    * http:\/\/88\.to
    /dev/null

    :0 BhH
    * http:\/\/fly\.to
    /dev/null

    :0 BhH
    * http:\/\/china\.kyodo\.co\.jp
    /dev/null

    :0 BhH
    * http:\/\/.*\.openmybiz\.com
    /dev/null

    :0 BhH
    * http:\/\/.*\.pufan\.com
    /dev/null

    :0 BhH
    * http:\/\/.*\.buyy\.biz
    /dev/null

    :0 BhH
    * http:\/\/.*\.tw886\.to
    /dev/null

    :0 BhH
    * http:\/\/.*\.hala\.idv\.tw
    /dev/null

    # 底下是最近的一些发信软件所发送的几个 Keyword. 2003/09/05
    :0 Bh
    * http:\/\/.*\.wantclick\.com
    /dev/null

    :0 Bh
    * http:\/\/fastcounter\.bcentral\.com
    /dev/null

     
    此外,您还要新增一个档案在 /etc/logrotate.d 里面才行!因为你会多一个 /var/log/procmail.log 的档案啊!
     
    [root@test root]# vi /etc/logrotate.d/procmail
    /var/log/procmail.log {
            monthly
            rotate 5
            nocompress
    }
     
    其他 Procmail 相关的信息可以查询底下的网站喔!
    http://www.procmail.org
    http://www.sektorn.mooo.com/era/procmail/mini-faq.html

大标题的图示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 对于安全的要求越来越严格,所以你必须针对每个目录或档案进行检查才行!通常检查的目录为:
    • /etc/mail :里面的档案至少都为 644 或 640 的权限!
    • /var/spool/mqueue :务必为 700 的权限
    • /var/spool/clientmqueue:这在 8.12 才有,所有人与群组务必为 smmsp ,而权限务必为 770 ;
    • 每个 ./forward 的档案需要控制其权限喔!在 8.12 版本中, .forward 的『拥有群组』必须要为 smmsp ,并且其权限必须要为 640 才行喔!
  8. 关于使用者的设定问题:一般而言,如果使用者不登入 sendmail 主机进行寄信的动作( local mailer ),那么 /etc/passwd 里面的设定就无关紧要了!不过,如果该使用者想要在 sendmail 本机上面使用 mail 的功能,那么在 8.12 版本当中,您就必须要:
    • 使用者的 primary 群组必须要为 smmsp !
    • 使用者的 shell 必须要可以登入才行!
    • 其他使用者的相关档案当中,最明显的 .forward 权限必须设定正确!
  9. 其他档案的设定问题:
    • 如果发现只有某个 domain 可以寄信,其他的同一主机的 domain 无法寄信,需要检查 local-host-names 这个档案的设定;
    • 如果发现邮件被挡下来了!而且老是显示 reject 的字样,那么可能被 /etc/mail/access 挡住了;
    • 如果发现邮件队列 (mailq) 存在很多的邮件,可能是 DNS 死掉了,请检查 /etc/resolv.conf 的设定是否正确!
  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 私房菜 -- 基础学习篇』里面介绍过了,这里不再重复介绍,要介绍的是几个可能会发生在实际的案例中的一些小技巧:
  • 邮件信箱所在的磁盘空间不足了:

  • 这是很可能会发生的问题啊!尤其是在用量很大的网站上面!这个时候你的解决方法主要有:
    1. 新增加一颗硬盘,格式化好之后将他 mount 到 /var/spool/mail 这个目录下;
    2. 如果主机里面还有其他目录具有很大的空间,例如 /home 这个地方,那么就可以:

    3. cd /var/spool
      mv mail /home
      ln -s /home/mail mail
     
  • 使用 quota 设定:

  • 一般而言,我们通常会将 /home 做为 quota 的 partition ,那么 /var/spool/mail 其实也可以依附在 /home 这个 partition 之下,来达到 quota 对于使用者的规范喔!达成的方法很简单啦:
    1. 先在主机规划与安装的时候,让 /home 独立于一个 partition 当中;
    2. 以『鸟哥的 Linux 私房菜 -- 基础学习篇』的 quota 内容为范例,建立好 /home 的 quota 限额;
    3. 将 /var/spool/mail 整个搬到 /home 底下,并做好连结的动作就可以立即生效啦:

    4. cd /var/spool
      mv mail /home
      ln -s /home/mail mail
     
  • 关于使用者邮件的放置地点:

  • 很多的读者可能喜欢让每个使用者去到自己的家目录读取 mail box 的咚咚,亦即是将 /var/spool/mail 的内容给他搬到个别的家目录去!例如 vbird 的 mail box 变成的 /home/vbird/vbird 这个档案!不过,如此一来的话, sendmail 与 pop 都将需要改写其 source code !所以『不建议这么搞喔!』

大标题的图示本章与 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 才行!』至于会考的档案与指令可能有这些:

大标题的图示参考资源:

大标题的图示本章习题练习 ( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
  • 我在使用 Sendmail 寄信时,却发生底下这个问题,请问可能的发生原因为何?
  • 请列出四个 Mail Server 的相关的组件,以及其功用为何?
  • POP3 与 SMTP 的功能为何?
  • 请简单的说明 DNS 里面 MX 标志与 Mail 的关系为何?
  • 今天我突然兴起,想要修改我的 sendmail ,请问, sendmail 的配置文件在哪里?而我要以什么程序修改 sendmail 呢?
  • 什么是 mailling list ?在 sendmail 底下有什么方法可以不藉由其他的软件达到 mailling list 的功能?
  • 如何察看邮件队列的内容,以及邮件队列内容放置在何方?
  • 若我的 sendmail 主机有很多名称,我想让这些名称都可以进行 mail 的接收,应该修改什么档案?
  • 什么是 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 的内容、整个版面稍微修订,以及内容的稍微校稿!
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室