您的位置: 网站首页 > 千军万马 > Linux操作系统 > 第8章 电子邮件服务器配置 > 【8.2 Sendmail邮件服务器】

8.2 Sendmail邮件服务器

 

8.2  Sendmail邮件服务器

Fedora 6的安装光盘中已经自带Sendmail服务器的安装包。为了避免重复安装,应该先检测机器是否安装过。右击新建终端,执行以下命令:

[root@localhost etc]# rpm -qa|grep sendmail

sendmail-8.13.8-2

sendmail-cf-8.13.8-2

1.安装Apache服务器程序

如果发现还没有安装Apache服务器程序,则进行以下操作进行服务器的安装:

1)选择“应用程序”→“添加/删除软件”选项,弹出“软件包管理者”对话框,如图8-2所示。

8-2  软件包管理者

2)在左侧主选项中选择“服务器”选项,在右侧相应的选项中选择“邮件服务器”选项,如图8-3所示。

8-3  选择“万维网服务器”选项

3)单击“可选的软件包”按钮添加可选的软件包,如图8-4所示,选择完毕后单击“应用”按钮安装Sendmail软件。

8-4  选择软件包

用命令行查看Sendmail是否在此时已经启动,利用ps指令查看是否存在Sendmail程。

[root@localhost etc]# ps -e|grep sendmail

 1744 ?        00:00:02 sendmail

 1752 ?        00:00:00 sendmail

2.运行Sendmail服务

如果需要运行Sendmail服务或是要求系统开机自动运行Sendmail服务器,则可在图形界面进行设置。选择“系统”→“管理”→“服务器设置”→services选项,则系统自动弹出“服务配置”对话框,如图8-5所示。

8-5  服务配置

在此对话框的左侧部分查找Sendmail选项,然后单击“开始”按钮,Apache就会自动运行。单击“重启”按钮,Apache自动重新启动。选取Sendmail选项,单击“保存”按钮,Apache在系统启动时就会自动运行。

8.2.1  Sendmail的工作模式及DNS配置

虽然现在有许多的程序可以作为信件传输代理,但是Sendmail却是其中最重要的一个,事实证明它可以支持数千甚至更多的用户,而且占用的系统资源少。不过Sendmail的配置十分复杂,因此,也有人使用另外的一些工具,如smail。当然,基于Windows NTExchangeServerNetScape Message Server也是这种产品的例子。

无论什么产品,它们必须支持同样的规范,如信件传输的报文格式,监听的端口等。一般来说,系统管理员并不需要了解信件传输的命令标准,用户代理会生成正确的命令。但是,了解其他一些信息是重要的。

信件传输代理运行在25端口接受请求,当接受用户的请求时,它不需要身份验证。因此不需要提交用户口令就可以发出电子邮件,这意味着任何用户都可以冒充成另外一个用户发出假的电子邮件,这是电子邮件设计的一个弊端,无法消除。

Sendmail程序得到一封待发送的邮件的时候,它需要根据目标地址确定将信件投递给哪一个服务器,这是通过DNS服务实现的。例如,有一封邮件的目标地址是someone@y ahoo.com,那么,Sendmail首先确定这个地址是用户名(someone+机器名(yahoo.com)的格式,然后,通过查询DNS来确定需要把信件投递给某个服务器。

DNS数据中,与电子邮件相关的是MX记录,这可以在查询DNS时设置查询类型为mx来得到,在命令行中执行:

[root@localhost ~]# nslookup

> set q=mx

> sohu.com.cn

Server:         192.168.0.1

Address:        192.168.0.1#53

Non-authoritative answer:

sohu.com.cn     mail exchanger = 10 sohumx.sohu.com.

在一般的情况下,MX交换器会自动把信件内容转交给目标主机,不过,也有可能存在目标主机(比如yahoo.com)不存在,或者不执行smtp服务,而是由其MX交换器来执行信件管理的情况,这时候,最终的信件将保存在MX机器上,直到用户来查看它。可以简单地在DNS记录中用MX关键字设置信件交换,例如,在设置中:

@ IN SOA openlab.cau.edu.cn. wanghy.openlab.cau.edu.cn. (

1997022700 ; Serial

28800 ; Refresh

14400 ; Retry

3600000 ; Expire

86400 ) ; Minimum

IN NS openlab.cau.edu.cn.

IN MX 10 mail.cau.edu.cn.

IN MX 20 mail2.cau.edu.cn.

openlab IN A 202.199.248.6

openlab IN MX 10 mail2.cau.edu.cn.

mail IN A 202.199.248.11

www IN A 202.199.248.2

mail2 IN A 202.199.248.177

这里面定义了三个MX记录,MX记录的规则是:

[机器名/域名] IN MX [优先级] [服务器]

优先级是一个整数,数值越小优先级越高。第一个IN MX 10 mail.asnc.edu.cn.因为没有机器名,使用来自named.conf的默认后缀,就是asnc.edu.cn,这个定义也就是让所有some@ asnc.edu.cn的信件传送到mail.asnc.edu.cnIN MX 20 mail2.asnc.edu.cn.的概念差不多,只是其优先数为20,也就是说只有当mail.asnc.edu.cn拒绝接受(比如,服务器忙或者当机)的时候,信件才会投递到mail2.asnc.edu.cnopenlab IN MX 10 mail2.asnc.edu.cn.定义凡是someone@openlab.asnc.edu.cn的信件要发送到mail2.a snc.edu.cn,依此类推。

MX记录可以使整个子域内的用户使用同样的邮件主机和传输代理,另外,如果用户用户主机不能工作时,那么信件可以暂时存储在信件交换主机上,直到用户自己的机器恢复为止。例如,mail.yourdomain.com是一台smtp主机,而mx2.yourdomain.com是另外一smtp主机,用户希望在mail.yourdomain.com正常的时候直接由其自身收发邮件,而万一mail崩溃,mx2为它暂时存储一段时间的邮件直到mail恢复正常工作——这是常见的设置。那么,则需要把mail以比较高的优先数设置成自己的信件交换主机,而mx2作为一个优先数较低的信件交换主机,也就是,在用户的DNS配置文件中,应该配置:

mail IN MX 0 mail

IN MX 10 mx2

如果DNS查询无法找出某个地址的MX记录(通常因为对方没有信件交换主机),那么Sendmail将是试图直接与对方的主机(来自邮件地址)对话并且发送邮件。例如,test@ openlab.asnc.edu.cnDNS中没有对应的MX记录,因此Sendmail在确定MX交换器失败后,将从DNS取得对方的IP地址并直接和对方对话试图发送邮件。

Sendmail发送邮件时,如果经过设定的时间后仍然未能将信件投递到目的主机,它将返回一个错误信息,间隔一段时间后,重新尝试投递,如果连续多次失败,Sendmail最终将放弃投递并将错误信息投递给postmaster用户。在许多机器上,postmaster用户是root用户的一个别名(参考下面关于别名的内容),用户应该将它设置为邮件的实际管理员的用户名。

上面介绍的内容就是Sendmail的基本工作方式,还有一个问题就是所谓“信封地址”。简单地说,当Sendmail向目标地址发信的时候,它并不是直接用用户的信件内容发送,相反,它依赖于用户给它的命令。例如,用户可能会用mail程序向某个地址发信:

$mail someone@somedomain.com

To:other@otherdomain.com

Subject:test mail

test

那么,当Sendmail发信的时候,它是向someone@somedomain.com发信而不是other@ot herdomain.com。相应地,如果用户想向两个人发信,例如在Outlook里面写上:“投递给user1@a.com,抄送user2@b.com”,那么Sendmail将试图构造两个包装(称为信封),每个包装上只列出一个投递地址,各投递一次。虽然邮件正文的头部仍然包含两个地址,但是Sendmail不会看它。

8.2.2  Sendmail的配置

Sendmail是一个极为复杂的程序,其行为主要依赖于/etc/mail/mail.cf配置文件。实际上,这是一个极其复杂的文件,这里也不建议用户从头到尾直接去写这个文件。一般来说,大部分使用者是用m4宏处理来书写Sendmail.cf。虽然m4程序几乎和Sendmail.cf 一样复杂,不过,通常普通用户只需要关心一些比较重要的部分即可。

要使用宏处理程序,必须确定已经安装了m4Sendmail-cf两个软件包,Sendmail默认下,Sendmail-cf安装在/usr/lib/Sendmail-cf目录下。

首先从构造一个简单的可以使用的Sendmail.cf文件开始,建立一个文件,称为Sendmail.mc,并将其拷贝到/usr/lib/Sendmail-cf/cf目录下:

include(`../m4/cf.m4)

define(`confDEF_USER_ID,``8:12)

OSTYPE(`linux)

FEATURE(redirect)

FEATURE(always_add_domain)

FEATURE(use_cw_file)

FEATURE(local_procmail)

MAILER(procmail)

MAILER(smtp)

提示:注意里面的正反引号,而且不能随便加入空格。

然后,用m4程序可以生成一个Sendmail.cf。在命令行中输入下面命令:

m4 sendmail.mc /etc/sendmail.cf

接下来,启动Sendmail程序并输入:

killall sendmail

sendmail –bd –q15m

用户会发现现在可以在这台主机上发送电子邮件了。

一般情况下,可以像用m4程序生成Sendmail.cf一样,通过更改模板来改变sendm ail.cf的内容。一个mc模板文件通常可以包含几个段落:

divert

通常总是设置为divert(-1)m4在输出中删除一些不需要的内容。

OSTYPE OSTYPE

定义使用的操作系统类型,当然在理想的情况下就是使用Linux,但是一定要注意m4程序中引号的用法,一个反引号和一个正引号才代表把对应的东西括起来。

define

定义一些全局设置,对于Fedora系统,设置了OSTYPE之后,可以定义下面的一些全局参数,如果不定义,就使用默认值。例如:

define(ALIAS_FILE,/etc/aliases)

变量名说明(方括号中为默认值)

ALIAS_FILE [/etc/aliases]

别名文件的位置。如果有多个别名文件,需要把它们用引号括起来。

confCR_FILE [/etc/mail/relay-domains]

默认的域定义文件,在这个域中定义的域中机器可以通过用户的服务器进行邮件发送。

HELP_FILE [/usr/lib/sendmail.hf]

此文件中含有对SMTPHELP命令进行响应时要列出的信息。

QUEUE_DIR [/var/spool/mqueue]

邮件队列文件所在目录。

STATUS_FILE [/etc/sendmail.st]

Sendmail的状态信息文件。

LOCAL_MAILER_PATH [/bin/mail]

用于投递本地邮件的程序。

LOCAL_MAILER_FLAGS [rmn9]

local mailer要用到的标志,永远包含标志lsDFM

LOCAL_MAILER_ARGS [mail -d $u]

在投递本地邮件时所传送的参数。

LOCAL_MAILER_MAX [没有]

如定义了此参数,则为此邮件服务器所能接收最大单个邮件大小。

LOCAL_MAILER_CHARSET [没有]

如果定义了此参数,则被转化为MIME格式的从其他地址到local mailer的含有8位字符的信息将被标为此字符集。

LOCAL_SHELl_PATH [/bin/sh]

用于投递利用管道功能处理的邮件的shell

LOCAL_SHELL_FLAGS [eu9]

prog mailer用到的标志。在此标志中永远包含标志lsDFM

LOCAL_SHELL_DIR [$z:/]

shell运行时所要查找的目录路径。

USENET_MAILER_PATH [/usr/lib/news/inews]

用于投递电子新闻组的程序名称。

USENET_MAILER_FLAGS [rlsDFMmn]

usenet mailer的投递标志。

USENET_MAILER_ARGS [-m -h -n]

usenet mailer的命令行参数。

USENET_MAILER_MAX [100000]

usenet mailer所能接收的最大信息大小。

SMTP_MAILER_FLAGS [没有]

SMTP mailer附加标志。对所有基于SMTPmailer其默认标志为mDFMUX;基于esmtp的邮差(mailer)加上a标志;而基于smtp8的邮差则加上8

SMTP_MAILER_MAX [没有]

使用smtpsmtp8esmtp传输的单个邮件最大容量。

SMTP_MAILER_CHARSET [没有]

如果定义了此参数,则被转化为MIME格式的从其他地址到任一个smtp mailer的含有8位字符的信息将被标为此字符集。

relay_hosts_only

通常情况下,SendmailSendmail.cf中明确列出的域(一般是localhost)和/etc/ mail/ relay-domains中定义的域进行投递代理。默认下这两处定义的都是域的名字。如果用户定义了这个参数,那么这两处的内容将被解释为主机名字。

use_ct_file

读取文件/etc/Sendmail.ct以取得系统“信任”的用户名字,这些用户可以使用-f设置其发信信封上的from地址而不产生警告信息。

redirect

使用REDIRECT特性,这个特性允许用户对某些已经搬迁的用户发出重定向信息。例如:

FEATURE(redirect)

mailertable

包含一个用于覆盖到特定域路由(routing)的“mailer table”。此特性参数定义可以是一个关键词定义。如未指定任何参数,其定义通常是:

FEATURE(mailertable,'hash -o /etc/mailertable)

domaintable

包含一个用于提供域名映像的domain table,当改变用户自已的域名时可能有用(如用户公司由oldname.com改为newname.com)。其定义通常是:

FEATURE(domiaintable,'hash -o /etc/domaintable)

always_add_domain

在本地发送邮件时也加上其主机域名。例如:

FEATURE(always_add_domain)

allmasquerade

如果使用了伪装(masquerading,使用MASQUERADE_AS),则此特性将使接收者的地址也伪装为来自所伪装的主机。

limitd_masquerade

通常情况下$w所列出的所有主机将被伪装。如果使用了此特性,则只对那些$m所列出的主机进行伪装。

masquerade_entire_domain

如使用了伪装且设置了MASQUERADE_DOMAIN,此特性将引起地址重写,使所要伪装的网域整个被隐藏。所有含有被伪装域名的主机用伪装域名(通常是MASQUERADE_AS进行重写。

masquerade_envelope

用此特性告知Sendmail将信封和信件头上的发送者和接收者进行伪装。

定义了有关masq的选项之后,就可以使用伪装了,可以直接将伪装命令写入mc模板,示例如下:

MASQUERADE_AS(masq.com)

MASQUERADE_DOMAIN(foo.org)

someone@foo.org发信的时候,Sendmail将会把它的信封伪装为some one@masq.com。这对于统一整个域的电子邮件是非常重要的。

virtusertable

允许在同一个主机上使用多个虚拟域。例如:

FEATURE('virtusertable,'hash –o /etc/mail/virtusertable)

nullclient

这是一个特殊情况——它生成一个除了支持将所有的邮件通过本地的基于SMTP的网络转递到一个中心邮件HUB之外不含任何内容的配置文件。其参数是此邮件HUB的主机名。唯一可与nullclient一起使用的其他特性是nocanonify(可以使非完全地址可通过SMTP连接进行发送;通常情况下地址将使用伪装名字转变为完全邮件名称,此伪装名字默认值为邮件HUB主机的名字)。在此特性使用是不应定义任何邮差。当然也不进行别名处理或转寄。

local_procmail

使用procmail作为本地邮差。

smrsh

对到程序的邮件使用Sendmail发行版所带的SendMail Restricted SHell SMRSH)而不是/bin/sh。由于Sendmail是以root权限执行,某个发送到恶意程序的邮件可能破坏系统,只要利用别名转向使得邮件被转发到对应的程序,因此默认下Sendmailsmrsh来处理邮件转发到程序的请求。这可以提高本地系统管理员控制对那些通过邮件运行程序的行为,例如:

FEATURE('smrsh,'/usr/sbin/smrsh)

注意,有些程序无法通过smrsh运行(例如majordomowrapper程序),这是出于安全性的考虑,smrsh不准用户程序使用一些setuid功能。如果用户一定要使用这些程序,请将smrsh定义成其他shell程序,如sh

access_db

本地存取控制文件的名字,默认是/etc/mail/access.db,也可以用命令行指出,例如:

FEATURE('access_db)

或者

FEATURE('access_db,'hash –o /etc/mail/access)

mailertable

允许使用mailertable文件。这个文件定义对某确定的域使用什么样的邮差。例如:

FEATURE('mailertable','hash o /etc/mail/mailertable)

blacklist_recipients

允许用户用前面定义的access_db来禁止某个地方来的邮件,或是某个人的邮件,等等。

relay_based_on_MX

是否允许别人用这台机器当成MX交换器。如果设置了这个选项,那么任何人只要在域名服务器中将这台机器设置成为他的MX交换就可以用这台机器转发电子邮件。这个功能意味着:这台机器替它接受电子邮件,再提交给它。一般来说这个功能是不必要的,如果一定要使用这个选项,则可能会有庞大的邮件流量。但是在一种情况下这个功能又是不可缺少的:假如用户的系统有防火墙,只有邮件服务器能够对外连接,那么这个功能是使网络内部其他主机能够接受自己电子邮件的唯一方法。

DOMAIN

这个关键字一般用来定义邮件中继,假如用户的系统里面除了Internet互连之外还有类DECnetUUCP之类的东西,那么就需要设置DOMAIN来保证非Internet的邮件被正确中继。对于一般的系统,不需要定义这个属性。

MAILER

定义可以使用的投递程序(邮差)。例如:

MAILER(smtp)

定义smtp投递。

MAILER(local)

定义局部投递。

如果用户想做邮件服务,两个邮差是必须的。

一般情况下,当安装Sendmail-cf包的时候,会自动在/usr/Sendmail-cf/cf目录下产生一个模板,名字是redhat.mc。用户可以根据上面的描述对它进行修改以便满足自己的需要,最后用以下命令产生配置文件:

m4 redhat.mc sendmail.cf

要注意这里只列出了一些常用的配置命令,许多与时间相关的配置定义这里并没有描述,如confMESSAGE_TIME OUT等等,这一类的命令通常默认值已经足够,除非用户准备制作一个相当庞大的站点,在这种情况下,则应该去参考/usr/lib/Sendmail-cf/README文件得到更多的信息。

在生成了Sendmail.cf之后,就可以启动Sendmail程序了,首先需要把建立的sendmai l-cf文件拷贝到/etc下面,然后启动Sendmail/usr/sbin/Sendmail程序支持许多命令参数,对用户来说,最重要的是-bd参数,它表示将Sendmail作为一个守护进程来运行:

sendmail –bd –q1h

-q1h表示每隔一个小时发送一次邮件,类似地,-q15m15分钟,等等。