使用 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 这个档案当中寻找!
#p#
二、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
这样就成功得用M4设定sendmail啦!
【编辑推荐】