本节展示了局域网上 UUCP 叶子站点的配置文件示例。这些示例文件基于 smail-3.1.28 源代码发行版中包含的示例文件。尽管我尽力解释这些文件的工作原理,但我建议您阅读非常优秀的 smail(8) 手册页,其中详细讨论了这些文件。一旦您理解了 smail 配置背后的基本思想,就值得阅读。这很简单!
显示的第一个文件是 routers 文件,它向 smail 描述了一组路由器。当 smail 必须将消息传递到给定的地址时,它会依次将该地址传递给所有路由器,直到其中一个路由器匹配它。这里的匹配意味着路由器在其数据库中找到目标主机,无论是 paths 文件、/etc/hosts 还是路由器接口的任何路由机制。
smail 配置文件中的条目始终以唯一名称开头,用于标识路由器、传输或导向器。 它们后面跟着一个属性列表,用于定义其行为。此列表由一组全局属性(例如使用的driver)和仅由特定驱动程序理解的私有属性组成。属性之间用逗号分隔,而全局属性集和私有属性集之间用分号分隔。
为了清楚地说明这些细微的区别,假设您要维护两个独立的 pathalias 文件;一个包含您域的路由信息,第二个包含全局路由信息,可能从 UUCP 映射生成。使用 smail,您现在可以在 routers 文件中指定两个路由器,它们都使用 pathalias 驱动程序。此驱动程序在 pathalias 数据库中查找主机名。它期望在私有属性中给出文件名
上面两个路由器条目中给出的第二个全局属性定义了当路由器匹配地址时应使用的传输方式。在我们的例子中,消息将使用 uux 传输方式传递。传输方式在 transports 文件中定义,这将在下面解释。
如果您指定 method 文件而不是 transports 属性,则可以微调消息将通过哪种传输方式传递。Method 文件提供了从目标主机名到传输方式的映射。我们在这里不讨论它们。
以下 routers 文件为查询解析器库的局域网定义了路由器。 但是,在 Internet 主机上,您可能需要使用处理 MX 记录的路由器。 因此,您应该取消注释备用的 inet_bind 路由器,该路由器使用 smail 的内置 BIND 驱动程序。
在混合使用 UUCP 和 TCP/IP 的环境中,您可能会遇到这样的问题:您的 /etc/hosts 文件中有一些主机,您仅与这些主机进行偶尔的 SLIP 或 PPP 连接。通常,您仍然希望通过 UUCP 发送给他们的任何邮件。为了防止 inet_hosts 驱动程序匹配这些主机,您必须将它们放入 paths/force 文件中。这是另一个 pathalias 风格的数据库,在 smail 查询解析器之前会被查询。
本地地址邮件的处理在 directors 文件中配置。它的组成与 routers 文件类似,包含一系列条目,每个条目定义一个导向器。导向器不传递消息,它们仅执行所有可能的重定向,例如通过别名、邮件转发等。
当将邮件传递到本地地址(例如 janet)时,smail 依次将 usr 名称传递给所有导向器。如果导向器匹配,它要么指定消息应通过哪种传输方式传递(例如,传递到用户的邮箱文件),要么生成一个新地址(例如,在评估别名后)。
由于涉及安全问题,导向器通常会对它们使用的文件是否可能被泄露进行大量检查。以某种可疑方式获得的地址(例如,来自世界可写的别名文件)被标记为不安全。某些传输驱动程序会拒绝此类地址,例如将消息传递到文件的传输驱动程序。
除此之外,smail 还将用户与每个地址关联。任何写入或读取操作都作为该用户执行。对于传递到 janet 的邮箱,地址当然与 janet 关联。从别名文件等获得的其它地址与其它用户关联,例如 nobody 用户。
有关这些功能的详细信息,请参阅 smail(8) 手册页。
在成功路由或导向消息后,smail 将消息传递给路由器或导向器指定的传输方式,该路由器或导向器匹配了该地址。这些传输方式在 transports 文件中定义。同样,传输方式由一组全局和私有选项定义。
每个条目定义的最重要选项是 driver,它处理传输,例如 pipe 驱动程序,它调用 cmd 属性中指定的命令。 除此之外,传输方式可以使用许多全局属性,这些属性对消息头以及可能的消息体执行各种转换。例如,return_path 属性使传输方式在消息头中插入 return_path 字段。 unix_from_hack 属性使其在每行开头的单词 From 的每次出现之前添加一个 > 符号。
# A sample /usr/lib/smail/transports file # local - deliver mail to local users local: driver=appendfile, # append message to a file return_path, # include a Return-Path: field from, # supply a From_ envelope line unix_from_hack, # insert > before From in body local; # use local forms for delivery file=/var/spool/mail/${lc:user}, # location of mailbox files group=mail, # group to own file for System V mode=0660, # group mail can access suffix="\n", # append an extra newline # pipe - deliver mail to shell commands pipe: driver=pipe, # pipe message to another program return_path, # include a Return-Path: field from, # supply a From_ envelope line unix_from_hack, # insert > before From in body local; # use local forms for delivery cmd="/bin/sh -c $user", # send address to the Bourne Shell parent_env, # environment info from parent addr pipe_as_user, # use user-id associated with address ignore_status, # ignore a non-zero exit status ignore_write_errors, # ignore write errors, i.e., broken pipe umask=0022, # umask for child process -log_output, # do not log stdout/stderr # file - deliver mail to files file: driver=appendfile, return_path, # include a Return-Path: field from, # supply a From_ envelope line unix_from_hack, # insert > before From in body local; # use local forms for delivery file=$user, # file is taken from address append_as_user, # use user-id associated with address expand_user, # expand ~ and $ within address suffix="\n", # append an extra newline mode=0600, # set permissions to 600 # uux - deliver to the rmail program on a remote UUCP site uux: driver=pipe, uucp, # use UUCP-style addressing forms from, # supply a From_ envelope line max_addrs=5, # at most 5 addresses per invocation max_chars=200; # at most 200 chars of addresses cmd="/usr/bin/uux - -r -a$sender -g$grade $host!rmail $(($user)$)", pipe_as_sender, # have uucp logs contain caller log_output, # save error output for bounce messages # defer_child_errors, # retry if uux returns an error # demand - deliver to a remote rmail program, polling immediately demand: driver=pipe, uucp, # use UUCP-style addressing forms from, # supply a From_ envelope line max_addrs=5, # at most 5 addresses per invocation max_chars=200; # at most 200 chars of addresses cmd="/usr/bin/uux - -a$sender -g$grade $host!rmail $(($user)$)", pipe_as_sender, # have uucp logs contain caller log_output, # save error output for bounce messages # defer_child_errors, # retry if uux returns an error # hbsmtp - half-baked BSMTP. The output files must # be processed regularly and sent out via UUCP. hbsmtp: driver=appendfile, inet, # use RFC 822-addressing hbsmtp, # batched SMTP w/o HELO and QUIT -max_addrs, -max_chars; # no limit on number of addresses file="/var/spool/smail/hbsmtp/$host", user=root, # file is owned by root mode=0600, # only read-/writable by root. # smtp - deliver using SMTP over TCP/IP smtp: driver=tcpsmtp, inet, -max_addrs, -max_chars; # no limit on number of addresses short_timeout=5m, # timeout for short operations long_timeout=2h, # timeout for longer SMTP operations service=smtp, # connect to this service port # For internet use: uncomment the below 4 lines # use_bind, # resolve MX and multiple A records # defnames, # use standard domain searching # defer_no_connect, # try again if the nameserver is down # -local_mx_okay, # fail an MX to the local host