.\" @(#) config,v 1.6 1994/10/26 14:29:12 nm4 Exp
.NH
Setting up Run-time Configuration Files
.PP
The
.B smail3.1
binary is preloaded with a complete configuration and needs no
run-time configuration files.  This preloaded configuration file is
tunable over a small range through the
.I EDITME
file, and should be sufficient for many sites.  However, if this
configuration is not sufficient for your site, or if you wish to
define a router that uses
.I method
files, then you can write run-time configuration files to adapt smail
to fit your needs.
.NH 2
Types of Run-time Configuration Files
.PP
There are five types of run-time configuration files:
.RS
.IP \(bu
one or two
.B config
files, used to set values for a variety of smail variables,
.IP \(bu
a
.B directors
file, describing the rules for resolving local addresses,
.IP \(bu
a
.B routers
file, describing the rules for resolving remote addresses,
.IP \(bu
a
.B transports
file, describing the possible methods for performing delivery,
.IP \(bu
zero or more
.B method
files, which match hosts to transports.
.IP \(bu
and a
.B retry
file, which modifies the retry and timeout behaviour of smail.
.RE
.LP
The following sections give
overviews of the formats of these files, with examples of their use.
For a complete format description see the man page
.I smail (5).
.NH 3
Config Files
.PP
Any machine may have a primary and a secondary
.B config
file which redefines the values for a number of smail variables.
These files can be used to define names for the localhost, define
where files reside, setup the values for site-definable message header
fields and more.  Values set in the primary config file override
values predefined in the smail binary.  Values set in the secondary
config file override values defined in the smail binary or in the
primary configuration file.  Also, the name of the secondary config
file can be redefined in the primary configuration file.
.PP
The capability for having two such files is useful in networked
environments with distributed filesystems.  For example, on the Sun
network at Amdahl Corp., we define the name of the primary
configuration file to be
.I /usr/local/lib/smail/config
which is found on our fileservers.  This file is maintained by the
group that maintains the mailers running on all of the Suns.  The
primary configuration file defines a secondary configuration file
named
.I /private/usr/lib/smail/config .
If such a file exists on a given workstation, it can be used to
redefine the mailer behavior on that workstation without requiring
different binaries.
.PP
Because this second configuration file can redefine the paths to any
other configuration file or directory, any aspect of the mailer
behavior can be changed.  Thus, a gateway machine can use the same
primary config file, director file and transport file as the other
suns while using its own private router file.  In addition, a
machine on which a new delivery agent is being tested can define
a private config file that points to its own router and transport
files.
.PP
The format for either config file consists of text records that set a
variable equal to some value.  To set a variable to a string or
numeric value, use the form:
.DS I
\fIvariable\fP = \fIvalue\fP
.DE
For example, the file
.DS I
postmaster = tron@glotz.uucp
domains = wall.com
spool_mode = 0664
.DE
sets the default address for the postmaster to ``tron@glotz.uucp'',
sets the run-time equivalent of the EDITME variable DOMAINS to
``wall.com'' and sets the permission mode for spool files to allow the
file owner and group to write it.
.PP
Boolean attributes can be set using the notation:
.DS I
+\fIboolean-variable\fP
.DE
and can be reset using the notation:
.DS I
\-\fIboolean-variable\fP
.DE
The ``\-\fIvariable\fP'' notation can also be used to set a numeric
variable to zero and to unset a value for a string variable.  For
example, the following config file disables the use of an external
transport file and tells smail that configuration files are not
optional:
.DS I
\-transport_file
+require_configs
.DE
Comments using the shell `#' notation and blank lines are allowed in
config files.  In addition, records can be extended by including white
space at the beginning of successive lines.  For example, the
following config file sets the
.B Received:
header field to use for messages to a multi-line value and sets the
name of a user that has few access capabilities:
.DS I
.ta .5i 2.5i
# Use a verbose format for the Received: header field
received_field = "Received: by $primary_name
	with smail ($version_string)
	id <$message_id@$primary_name); $date"
.sp \n(PDu
nobody = unknown	# unknown has few access capabilities
.TA
.DE
.PP
The complete list of variables that can be set in the config files is
described in the man page
.I smail (5).
.NH 3
Directors, routers and Transports Files
.PP
The
.B directors ,
.B routers
and
.B transports
files all have the same format.  These files describe entries in a
table where each entry describes the attributes for one director,
router or transport.  The order of entries in the director and router
files is import, in that directors and routers are called in the order
stated in the table.  The order of entries in the transport file is
not important.
.PP
An entry in one of these files defines:
.RS
.IP \(bu
a name by which that entry is
known.
.IP \(bu
a driver which implements the function for that entry.
.IP \(bu
a set of
.I generic
attributes from a set that can be applied to any entry in the file.
.IP \(bu
a set of
.I driver-specific
attributes, from a set that can be applied only to entries that use
the specified driver.
.RE
.PP
As an example, the director file entry below specifies the attributes
for a director that reads aliases from a file
.I /private/usr/lib/aliases :
.DS I
.ta .5i
# read aliases from a file private to one machine on the network
private_aliases:
	driver=aliasfile, owner=owner\-$user ;
	file=/private/usr/lib/aliases
.TA
.DE
This entry is named
.I private_aliases ,
and depends upon the low-level director driver routine named
.I aliasfile .
Errors found while processing addresses found by this director
are sent to an address formed by prepending ``owner\-'' to
the name of the alias, and these the aliases are stored in the file
.I /private/usr/lib/aliases .
The
.I aliasfile
director driver implements a general mechanism for looking up aliases
stored in a database.  By default, this database is simply a file
containing ASCII records in no particular order.  The file
.I /private/usr/lib/aliases
could contain:
.DS I
.ta .5i 3i
# tron is the postmaster for this particular machine
Postmaster: tron
.sp \n(PDu
# list the users that are likely to use futatsu frequently
Futatsu-Users:
	tron,	# Ronald S. Karr
	chongo,	# Landon Curt Noll
	deleanu	# Jay Deleanu
.TA
.DE
Notice that, as with other configuration files, an alias can be
extended across multiple lines by beginning successive lines with
whitespace.
.PP
The separation between
.I generic
attributes and
.I driver-specific
attributes mirrors the internal design of
.B smail3.1 .
Above the driver level, there exist routines that implement aspects of
drivers, routers and transports that do not depend upon the specific
means for performing the operation.  These higher-level functions can
be manipulated through the
.I generic
attributes.  On the other hand, the drivers that actually perform
these operations accept a different set of attributes to control their
behavior.  In the case of a driver thats read or writes to a file, a
.B file
attribute usually exists.  In the case of a driver that executes a
program a
.B cmd
attribute usually exists to specify how that program is to be invoked.
.PP
The complete description of the director, router and transport files
is contained in the
.I smail (5)
man page.  Included in the man page is a description for all of the
drivers that are included in the
.B smail3.1
source distribution.  The following sections describe the preloaded
configuration.  To serve as examples, these sections include
configuration files which are the equivalent of the preloaded
configuration.
.NH 2
The Preloaded Configuration
.PP
In order to gain a better understanding of how configuration files can
be used to change the behavior of smail, it is useful to know what
smail will do if run-time configuration files were not used.  This
behavior is defined in the preloaded configuration which is in the
source file
.I src/default.c .
.PP
The preloaded configuration currently comes in two flavors: one flavor
is for systems that have Berkeley-style networking with TCP/IP, the
other flavor is for sites that do not have such networking.  The
difference between the two is that a networking configuration defines
two extra routers to match network hosts by name or by internet
address.  Also, one extra transport is defined to deliver using SMTP
over a TCP/IP connection to a network host.
.NH 3
The Preloaded Director Configuration
.PP
If a
.I directors
configuration file is not found at run-time, then the default
pre-loaded configuration is used.  The default director configuration
supports the following directors:
.iP "aliasinclude and forwardinclude"
For local addresses of the form
.B :include:filename
these addresses will be expanded into a list of addresses contained in
the given ASCII file.  The files to which these addresses refer are
called
.I "mailing list"
files.  This form of local address can come from any alias file,
forward file or mailing list file.  Users cannot supply such addresses
themselves.
.iP "aliases"
This director scans for entries in an alias database.  The name of
this database, and the method by which this file is searched can be
changed in the
.I EDITME
file.  As distributed, aliases are taken from the file
.I /usr/lib/aliases ,
which is an unsorted ASCII text file.  This alias file is optional,
and is ignored if it does not exist.  Any errors found while resolving
addresses produced by an alias are mailed to an address with the
string ``owner\-'' prepended to the name of the alias, if such a local
address is defined.
.iP "dotforward"
A user may have a file named
.I .forward
in his or her home directory.  If such a file exists it will be
scanned for addresses.  Any mail to a user that has such a file will
be redirected to the addresses contained within it.  The file can
contain addresses which specify files or shell commands as recipients.
If the forward file is owned by root or by the user himself, then
deliveries to any shell commands or files are performed under the
user's user and group id.  Any errors found while resolving this list
of addresses are mailed to the Postmaster.  In a forward file for the
user
.I root ,
deliveries to shell command and file addresses are performed under an
unprivileged user and group ID.  The same is true in the case of
forward files that were not owned by root or by the given user.
Finally, shell command and file addresses are not allowed at all in
forward files that are in remotely accessible directories.
.iP "forwardto"
The mailbox file for a user may contain a line of the form
.DS I
Forward to \fIaddress\fP, \fIaddress\fP ...
.DE
as an alternate method for a user to forward his mail.  Only one line
is read from this file so addresses cannot be placed across multiple
lines.  The comments that apply to a
.I forward
file also apply to this use of a mailbox file, except that it is
assumed that a mailbox file is not in a remotely accessible directory.
.iP user
A user is matched by name, either in upper or lower case, with
delivery to that user being performed using a transport by the name of
``local''.
.uP real-user
A user can also be matched by name if the username is prefixed by
``real\-''.  Delivery is performed by a transport named ``local''.
.iP lists
Mailing list files can be created under a mailing list directory.
This is a directory named
.I lists
under the directory containing smail utilities and configuration files
(typically
.I /usr/lib/smail ).
A new mailing list can be creating by making a file in this directory
which contains a list of addresses.  The basename of this file
determines the local address which will be expanded to this list of
addresses.  For example, a file named
.I info-smail
could be created with a list of recipient addresses for the
``info-smail'' mailing list.  Errors in delivering to this list of
addresses are mailed to a local address with the name ``owner\-''
prepended to the basename of the file, if such an address is defined.
.iP smart_user
If a local address is not matched by any other means, mail to that
address can be sent to another machine using the
.B smartuser
director.  The address to which this mail is redirected can be defined
in a
.I config
file by setting the variable
.B smart_user .
For example, the following config file line could be used to redirect
mail to the host amdahl.uts.amdahl.com:
.DS I
smart_user = $user@amdahl.uts.amdahl.com
.DE
If this variable is not set, then the
.B smart_user
director is ignored.
.PP
The order of entries in the director file determines the order in
which operations are attempted.  If a director matches an address then
no other directors are called attempted to expand or resolve that
address.  A director file which is equivalent to the preloaded
configuration is:
.DS I
.ta .5i 3i
# aliasinclude \- expand ":include:filename" addresses
#	produced by alias files
aliasinclude:
	driver = aliasinclude,	# use this special-case driver
	nobody;	# associate nobody user with addresses
		#  when mild permission violations
		#  are encountered
.sp \n(PDu
	copysecure,	# get permissions from alias director
	copyowners	# get owners from alias director
.DE
.DS I
.ta .5i 3i
# forwardinclude \- expand ":include:filename" addresses
#	produced by forward files
forwardinclude:
	driver = forwardinclude,	# use this special-case driver
	nobody;
.sp \n(PDu
	copysecure,	# get perms from forwarding director
	copyowners	# get owners from forwarding director
.DE
.DS I
.ta .5i 3i
# aliases \- search for alias expansions stored in a database
aliases:
	driver = aliasfile,	# general-purpose aliasing director
	\-nobody,	# all addresses are associated
		# with nobody by default, so setting
		# this is not useful.
	owner = owner\-$user;	# problems go to an owner address
.sp \n(PDu
	file = /usr/lib/aliases,
	modemask = 002,
	optional,	# ignore if file does not exist
	proto = lsearch
.DE
.DS I
.ta .5i 3i
# dotforward \- expand .forward files in user home directories
dotforward:
	driver = forwardfile,	# general-purpose forwarding director
	owner = Postmaster,	# problems go to the user's mailbox
	nobody,
	sender_okay;	# sender never removed from expansion
.sp \n(PDu
	file = ~/.forward,	# .forward file in home directories
	checkowner,	# the user can own this file
	owners = root,	# or root can own the file
	modemask = 002,	# it should not be globally writable
	caution = daemon:root,	# don't run things as root or daemon
	# be extra careful of remotely accessible home directories
	unsecure = "~ftp:~uucp:~nuucp:/tmp:/usr/tmp"
.DE
.DS I
.ta .5i 3i
# forwardto \- expand a "Forward to " in user mailbox files
#
# This emulates the V6/V7/System-V forwarding mechanism which uses a
# line of forward addresses stored at the beginning of user mailbox
# files prefixed with the string "Forward to "
forwardto:
	driver = forwardfile,
	owner = Postmaster, nobody, sender_okay;
.sp \n(PDu
	file = /usr/mail/${lc:user}, # the mailbox file for System V
	forwardto,	# enable "Forward to " function
	checkowner,	# the user can own this file
	owners = root,	# or root can own the file
	modemask = 0002,	# under System V, group mail can write
	caution = daemon:root	# don't run things as root or daemon
.DE
.DS I
.ta .5i 3i
# user \- match users on the local host with delivery to their mailboxes
user:	driver = user;	# driver to match usernames
.sp \n(PDu
	transport = local	# local transport goes to mailboxes
.DE
.DS I
.ta .5i 3i
# real_user \- match usernames when prefixed with the string "real\-"
#
# This is useful for allowing an address which explicitly delivers to
# a user's mailbox file.  For example, errors in a .forward file
# expansion can be delivered here, or forwarding loops between
# multiple machines can be resolved by using a real-username address.
real_user:
	driver = user;
.sp \n(PDu
	transport = local,
	prefix = "real\-"	# for example, match real-root
.DE
.DS I
.ta .5i 3i
# lists \- expand mailing lists stored in a list directory
#
# mailing lists can be created simply by creating a file in the
# /usr/lib/smail/lists directory.
lists:	driver = forwardfile,
	caution,	# flag all addresses with caution
	nobody,	# and then associate the nobody user
	owner = owner\-$user;	# system V sites may wish to use
		# o\-$user, as owner\-$user may be
		# too long for a 14-char filename.
.sp \n(PDu
	# map the name of the mailing list to lower case
	file = lists/${lc:user}
.DE
.DS I
.ta .5i 3i
# smart_user \- a partially specified smartuser director
#
# If the config file attribute smart_user is defined as a string such
# as "$user@domain-gateway" then users not matched otherwise will be
# sent off to the host "domain-gateway".
#
# If the smart_user attribute is not defined, this director is ignored.
smart_user:
	driver = smartuser;	# special-case driver
.sp \n(PDu
	# do not match addresses which cannot be made into valid
	# RFC822 local addresses without the use of double quotes.
	well_formed_only
.TA
.DE
.NH 3
The Preloaded Router Configuration
.PP
If a
.I routers
configuration file is not found at run-time, then the default
pre-loaded configuration is used.  The default router configuration
supports the following routers:
.iP inet_addrs
This router will match hosts specified as internet addresses enclosed
in square brackets.  Delivery to such hosts is always performed using
the
.B smtp
transport (described in a later section).  Any hostname with square
brackets that does not match the form of an internet address will be
considered an error.  An example of an internet address is
.B [192.2.12.142] .
This router is only available on machines that support BSD compatible
networking facilities.
.iP inet_hosts
This will match internet hostnames that can be matched through the
.I gethostbyname (3N)
library routine.  Often this library function will match any host in
the file
.I /etc/hosts .
Deliveries to hosts matched with this router are always performed using
the
.B smtp
transport (described in a later section).  This router is only
available on machines that support BSD compatible networking
facilities.
.iP paths
A path database is used to match hosts for which routes are known.
Normally, this path database is stored in the file
.I /usr/lib/smail/paths .
Often this database will be generated from map files distributed over
the USENET newsgroup
.B comp.mail.maps ,
though path databases can also be created through other means.  A
paths database associates a path with specific hostname or domain.  A
path is defined as a set of hostnames separated by single exclamation
points (`!'), with the last host being followed by the string `%s'.
An example of a simple path database is a file containing:
.DS I
.ta \w'.curds.org'u+2n
\&.curds.org	curds-vax!%s
\&.whey.edu	foo!whey-3b20!%s
bar	foo!bar!%s
foo	foo!%s
.DE
Each path in this database specifies the sequence of hosts, from first
to last, through which a mail message must pass to reach the host
specified on the left-hand-side.  For more information on path
databases see
.I pathalias (8)
and
.I mkpath (8).
Depending upon the configuration specified in the
.I EDITME
configuration file, this path file may need to be sorted, or it may
be stored in a database created with the
.I dbm (3X)
library routines (see
.I mkdbm (8)
for information on how to create these databases).  Delivery to hosts
matched with this router is performed using the
.B uux
transport, which is described in a later section.
.iP uucp_neighbors
The program
.I /usr/bin/uuname
is used to obtain a list of sites that the local host communicates
with over UUCP (see
.I uucp (1)).
This router compares hostnames against this list and causes delivery
to be performed using the
.B uux
transport whenever a match is found.
.iP smart_host
If a hostname is not matched by any other means, mail to that host can
be sent to another machine using the
.B smarthost
router.  The path through which this mail is redirected can be
defined in a
.I config
file by setting the variable
.B smart_path .
For example, the following config file line could be used to redirect
mail to the neighboring host
.I amdahl :
.DS I
smart_path = amdahl
.DE
If this variable is not set, then the
.B smart_user
director is ignored.  Delivery is performed using the transport named
in the
.I config
file variable
.B smart_transport .
If this variable is not set then the
.B uux
transport is used.
.PP
The order of entries in the router file determines the order in which
operations are attempted.  If a router matches a hostname completely,
then no other operations are attempted to resolve that host.  If a
router matches a host partially, as a domain in the right-hand side of
the hostname, then subsequent routers may also find routes.  The
router which finds the best match, based on number of characters
matched, wins.  In the case of a tie, the router earliest in the
router file wins.  A router file which is equivalent to the preloaded
configuration file is:
.DS I
.ta .5i 3i
# inet_addrs and inet_hosts are only defined when BSD networking
# exists
.sp \n(PDu
# inet_addrs \- match domain literals containing literal IP addresses
#
# For example, [128.103.1.1] will match harvard.harvard.edu on the
# internet.  The library routine gethostbyaddr(3N) will be called to
# see if a reverse mapping to the canonical hostname is available.
inet_addrs:
	driver = gethostbyaddr,	# router to match IP domain literals
	transport = smtp;	# deliver using SMTP over TCP/IP
.sp \n(PDu
	fail_if_error,	# fail malformed domain literal addrs
	check_for_local	# see if this is really the local host
.DE
.DS I
.ta .5i 3i
# inet_hosts \- match hostnames with gethostbyname(3N)
inet_hosts:
	driver = gethostbyname,	# match hosts with the library function
	transport = smtp
.DE
.DS I
.ta .5i 3i
# paths \- route using a paths file, like that produced by the
#	pathalias program
paths:	driver = pathalias,	# general-use paths router
	transport = uux;	# for matches, deliver over UUCP
.sp \n(PDu
	file = paths,	# sorted file containing path info
	proto = bsearch,	# use a binary search
	optional,	# ignore if the file does not exist
	domain = uucp	# strip ending ".uucp" before searching
.DE
.DS I
.ta .5i 3i
# uucp_neighbors \- match neighbors accessible over UUCP
uucp_neighbors:
	driver = uuname,	# use a program which returns neighbors
	transport = uux;
.sp \n(PDu
	cmd = /usr/bin/uuname,	# specifically, use the uuname program
	domain = uucp
.DE
.DS I
.ta .5i 3i
# smart_host \- a partially specified smarthost director
#
# If the config file attribute smart_path is defined as a path from
# the local host to a remote host, then hostnames not matched
# otherwise will be sent off to the stated remote host.  The config
# file attribute smart_transport can be used to specify a different
# transport.
#
# If the smart_path attribute is not defined, this router is ignored.
smart_host:
	driver = smarthost,	# special-case driver
	transport = uux	# by default deliver over UUCP
.TA
.DE
.NH 3
The Preloaded Transport Configuration
.PP
If a
.I transports
configuration file is not found at run-time, then the default
pre-loaded configuration is used.  The default transport configuration
supports the following transports:
.iP local
Deliver to users on the local machine.  Mailbox files for local users
are generally found under the directory
.I /usr/spool/mail
or under
.I /usr/mail ,
and have the same name as the corresponding user.
To support the generally available user interfaces, such as
.I Mail (1)
and
.I mailx (1),
certain transformations are performed on the message.  Namely, a line
containing the return address of the sender and a time stamp is
prepended to the message, a blank line is appended at the end, and any
line beginning with the word ``From'' will have the character `>'
prepended to it.  An example of one of the lines prepended to the
message is:
.DS I
From amdahl!futatsu!tron Mon Apr 18 16:11:13 1988
.DE
In addition, a ``Return-Path:'' header field is
inserted which duplicates the return address of the sender.
.iP pipe
Local addresses which begin with a vertical bar character (`|') are
delivered using this transport (the transport name
.B pipe
is reserved for this purpose).  The
.B pipe
transport executes a shell command by calling the program
.I /bin/sh .
The message is passed on the standard input to this command.  The
shell command is formed by removing the vertical bar character from
the beginning of the address.  The alias or forward address which
produced the pipe command address is stored in the environment as
"$ADDR".
.iP file
Local addresses which begin with a slash (`/') or a tilde character
(`~') are delivered using this transport (the transport name
.B file
is reserved for this purpose).  The
.B file
transport appends to a file identified by the local address string.
If the local address string begins with a slash, then it identifies an
absolute path.  If the string begins with ``~\fIusername/\fP'', then
this substring is replaced by the home directory of the given user.
If the string begins simply with ``~/'', then this substring will be
replaced with any home directory associated with the address; e.g.,
a file address in a user's
.I ~/.forward
file will be associated with that user's home directory.
.iP uux
The
.B uux
transport is used as the normal form of delivery over UUCP.  This
transport will deliver up to five addresses at a time by calling the
program
.I uux (1)
to deliver mail to the program
.I rmail (1)
on a remote system.  The request is queued, and actual delivery is not
attempted immediately.  To force an immediate attempt to contact the
remote site, use the
.B demand
transport.
.iP demand
The
.B demand
transport is used to deliver up to five addresses at a time by calling
the program
.I uux (1)
to deliver to a remote
.I rmail (1)
program.  In contrast to
.B uux
this transport forces an immediate attempt to contact the remote site.
.iP uusmtp
The
.B uusmtp
transport is used to deliver using Batched SMTP over UUCP.  It will
deliver to an unlimited number of addresses by calling the program
.I uux (1)
to deliver to a remote
.I rsmtp (1)
program.  The request is queued, and actual delivery is not attempted
immediately.
.iP demand_uusmtp
This transport is used to deliver to an unlimited number of addresses
by calling the program
.I uux (1)
to deliver to a remote
.I rsmtp (1)
program.  This transport forces an immediate attempt to contact the
remote site.
.iP smtp
For sites that have BSD networking facilities, this transport is
available, which performs delivery by opening a TCP/IP virtual circuit
to a remote host and engaging in an interactive SMTP dialogue to perform
delivery.
.PP
The order of entries in the transport file is not important, unless
transport entries with duplicate names exist.  In this case, the
transport earlier in the transport file is always used.  A transport
file which is equivalent to the preloaded configuration file is:
.DS I
.ta .5i 3i
# local \- deliver mail to local users
#
# By default, smail will append directly to user mailbox files.
local:	driver = appendfile,	# append message to a file
	return_path,	# include a Return-Path: field
	local,	# use local forms for delivery
	from,	# supply a From_ envelope line
	unix_from_hack;	# insert > before From in body
.sp \n(PDu
	file = /usr/mail/${lc:user},# use this location for System V
	group = mail,	# group to own file for System V
	mode = 0660,	# under System V, group mail can access
	suffix = "\n"	# append an extra newline
.DE
.DS I
.ta .5i 3i
# pipe \- deliver mail to shell commands
#
# This is used implicitly when smail encounters addresses which begin with
# a vertical bar character, such as "|/usr/lib/news/recnews talk.bizarre".
# The vertical bar is removed from the address before being given to the
# transport.
pipe:	driver = pipe,	# pipe message to another program
	return_path, local, from, unix_from_hack;
.sp \n(PDu
	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
	umask = 0022,	# umask for child process
	\-log_output	# do not log stdout/stderr
.DE
.DS I
.ta .5i 3i
# file \- deliver mail to files
#
# This is used implicitly when smail encounters addresses which begin with
# a slash or twiddle character, such as "/usr/info/list_messages" or
# perhaps "~/Mail/inbox".
file:	driver = appendfile,
	return_path, local, from, unix_from_hack;
.sp \n(PDu
	file = $user,	# file is taken from address
	append_as_user,	# use user-id associated with address
	expand_user,	# expand ~ and $ within address
	suffix = "\n",
	mode = 0644
.DE
.DS I
.ta .5i 3i
# 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
.sp \n(PDu
	# the \-r flag prevents immediate delivery, parentheses around the
	# $user variable prevent special interpretation by uux.
	cmd = "/usr/bin/uux \- \-r $host!rmail $(($user)$)",
	umask = 0022,
	pipe_as_sender
.DE
.DS I
.ta .5i 3i
# demand \- deliver to a remote rmail program, polling on demand
demand:	driver = pipe,
	uucp, from, max_addrs = 5, max_chars = 200;
.sp \n(PDu
	# with no \-r flag, try to contact remote site immediately
	cmd = "/usr/bin/uux \- $host!rmail $(($user)$)",
	umask = 0022, pipe_as_sender
.DE
.DS I
.ta .5i 3i
# uusmtp \- deliver to the rsmtp program on a remote UUCP site
#
# The rsmtp program is assumed to to take batched SMTP requests.
uusmtp:	driver = pipe,
	bsmtp,	# send batched SMTP commands
	inet,	# use internet forms for addressing
	\-max_addrs,	# there is no limit on the number or
	\-max_chars;	#  total size of recipient addresses.
.sp \n(PDu
	# supply \-r to prevent immediate delivery, the recipient addresses
	# are stored in the data sent to the standard input of rsmtp.
	cmd = "/usr/bin/uux \- \-r $host!rsmtp",
	umask = 0022, pipe_as_sender
.DE
.DS I
.ta .5i 3i
# demand_uusmtp \- deliver to a remote rsmtp program, polling on demand
demand_uusmtp:
	driver = pipe, inet,
	bsmtp, \-max_addrs, \-max_chars;
.sp \n(PDu
	# with no \-r flag, try to contact remote site immediately
	cmd = "/usr/bin/uux \- $host!rsmtp",
	umask = 0022, pipe_as_sender
.DE
.DS I
.ta .5i 3i
# smtp \- deliver using SMTP over TCP/IP
#
# Connect to a remote host using TCP/IP and initiate an SMTP conversation
# to deliver the message.  The smtp transport is included only if BSD
# networking exists.
#
# NOTE:	
#	This is hardly optimal, a backend should exist which can handle
#	multiple messages per connection.
#
# ALSO:	
#	It may be necessary to restrict max_addrs to 100, as this is the
#	lower limit SMTP requires an implementation to handle for one
#	message.
smtp:	driver = smtp,
	\-max_addrs,
	\-max_chars, inet
.TA
.DE
