分类: LINUX
2006-09-13 09:34:30
人们在internet上最常使用的就是电子邮件,很多企业用户也经常使用电子邮件系统。在unix系统中,sendmail是应用最广的电子邮件服务器。本文将比较详细地介绍如何建立一个sendmail电子邮件服务器,以满足企业的基本需求。
一. sendmail的工作模式
sendmail是最重要的邮件传输代理程序。理解电子邮件的工作模式是非常重要的。一般情况下,电子邮件系统可分为用户代理、传输代理和投递代理几个部分。用户代理用来接受用户的指令,将用户的信件传送至信件传输代理,如outlook express和foxmail等。而投递代理则从信件传输代理取得信件传送至最终用户的邮箱,如procmail。
当用户试图发送一封电子邮件的时候,他并不能直接将信件发送到对方的机器上,用户代理必须试图去寻找一个信件传输代理,把邮件提交给它。信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序将找到应该对这个目标地址负责的邮件传输代理服务器,再通过将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者查看自己的电子信箱。
显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者 提交给最终投递程序。 有许多程序可以作为信件传输代理。在unix系统中,sendmail是其中应用最广泛的一个,它是一个免费软件,可以支持数千甚至更多的用户,而且占用的系统资源相当少。不过,sendmail的配置十分复杂,因此,也有人使用另外的一些工具,如qmail或postfix等等。
当sendmail程序得到一封待发送的邮件的时候,它需要根据目标地址确定将信件投递给对应的服务器,这是通过dns服务实现的。例如一封邮件的目标地址是ideal@linuxaid.com.cn,那么sendmail首先确定这个地址是用户名(ideal)+机器名(linuxaid.com.cn)的格式,然后,通过查询dns来确定需要把信件投递给某个服务器。
dns数据中,与电子邮件相关的是信件交换(message exchange,mx)记录,例如在linuxaid.com.cn这个域的dns数据文件中有如下设置:
in mx 10 mail<@xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
in mx 20 mail1
mail in a 202.99.11.120
mail1 in a 202.99.11.121
显然,在dns中说明linuxaid.com.cn有2个mx服务器,于是,sendmail试图将邮件发送给两者之一。一般来说,排在前面的mx服务器的优先级别比较高,因此服务器将试图连接mail.linuxaid.com.cn的25端口,试图将信件报文转发给它。如果成功,smtp服务器的任务就完成了。在这以后的任务,将由mail.linuxaid.com.cn来完成。在一般情况下,mx服务器会自动把信件内容转交给目标主机。不过,也存在这样的情况,目标主机(比如linuxaid.com.cn)可能并不存在,或者不执行smtp服务,而是由其mx服务器来执行信件的管理,这时候,最终的信件将保存在mx机器上,直到用户来查看它。
如果dns查询无法找出对某个地址的mx记录(通常因为对方没有信件交换主机),那么sendmail将试图直接与来自邮件地址的主机对话并且发送邮件。例如,,dns中没有对应的mx记录,因此sendmail在确定mx服务器失败后,将从dns取得对方的ip地址并直接和对方对话试图发送邮件。
二. 工作环境
本文假设用户希望在企业网环境中创建一个电子邮件服务器,为本企业用户提供邮件服务。该服务器拥有一个合法的ip地址202.99.11.200和一个合法的域名mail.linuxaid.com.cn,并且dns的mx记录也指向该域名(注:这里示例域名和ip地址均为伪造域名和地址)。为了满足域名需求,dns的域数据文件应该包含以下内容:
in mx 10 mail<@xml:namespace prefix = o />
mail in a 202.99.11.200
试验环境为redhat 6.2、sendmail 8.11.4和qpopper 4.0.3,可分别从http://www.sendmail.org/current-release.html和 下载sendmail和qpopper。
三. sendmail的安装
当前sendmail最新的稳定版本为8.11.4,下载得到tar.gz格式的压缩包以后,将其存放在/usr/src目录下。
1.解压软件包
[root@email src]# tar xvfz sendmail.8.11.4.tar.gz
[root@email src]# cd sendmail-8.11.4
2.编译安装
[root@email sendmail-8.11.4]# cd sendmail
[root@email sendmail]# sh build
3.生成配置文件
[root@email sendmail]#cd /usr/src/sendmail-8.11.4/cf/cf/
一般该目录下应该有config.mc的文件,如果没有则创建新文件
config.mc,内容如附图所示。
然后运行:
[root@email cf]# sh build config.cf
该命令将在该目录下生成config.cf文件。
4.安装sendmail
[root@email sendmail]# sh build install
将config.cf拷贝到/etc/mail目录下,并改名为sendmail.cf:
[root@email mail]#cp /usr/src/sendmail-8.11.4/cf/cf/
config.cf /etc/mail/sendmail.cf
四. sendmail的配置
配置sendmail的步骤如下。 <@xml:namespace prefix = o />
1.在/etc/mail目录下创建access文件,内容如下:
127.0.0.1 relay
202.99.11 relay
这里表示允许本机和202.99.11.0网段中的机器通过该邮件服务器的转发邮件。其中202.99.11应该是您拥有的局域ip网段的ip地址,只需要写部分即可。比如说您的用户有多个网段,只需要在其中设置多个网段即可:
127.0.0.1 relay
202.99.11 relay
200.200.201 relay
2.对access文件生成易于检索的库文件格式:
[root@email mail]# makemap hash access.db < access
创建文件/etc/mail/local-host-names,其内容为本机的拥有的域名信息,因为在上面的dns配置文件中该服务器有一个域名: email.linuxaid.com.cn,并且mx记录也指向该域名,因此该服务器就有2个域名,分别为email.linuxaid.com.cn和linuxaid.com.cn,这样用户才可以使用someone@linuxaid.com.cn这样的地址收发邮件,故该文件应该包含入下内容:
linuxaid.com.cn.
mail.linuxaid.com.cn.
3.创建别名数据库。在/etc/mail/aliases目录下创建文件aliases,内容如下:
mailer-daemon: postmaster
postmaster: root
bin: root
daemon: root
nobody: root
然后生成aliases库:
[root@email mail]# newaliases
然后,就可以按如下方式启动sendmail了:
[root@email mail]# /usr/sbin/sendmail -bd -q20m
在第一次启动时可能出现如下的错误信息:
554 5.0.0 /etc/mail/sendmail.cf: line 41: unknown
configuration line ""
554 5.0.0 /etc/mail/sendmail.cf: line 60: unknown
configuration line ""
不要紧张,只需要使用vi编辑器将这些行删除即可,其实41和60等行都是空白行而已。删除以后再重新启动就应该没有问题了。
五. qpopper的安装配置
qpopper是unix/linux环境下的pop3服务器,该软件配合sendmail使用。其主要功能是实现支持用户通过pop3接收信件。安装和配置qpopper的主要步骤如下:
1.创建从/usr/mail指向/var/spool/mail/的链接<@xml:namespace prefix = o />
[root@email src]# ln -s /var/spool/mail/ /usr/mail
2.解压qpopper软件包
[root@email src]# tar xvfz qpopper4.0.3.tar.gz
[root@email src]# cd qpopper4.0.3
3.编译安装qpopper
[root@email qpopper4.0.3]# ./configure
[root@email qpopper4.0.3]# make
[root@email qpopper4.0.3]# make install
安装成功以后,qpopper将会被安装在/usr/local/sbin/目录下。设置inetd启动qpopper。编辑/etc/inetd.conf,查找pop内容的一行,在其前面添加#号,然后在改行后面添加如下内容:
pop-3 stream tcp nowait root /usr/local/sbin/popper
qpopper -s然后查找inetd进程id号:
[root@email qpopper4.0.3]# ps ax|grep inetd
336 @ s 0:00 inetd
16872 pts/0 s 0:00 grep inetd
找到inetd进程号为226。然后重新启动inetd进程,
重新读取配置文件:
[root@www qpopper4.0.3]# kill -hup 336
这时候查看系统服务端口号:
[root@email qpopper4.0.3]# netstat -ln|grep 110
tcp 0 0 0.0.0.0:110 0.0.0.0:* listen
则说明110端口已经开始正常服务。
六. 测试邮件服务器
接下来是测试邮件服务器的邮件发送/接收功能。注意,在测试时,不要在只对本地用户进行测试。例如,用户的域为abc.com,测试时,不要只在邮件服务器上通过mail、elm等程序测试user1@abc.com用户。因为,此时user1是本地用户,所以邮件服务器可以对其进行relay。用户应该从局域网上的另一台机器使用outlook等邮件客户端对服务器进行收发测试。
这种配置对于ip固定用户没有问题,只需要在access文件中指定其固定ip即可,而对于需要支持流动用户,如拨号用户的应用则不大适合,因为如果完全打开relay功能可能导致邮件服务器的称为垃圾邮件的转发站。
解决用户ip不固定问题有2种方案,一种为采用smtp认证,即用户发送邮件以前,邮件服务器进行用户身份认证,通过则服务器为其发送邮件,否则拒绝发信;第二种方案是采用动态转发授权控制(dynamic relay authorization control,drac),其工作原理为: 拨号用户拨号上网后,首先收邮件,如果用户能正确收邮件,则drac自动在access.db中加入刚才收邮件用户的ip,并允许此ip可以发信。不过,30分钟内,此ip不发/收邮件的话,drac将从access.db中删除此ip。此种机制保证拨号用户在没有smtp认证的情况下,也可以通过远程邮件服务器发送电子邮件。