trusted-users
设置可信任用户
可以代表其他用户发邮件的用户
这个可选的特性在sendmail.mc中的名称为use_ct_file。
这个列表中的用户可以改变电子邮件的寄件人。
在/etc/mail/trusted-users文件中每个用户名占一行。
这对运行在你的服务器上的脚本或应用程序给某个人或组发信息是非常有用的。
它可以更容易的快速识别一个电子邮件的信息。
virtusertable
改域名后,可以做域名的转换 旧域 新域
类似于aliases文件,但用于外部用户
/etc/mail/virtusertable
虚拟用户表格向你服务器上的真实邮箱发送虚拟域和邮箱的邮件。这些邮箱可以是本地的,远程的,或是由/etc/aliases定义的别名。这些是在你的sendmail.mc文件中一命令行的形式进行初始配置的。
语法如下:
左地址 右地址
中间用Tab键分开。
例如: someone@otherdomain.com localuser
这样一行意味着本来应该发送给someone@otherdomain.com的邮件现在要发送给本机的用户localuser。当然,这意味着:第一,你的DNS记录中,本机应该是otherdomain.com的MX交换器;第二,你的本机local-host-names文件应该包含otherdomain.com这个名字。
当然纯粹的这样的域意义不大,但是sendmail还支持邮件虚拟域的参数翻译。例如:
@testdomain.com test@mydomain.com
意味着所有发往xxx@testdomain的邮件都会被发送到test@mydomain.com。而
@testdomain.com %1test@mydomain.com
则代表参数转义,例如user1@testdomain.com的邮件被发送到user1test@mydomain.com,user2@testdomain.com被发送到user2test@mydomain.com。同样,这样的功能也要通过MX记录和local-host-names文件加上去。
建立virtusertable的方法与建立access的办法是一样的:
#makemap hash virtusertable.db < virtusertable
然后重新启动sendmail。
virtusertable.db
如同Apache一样,sendmail也允许使用虚拟主机功能,这是通过FEATURE(virtusertable)功能实现的,而虚拟主机的文件缺省是/etc/mail/virtusertable.db,它用/etc/mail/virtusertable文件生成,这个文件的形式类似于aliases文件,
#makemap hash virtusertable.db < virtusertable
mailertable
定义邮差
/etc/mail/mailertable文件(在FEATURE(`mailertable')里定义)用来定义对某个域名或者用户使用什么样的邮差,如sz.st-anda.com smtp:[10.100.100.252]等等。一般情况下,并不需要定义这个功能。建立这个文件的方式与上面的几个hash数据库相同。
spamassassin
给/etc/procmailrc增加:
INCLUDERC=/etc/mail/spamassassin/spamassassin-default.rc
来支持SpamAssassin
statistics
/var/log/mail/statistics
用mailstats来读取这个文件,主要记录sendmail收发信件的相关信息。
submit.mc
可以让使用sendmail的限定于组
Makefile
/etc/mail/Makefile中是编译选项,用make -C /etc/mail来处理mail目录中的所有文件
☆mqueue
/var/spool/mqueue是邮件队列临时存放的目录。在/var/spool/mqueue下,有不同的队列。消息存放在不同的队列中。消息队列文件有以下形式: qf* ------消息队列控制文件 df* ------数据文件 tf* -------临时文件
nf* -------每个用户对应的消息队列 xf* ------当前会话过程的transcript文件
一般来说,sendmail守护子进程周期性地处理此队列,尝试发送每个消息。//etc/init.d/sendmail脚本启动sendmail进程,使它每15分钟fork出一个子进程,来处理这个mail队列,每次sendmail处理这个队列的时候 ,它就读取此队列并排序,然后试图依次运行各个任务。
☆mail日志
Sendmail很好的利用的它的日志文件,你可以追捕到大部分问题的所在。
mail.log和mail.err是你需要注意的两个主要文件,还有就是mail.warn和mail.info。
这些文件有许多共同之处,所以我一般只看前两个文件。一般而言,你可以在 /var/log/下找到这些文件,对特定的系统和Linux版本,可能在其他目录下。如果必要的话,你可以察看/etc/syslog.conf文件。典型的电子邮件成功发送一般是这样的:
Oct 25 18:22:14 example sendmail[29322]: SAA29322: from=user, size=193, class=0, pri=60193, nrcpts=2, msgid=<200110260122.SAA29322@panda.com>, relay=user@local
Oct 25 18:22:14 example sendmail[29324]: SAA29322: to=help@techsupport.net, ctladdr=user (500/1000), delay=00:00:00, xdelay=00:00:00, mailer=local, stat=Sent
你可以在mail.log看到和下面类似的拒绝信息:
Oct 23 14:23:51 example sendmail[27467]: OAA27467: ruleset=check_rcpt, arg1=, relay=west1.mail-abuse.org [204.152.186.193], reject=550 ... Relaying denied
通常,你所需要的所有信息都存储在这些日志文件中,包括用户名,主机名,出错代码。这些出错代码很有用处,可以通过这些让你对自己有更好的了解。
#tail -f /var/log/maillog 使用tail的-f命令可以观察日志文件内容的实时更新,特别适合于对服务器进行调试和错误检查。
16☆Sendmail的常见配置举例
假设配置的要求如下:
·邮件服务器的IP地址为192.168.1.2,主机域名为mail.1test.com
·邮件服务器将为1test.com域中的用户提供邮件服务
·为了防止垃圾邮件,服务器需要具有SMTP用户认证功能
邮件服务器的基本配置步骤:
1.首先一定要安装以下两个软件包,否则m4,newaliaes,makemap命令都无法使用:
#rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm (第二张光盘,默认未装)
#rpm -ivh sendmail-doc-8.13.8-2.el5.i386.rpm (第三张光盘,默认未装)
2.域名设置
邮件服务器的正常工作需要在DNS服务器中进行相应的设置,对于主机域名为mail.1test.com的邮件服务器需要在1test.com域的主DNS服务器中进行设置:
mail IN A 192.168.1.2
@ IN MX 5 mail.1test.com.
3.设置local-host-names文件
在sendmail服务器的配置目录下,local-host-names文件用于设置邮件服务器提供邮件服务的域名。例如,为了对1test.com域提供邮件服务,local-host-names
文件中需要添加1test.com设置行。
#vi /etc/mail/local-host-names
1test.com //添加邮件服务器提供邮件服务的域名
在local-host-names文件中设置域名后,sendmail服务器将对文件中设置的域名提供邮件服务。
4.开启sendmail服务器的网络接口
sendmail服务器出于安全考虑,默认只对lo回环网络接口(IP地址为127.0.0.1)提供服务,为了使服务器能够为主机的所有网络接口(地址为0.0.0.0)提供服务
需要在sendmail.mc文件中进行配置的修改:
#vi /etc/mail/sendmail.mc
DAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1,Name=MTA')dn1 //查找到此行,修改为:
DAEMON_OPTIONS('Port=smtp,Addr=0.0.0.0,Name=MTA')dn1
在sendmail.mc文件中进行以上修改后,sendmail服务器将监听主机所有网络接口的25端口。
5.sendmail服务器的用户管理
(1)设置SMTP的用户认证
邮件服务器提供发送邮件的功能是很正常的,但是如果为所有人都能够无条件地发送(投递)邮件是很危险的,非常容易造成大量垃圾邮件产生。因此在sendmail
服务器中需要设置发送邮件的用户认证,当用户使用MUA软件通过SMTP向邮件服务器发送邮件时,邮件服务器会要求用户提供用户账号和口令进行身份认证,只有
通过身份认证的用户才能通过邮件服务器向外部发送邮件。RHEL5系统中提供的sendmail服务器提供了SMTP的用户认证功能,但是默认的设置没有启用此功能,因
此需要在sendmail.mc文件中进行相应的配置:
#vi /etc/mail/sendmail.mc
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl //查找到以下两行
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
修改为:
TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl //去掉前面的注释字符串dnl
define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl //去掉前面的注释字符串dnl
特别注意:以上两行去掉了前面的注释串dnl后,前面一定不能留有空格,否则在启动sendmail服务时会出错!
在sendmail服务器中,使用了sasl的第二版sasl2作为SMTP的认证方式,在/usr/lib/sasl2/Sendmail.conf配置文件中设置了使用saslauthd服务程序提供用户认
证服务,因此当sendmail服务器使用SMTP认证功能时,需要确保saslauthd服务程序正确运行:
#cat /usr/lib/sasl2/Sendmail.conf
pwcheck_method:saslauthd
#chkconfig --level 35 saslauthd on
#service saslauthd start
(2)用户账号
sendmail服务器使用linux系统中的用户账号作为邮件账号,因此为用户添加邮件账号只需要添加linux用户账号即可。为了便于对邮件用户进行管理,需要先建
立邮件用户组mailuser,新建立的邮件用户账号应属于该组账号。由于邮件账号通常不需要登录linux系统,因此在adduser命令中可以使用“-s”选项指定用户
的shell为“/sbin/nologin”,即不允许用户登录linux系统。在建立邮件用户账号之后,需要使用passwd命令为用户设置口令,以便用户发送和收取邮件时进
行身份认证。
#groupadd mailuser //建立邮件用户组mailuser;
#adduser -g mailuser -s /sbin/nologin name1 //创建邮件用户账号name1和name2;
#adduser -g mailuser -s /sbin/nologin name2
#passwd name1 //设置邮件用户口令
#passwd name2
(3)设置邮件别名和邮件群发功能
在sendmail服务器中使用aliases机制实现邮件别名和邮件群发功能,在“/etc”目录下同时存在名为aliases和aliases.db两个文件。aliases文件是文本文
件,其内容是可阅读和可编辑的,aliases.db是数据库文件,是由aliases文件生成而来的。对“/etc/aliases”文件的内容进行修改后,需要执行newaliases
命令,该命令根据aliases文件的内容重新生成aliases.db文件。只有对aliases.db文件进行了更新,aliases文件中新的别名设置在系统中才会生效,在aliases
文件中每行作为一个别名设置记录,记录的格式如下:
name: addr_1, addr_2, addr_3,...addr_N
在aliases记录的格式中name表示虚拟邮件账号,addr_N表示真实邮件账号名,aliases记录可实现邮件别名和邮件群发功能。在RHEL5系统的“/etc/aliases”
文件中已经默认设置了一些别名记录,其中大部分都是为root用户设置的别名。
例1.为邮件用户name1设置别名admin的记录如下:
#vi /etc/aliases
admin: name1
#newaliases
sendmail服务器会根据设置的别名记录将发往admin用户的所有邮件转发到name1用户的邮箱中,即实现了为name1用户设置别名。
例2.设置别名记录,将发往testgroup邮箱的所有邮件都转发到name1和name2用户的邮箱中,实现邮件的群发功能:
#vi /etc/aliases
testgroup: name1, name2
#newaliases
为了实现邮件群发功能,需要在别名记录中设置多个真实邮件账号的名称。
6.访问控制的设置
在sendmail服务器中使用access.db数据库进行基于主机地址的访问控制,默认开启了对邮件服务器本机用户的邮件投递,即在sendmail服务器所在主机中的用
户可以任意发送邮件,而不需要进行任何身份认证。
#vi /etc/mail/access
localhost.localdomain RELAY
localhost RELAY
127.0.0.1 RELAY
access.db数据库文件和SMTP认证功能配合使用,可以保证sendmail服务器具有较好的安全性。
7.生成sendmail.cf文件
在对sendmail.mc文件修改完成了所有的配置后,需要使用m4命令生成新的sendmail.cf配置文件:
#cd /etc/mail
#m4 sendmail.mc > sendmail.cf
注意:m4命令一定要在/etc/mail目录下执行!
8.重新启动sendmail服务器
当完成对sendmail服务器的配置之后,需要使用sendmail脚本重新启动服务程序,使新的配置生效:
#service sendmail restart
使用netstat命令可以查询到sendmail服务程序已经对所有的网络接口的25端口进行了邮件服务的监听:
#netstat -ntpl | grep 25
通过telnet邮件服务器的25端口可以验证邮件服务器的SMTP认证功能:
#telnet localhost 25
.......
ehlo localhost //登录到邮件服务器的25端口后,输入ehlo localhost命令会显示邮件服务器的状态信息;
........
250-AUTH DIGEST-MD5 CRAM-MD5 LOGIN PLAIN //如果在250-AUTH开始的行中出现了LOGIN PLAIN,则说明sendmail服务器中设置的SMTP认证功能生效。
通过telnet命令与SMTP服务交互通信的步骤,演示SMTP的工作过程:
(1)客户机通过telnet命令与服务器的25端口建立一个TCP连接,连接成功后,服务器返回一个表示通信连接成功的220应答代码:
#telnet localhost 25
220 localhost.localdomain ESMTP Sendmail 8.13.8/8.13.8;Sun, 5 0ct 2008 04:14:52 +0800
(2)发送HELO,向服务器标识发件人的身份,若成功,则会收到表示邮件系统命令成功的250应答码:
HELO localhost //输入此语句
250 localhost.localdomain Hello localhost.localdomain [127.0.0.1],pleased to meet you
(3)使用MAIL FROM:命令给服务器传送发信人地址,传送成功后,收到250应答码:
MAIL FROM:tjj@benet.com //输入此语句
250 2.1.0 tjj@benet.com......Sender ok
(4)使用RCPT TO:命令传送收信人地址,可以传送多行收信人地址到服务器,服务器收到有效的收信人地址后,将返回250成功应答码:
RCPT TO:root //输入此语句
250 2.1.5 root.....Recipient ok
(5)向服务器发送DATA命令,准备开始传送邮件内容,服务器若返回354应答码,即表示已经准备接收邮件内容,可以在下一行开始输入邮件内容,并在最后一行,
以只含一个圆点的行表示输入结束(即在新行中键入圆点字符,然后回车,将结束邮件内容的输入)。服务器接受输入后,返回250应答码,开始传送邮件:
data //输入此语句,准备开始传送邮件内容
354 Enter mail ,end with "." on a line by itself
I love your ,LINUX! //此行开始输入邮件内容
. //结束行中只输入一个圆点表示将结束邮件内容的输入
250 2.0.0 m94KG5YI029186 Message accepted for delivery
(6)使用QUIT命令退出通信过程,相应的用户将会收到该信件:
QUIT //表示退出通信过程
221 2.0.0 localhost.localdomain closing connection
Connection closed by foreign host.
邮局的基本配置步骤:
在整个邮件系统中sendmail服务器实现了SMTP功能,因此只实现了邮件的发送功能,并不为MUA软件提供收取邮件的功能,收取邮件需要单独安装实现POP3或IMAP
功能的服务器程序,可以使用dovecot服务器实现POP3功能。
1.安装dovecot软件包
由于安装dovecot服务器依赖的软件包较多,建议使用RHEL5系统的软件包管理程序来安装docecot软件包:#system-config-packages,或依次安装以下rpm包:
#rpm -ivh perl-DBI-1.52-1.fc6.i386.rpm (第二张光盘)
#rpm -ivh mysql-5.0.22-2.1.i386.rpm (第二张光盘)
#rpm -ivh dovecot-1.0-1.2.rc15.el5.i386.rpm (第二张光盘)
若是RHEL4系统则需依次以下包:
#rpm -ivh perl-DBI-1.40.5.i386.rpm --aid (第二张光盘)
#rpm -ivh perl-DBD-MySQL-2.9004.3-1.i386.rpm --aid (第二张光盘)
#rpm -ivh mysql-4.1.7-4.RHEL4.1.i386.rpm (第二张光盘)
#rpm -ivh postgresql-libs.7.4.6-1.RHEL4.2.i386.rpm (第二张光盘)
#rpm -ivh dovecot-0.99.11-2.EL4.1.i386.rpm (第四张光盘)
2.设置dovecot服务器
dovecot服务器的配置文件是/etc/dovecot.conf,dovecot服务器可以提供IMAP和POP3服务,但是默认只提供IMAP服务,因此需要在/etc/dovecot.conf配置
文件中进行设置的修改:
#vi /etc/dovecot.conf
#protocols = imap imaps //修改此行,去掉注释“#”;添加pop3,pop3s两项服务
修改为:
protocols = imap imaps pop3 pop3s
3.启动dovecot服务程序,并设置启动状态
对dovecot.conf配置文件进行设置后,需要重新启动dovecot服务程序,以便新的设置生效,而且dovecot服务程序安装后默认设置并不自动启动,所以需要使用
chkconfig命令设置自动运行,以保障邮件服务器的正常运行:
#service dovecot restart
#chkconfig --level 35 dovecot on
#netstat -ntpl | grep 110
☆sendmail校验
看sendmail是否启动:
#netstat -nutlp | grep :25
确定sendmail没有在启动的时候出现错误,/var/log/maillog中。检查此文件中的最后出现"starting"的地方以确保sendmail在启动的时候没有任何错误。
sendmail可执行文件位于/usr/sbin/sendmail,为了确定sendmail是否正确标识您的主机名称,通过命令行开关开启其调试模式并且设定为0:
[root@panda mail]# sendmail -d0 < /dev/null
Version 8.13.1
Compiled with: DNSMAP HESIOD HES_GETMAILHOST LDAPMAP LOG MAP_REGEX
MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6
NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF STARTTLS TCPWRAPPERS
USERDB USE_LDAP_INIT
============ SYSTEM IDENTITY (after readcf) ============
(short domain name) $w = panda
(canonical domain name) $j = panda.panda.com
(subdomain name) $m = panda.com
(node name) $k = panda
========================================================
Recipient names must be specified
如果sendmail返回您的主机名称为localhost,您可能错误配置了/etc/hosts文件。检查您的/etc/hosts文件,删除所有的但记住留下localhost的指向。
127.0.0.1 panda.panda.com panda localhost
如果/etc/hosts文件是正确的,那么检查一下在/etc/sysconfig/network中的HOSTNAME的定义。
试图向root@panda发送简单的邮件。您可以看到一个合理的您的主机的转发服务器的SMTP交换。
echo "hello root" | mail -v -s hello root@panda
[root@panda ~]# echo "hello root" | mail -v -s hello root@panda
root@panda... Connecting to [127.0.0.1] via relay...
220 panda.panda.com ESMTP Sendmail 8.13.1/8.13.1; Thu, 27 Jul 2006 08:46:11 +0800
>>> EHLO panda.panda.com
250-panda.panda.com Hello panda.panda.com [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
250-DELIVERBY
250 HELP
>>> MAIL From: SIZE=42 AUTH=root@panda.panda.com
250 2.1.0 ... Sender ok
>>> RCPT To:
>>> DATA
250 2.1.5 ... Recipient ok
354 Enter mail, end with "." on a line by itself
>>> .
250 2.0.0 k6R0kBQO005444 Message accepted for delivery
root@panda... Sent (k6R0kBQO005444 Message accepted for delivery)
Closing connection to [127.0.0.1]
>>> QUIT
221 2.0.0 panda.panda.com closing connection
You have mail in /var/spool/mail/root
如果SMTP交换向上面一样正确,那么消息将被转发到您的工作站上的本地的转发服务器上,并且mailq -Ac将会报告一个空的对列。接下来检查mail(不使用参数)来检查一下消息是否从本地的转发到server1。这样对列也应该是空的。
[root@panda public_html]# mailq -Ac
/var/spool/clientmqueue is empty
Total requests: 0
您的消息是不是在/var/log/maillog中正确的记录呢?在下面的步骤中,监视文件/var/log/maillog。下面的命令将会十分的有用:
#xterm -e tail -f /var/log/maillog &
☆sendmail收取邮件
为了安全的原因,sendmail和postfix的缺省的配置允许发邮件但是不允许从网络上接收邮件(缺省的它们只接受从回环接口上的连接)。
确保在Server上的sendmail.mc文件中的DAEMON_OPTIONS被注释并且重新编译sendmail.cf文件使得能构接受来自其他主机的电子邮件。
修改 /etc/mail/sendmail.mc
使用dnl注释在下面的行之前,就象这样:
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
先将您的sendmail.cf文件做一个备份:
cp /etc/mail/sendmail.cf /etc/mail/sendmail.cf.bak
在同一个目录下,编译sendmail.cf
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
重新启动sendmail
☆sendmail别名
sendmail的主要的别名配置文件是/etc/aliases。
在sendmail决定消息的接受者的目的地的之前,其先试图在别名中查找。
为了优化查找,sendmail为其别名记录建立了一个哈希表数据库/etc/aliases.db该文件通过newaliases命令产生(该命令是sendmail -bi的同名)
下列命令将增加用户student(如果不存在的话)
useradd student
在/etc/aliases 行加入如下的行:
me: student(别名:实际用户名)
wizards: root, me
methere: student@panda.panda.com
现在运行
newaliases
命令来更新数据库
尝试发送邮件给您定义的收件人:
echo "hello there" | mail -s "hello" me
echo "hello there" | mail -s "hello" wizards
echo "hello there" | mail -s "hello" methere
您是否得到了期望的结果?是否所有的位于wizards的收件人都受到了邮件?如果没有,su - 到不是root的用户再试一次。
如果没有收到,可能需要在/etc/mail/access中打开权限
☆sendmail允许转发
通过控制您的机器的混杂转发,您可以使得任何人都能够将您的机器作为转发的主机。
配置/etc/mail/sendmail.mc, 通过加入如下行使得m4前置处理器允许混杂转发(可以发到任何地址):
/etc/mail/sendmail.mc中添加
FEATURE(`promiscuous_relay')dnl
使用m4前置处理机通过这个模板文件生成一个新的sendmail配置文件,然后将新生成的文件与通过sendmail RPM软件包提供的进行比较
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.relay
diff /etc/mail/sendmail.relay /etc/mail/sendmail.cf
使用混杂转发以后会有多大的不同呢?现在将新建立的sendmail.relay放置在恰当的位置上,重新启动sendmail.
mv /etc/mail/sendmail.cf /etc/mail/sendmail.cf.accept-mail
cp /etc/mail/sendmail.relay /etc/mail/sendmail.cf
service sendmail restart
让您的伙伴扮演恶意的垃圾邮件的发送者,该人能够通过telnet到您的机器上的smtp(sendmail)的25号断口,进行垃圾邮件发送地址的欺骗,在panda主机上键入如下命令:
[root@panda ~]# telnet panda 25
Trying 127.0.0.1...
Connected to panda.panda.com (127.0.0.1).
Escape character is '^]'.
220 panda.panda.com ESMTP Sendmail 8.13.1/8.13.1; Thu, 27 Jul 2006 01:12:37 +0800
helo panda.panda.com
250 panda.panda.com Hello panda.panda.com [127.0.0.1], pleased to meet you
mail from: panda@panda.panda.com
250 2.1.0 panda@panda.panda.com... Sender ok
rcpt to:root@panda.panda.com
250 2.1.5 root@panda.panda.com... Recipient ok
data
354 Enter mail, end with "." on a line by itself
Subject: Faked
this was faked!
250 2.0.0 k6QHCb8x007709 Message accepted for delivery
quit
221 2.0.0 panda.panda.com closing connection
Connection closed by foreign host.
垃圾邮件现在送到您的机器上了。下一步,发给其他主机
☆sendmail不允许转发
通过替换新的sendmail.cf为接受传入的信件的配置文件来恢复缺省的sendmail的配置,并且重新启动sendmail:
注释掉这行
FEATURE(promiscuous_relay)dnl
mv /etc/mail/sendmail.cf.accept-mail /etc/mail/sendmail.cf
service sendmail restart
让您的伙伴再从stationY转发垃圾邮件。您的sendmail还是一个转发器么?任何一个转发的都会产生如下的消息:
550 5.7.1 kddk@kdk.com... Relaying denied
但是本机是可以转发的(access文件中定义)
☆sendmail选择性的转发
对于特定的主机,域或者网络,编辑/etc/mail/access并且重新启动sendmail。
为了允许所有在panda.com域中的机器可以把您的机器作为邮件转发服务器,你在/etc/mail/access中添加如panda.com域。
然后用#makemap hash access.db
☆m4
sendmail是一个极为复杂的程序,其行为主要地依赖于在UNIX界"臭名昭著"的/etc/sendmail.cf配置文件。实际上,我怀疑会有谁真的从头去写一个sendmail.cf文件。一般来说,我们总是用m4宏处理来书写sendmail.cf。实际上,m4程序几乎和sendmail.cf一样复杂,不过,通常我们只需要关心一些比较重要的部分。
要使用宏处理程序,必须确定你已经安装了m4和sendmail-cf这样两个软件包
用m4程序可以生成一个sendmail.cf: #m4 sendmail.mc > /sendmail.cf
☆sendmail总结
配置接收邮件,/etc/mail/sendmail.mc
dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
m4 sendmail.mc > sendmail.cf
添加别名 在/etc/aliases加入别名,newaliases
不充许转发:默认
转发:在sendmail.mc 加入
FEATURE(promiscuous_relay) dnl
选择转发: /etc/mail/access
用户和主机访问控制
/etc/mail/access
domain.com RELAY
USER@ REJECT
USER@domain.com REJECT
IP RELAY
或
☆新建E-Mail帐号
在LINUX中,要为一个新的用户开E-Mail帐号是十分简单的。只要在LINUX系统中新增一个用户就可以了。那么这个用户帐号和密码就是E-Mail的帐号和密码。
我为一个新用户test开一个E-Mail帐号。就用以下命令:#adduser panda, # passwd panda
这样,这个新用户的E-Mail地址就是: panda@panda.com 密码当然就是帐号的密码了。
要防止本地用户利用 sendmail 服务器上的漏洞,最好是让邮件用户只使用电子邮件程序来访问 sendmail 服务器。邮件服务器上的 Shell 帐号不应该被允许,/etc/passwd 文件中的所有用户 shell 都应该被设置为 /sbin/nologin,在添加系统用户时可以useradd -s /sbin/nologin 用户名,这样添加的用户名就没有了shell,只能收发信而不能登陆到服务器运行其他程序,安全一点。
☆sendmail邮件限额
当一个E-Mail服务器为许多人提供E-Mail服务的时候,无限量的电子邮件将很容易塞满服务器的硬盘,造成很大的负载。如果你的服务器不想为用户提供无限空间的E-Mail暂存空间,那么你就可以使用"邮件限额"来给用户一个有限的暂存空间。
其实,它是利用磁盘限额功能来实现的。电子邮件的暂存空间是在/var/spool/mail目录下,只要通过磁盘限额设定每一个用户在这个目录下能使用的最大空间就可以了。
☆mailstats
邮寄状态查询命令,可查询sendmail运行作至今邮件收发总计资料。
M :
msgsfr:发送的邮件数量
bytes_from:邮件容量
megsto:收到邮件的数量。
bytes_to:同上
msgsrej:邮件deny的次数。
msgsdis:邮件discard的次数。
Mailer :esmtp对外邮件,local本地邮件。
☆mailq
#/usr/bin/mailq邮件队列查询命令。
Q-ID 邮件id号。
Size 邮件容量。
Q-Time 邮件进入队列(也就是/var/spool/mqueue目录)的时间和不能邮寄的原因。
Sender/Recipient 发信和收信人的邮箱地址。
☆sendmail -q
当命令sendmail -q发出以后,sendmail将会试图仍在队列中等待的邮件。
可以在后面跟上时间‘s’是秒,‘m’分钟(缺省),‘h’小时, ‘d’天,‘w’周.
☆sendmail管理邮件队列
一般当你发送一封邮件的时候,sendmail倾向于立刻发送这一封电子邮件。但是如果 当前网络忙使得无法立刻投递信件,或者是目标地址的连接速度太慢,无法在短时间内投递到目标地址处,那么sendmail将把待发送的邮件排入队列,并在合适的时候重新发送。
队列文件通常存放在/var/spool/mqueue下面,每个待发送的邮件由几个文件构成
例如,我们可以看到下面的目录文件列表:
[root@mail mqueue]# ls
dfRAA27175 xfAAA00733 xfBAA00819 xfEAA32763 xfXAA00706
qfRAA27175 xfAAA00784 xfDAA01360 xfFAA01616
文件名字总是由一个两字符的前缀加上一个随机数字。前缀有四钟:
df:邮件内容
qf:邮件头和一些控制信息
xf:一些临时文件
tf:qf文件的临时存储文件
可以通过看队列中的qf文件来确定当前队列信息,不过通常都可以用mailq程序来完成 对队列状态的查询:
[root@mail mqueue]# mailq
Mail Queue (1 request)
--Q-ID-- --Size-- -----Q-Time----- ------------Sender/Recipient----------- -
RAA27175 22429 Fri Feb 25 17:34
: deferred)
chaszhj@21cn.net
这表示队列中目前只有一封信,由zhangfl发出,收信人是chaszhj@21cn.net。
由sendmail接受到的信件在用户取走之前将暂时存储在/var/spool/mail目录下面,存 储的方法非常简单,就是每个有待读邮件的用户一个文件:
[root@mail spool]# ls -l /var/spool/mail |more
total 19364
-rw-rw---- 1 anyi mail 7559035 Feb 28 22:04 anyi
-rw-rw---- 1 baixuan mail 514 Nov 7 01:32 baixuan
-rw-rw---- 1 cwc mail 515 Feb 28 08:35 cwc
如果一个用户有多封电子邮件,那么这些邮件就被简单地连接在一起构成一个大文件 (所以你会看到非常巨大的邮件文件)。
如果你面对的是一个很庞大的邮件服务系统,有时会在某个邮件队列中拥塞太多的消 息,你可能想把这个队列暂停并且在网络空闲的时候再发送,暂停一个邮件队列的办法非常简单,就是将/var/spool/mqueue目录移走:
killall sendmail
mv /var/spool/mqueue /var/spool/mqueue.stop
mkdir /var/spool/mqueue
sendmail -bd
当网络空闲的时候,可以用-oQ参数立即处理拥塞的队列:
sendmail -oQ /var/spool/mqueue.stop -q
☆SMTP协议的基本命令
在/etc/mail/helpfile中有描述
为了使用这种测试技术,你需要了解SMTP协议的基本命令,这样的命令有14个,在下面列出:
HELO
标志发起smtp请求的主机,例如,从client1发起smtp会话,可以使用 HELO client1
MAIL FROM:
启动一个邮件会话,在这个行中需要标志发信人的信封地址,例如,要从user1@client1发出邮件,使用MAIL FROM:user1@client1,注意尖括号的用法。
RCPT TO:
标志收信人的信封地址,例如,要发送给user2@mail2,使用RCPT TO: user2@mail2。在一个MAIL FROM之后可以给出多个收信人地址,以便实现多副本的传送。
VRFY
验证某个地址,例如,要确定test@mail是一个可以投递的地址,使用VRFY test@mail。
EXPN
显示某个收件人地址或者用户名的实际名字。例如,要显示postmaster用户的实际投 递地址,使用EXPN postmaster。如果在某个用户的目录下有.forward文件,这个文件的 内容将会被自动使用。
DATA
开始写信,在MAIL和RCPT之后可以使用这个命令传输信件正文,传输完毕之后输入一 个.退出。
QUIT
关闭smtp会话
RSET
复位连接状态
HELP
显示这个命令表。
☆sendmail测试
/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
如果出现以上提示信息,则启动成功。可用以下命令正式启动:
打开你喜欢的Mail Client,设置smtp服务器为:localhost (假如和服务器在同一台机子上,也可以设置本机的IP),端口为:25.然后随便一段测试信息,填写好接收邮件的地址,按发送。你的Mail Client会提示邮件已发送。实际上你的邮件还在计算机上排队,并未发出!要发送所有排队的邮件,你需要连上网,然后你root身份登陆,并运行:# sendmail -q .现在你的邮件就会发送到指定的邮箱中。