Sendmail配置
安装所需软件 sendmail.8.12.10.tar.gz http://www.sendmail.org/ cyrus-sasl-2.1.18.tar.gz http://asg.web.cmu.edu/cyrus/
安装步骤
一、 先安装cyrus-sasl-2.1.18.tar.gz,sendmail安装时要用到sasl(简单认证和安全层协议)的库文件的头文件。 解压缩: # tar -zxvf cyrus-sasl-2.1.18.tar.gz 编译: 进入刚解压的源码目录,运行如下命令完成安装。 #./configure --prefix=/usr/local/sasl2 --enable-login 必定要加--enable-login,由于SASL2默认不支持login这种验证方式,而OUTLOOK是经过 login来进行SMTP验证的。 #make # 编译 #make install # 安装 完成以上linux程序安装三步曲以后,就能够开始配置和测试了。
二、配置SASL
为了把SASL应用于sendmail认证,还需进行一些配置工做。sendmail会到/usr/lib目录下去 找SASL2库,而咱们是把程序安装在/usr/local/sasl2中,为何不把软件安装在/usr/lib目录 呢?这主要是为了好管理自已安装的软件啦。因此咱们要在/usr/lib目录下作一个连接: # cd /usr/lib # ln -s /usr/local/sasl2/lib/* . ok,接着要在/var/目录下建一个目录给saslauthd进程存在临时数据。 # cd /var # mkdir state # cd state # mkdir saslauthd 注:若是没有这些目录,运行saslauthd时,会提示出错。 ok,接着为确保CYRUS-SASL2函数库知道怎样验证所收来的SASL认证请求,必须建立一 个SASL的配置文件来把MTA程序定义成一个SASL应用。配置文件名为Sendmail.conf(注 意是大写的S),位于/usr/lib/sasl2目录中,也就是/usr/local/sasl2/lib/sasl2这个目录,记得上 面新建的连接了吗?在该文件中你定义你但愿使用的认证数据库方法,如下这个例子使用 saslauthd来验证认证请求。 # cd /usr/lib/sasl2 # echo 'pwcheck_method: saslauthd' >; Sendmail.conf
三、测试
ok,如今能够运行saslauthd了,并进行测试。 # cd /usr/local/sasl2/sbin # ./saslauthd -a shadow 用shadow的用户和密码进行验证 # ./testsaslauthd -u userid -p password 0: OK "Success." 若是出现以上信息,就说明saslauthd正常运行了。testsaslauthd程序默认是没有编译的,你 须要在源码目录树的saslauthd子目录中运行 # make testsaslauthd命令生成。
四、sasl2安装完成后,就要开始安装sendmail了。
先解压sendmail源码。 # tar -zxvf sendmail.8.12.10.tar.gz 若是要sendmail支持SASL,须要修改源码的位置配置文件site.config.m4。site.config.m4位 于源码目录树的devtools/Site。文件中应包含如下行: PREPENDDEF(`confMAPDEF', `-DMAP_REGEX') APPENDDEF(`confENVDEF', `-DTCPWRAPPERS -DSASL=2') APPENDDEF(`conf_sendmail_LIBS', `-lwrap -lsasl2') APPENDDEF(`confLIBDIRS', `-L/usr/local/sasl2/lib') APPENDDEF(`confINCDIRS', `-I/usr/local/sasl2/include') 第一行配置正则表达式相关内容 第2、三行配置表示在sendmail程序中支持sasl2和tcp_wrapper(可经过hosts.allow和 hosts.deny控制访问) 第4、五行配置指出sasl2的库文件和头文件的位置。
ok,接着在编译前要创建一些用户和目录,并确保有正确的权限。
sendmail必须有一个set-group-id(默认是smmsp组)的程序来在一个组可写的目录中查询 排队邮件。因此咱们要创建一个smmsp用户和组。并创建以下目录并设置相应的权限,具 体设置要求可查询源码目录树下sendmail/SECURITY文档。 # groupadd smmsp # useradd smmsp -d /var/spool/clientmqueue -s /dev/null # mkdir /var/spool/clientmqueue # chown -R smmsp:smmsp /var/spool/clientmqueue # chmod -R 770 /var/spool/clientmqueue # mkdir /etc/mail # mkdir /var/spool/mqueue # chmod go-w / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue # chown root / /etc /etc/mail /usr /var /var/spool /var/spool/mqueue
ok,接下来就能够进入源码目录树开始编译了。
# ./Build -c -c选项能删除上次编译产生的文件。 # ./Build install 编译完成后就能够进行安装。
五、sendmail配置
要sendmail正常运行,还需配置几个文件,首先最重要的就是sendmail.cf 文件了。它在源 码目录树下的cf/cf目录下有不少例子可参考。你能够拷贝使用。因为sendmail.cf中的语法 很复杂,因此不建议手工修改。咱们能够以sendmail.mc文档配合sendmail-cf目录下的宏通 过m4预处理器自动生成。m4预处理器用来从一组宏文件中建立sendmail配置文件。宏文 件做为输入被读进来。宏被展开,而后写到一个输出文件。sendmail-cf目录通常放在/usr/share 目录下。其实sendmail-cf目录的内容和源码目录树下的cf目录的内容是同样的,因此,为 了保证sendmail-cf目录的内容与安装版本同步,要把源码目录树下的cf目录的内容拷贝到 /usr/share/sendmail-cf目录。
sendmail.mc配置文档内容以下:
divert(-1) include(`/usr/share/sendmail-cf/m4/cf.m4') VERSIONID(`linux setup for Red Hat Linux')dnl OSTYPE(`linux') 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') define(`confDEF_USER_ID',``8:12'')dnl undefine(`UUCP_RELAY')dnl undefine(`BITNET_RELAY')dnl 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/mail/aliases')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 TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl dnl define(`confCACERT_PATH',`/usr/share/ssl/certs') dnl define(`confCACERT',`/usr/share/ssl/certs/ca-bundle.crt') dnl define(`confSERVER_CERT',`/usr/share/ssl/certs/sendmail.pem') dnl define(`confSERVER_KEY',`/usr/share/ssl/certs/sendmail.pem') dnl define(`confTO_QUEUEWARN', `4h')dnl dnl define(`confTO_QUEUERETURN', `5d')dnl dnl define(`confQUEUE_LA', `12')dnl dnl define(`confREFUSE_LA', `18')dnl define(`confTO_IDENT', `0')dnl dnl FEATURE(delay_checks)dnl FEATURE(`no_default_msa',`dnl')dnl FEATURE(`smrsh',`/usr/sbin/smrsh')dnl FEATURE(`mailertable',`hash -o /etc/mail/mailertable.db')dnl FEATURE(`virtusertable',`hash -o /etc/mail/virtusertable.db')dnl FEATURE(redirect)dnl FEATURE(always_add_domain)dnl FEATURE(use_cw_file)dnl FEATURE(use_ct_file)dnl 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 -T<TMPF>; -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=0.0.0.0, 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 dnl FEATURE(`relay_based_on_MX')dnl MAILER(smtp)dnl MAILER(procmail)dnl
记得要使如下两个条语句有效,它的意思是若是access.db访问控制没有设置,则启用如下
验证方式进行smtp验证。 TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
sendmail宏定义说明
divert(n) 为m4定义一个缓冲动做,当n=-1时缓冲被删除,n=0时开始一个新缓冲 OSTYPE 定义宏所使用的操做系统,该宏容许m4程序增长同相关操做系统相关的 文件 Domain 定义MTA将使用哪些域来传输邮件 Feature 定义配置文件中使用的一个特定的功能集 Define 定义配置文件中的一个特定的选项值 MASQUERADE_AS 定义sendmail来应答邮件的其它主机名 MAILER 定义sendmail使用的邮件传输方法 dnl 注释
完成sendmail.mc文档的编写后就能够用m4程序生成正式的sendmail.cf配置文档。语法如
下: # m4 sendmail.mc >; sendmail.cf 也能够用源码目录树下的cf/cf/Build命令生成。前提是你要在该目录下有一个sendmail.mc 文档。语法以下: # ./Build sendmail.cf
ok,接着就能够把sendmail.cf and submit.cf文档安装到/etc/mail目录中的,语法以下:
# ./Build install-cf 其实也能够自已用cp命令拷贝的啦。记得把sendmail.mc文档也拷贝一份到/etc/mail目录, 以便之后修改配置时可从新生成sendmail.cf文档。
ok,接着到/etc/mail目录下配置一些文档。
# cd /etc/mail # echo 'examply.com' >;>; local-host-names 接收邮件的主机名 # echo 'localhost RELAY' >;>; access 用来拒绝或容许来自某个域的邮件,本例容许 本地转发。 # makemap hash access < access 生成access.db数据库 # touch domaintable 用来把旧域名映射互新域名 # makemap hash domaintable < domaintable # touch mailertable 来覆盖向指定域的路由 # makemap hash mailertable < mailertable # touch trusted-users # touch virtusertable 用来把用户和域名映射到其它地址 # makemap hash virtusertable < virtusertable # chown root:wheel /var/spool/mqueue/ # chmod 700 /var/spool/mqueue # touch aliases 别名数据库,文本形式。可参照源码目录树下 sendmail/aliases文件。 # newaliases 从文本文件中建立一个新的别名数据库文件。 # sendmail -v -bi 调试启动。 /etc/mail/aliases: 42 aliases, longest 10 bytes, 432 bytes total 若是出现以上提示信息,则启动成功。可用如下命令正式启动: # sendmail -bd -q30m 该命令之后台进程方式(-bd)运行,并使其每隔30分钟(-q30m)轮询一次未发送邮件队 列,检查是否有新邮件。
服务器启动后,能够用telnet链接服务器。
# telnet localhost 25 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 test.tigerhead ESMTP Sendmail 8.12.10/8.12.10; Tue, 30 Mar 2004 14:50:14 +0800 ehlo test 你输入的命令,按回车结束。 250-test.tigerhead Hello LOCALHOST.localdomain [127.0.0.1], pleased to meet you 250-ENHANCEDSTATUSCODES 250-PIPELINING 250-8BITMIME 250-SIZE 250-DSN 250-ETRN 250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN 250-DELIVERBY 250 HELP 以250-开头的为服务器的响应信息。注意倒数第三行,这就是成功配置smtp验证的显示。 输入quit离开。
安装完成后为确保系统安全,还需调整一些目录的权限。可参考sendmail源码目录下
sendmail/SECURITY文档。 # chmod 0640 /etc/mail/aliases /etc/mail/aliases.{db,pag,dir} # chmod 0640 /etc/mail/*.{db,pag,dir} # chmod 0640 /etc/mail/statistics /var/log/sendmail.st # chmod 0600 /var/run/sendmail.pid /etc/mail/sendmail.pid -r-xr-sr-x root smmsp ... /PATH/TO/sendmail drwxrwx--- smmsp smmsp ... /var/spool/clientmqueue drwx------ root wheel ... /var/spool/mqueue -r--r--r-- root wheel ... /etc/mail/sendmail.cf -r--r--r-- root wheel ... /etc/mail/submit.cf
六、sendmail功能介绍
aliases 别名数据库设置 test: test1,test2,test3 设置test群组别名,test不是一个实际的用户,只是一个别名。发给 test的信,test1,2,3均可收到。 test: test,testbak 在testbak邮箱中备份test的邮件。 test: test,test@163.com 远程邮件备份,原理同上。 test: :include: /etc/mail/userlist 使用用户列表设置群组。 userlist格式以下: test1, \ test2, \ test3, \ test4 关于系统预设aliases,因为sendmail预设用mailer-daemon and postmaster做为资料传送者, 或邮件退回的账号,但系统实际没有这两个账号,因此要以下设置别名。 mailer-daemon: postmaster postmaster: root 设置完成后不要忘了用newaliases命令生成数据库。
~/.forward文件配置
其实该文档的做用和aliases数据库的做差很少啦,都是配置别名,作邮件转发的。由于alises 只能由管理员控制,我的用户不能修改,因此就能够在我的的目录下创建一个转寄文档。以 设置我的的邮件转寄列表。文档格式以下: test test1 test2 test3 and os on 但因为我的用户安全意识差,若是设置不当会有安全漏洞,不建议使用。
access访问控制列表设置
92.168 RELAY test.NET OK test.COM REJECT test.COM 550 SORRY,WE DON'T ALLOW SPAMMERS HERE test.ORG DISCARD Ok--远程主机能够向你的邮件服务器发送邮件; RELAY--容许中转; REJECT--不能向你的邮件服务器发邮件和不能中转; DISCARD--发来的邮件将被丢弃,同时并不向发送者返回错误信息。 nnn text-- 发来的邮件将被丢弃,但sendmail将会向发送者返回nnn肯定的smtp代码和text 变量肯定的文本描述。 设置完成后要用makemap hash access.db < access命令生成数据库。
mailq邮件队列查询命令。
Q-ID 邮件id号。 Size 邮件容量。 Q-Time 邮件进入队列(也就是/var/spool/mqueue目录)的时间和不能邮寄的缘由。 Sender/Recipient 发信和收信人的邮箱地址。
mailstats邮寄状态查询命令,可查询sendmail运行做至今邮件收发总计资料。
M : msgsfr:发送的邮件数量。 bytes_from:邮件容量 megsto:收到邮件的数量。 bytes_to:同上 msgsrej:邮件deny的次数。 msgsdis:邮件discard的次数。 Mailer :esmtp对外邮件 ,local本地邮件 。
mail邮件命令
mail 查看/var/spool/mail/目录下自已邮箱内容。以q退出把看过的邮件保存在 ~/mbox中。 mail test@example.com 直接发邮件给人。 mail -s 'title text' test@example.com < mail.txt 把文档中内容邮寄出去。 mail -f ~/mbox 查看home目录下邮箱内容。 用mail发附件也是可行,要用到uuencode and uudecode命令进行编码。 编码:uuencode [file] name example:uuencode hello hello>;hello.uue default input is stdin;default output is stdout. 解码:uudecode [-o outfile] name example:uudecode hello.uue 能够用-o选项输出另一个 文件名。 # uuencode ~/.bashrc bashrc | mail -s 'test uuencode' test@example.com
5、其余设置。
要想更好的使用sendmail,经常使用到的一些设置: 一、限制最大邮件。 vi /etc/sendmail.cf # maximum message size O MaxMessageSize=5000000 (注:5M) 二、最大的群发数目。 vi /etc/sendmail.cf # maximum number of recipients per SMTP envelope O MaxRecipientsPerMessage=20 (注:20个) 三、域名文件----local-host-name 能够用他来实现虚拟域名或多域名支持。 /etc/mail/local-host-name v1mail.com v2mail.com ....... 四、mail别名文件--aliases。 vi /etc/aliases 系统内部别名:peng:zpeng,hero,mmmn,yt peng是个人用户名,其余的是别名,用逗号隔开。 转发到其余的邮箱:peng:zpeng@sina.com,yt.sohu.com #newaliases --写到库中 五、邮件控制文件--access relay、ok、reject和discard。relay能够实现转发。ok是用来容许用户的任意访问,它会覆盖任何其它已创建的检查(实际设置中,最好别设这项,除非你对该用户是绝对信任的);reject能够实现对来访地址的拒绝,它根本就不允许该地址与你的邮件服务器进行链接通讯;discard的做用是在接收到传输的邮件消息后,偷偷地把它丢弃掉(在发送者看来,他的邮件的确是接收了,但他并不知道,发送的目的地址根本不可能接收到他的邮件,服务器巧妙地欺骗了他。 vi /etc/mail/access.
localhost.localdomain RELAY ---容许
localhost RELAY 127.0.0.1 RELAY peng@sina.com ok @sexgirl.net reject 211.77.22.45 discard
#makemap hash access.db < access --写入库中
六、虚拟用户文件---virtusertable.
这个文件能够mail重名问题。 例如:你有两个域名,virt1.com and virt2.com,可是都有peng这个用户: peng@virt1.com and peng@virt2.com,这是两个用户。但对于系统用户来讲,他只认系统用户peng,只能经过一下改: vi /etc/mail/virtusertable peng@virt2.com r010 这样就能够了。在新开一个用户r010,可是 peng@virt2.com在客户端的pop3 and smtp server的用户名和口令要用r010的。 #makemap hask virtusertable.db < virtusertable
# /usr/sbin/sendmail -d0.1 -bv root |grep SASL NAMED_BIND NETINET NETINET6 NETUNIX NEWDB NIS QUEUE SASL SCANF
|