在众多的邮件服务器软件中,Sendmail总是能够在每一次评比中获得荣誉,从而使它成为目前使用最为广泛的一种E-mail服务器。但是,说起Sendmail的配置,很多人会感到头痛。长期以来,很多人为此不厌其烦地一遍又一遍地在BBS、新闻组上询问其配置。笔者希望借助本文对Sendmail的使用作一个力求完满的说明。
下载及安装
Sendmail的最新版本为:8.11.3,文件大小为1.2MB。
1.解压缩
#tar-zxvfSendmail-8.11.3.tar.gz
#cdSendmail-8.11.3
如果软件包是rpm格式,则解压安装如下:
#rpm-ivhSendmail-8.11.3-src.rpm
2.编译
#./Build
如果不出什么问题,编译通过,编译完成后会自动生成目录:obj.Linux.2.2.18.i686(这是笔者的核心名称,也许你的内核名称与此不同)。
3.安装
#./Buildinstall
如果是rpm格式的软件包,则应编译如下:
#rpm-baSendmail-8.11.1.spec
#rpm-ivhSendmail*.rpm
至此编译、安装完成
配置策略
sendmail.cf是Sendmail的配置文件,它全权决定了Sendmail的属性。这个文件定义邮件服务器为哪个域工作。其中的内容为特定宏,大多数人对它都抱有恐惧心理,因为文件中的宏代码实在是太多。sendmail.cf通常是由一个以mc结尾的文件编译产生。如Redhat自带一个redhat.mc,用户可以自己修改其中的一些设置,使之适合自己。笔者的sendmail.mc文件内容如下:
divert(-1)
dnlThisisthemacroconfigfileusedtogeneratethe/etc/sendmail.cf
dnlfile.Ifyoumodifytheifileyouwillhavetoregeneratethe
dnl/etc/sendmail.cfbyrunningthismacroconfigthroughthem4
dnlpreprocessor:
dnlm4/etc/sendmail.mc>/etc/sendmail.cf
dnlYouwillneedtohavetheSendmail-cfpackageinstalledforthistowork.
include(`/usr/lib/Sendmail-cf/m4/cf.m4')
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')
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(smtp)
MAILER(procmail)
FEATURE(`access_db')
FEATURE(`blacklist_recipients')
dnlWestronglyrecommendtocommentthisoneoutifyouwanttoprotect
dnlyourselffromspam.However,thelaptopandusersoncomputersthatdo
dnlnothav24x7DNSdoneedthis.
FEATURE(`accept_unresolvable_domains')
dnlFEATURE(`relay_based_on_MX')
编译sendmail.mc以产生需要的sendmail.cf文件:#m4/etc/sendmail.mc>/etc/mail/sendmail.cf。
生成sendmail.cf以后,编辑sendmail.cf。在文件中,查找DS,在其后加入邮件服务器名、域名,这样可以保证当你以username@mail.domain.com或username@domain.com发信时,用户都可以收到,如下所示:
#Aliasforthishost
Cwmail.domain.comdomain.com
然后,就可以启动Sendmail了:#/usr/sbin/Sendmail-bd-q20m。
Sendmail8.9.x以后的版本,在缺省情况下,都默认不对未验证的计算机进行转发(Relay),所以如果要为本机以外的其他计算机进行邮件转发,这时,应该在相应的配置文件中明确告诉Sendmail要对哪几个主机进行转发。如果不考虑验证,对任何主机都进行转发的话,可以在sedmail.mc文件中加入一行:FEATURE(promiscuous_relay)。
不过,如果你的计算机是放在公网上的话,建议你不要这样做,因为这样做了以后,任何人都可以使用你的计算机进行转发邮件了,特别是一些别有用心的人或一些兜售客(spammer,垃圾邮件制造者)会利用你的邮件服务器的转发功能乱发大量的垃圾邮件。
使用说明
通常情况下,Sendmail不会为邮件服务Relay信息,这样可以防止一些有恶意的人利用别人的邮件服务器乱发邮件。缺省情况下,Sendmail关闭了Relay功能。如果你要为别的服务器Relay邮件,可以进行如下设置——在access文件中加入要为其Relay信件的机器,格式为:
hostnameRELAY
ipaddressRELAY
如果要为一个域内多个机器Relay信件,则可以在/etc/mail/access文件中直接加入其子网IP或域名,如下所示:
access文件内容:
domainname.comRELAY(允许为域domainname的所有计算机relay邮件)
localhostRELAY
192.168.1.0RELAY(为192.168.1.0此网内所有机器relay邮件)
此文件惟一决定了哪些机器、哪个域可以使用邮件服务器转发邮件。完成后需要进行编译:#makemaphashaccess.db<access。
其他配置的文件关系不是很大,可以暂时使用缺省安装的内容。至此,Sendmail应该可以正常工作了。
接下来是测试邮件服务器的邮件发送功能,注意:测试时,不要只对本地用户进行测试,如:你的域为abc.com,测试时,不要只在邮件服务器上测试user1@abc.com用户。因为,此时user1是本地用户,所以邮件服务器可以对其进行Relay。你应该从局域网上的另一台机器使用Outlook等邮件客户端对服务器进行测试。
固定IP用户(包括跨国性公司的用户)没有问题,可以在数据库中加入其固定IP。对于经常出差在外的人,不适用。
排错
错误1.在Outlook中正确配置POP及SMTP服务器的地址后,出现如下错误:
无法连接到服务器。账号:'192.168.0.1',服务器:'192.168.0.1',
协议:POP3,端口:110,安全(SSL):否,套接字错误:10061,
错误号:0x800CCC0E
产生错误的原因:主要原因是没有运行POP3D和IMAPD
解决方法:打开/etc/inetd.conf查找到
#pop-3streamtcpnowaitroot/usr/sbin/tcpdipop3d
把#号删掉。
打开/etc/services查找到
#pop3110/tcp
#pop3110/udp
将两行最前面的#号删掉。
这样,在restartinetd后,pop3110端口就可以收信了!如果还是不行,请检查是否安装POP3服务软件包!
错误2:很多拨号用户会碰到以下问题:
由于服务器拒绝收件人之一,无法发送邮件。被拒绝的E-mail地址是lcl@lettee.com.cn。主题'ffd',账号:'mailns.lettee.com.cn(1)',服务器:'mailns.lettee.com.cn',协议:SMTP,服务器响应:'551wedonotrelay',端口:25,安全(SSL):否,服务器错误:551,错误号:0x800CCC79
此错误表示:Sendmail不能为你正在使用的客户机Relay邮件。
错误原因:Sendmail8.9.3以后,缺省限制了Relay功能,主要是为了防止Spammer。使用此服务器的本地用户可以发信,而以外的用户不可以通过它发信了。解决方法:在access中加入客户机的IP,重新编译access即可。
很多朋友常犯的错误是我已经在access中加入了邮件服务器的IP地址,也对数据库文件进行了makemap工作,可依然还是不行。其实你搞错了,应该加入的是客户机的IP——试着将你的拨号PC的IP加入到access中,makemap后,你不必重新启动Sendmail,试试,发信成功了!
正如前面所说的,如果你是拨号上网,下次拨号,你的IP就会改变,当然你的邮件服务器就又不让你发信了。如果公司的员工常要出差,到外地后,经常是拨通当地ISP来收发邮件。收邮件肯定没有问题,但是,邮件目前SMTP没有进行口令验证,而邮件服务器又要进行转发控制,不对未记录在数据库中的主机转发。所以,邮件是发不出去了。在这种情况下,如果像本文前面所说的那样设置全部转发功能的话,倒是可以让拨号用户发信,但同时,带来的问题就是会有很多Spam,实在是难以做到两全其美。
解决以上问题有两种方案,一种为采用SMTP认证,即用户发送邮件以前,邮件服务器进行用户身份认证,通过则服务器为其发送邮件,否则拒绝发信;第二种方案是采用动态转发授权控制(DynamicRelayauthorizationcontrol),其工作原理为:拨号用户拨号上网后,首先收邮件,如果用户能正确收邮件,则DRAC自动在access.db中加入刚才收邮件用户的IP,并允许此IP可以发信。不过,30分钟内,此IP不发/收邮件的话,DRAC将从access.db中删除此IP。此种机制保证拨号用户在没有SMTP认证的情况下,也可以通过远程邮件服务器发送E-mail(详情,请参阅笔者的另一篇文章:利用DRAC杜绝垃圾邮件)。