Linux网络管理员手册(14)
翻译:赵炯
[email protected]
第十四章 配置和运行smail
这一章将给你一个设置smail的快速入门,以及它所提供的功能概述。尽管smail的行为在很大程度上与sendmail相兼容,但是它们的配置文件却是完全不同的。
主要的配置文件是/usr/lib/smail/config。你一定要编辑这个文件以反映你的站点的特定的值。如果你只是一个UUCP的末端站点(leaf site),那么相应地你很少需要改动的。配置路由选择和传输选项的其它文件当然也可以使用;这些文件也将概要地论及。
缺省地,smail会立刻处理并分发所有入站的邮件。如果你有相应较大的流量,你可以先让smail将信息收集到所谓的队列(queue)中,并且仅在一定的间隔期间来处理它们。
当在TCP/IP网络上处理邮件时,smail会以后台模式(daemon mode)频繁地运行:在系统引导启动时,它是从rc.inet2被调用的,并且将自己置入后台以等待SMTP端口(通常是端口25)进入的TCP连接。当你可能会遇上较大信息流量时,这是非常有用的,因为smail不会针对每个入站连接而立即运行的。另外一种方法是让inetd来管理SMTP端口,并且每当这个端口有连接时,由它来调用smail。
smail有许多标志以控制自己的行为;在此详细讨论它们对你并不会有太大的帮助。幸运的是,smail支持一些标准的操作模式,当你通过一特定的命令名调用smail时这些模式会开启,如rmail和smtpd。通常,这些别名本身是对smail执行文件的符号连接。在讨论smail的各种特性时我们会遇到其中大多数特性。
在所有环境下,你应该有两个到smail的连接;它们是/usr/bin/rmail和/usr/sbin/sendmail。[1] 当你使用一个用户代理程序(如elm)撰写和发送一个邮件信息时,该邮件信息将输送给rmail去进行投递,而接收者列表要在命令行上给出。对于通过UUCP接收的邮件也会有同样的情况。然而,elm的某些版本会调用/usr/sbin/sendmail而不是rmail,所以你需要它们两者。例如,如果你将smail放在/usr/local/bin中,那么在shell提示下键入下面两行:
# ln –s /usr/local/bin/smail /usr/bin/rmail
# ln –s /usr/local/bin/smail /usr/sbin/sendmail
如果你想更深入地研究配置smail的细节,请参阅手册页smail(1)和smail(5)。如果它没有包括在你中意的Linux发行版本中,你可以从smail的源程序中得到。
14.1 UUCP的设置
要想在只有UUCP的环境下使用smail,基本的安装过程是非常简单的。首先,你必须确信你已经有了上面所提到的两个符号连接rmail和sendmail。如果你还希望从其它站点接收到SMTP批处理信息,你也需要设定rsmtp为一个到smail的连接。
在Vince Skahan的smail发行版中,你会找到一个样本配置文件。它被命名为config.sample并存在于/usr/lib/smail中。你必须拷贝它到config并且编辑它以适用于你的站点。
假设你的站点名称是swim.twobirds.com,并在UUCP映射中以swim登记注册。你的灵敏主机是ulysses。此时你的config文件应该看上去象这样的:
#
# Our domain names
visible_domain=two.birds:uucp
# Our name on outgoing mails
visible_name=swim.twobirds.com
#
# Use this as uucp-name as well
uucp_name=swim.twobirds.com
#
# Our smarthost
smart_host=ulysses
第一条语句告知smail有关你的站点所属的域。在这里插入它们的名字并用冒号分开。如果你的站点名在UUCP映射中注册过,那么你也应该加上uucp。在处理一个邮件消息时,smail使用hostname(2)系统调用来确定你的主机的名字,并且将接收者的地址和这个主机名作比较检查,依次添加上这个列表中的所有名字。如果该地址与这些名字或非正规主机名中的任何一个相匹配时,接收者就被认为是本地的,并且smail将试图将这个消息投递给本地主机上的一个用户或别名。否则的话,接收者被认为是远程的,并开始尝试投递到目的主机去。
visible_name应该含有单个、用于出站邮件上的你的站点的全资域名。当在所有出站邮件上生成发送者的地址时,将使用这个名字。你必须确信使用了一个smail能够识别为代表本地主机的名字(也即,列于visible_domain属性中域之一的主机名)。否则的话,对你的邮件作出的回复将弹出你的站点。
最后一条语句设置用于灵敏主机路由选择的路径(已在13.4节中作了描述)。对于这个样本设置,smail会把所有到远程地址的邮件转发给灵敏主机。由于消息将通过UUCP来投递,该属性必须指定一个你的UUCP软件认识的系统。请参阅第12章的让站点为UUCP知晓。
还有一个上面文件中用到的选项我们至今还没给出解释;这就是uucp_name。使用这个选项的理由是:默认地,smail使用hostname(2)返回的值给UUCP方面使用,比如在From_标题行中给出的返回路径。如果你的主机名没有在UUCP映射计划组注册过,你应该告诉smail另外使用你的全资域名取代之。[2] 这可以在config文件中加入uucp_name选项来做到。
在/usr/lib/smail中还有一个文件,叫paths.sample。它是paths文件的一个例子。然而,除非你有到多于一个站点的邮件连接,否则的话你并不需要它。如果你确实有多个邮件连接,你就需要自己写一个这个文件,或者从Usenet映射中生成一个。paths文件将在本章稍后讨论。
14.2 为局域网(LAN)进行设置
如果你正运行一个站点,具有两台或以上的主机构成了一个LAN,那么你就必须指定一台主机来处理你的UUCP与外部世界的连接。在你的LAN上的主机之间,你很可能会用SMTP在TCP/IP上交换邮件。假设我们现在再次回到虚拟酿酒厂,而且vstout被设置成为UUCP的网关。
在一个连网的环境中,最好将所有用户的邮件箱放在单个文件系统上,这个文件系统在所有其它主机上可以以NFS加载的。这允许用户从一台机器换到另一台机器,而不需要将他们的邮件带来带去(或者更糟的是,每天早晨检查三四台机器看看有没有新到的邮件)。因此你也希望发信者的地址是与编写邮件的机器无关的。在发信者的地址中一直使用域名而非主机名,就是一个非常实际有用的方法。例如,Janet用户将指定地址为[email protected]而不是[email protected]。下面我们将解释如何让服务器将域名识别为一个你的站点的有效名字。
将所有邮件箱保持在一台中央主机上的另一种不同的方法是使用POP或者IMAP。POP代表邮局协议(Post Office Protocol)它能让用户通过一简单TCP/IP连接访问他们的邮件箱。IMAP,交互式邮件访问协议(Interactive Mail Access Protocol),与POP类似,但更通用。IMAP和POP的客户以及服务器程序都已经移植到Linux上,可以从sunsite.unc.edu中的/pub/Linux/system/Network下取得。
14.2.1 编写配置文件
酿酒厂的配置是按如下方式工作的:除了邮件服务器vstout本身的所有主机使用灵敏主机路由选择将所有出站邮件传递给服务器。vstout本身则将所有出站邮件发送给用以传递所有酿酒厂邮件的真正灵敏主机;这个主机叫作moria。
除了vstout,所有其它主机的标准config文件看上去象这样:
#
# Our domain:
visible_domain=vbrew.com
#
# Whaat we name ourselves
visible_name=vbrew.com
#
# Smart-host routing: via SMTP to vstout
smart_path=vstout
smart_transport=smtp
这同我们用于UUCP站点的非常相似。主要的不同之处是用于发送邮件到灵敏主机的传输是SMTP。visible_domain属性使得smail在所有出站邮件上使用域名来代替本地主机名。
在UUCP邮件网关vstout上,config文件看上去稍有不同:
#
# Our hostnames:
hostnames=vbrew.com:vstout.vbrew.com:vstout
#
# What we name ourselevs
visible_name=vbrew.com
#
# in the uucp world, we’re known as vbrew.com
uucp_name=vbrew.com
#
# Smart transport: via uucp to moria
smart_path=moria
smart_transport=uux
#
# we’re authoritative for our domain
auth_domains=vbrew.com
这个config文件使用了一个不同的方案来告诉smail本地主机叫什么。不是给它一个域列表并让它使用一个系统调用来找出主机名,而是明确地给出了一个列表。上面的配置本身含有全资和自由的主机名(fully qualified and the unqulified hostname),以及域名。这使得smail能将[email protected]识别为一个本地地址,并将消息投递给janet。
auth_domains变量命名一个域,对于这个域,vstout被认为是授权的。也即,在smail接收到任何到地址host.vbrew.com的邮件时,如果其中的host不是任何本地机器的名字,那么它就会拒绝这个邮件消息并将它返回给发信者。如果没有这个条目,那么任何这样的消息都将被送到灵敏主机,而灵敏主机将把它返回给vstout,一直这样循环下去直到该消息由于超过最大跳数而被丢弃。
14.2.2 运行smail
首先,你要决定是否将smail作为一个独立的后台程序(daemon)运行,或者是让inetd管理SMTP端口并且仅当某些客户请求一个SMTP连接时才调用smail。通常,在邮件服务器上,你将更喜欢后台程序操作的方式,因为这样不会对每个单独的连接不停地产生smail子进程而增加机器的负荷。由于邮件服务器也将大多数入站邮件直接投递给用户,在许多其它主机上你将选择inetd的操作方式。
对每台单独的主机,不管你选择了哪种操作模式,你必须确信在/etc/services文件中有下面的条目:
smtp 25/tcp # Simple Mail Transfer Protocol
这定义了smail用于SMTP连接的TCP端口号。25是定义于Assigned Numbers RFC中的标准端口号。
当运行于后台模式时,smail将把自己放入后台,并且等待发生在SMTP端口的连接。当出现一个连接时,它用对等进程产生并引导一个SMTP对话。smail后台程序通常是使用下面命令通过从rc.inet2脚本中被调用而启动的:
/usr/local/bin/smail –bd –q15m
-bd标志打开后台模式,-q15m使得它每隔15分钟就处理一次堆积在队列中的消息。
如果你想另外使用inetd方式,那么你的/etc/inetd.conf文件中应该含有象这样的一行:
smtp stream tcp nowait root /usr/sbin/smtpd smtpd
smtpd应该是一个到smail执行文件的符号链接。记住,在作过改变之后你必须给它发送一个HUP信号让inetd重读inetd.conf。
后台模式(Daemon mode)和inetd模式是相互排斥的。如果你以后台模式运行了smail,你应该确信注释掉了inetd.conf中任何smtp服务的行。同样地,当让inetd管理smail时,请确信rc.inet2没有启动smail后台程序。
14.3 如果你没有顺利完成___
如果你在安装时碰到了问题,有几个特征可能可以帮助你找出问题的根源。第一个需要检查的地方是samil的日志文件。它们是放在/var/spool/smail/log中的,名字分别为logfile和paniclog。前者列出了所有事项,而后者仅用于存储与配置错误等相关方面的出错信息。
logfile中的典型条目看上去象这样的:
04/24/94 07:12:04: [mOpuwU8-00023UB] received
| from: root
| program: sendmail
| size: 1468 bytes
04/24/94 07:12:04: [mOpuwU8-00023UB] delivered
| via: vstout.vbrew.com
| to: [email protected]
| orig-to: [email protected]
| router: smart_host
| transport: smtp
这显示出从root到[email protected]的消息已经通过SMTP正确地投递到主机vstout上去了。
smail不能投递的消息在日志文件中也产生类似的条目,但是用一错误信息取代了delivered部分:
04/24/94 07:12:04: [mOpuwU8-00023UB] received
| from: root
| program: sendmail
| size: 1468 bytes
04/24/94 07:12:04: [mOpuwU8-00023UB] [email protected] … deferred
(ERR_148) transport smtp: connect: Connection refused
上面的错误对于smail已能正确地识别出消息应该投递到vstout但是却连不到vstout上的SMTP服务的情况是一种典型的错误。如果发生了这种情况,你或者是有个配置问题,或者是因为你的smail执行程序不支持TCP。
这个问题并没有人们想象的那么特殊。存在着很多已经编译好的smail执行程序都不支持TCP/IP连网,甚至是在某些Linux发行版中。如果你碰到的是这种情况,你就必须自己编译smail。如果已经安装了smail,你可以通过telnet远程登录到你的机器的SMTP端口来检查它是否支持TCP连网。到SMTP服务的一个成功连接如下面显示的(你的输入用这样表示的):
$ telnet localhost smtp
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
220 monad.swb.de Smail3.1.28 #6 ready at Sun, 23 Jan 94 19:26 MET
QUIT
221 monad.swb.de closing connection
如果这个测试没有产生SMTP标题(以220码开头的行),首先在你自己进行smail编译之前确信你的配置是确实正确的,这在下面讨论。
如果你使用smail遇到了一个问题,而且从smail产生的出错信息不能确定问题的所在,那么你可以开启调试信息功能。你可以使用-d标志来做到,后跟一个指定调试信息长度的数字选项(在标志和数字之前可以不加空格)。smail将在屏幕上打印出它的操作报告,这可能会给你更多有关出错的线索。
[不知道,…人们可能不会觉得这有趣:] 如果一点也没帮助,你可能想要通过在命令行上给出-bR选项以Rogue模式调用smail。关于这个选项手册页说:“往敌方域发送巨量的邮件信息,以及RFC标准的资料。试图让它下到协议层26然后返回。”尽管这个选项不能解决你的问题,它可能为你提供某些舒适度和安慰。[3]
14.3.1 编译smail
如果你确实认为你的smail还没有TCP网络支持,你就必须取得源码。如果你是从CD-ROM中得到的,那么一般它是包括在你的发行版中的,否则的话你可以从网上FTP站点获得。[4]
当编译smail时,你最好用从Vince Skahan的newspak发行版的配置文件集开始。为了用TCP网络驱动程序编译,你必须设置conf/EDITME文件中的DRIVER_CONFIGURATION宏为bsd-network或arpa-network。前者适用于LAN的安装,但是Internet需要arpa-network。这两者的不同之处在于后者是能够识别MX记录的BIND服务专用的驱动程序,而前者却不是。
14.4 邮件投递模式
正如上面提到的,smail能够立刻将消息投递出去,或者排入队列稍后再作处理。如果你选择将消息排入队列,smail将把所有的邮件存储在/var/spool/smail目录下。smail不会去处理这些邮件直到明确地告知它去处理(这也称为“运行该队列(running the queue)”)。
通过在config文件中设置delivery_mode属性为foreground、background或queued,你可以选择三种投递模式之一。这将投递模式选择为前台的(对入站消息进行立即处理)、后台的(消息将有接收进程的子进程进行投递,而父进程则会在派生了子进程后立即退出)、以及排队的。如果config文件中设置了布尔变量queue_only,那么不管这个选项怎么设置,入站邮件将总是被排入队列中。
如果你打开了排队选项,你必须确信队列会被定期检查;一般是每个10或15分钟。如果你以daemon模式运行smail,你就必须在命令行上加上选项-q10m用以每隔10分钟处理一次队列。另外,你可以以这些间隔时间从cron来调用runq。runq应该是一个到smail的链接。
你可以通过用选项-bp来调用smail来显示当前的邮件队列。同样地,你可以作一个到smail的链接mailq,并调用mailq:
$ mailq –v
mOpvB1r-00023UB From: root (in /var/spool/smail/input)
Date: Sun, 24 Apr 94 07:12 MET DST
Args: -oem –oMP sendmail [email protected]
Log of transactions:
Xdefer: <[email protected]> reason: (ERR_148) transport smtp;
connect: Connection refused
这显示了消息队列中的一个消息。事项日志(仅在你给mailq一个-v选项时才会显示)可能会给出为什么还在等待投递的额外原因。如果至今都没有试图投递这个消息,那么将不显示事项日志。
即使你不使用队列,那么当smail发现由于短暂的原因立即投递失败时偶然也会将消息放入队列中。对于SMTP连接来说,这可能是一个不可达的主机;但是当文件系统满时消息也会被延期投递的。因此你应该放置一个队列并且每隔1小时左右运行处理队列一次(使用runq),否则的话,任何延期的消息都将永远待在队列中了。
14.5 各种其它config选项
还有许多可以在config文件中设置的选项,这些选项尽管很有用,但对运行smail并不是必须的,所以我们在这里不讨论它们。而是仅提及几个你可能由于某种原因会使用的选项:
error_copy_postmaster
如果设置了这个布尔变量,任何错误都会产生一条给邮件管理者的消息。通常,这样做只是为了检测配置中的错误。通过将它放入config文件,并在前面放一个加号(+)来开启这个功能。
max_hop_count
如果一个消息的跳数(也即,经过的主机数目)等于或超过这个数字时,在远程投递消息的企图将产生一个错误信息并被返回给发送者。这是用于防止消息不停地循环传输。跳数的计数一般是从邮件标题中的Received:字段的个数计算出的,但是也可以在命令行上使用-h选项手工设置的。
这个变量的缺省值是20。
postmaster 邮件管理者的地址。如果Postmaster不能解析成一个有效的本地地址,那么作为最后的手段。缺省值是root。
14.6 消息(报文)路由选择和投递
smail将邮件的投递分成了三个不同的任务,路由器、导向器和传输器模块(router,director,transport module)。
路由器模块用于解析所有远程地址,确定消息将被送到下一台哪台主机,以及必须使用哪种传输器。根据链接的特性,将使用不同的传输器,比如UUCP或SMTP。
本地地址将给予导向器任务,用于解析任何转发和别名使用。例如,地址可能是一别名或一个邮件列表,或者用户可能想将她的邮件转发到另外一个地址。如果所得到的地址是远程的,它将被传送给路由器模块进行额外的路由选择,否则的话它将进行本地投递传输。到目前为止,最普通的情况是投递到一个邮件箱中,但消息也可能被传送给一个命令,或者是附加到某些任意的文件中。
最后,传输器模块负责选择投递的方法。它试图投递这个消息,并且如果失败就将消息弹回,或将消息延迟投递。
使用smail,在配置这些任务时你有很大的自由度。对于每个任务,有许多驱动程序,你可以从中选取你所需的。要使用几个文件来向smail描述它们,它们是位于/usr/lib/smail中的routers、directors和transports。如果这些文件不存在的话,那么将采用合理的默认值,这些默认值对于使用SMTP或UUCP传输的许多站点来讲都是合适的。如果你想改变smail的路由选择策略,或者要修改某个传输,你应该从smail的源发行版中取得样本文件[5],将样本文件拷贝到/usr/lib/smail目录下,并且按照你的需要来修改它们。在附录B中也给出了样本配置文件。
14.7 消息(报文)的路由选择
当给出一个消息,smail首先会检查它的目的地是否是本地的,还是一远程站点。如果目标主机地址是config中配置的本地主机名之一,就将消息传送到导向器模块。否则的话,smail将把目的地址送到一系列路由器驱动程序以找出将消息转发到的主机。可以在routers文件中对它们进行描述;如果这个文件不存在的话,就会使用一族缺省值。
接下来目的主机(名)将传给所有的路由器,并且将选择找到最为确定路由的路由器。考虑一个到[email protected]的消息。那么,某个路由器可能知道一个到bar.com域中所有主机去的缺省路由,而另一个路由器却有foo.bar.com本身的信息。由于后者更为确切,就会选择后者。如果有两个路由器都提供了“最佳匹配”,那么就会选择routers文件中先出现的那个。
现在,这个路由器指定所使用的传输器,比如UUCP,并且生成一个新的目的地址。这个新的地址与主机(名)一起传给这个传输器以将消息转发过去。在上面的例子中,smail可能会发现通过使用路径ernie!bert的UUCP可以到达foo.bar.com。此时它会产生一个新的目标bert!foo.bar.com!user,并且让UUCP传输器将此目标用作信封地址传送到ernie。
当使用缺省设置时,就有下列路由器:
如果目的主机地址可以使用gethostbyname(3)或者gethostbyaddr(3)库调用解析出来,那么消息就会用SMTP进行投递。唯一的例外是,如果发现该地址引用(涉及)到本地主机,那么消息也会被传到导向器模块。
smail也能识别点分四组写的IP地址作为一个合法的主机名,只要它们能够使用gethostbyaddr(3)调用来解析。例如,scrooge@[149.76.12.4]将是一个有效的地址,尽管在quark.physics.groucho.edu上这是一个非常与众不同的邮件地址。
如果你的机器是在Internet上的,那么这些路由器就不是你所要的,因为它们不支持MX记录。对于这种情况请看下面。
如果路径别名数据库/usr/lib/smail/paths存在,那么smail将试图在这个文件中查找目标主机(减去任何.uucp的结尾)。邮递到这个路由器匹配的地址去的邮件将使用UUCP和数据库中找到的路径来投递。
主机地址(去除任何.uucp结尾)将与uuname命令的输出相比较,以检查目标主机实际上是否是一个UUCP邻居。如果真是这种情况,那么消息将使用UUCP传输器投递。
如果地址用上面任何一个路由器都不能匹配的话,那么它将被投递到灵敏主机。到灵敏主机的路径以及所使用的传输器是在config文件中设置。
这些缺省设置对于许多简单设置来说是可工作的,但是如果路由选择的要求稍微复杂一些时就会失败。如果你面临下面描述的任何问题,那么你就需要安装你自己的routers文件以覆盖缺省的文件。附录B中给出了一个样本routers文件,你可以以它作为开始。某些Linux发行版也携带有一族配置文件,它们被编辑成克服这些困难的。
当你的主机有着双重的拨号IP和UUCP链接时,或许会产生最糟糕的问题。此时在你的hosts文件中有着你仅通过SLIP链接很少论及的主机名,所以smail将试图通过SMTP为这些主机投递任何邮件。这通常并不是你想要的,因为即使SLIP链接是定期激活的,SMTP要比通过UUCP发送邮件慢得多。对于使用缺省设置的情况,没有任何方法来逃避smail的。
通过在查询解析器之前让smail检查paths文件,你就可以避免这个问题,并且将所有你想迫使UUCP投递到的主机放入paths文件中。如果你再也不想通过SMTP发送任何消息,那么你也可以完全注释掉基于解析器的路由器。
另一个问题是缺省的设置并不是为真正的Internet邮件路由选择提供的,因为基于解析器的路由器没有估计(evaluate)MX记录。为了启用对Internet邮件路由选择的全面支持,注释掉这个路由器,并且去掉对使用BIND的路由器的注释。然而,包含在某些Linux发行版中的samil执行程序并没有编译进对BIND的支持。如果你启用BIND,但却在paniclog文件中得到一个信息指出“路由器inet_hosts:驱动程序bind没有找到”(“router inet_hosts: driver bind not found”),那么你就必须取得源代码并重新编译smail(见上面14.2节)。
最后,使用uuname驱动程序一般并不是一个好主意。首先是当你没有安装UUCP时,它将会产生一个配置错误,因为会找不到uuname命令。其次是当你有比实际有邮件链接多的站点列于你的UUCP Systems文件时。这些可能是你仅仅进行news交换的站点、或者是你偶尔使用匿名UUCP下载文件的站点,但除此以外没有任何交通流量了。
为了解决第一个问题,你可以用只做一简单exit 0的shell脚本来替换uuname。然而,更加常规的解决方案是编辑routers文件并且完全删除这个驱动程序。
14.7.1 paths数据库
smail期望在/usr/lib/smail下的paths文件中找到路径别名数据库(pathalias database)。而这个文件是可选的,所以如果你完全不需要执行任何路径别名路由选择的话,只需简单地删除任何存在的paths文件。
paths必须是一个排过序的ASCII文件,包含有映射目的站点名到UUCP bang paths的条目。因为smail使用二叉树搜索来查找一个站点,所以这个文件必须是排过序的。文件中不得含有注释,并且站点名与路径之间必须用制表符TAB分开。路径别名数据库已在第13章中详细讨论过。
如果这个文件是你自己编写的,你应该确信其中包含了一个站点的所有合法的名称。例如,如果一个站点已知有无格式UUCP名称和一个全资域名(fully qualified domain name),那么你就必须为这两个名字都加入一个条目。可以通过将此文件传给sort(1)命令来排序这个文件。
然而,如果你的站点仅仅是个页站点(a leaf site),那么就完全不需要paths文件;只要在你的config文件中设置灵敏主机属性,并让你的邮件馈送者来处理所有的路由选择。
14.8 往本地地址投递消息(报文)
非常一般地,一个本地地址只是一个用户的登录名,在这种情况下,消息被投递到她的邮件箱中,/var/spool/mail/user。其它的情况包括别名和邮件列表名、以及用户作的邮件转发。在这些情况下,本地地址被扩展成一个新的地址列表,这个新地址列表或者是本地的,也可能是远程的。
除了这些“普通的“地址以外,smail还可以处理其它本地消息目的的类型,象文件名和管道命令。这些本身并不是地址,所以你不可以将邮件发送到/etc/[email protected]这样的地址去;仅当它们是从转发和别名文件中取得时,它们才是有效的。
一个文件名(file name)是以斜杠(/)或破折号(~)开始的任何字符串。后者表示用户的主目录,而且仅当文件名是从一个.forward文件或从一个在邮件箱(见下面)的转发条目中取得时才是可能的。当投递到一个文件时,smail将消息附加到这个文件上,必要时就创建这个文件。
一个pipe命令可以是前面加有管道符号(|)的任何UN*X命令。这使得smail将命令及其参数传递给shell,但是不包括前导‘|’。消息本身在标准输入上被馈送给这个命令。
例如,为了将邮件列表送入一个本地新闻组(newsgroup)中,你可以使用一个名为gateit的shell脚本,并且设置一个本地别名,这个别名会使用“—gateit”从这个邮件列表中投递所有的消息。
如果引用中包括有空格,就必须使用双引号包住。由于所涉及的安全因素,如果地址是以某些不可靠的方法获得的(例如,如果从中获取地址的别名文件是任何人可写的),就要避免执行这个命令。
14.8.1 本地用户
一个本地地址最普通的情况是表示一个用户的邮件箱。这个邮件箱位于/var/spool/mail中并且具有这个用户的名字。它是属于这个用户的,并有组名mail和属性600。如果它不存在,smail就会创建它。
注意,尽管/var/spool/mail目前是放置邮件箱文件的标准位置,某些邮件软件可能编译进了不同的路径,例如/usr/spool/mail。如果往你机器上的用户进行投递一直会失败,你应该试着作一个到/var/spool/mail的符号链接。
smail要求有两个地址存在:MAILER-DAEMON和Postmaster。当为一个不能投递的邮件产生一个反弹消息时,一个副本将被发送给postmaster帐号以作检查(以防万一这可能是由于配置方面的问题)。MAILER-DAEMON是在反弹消息上作为发送者地址的。
如果这些地址在你的系统上并没有有效的帐号,smail分别隐含地将MAILER-DAEMON映射到postmaster、postmaster到root。通常你应该通过为postmaster帐号建立别名来覆盖这个映射,将别名建立到负责维护邮件软件的用户去。
14.8.2 转发
用户可以使用smail支持的两种方法之一通过将邮件转发到另外一个地址来重定向她的邮件。一种选择是将
Forward to recipient,…
放在她的邮件箱文件的第一行。这会把所有入站的邮件发送到指定的接收者列表去。另一种方法是,她可以在她的主目录中建立一个.forward文件,该文件含有用逗号分开的接收者列表。对于各类转发,该文件的各行将被读取并作出说明。
注意,可以使用任何类型的地址。因此,对于休假的.forward文件的一个实际例子可以是
janet, “|vacation”
第一个地址不管怎样将会把入站消息投递到janet的邮件箱中,而vacation命令则会给发送者返回一个简短的通告。
14.8.3 别名文件
samil能够处理那些与Berkeley的sendmail兼容的别名文件。在别名文件中条目可以有如下的形式
alias: recipients
recipients是一个用逗号分开的地址列表,它将被别名替代。接收者列表可以续行如果下一行以一个制表符开始。
有一个特殊的属性,允许smail从别名文件中来处理邮件列表:如果你指定“:include:filename”作为接收者,smail将读取指定的文件,并且替换它的内容作为一个接收者的列表。
主要的别名文件是/usr/lib/aliases。如果你选择使得这个文件是人人可写的,smail将不会把任何消息投递给该文件给出的shell命令。一个例子文件见如下所示:
# vbrew.com /usr/lib/aliases file
hostmaster: janet
postmaster: janet
usenet: phil
# The development mailing list.
Development: joe, sue, mark, biff
/var/mail/log/development
owner-development: joe
# Announcements of general interest are mailed to all
# of the staff
announce: :include: /usr/lib/smail/staff,
/var/mail/log/announce
owner-announce: root
# gate the foobar mailing list to a local newsgroup
ppp-list: “|/usr/local/lib/gateit local.lists.ppp”
在投递给从aliases文件中产生的一个地址去时如果出现了一个错误,smail将试图把出错消息的一个拷贝发送到“别名拥有者”(“alias owner”)。例如,在把一个消息投递给development邮件列表时,如果投递给biff失败了,那么一个出错消息的拷贝将被邮递给发送者、以及postmaster和owner-development。如果拥有者的地址不存在,那么就不会生成额外的出错消息。
当投递给文件或者当调用aliases文件中给出的程序时,smail将成为nobody用户以避免任何安全方面的问题。特别是当投递给文件时,这将是非常麻烦的事。例如,在上面给出的文件中,nobody必须拥有这个日志文件并且对其可写,否则向他们进行的投递将会失败。
14.8.4 邮件列表
除了使用aliases文件,邮件列表也可以通过/usr/lib/smail/lists目录中的文件来管理。一个命名为nag-bugs的邮件列表是由lists/nag-bugs文件描述的,它应该含有用逗号分开的组员的地址。列表可以在多行上给出,注释使用hash符号来引出。
对于每个邮件列表,应该存在一命名为owner-listname的用户(或别名);在解析一个地址时发生的任何错误会向这个用户报告。这个地址在所有出站消息的Sender:标题字段中也用作发送者的地址。
14.9 基于UUCP的传输器
有许多利用UUCP程序集的编译进smail的传输器。在一个UUCP环境中,消息通常通过在下一台主机上调用rmail来传递的,并需要在标准输入上给rmail消息和在命令行上给rmail信封地址。在你的主机上,rmail应该是一个到smail命令的链接。
当把一个消息递给UUCP传输器时,smail将目标地址转换为一个UUCP bang路径。例如,user@host将被转换成host!user。任何存在的‘%’地址操作符都将保留,所以user%host@gateway将转换成gateway!user%host。然而,smail自己不会生成这样的地址。
另一方面,smail可以通过UUCP发送和接收BSMTP批处理。使用BSMTP,一个或多个消息被包裹成单个批处理,这个批处理含有本地邮件程序在一个实际SMTP连接被建立时将发出的命令。BSMTP频繁地使用于存储-转发(例如,基于UUCP的)网络以节约磁盘空间。附录B中的样本transports文件含有一个在一队列目录中能够生成部分BSMTP批处理的配有bsmtp的传输器。以后,使用一个加入适当的HELO和QUIT命令的shell脚本,它们必须被合并入最终的批处理中。
对于指定的UUCP连接,为了启用bsmtp传输器,你必须使用所谓的method文件(详细信息请参阅smail(5)手册页)。如果你仅有一个UUCP链接并且使用灵敏主机路由器,你可以通过将配置变量smart_transport设置成bsmtp而非uux来启用发送SMTP批处理。
要在UUCP上接收SMTP批处理,你必须确信你有解批处理(unbatching)命令,远程站点会将自己的批处理发送到这个命令。如果远程站点也使用smail,那么你需要使得rsmtp为一个到smail的链接。如果远程站点运行sendmail,那么你应该额外地安装一个名为/usr/bin/bsmtp的shell脚本,这个脚本执行一个简单的“exec rsmtp”(符号链接是不能工作的)。
14.10 基于SMTP的传输器
目前smail支持一个SMTP驱动程序以在TCP连接上投递邮件。[6] 在主机名指定为一个能够使用网络软件解析的全资域名,或是用方括号括住的点分四组表示法时,在一单个主机上将消息投递到任何数量的地址去是可以的。通常,由任何BIND、gethostbyname(3)、或gethostbyaddr(3)路由器驱动程序解析的地址都将被投递给SMTP传输器。
SMTP驱动程序通过列于/etc/services中的smtp端口将试图立即连接至远程主机。如果它不能到达,或者连接超时,那么将在以后时间再次尝试投递。
在Internet上的投递,要求到目的主机的路由指定为第13章中描述的route-addr格式,而不是作为一个bang路径。[7]因此,smail将转换user%host@gateway(这里gateway是通过host1!host2!host3到达的)成为源-路由地址<@host2,@host3:user%host@gateway>,这将被作为消息的信封地址发送到host1。要开启这些转换(与内建的BIND驱动程序一起),你必须编辑transports文件中的有关smtp驱动程序的条目。附录B中给出了一个样本transports文件。
14.11 主机名限定(qualification)
有时找出在发送者或接收者地址中指定的无限定的主机名(也即,那些没有域名的主机名)是值得做的。例如,当在两个网络之间进行网关连接时,其中,一个网络要求全资域名。在一个Internet-UUCP中继上,缺省地无限定主机名应该被映射到uucp域。除此之外的其它地址修改都是不可靠的。
/usr/lib/smail/qualify文件告诉smail哪个域名附加到哪个主机名上。qualify文件中的条目由一个从第一列开始的主机名、和后跟的域名组成。以hash符号作为首个非空格字符的行被看作是注释行。各条目是根据它出现的先后次序进行搜索的。
如果qualify文件不存在,那么就完全不会执行任何主机名限定操作。
特殊的主机名*与任何主机名匹配,因而允许你在进入一个缺省的域之前映射所有未提及的主机。它应该仅用于最后一个条目。
在虚拟酿酒厂,所有的主机已被设置成在发送者地址中使用全资域名。无限定接收者的地址被认为是在uucp域中的,所以在qualify文件中只需要一单个条目。
# /usr/lib/smail/qualify, last changed Feb 12, 1994 by janet
#
* uucp
注释
[1] 依照Linux文件系统标准,这是sendmail新的标准位置。另一个常用的位置是/usr/lib。
[2] 理由是:假设你的主机名是monad,但是并没有在映射中注册。然而,在映射中有一个站点叫做monad,所以每个到monad!root的邮件、甚至是从你的直接UUCP邻居来得邮件,都将被送到另一个monad去了。这对任何人来讲都是令人讨厌的。
[3] 如果你的情绪很坏时就不要使用它。
[4] 如果你是从销售商那里随同Linux发行版买来的,那么依照smail的拷贝条件,你就有资格“以最低的(极小的)运输费”得到源码。
[5] 可以从源目录的samples/generic下面找到缺省的配置文件。
[6] 作者称这种支持为“简单的”。对于smail的将来版本,他们预告了一个完整的能更有效处理的后端程序。
[7] 然而,在Internet中使用路由器是完全不赞成的。取而代之应该使用全资域名。
发布人:netbull 来自:Linux自由鸽