1.1. M4 和 sendmail.cf

Sendmail的配置文件 sendmail.cf 算得上“臭名昭著”,看看这个文件一定会让你头大,几乎没有人从头来写这个文件。关于 sendmail.cf 的详细内容,参见:Sendmail Installation and Operation Guide --- THE WHOLE SCOOP ON THE CONFIGURATION FILE

通过使用 m4 宏处理命令,由宏文件 sendmail.mc 来生成复杂的配置文件 sendmail.cf,一切变得简单多了。

/etc/mail/sendmail.mc 文件即是原始宏文件。生成配置文件 sendmail.cf 的命令为:


$ m4 sendmail.mc > sendmail.cf

默认的配置文件仅仅能在本机发送邮件,如果需要更强的功能,需要修改宏文件:sendmail.mc

缺省的sendmail.mc文件:

divert(-1)                                     1
dnl This is the sendmail macro config file. If you make changes to this file,
dnl you need the sendmail-cf rpm installed and then have to generate a
dnl new /etc/sendmail.cf by running the following command:
dnl
dnl        m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
dnl
include(`/usr/share/sendmail-cf/m4/cf.m4')
VERSIONID(`linux setup for Red Hat Linux')dnl  2
OSTYPE(`linux')                                3
dnl Uncomment and edit the following line if your mail needs to be sent out
dnl through an external mail server:
dnl define(`SMART_HOST',`smtp.your.provider')  4
define(`confDEF_USER_ID',``8:12'')dnl          5
undefine(`UUCP_RELAY')dnl
undefine(`BITNET_RELAY')dnl
define(`confAUTO_REBUILD')dnl
define(`confTO_CONNECT', `1m')dnl
define(`confTRY_NULL_MX_LIST',true)dnl
define(`confDONT_PROBE_INTERFACES',true)dnl
define(`PROCMAIL_MAILER_PATH',`/usr/bin/procmail')dnl
define(`ALIAS_FILE', `/etc/aliases')dnl        6
dnl 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
define(`confAUTH_OPTIONS', `A')dnl
dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confTO_QUEUEWARN', `4h')dnl
dnl define(`confTO_QUEUERETURN', `5d')dnl
dnl define(`confQUEUE_LA', `12')dnl
dnl define(`confREFUSE_LA', `18')dnl
dnl FEATURE(delay_checks)dnl
FEATURE(`no_default_msa',`dnl')dnl
FEATURE(`smrsh',`/usr/sbin/smrsh')dnl        7
FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl
FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl 8
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl                9
FEATURE(use_cw_file)dnl                      10
FEATURE(use_ct_file)dnl                      11
dnl The '-t' option will retry delivery if e.g. the user runs over his quota.
FEATURE(local_procmail,`',`procmail -t -Y -a $h -d $u')dnl
FEATURE(`access_db',`hash -o /etc/mail/access.db')dnl
FEATURE(`blacklist_recipients')dnl
EXPOSED_USER(`root')dnl
dnl This changes sendmail to only listen on the loopback device 127.0.0.1
dnl and not on any other network devices. Comment this out if you want
dnl to accept email over the network.
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
dnl NOTE: binding both IPv4 and IPv6 daemon to the same port requires
dnl       a kernel patch
dnl DAEMON_OPTIONS(`port=smtp,Addr=::1, Name=MTA-v6, Family=inet6')
dnl We strongly recommend to comment this one out if you want to protect
dnl yourself from spam. However, the laptop and users on computers that do
dnl not have 24x7 DNS do need this.
FEATURE(`accept_unresolvable_domains')dnl     12
dnl FEATURE(`relay_based_on_MX')dnl
MAILER(smtp)dnl
MAILER(procmail)dnl
Cwlocalhost.localdomain
1

divert(-1),从这行以下到divert(0)之间会被忽略,不会加到产生出来的*.cf文件中,通常放一些版权信息之类。

2

放入一些版本信息

3

根据平台设置,产生相关环境设定

4

行首的 dnl 相当于注释

5

行尾的 dnl 用于去掉行尾的空格、回车换行,以避免生成的文件包含过多的空行。

6

设置别名文件。亦可设置多个别名文件,如:define(`ALIAS_FILE', `/etc/aliases,/usr/local/majordomo/majordomo.aliases')dnl

7

smrsh 即 sendmail restricted shell。简而言之smrsh限制了攻击者可以执行的程序集。当它与sendmail程序一起使用的时候,smrsh有效的将sendmail可以执行的程序的范围限制在smrsh目录之下。

8

允许在同一个主机上使用多个虚拟域

9

即使是本地传送的信件,也会加上domain-name。

10

会参考 /etc/mail/local-host-names 来决定哪些domain-name是local-host。

11

会参考 /etc/mail/trust-users 文件,来决定哪些用户可以以其它身份发信而不产生警告。Majordomo 用户需要属于 trust-users。

12

发件人的地址如果不能解析,也能发送成功。避免由于域名解析受限制而拒收邮件。

修改该配置如下:

dnl Dmworldhello.net
dnl Dwmail
dnl define(`confDOMAIN_NAME', `$w.$m')dnl                    1
... ...
FEATURE(`domaintable',`hash -o /etc/mail/domaintable')       2
... ...
FEATURE(`genericstable',`hash -o /etc/mail/genericstable')   3
... ...
GENERICS_DOMAIN_FILE(`/etc/mail/genericsdomain')             4
... ...
dnl  DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')     5
... ...
FEATURE(`accept_unqualified_senders')dnl                     6
... ...
define(confMAX_HOP,30)                                       7
... ...
Cwlocalhost.localdomain your_real_domain                      8
... ...
1

如果sendmail不能正确判断本机域名,使用由变量 $w 和 $m 确定的域名。

2

添加配置,提供地址重写方式

3

添加配置,提供地址重写方式

4

添加配置,提供地址重写方式

5

注释掉本语句的目的是侦听所有网卡,为整个网络提供服务

6

允许未加域名的发件人发送邮件,默认禁止。

7

设置转发的地址不能超过30个。

8

定义类$w,在此处或者外部文件中定义。用于设置服务器提供服务的域名,即本地主机名。

外部文件通常为 sendmail.cw,新版本为 local-host-names。但也有可能是其他名称,用如下命令查看:


$ grep "^Fw" sendmail.cf 
Fw/etc/mail/local-host-names