Sendmail邮件服务器快速指南 1
程序员文章站
2024-02-02 19:11:04
人们在互联网上最常使用的就是电子邮件,很多企业用户也经常使用免费电子邮件系统。本文就以step by step的方式引导用户从sendmail源代码开始构建一个可以满足基本工作需要的邮件系统... 09-03-10...
人们在互联网上最常使用的就是电子邮件,很多企业用户也经常使用免费电子邮件系统。本文就以step by step的方式引导用户从sendmail源代码开始构建一个可以满足基本工作需要的邮件系统。
概述
sendmail是最重要的邮件传输代理程序。理解电子邮件的工作模式是非常重要的。一般情况下,我们把电子邮件程序分解成用户代理,传输代理和投递代理。 用户代理用来接受用户的指令,将用户的信件传送至信件传输代理,如:outlook express、foxmail等。而投递代理则从信件传输代理取得信件传送至最终用户的邮箱,如:procmail。
当用户试图发送一封电子邮件的时候,他并不能直接将信件发送到对方的机器上,用户代理必须试图去寻找一个信件传输代理,把邮件提交给它。信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序将找到应该对这个目标地址负责的邮件传输代理服务器, 并且通过网络将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者察看自己的电子信箱。
显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者 提交给最终投递程序。 有许多的程序可以作为信件传输代理,但是sendmail是其中最重要的一个,事实证明它可以支持数千甚至更多的用户,而且占用的系统资源相当少。不过,sendmail的配置十分复杂,因此,也有人使用另外的一些工具,如qmail、postfix等等。
当sendmail程序得到一封待发送的邮件的时候,它需要根据目标地址确定将信件投递给对应的服务器,这是通过dns服务实现的。例如一封邮件的目标地址是,那么sendmail首先确定这个地址是用户名(ideal)+机器名(linuxaid.com.cn)的格式,然后,通过查询dns来确定需要把信件投递给某个服务器。
dns数据中,与电子邮件相关的是mx记录,例如在linuxaid.com.cn这个域的dns数据文件中有如下设置:
in mx 10 mail
in mx 20 mail1
mail in a 202.99.11.120
mail1 in a 202.99.11.121
显然,在dns中说明linuxaid.com.cn有两个一个信件交换(mx)服务器,于是,sendmail试图将邮件发送给两者之一。一般来说,排在前面的的mx服务器的优先级别比较高,因此服务 器将试图连接mail.linuxaid.com.cn的25端口,试图将信件报文转发给它。如果成功,你的smtp服务器的任务就完成了,在这以后的任务,将由mail.linuxaid.com.cn来完成。在一般的情况下,mail换器会自动把信件内容转交给目标主机,不过,也存在这样的情况,目标主机(比如linuxaid.com.cn)可能并不存在,或者不执行smtp服务,而是由其mx交换器来执行信件的管理,这时候,最终的信件将保存在mx机器上,直到用户来察看它。
如果dns查询无法找出对某个地址的mx记录(通常因为对方没有信件交换主机),那么sendmail将是试图直接与来自邮件地址的主机对话并且发送邮件。例如,test@aidgroup.linuxaid.com.cndns中没有对应的mx记录,因此sendmail在确定mx交换器失败后,将从dns取得对方的ip地址并直接和对方对话试图发送邮件。
工作环境
本文假设用户希望在园区网环境中架设一个电子邮件服务器,为本单位用户提供邮件服务。该服务器拥有一个合法的ip地址202.99.11.200和一个合法的域名mail.linuxaid.com.cn,并且dns的mx记录也指向该域名(注:这里示例域名和ip地址均为伪造域名和地址)。为了满足域名需求,dns的域数据文件应该包含以下内容:
in mx 10 mail
mail in a 202.99.11.200
试验环境为:redhat6.2、sendmail.8.11.4、qpopper4.0.3。
软件下载
分别从以下地址下载sendmail和qpopper:
sendmail.8.11.4.tar.gz
qpopper4.0.3.tar.gz
sendmail的配置和安装
sendmail是目前使用最为广泛的一种e-mail服务器。当前其最新的稳定版本为8.11.4。下载得到tar.gz格式的压缩包以后,将其存放在/usr/src目录下。
解压软件包:
[root@email src]# tar xvfz sendmail.8.11.4.tar.gz
[root@email src]# cd sendmail-8.11.4
编译安装:
[root@email sendmail-8.11.4]# cd sendmail
[root@email sendmail]# sh build
生成配置文件:
[root@email sendmail]#cd /usr/src/sendmail-8.11.4/cf/cf/
一般该目录下应该有config.mc的文件,如果没有则创建新文件config.mc,内容为:
divert(-1)
dnl this is the macro config file used to generate the /etc/sendmail.cf
dnl file. if you modify thei file you will have to regenerate the
dnl /etc/sendmail.cf by running this macro config through the m4
dnl preprocessor:
dnl m4 /etc/sendmail.mc > /etc/sendmail.cf
dnl you will need to have the sendmail-cf package installed for this to work.
include(`/usr/src/sendmail-8.11.4/cf')
define(`confdef_user_id',`8:12')
ostype(`linux')
undefine(`uucp_relay')
undefine(`bitnet_relay')
define(`confauto_rebuild')
define(`confto_connect', `1m')
define(`conftry_null_mx_list',true)
define(`confdont_probe_interfaces',true)
define(`procmail_mailer_path',`/usr/bin/procmail')
feature(`smrsh',`/usr/sbin/smrsh')
feature(`mailertable',`hash -o /etc/mail/mailertable')
feature(`virtusertable',`hash -o /etc/mail/virtusertable')
概述
sendmail是最重要的邮件传输代理程序。理解电子邮件的工作模式是非常重要的。一般情况下,我们把电子邮件程序分解成用户代理,传输代理和投递代理。 用户代理用来接受用户的指令,将用户的信件传送至信件传输代理,如:outlook express、foxmail等。而投递代理则从信件传输代理取得信件传送至最终用户的邮箱,如:procmail。
当用户试图发送一封电子邮件的时候,他并不能直接将信件发送到对方的机器上,用户代理必须试图去寻找一个信件传输代理,把邮件提交给它。信件传输代理得到了邮件后,首先将它保存在自身的缓冲队列中,然后,根据邮件的目标地址,信件传输代理程序将找到应该对这个目标地址负责的邮件传输代理服务器, 并且通过网络将邮件传送给它。对方的服务器接收到邮件之后,将其缓冲存储在本地,直到电子邮件的接收者察看自己的电子信箱。
显然,邮件传输是从服务器到服务器的,而且每个用户必须拥有服务器上存储信息的空间(称为信箱)才能接受邮件(发送邮件不受这个限制)。可以看到,一个邮件传输代理的主要工作是监视用户代理的请求,根据电子邮件的目标地址找出对应的邮件服务器,将信件在服务器之间传输并且将接收到的邮件缓冲或者 提交给最终投递程序。 有许多的程序可以作为信件传输代理,但是sendmail是其中最重要的一个,事实证明它可以支持数千甚至更多的用户,而且占用的系统资源相当少。不过,sendmail的配置十分复杂,因此,也有人使用另外的一些工具,如qmail、postfix等等。
当sendmail程序得到一封待发送的邮件的时候,它需要根据目标地址确定将信件投递给对应的服务器,这是通过dns服务实现的。例如一封邮件的目标地址是,那么sendmail首先确定这个地址是用户名(ideal)+机器名(linuxaid.com.cn)的格式,然后,通过查询dns来确定需要把信件投递给某个服务器。
dns数据中,与电子邮件相关的是mx记录,例如在linuxaid.com.cn这个域的dns数据文件中有如下设置:
in mx 10 mail
in mx 20 mail1
mail in a 202.99.11.120
mail1 in a 202.99.11.121
显然,在dns中说明linuxaid.com.cn有两个一个信件交换(mx)服务器,于是,sendmail试图将邮件发送给两者之一。一般来说,排在前面的的mx服务器的优先级别比较高,因此服务 器将试图连接mail.linuxaid.com.cn的25端口,试图将信件报文转发给它。如果成功,你的smtp服务器的任务就完成了,在这以后的任务,将由mail.linuxaid.com.cn来完成。在一般的情况下,mail换器会自动把信件内容转交给目标主机,不过,也存在这样的情况,目标主机(比如linuxaid.com.cn)可能并不存在,或者不执行smtp服务,而是由其mx交换器来执行信件的管理,这时候,最终的信件将保存在mx机器上,直到用户来察看它。
如果dns查询无法找出对某个地址的mx记录(通常因为对方没有信件交换主机),那么sendmail将是试图直接与来自邮件地址的主机对话并且发送邮件。例如,test@aidgroup.linuxaid.com.cndns中没有对应的mx记录,因此sendmail在确定mx交换器失败后,将从dns取得对方的ip地址并直接和对方对话试图发送邮件。
工作环境
本文假设用户希望在园区网环境中架设一个电子邮件服务器,为本单位用户提供邮件服务。该服务器拥有一个合法的ip地址202.99.11.200和一个合法的域名mail.linuxaid.com.cn,并且dns的mx记录也指向该域名(注:这里示例域名和ip地址均为伪造域名和地址)。为了满足域名需求,dns的域数据文件应该包含以下内容:
in mx 10 mail
mail in a 202.99.11.200
试验环境为:redhat6.2、sendmail.8.11.4、qpopper4.0.3。
软件下载
分别从以下地址下载sendmail和qpopper:
sendmail.8.11.4.tar.gz
qpopper4.0.3.tar.gz
sendmail的配置和安装
sendmail是目前使用最为广泛的一种e-mail服务器。当前其最新的稳定版本为8.11.4。下载得到tar.gz格式的压缩包以后,将其存放在/usr/src目录下。
解压软件包:
[root@email src]# tar xvfz sendmail.8.11.4.tar.gz
[root@email src]# cd sendmail-8.11.4
编译安装:
[root@email sendmail-8.11.4]# cd sendmail
[root@email sendmail]# sh build
生成配置文件:
[root@email sendmail]#cd /usr/src/sendmail-8.11.4/cf/cf/
一般该目录下应该有config.mc的文件,如果没有则创建新文件config.mc,内容为:
divert(-1)
dnl this is the macro config file used to generate the /etc/sendmail.cf
dnl file. if you modify thei file you will have to regenerate the
dnl /etc/sendmail.cf by running this macro config through the m4
dnl preprocessor:
dnl m4 /etc/sendmail.mc > /etc/sendmail.cf
dnl you will need to have the sendmail-cf package installed for this to work.
include(`/usr/src/sendmail-8.11.4/cf')
define(`confdef_user_id',`8:12')
ostype(`linux')
undefine(`uucp_relay')
undefine(`bitnet_relay')
define(`confauto_rebuild')
define(`confto_connect', `1m')
define(`conftry_null_mx_list',true)
define(`confdont_probe_interfaces',true)
define(`procmail_mailer_path',`/usr/bin/procmail')
feature(`smrsh',`/usr/sbin/smrsh')
feature(`mailertable',`hash -o /etc/mail/mailertable')
feature(`virtusertable',`hash -o /etc/mail/virtusertable')