|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 27907 (0x6d03)
Types: TextFile
Names: »part.8«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦2fafebccf⟧ »EurOpenD3/mail/smail3.1.19.tar.Z«
└─⟦bcd2bc73f⟧
└─⟦this⟧ »design/part.8«
Part 8: Delivery.
Once the <next_host>, <next_address> pairs are known for all
remote recipients of an address, and the transports are known,
it is time to deliver the message to the remote recipients.
The files and procedures defined in the following sections are
used in doing this delivery.
Section 8.1: The transport file.
The transport file describes the use of transport drivers and
assigns names to each transport entry that can be referenced from
routers, method files and directors. Its format follows the
standard described in Part 5.
The following list defines the current set of generic attributes
available for transport file entries:
bsmtp
type: boolean
Use a batched SMTP format, where the message is
enclosed in an envelope of SMTP commands. This is not
the same format commonly used on BITNET, as it does not
contain FORTRAN carriage control characters. This can
be used to send mail to remote hosts using SMTP formats
even when direct two-way connections are not feasible.
For example, this will work over UUCP and eliminates
difficulties with sending arbitrary addresses as argu-
ments to UUX.
crlf
type: boolean
If set, then each line of the header and message will
end in carriage-return/line-feed rather than a single
newline character. This is not typically useful, as
the SMTP transport, which requires this as a part of
the interactive protocol always does this anyway.
debug
type: boolean
If set, replaces the body of the message with debugging
information. This can be used, for example, as a sha-
dow transport to watch the flow of mail for a while for
debugging purposes. This essentially allows for debug-
ging without the ethical and space problems of saving
the personal correspondence of others.
dots
type: boolean
If set, then use the hidden dot protocol. All output
lines which begin with dot will have one more dot
prepended. All of the various SMTP modes imply this
behavior.
driver
type: string
The driver attribute names a specific set of low-level
functions which will do the work of delivering mail.
This attribute is always required.
error_transport
type: string
names another transport that the message should be sent
to, if the first transport returns failure.
from
type: boolean
If set, then supply a ``From<space>'' line before the
message when delivering with this transport. If this
is a remote transport (i.e., the local attribute is not
turned on) then this line will end with ``remote from
hostname'' where hostname is the UUCP name for the
local host. This is useful for delivery over UUCP and
for delivery to standard mailbox files, which require
this format.
hbsmtp
type: boolean
``Half-baked'' batched SMTP. This is batched SMTP mode
without an initial HELO command or an ending QUIT com-
mand. This can be used for creating files which will
be concatenated together at a later time to form one
batch of SMTP commands containing multiple messages.
local
type: boolean
If set, the form of the header and envelope information
will be setup for delivery to the local host. This
performs no changes to existing header fields, other
than insertion of commas into fields containing sender
and recipient addresses. This also affects the form of
any generated ``From<space>'' line and the form of
envelope addresses used in SMTP commands.
max_addrs
type: number
This states the maximum number of recipient addresses
that can be given in one call to the transport. If
this is turned off then there is no maximum number.
The default number is 1 and typically this is either
left as 1 or turned off.
max_chars
type: number
This states the maximum number of characters in reci-
pient addresses that can be given in one call to the
transport. If this is turned off then there is no max-
imum number. The default number is about one third of
the number characters that can be passed as arguments
to a program. When using SMTP transports this should
be turned off unless a remote host is known to be
unable to handle a large number of addresses. For
delivery over UUCP to a remote rmail program, this
should be around 200 or 250, to avoid buffer overruns
at the remote site. UUCP generally has small buffers
to hold argument information.
If smail is given an address whose length exceeds this
number, then the address will be passed with one call
to the transport. Thus, this limit is not strictly
enforced.
max_hosts
type: number
This states the maximum number of different hosts that
can be given in one call to the transport. If this is
turned off, using the form -max_hosts then there is no
maximum number. The default number is 1 and typically
this is not changed.
received
type: boolean
If set, then a Received: field is inserted for mail
being delivered with this transport. The form of this
field is taken from the received_field attribute in the
config file. This attribute is on be default.
return_path
type: boolean
If set, then a Return-Path: field is inserted for mail
being delivered with this transport. The form of this
field is taken from the return_path_field attribute in
the config file. This should only be used for tran-
sports which perform final delivery to local destina-
tions.
shadow
type: string
This names another transport that the message should be
sent to. This could be used to, for example, start a
program that looked up the sender in a database and
brought up a rendition of his face from a face server
in a window on your workstation. The shadow transport
is called only if the primary transport successfully
performs delivery.
strict
type: boolean
If this flag is set, then some effort is done to
transform mail which does not conform to RFC822 stan-
dards. This is potentially useful for sites which
gateway between the UUCP zone and the Internet. In
general, it is not a good idea to turn this on as it
changes the contents of headers fields. This should
only be done when it is known that some remote hosts
only understand mail which conforms to the RFC822 stan-
dard.
unix_from_hack
type: boolean
If set then any line in the body of the message which
begins with ``From '' will have the character `>'
inserted at the beginning. This is required for local
delivery to mailbox files that are in the standard form
expected by the System V mailx (1) and the BSD Mail (1)
programs.
uucp
type: boolean
If set then outgoing recipient addresses will be con-
verted into UUCP-style paths of the form
hosta!hostb!hostc!user. An exception is that any use
of `%' as an address operator is preserved. Thus, an
envelope address of user%hostb@hosta would be converted
to hosta!user%hostb. This only affects envelope
addresses and does NOT affect the message or the mes-
sage header.
Section 8.2: Skip this section.
All this just to avoid having to renumber section numbers!
Section 8.3: Sample transport file.
The following is a sample transport file that will be used
by examples in the following sections.
# @(#)/usr/lib/smail/transports 8.4 1/12/88 25:03:17
# perform local deliver by appending to user mailbox files
local:
# generic transport attributes:
driver=appendfile,
local, # local form for header and envelope
from, # supply a From_ envelope line
returnpath; # supply a Return-Path: field
# driver-specific attributes:
file=/usr/spool/mail/${lc:user}, # BSD/V7 mailbox directory
check_user, # user cannot contain `/' character
mode=0600, # only allow access by the recipient
unix_from_hack, # put > in front of From's in text
suffix="\n" # mailboxes require one extra newline
# deliver to local files
# Note: local-form addresses that specify files as recipients
# are delivered using this transport.
# treat these very much like user mailbox files
file:
# generic transport attributes:
driver=appendfile,
local, # local form for header and envelope
from, # supply a From_ envelope line
returnpath; # supply a Return-Path: field
# driver-specific attributes:
file=$user, # the address specifies the filename
suffix="\n", # mailboxes require one extra newline
check_path, # make sure user can write to file
expand_user, # expand $user before filename
mode=0664, # mode will not allow everyone to write
unix_from_hack, # put > in front of From's in text
suffix="\n" # mailboxes require one extra newline
# deliver to local shell commands
# Note: local-form addresses that specify shell commands
# as recipients are delivered using this transport.
pipe:
# generic transport attributes:
driver=pipe,
local, # local form for header and envelope
from, # supply a From_ envelope line
-log_output, # don't log the shell-command output
returnpath; # supply a Return-Path: field
# driver-specific attributes:
cmd="/bin/sh -c $user", # send address to the bourne shell
umask=022, # file creation for child process
parent_env, # put values from parent addr in env
unix_from_hack, # put > in front of From's in text
ignore_status, # ignore non-zero exitcodes
ignore_write_errors # ignore failed writes on pipes
# send to uux, queuing the message instead of starting
# uucico immediately
uux:
# generic transport attributes:
driver=pipe,
uucp, # uucp form for header and envelope
-max_addrs, # no limit of recipients passed
max_chars=200, # but limit of 200 chars per invokation
from; # supply a From_ envelope line
# driver-specific attributes:
cmd="/usr/bin/uux - -r -g$grade $host!rmail $(($addr)$)",
pipe_as_sender
# deliver over uux, but don't queue unless you cannot
# immediately connect
demand:
# generic transport attributes:
driver=pipe,
uucp, # uucp form for header and envelope
-max_addrs, # no limit of recipients passed
max_chars=200, # but limit of 200 chars per invokation
from; # supply a From_ envelope line
# driver-specific attributes:
cmd="/usr/bin/uux - -g$grade $host!rmail $(($addr)$)",
pipe_as_sender
# deliver mail by sending batched SMTP commands over UUCP.
uusmtp:
# generic transport attributes:
driver=pipe,
bsmtp, # send batched SMTP commands
-max_addrs, -max_chars; # no limit on passed recipient addrs
cmd="/usr/bin/uux - -g$grade $host!rsmtp",
pipe_as_sender
Section 8.4: Calling transports.
When <next_host>, <next_address> and the transport are known
for all recipient addresses of a message, then we can begin
to work on message delivery.
Section 8.4.1: Grouping into transport instances.
Given the list of all addresses tied to transports, we need
to group this list into lists tied to specific instances
a transport. Instances should be setup so that the number
of non-unique <host_host> values does not exceed `maxhosts'
as defined in the transport database, and the total number
of addresses does not exceed `maxaddr'. We will call the
list of instances formed <instance_list> where each instance
has an associated <instance_addresses> list grouped by
<next_host> into lists called <instance_host_addresses>.
Section 8.5: The transport drivers.
The following sections list the currently available transport
drivers.
Section 8.5.1: The pipe driver.
The pipe driver is the most general form of transport. Its
job is to send mail messages to another program, such as uux
or the bourne shell. The driver attributes for the pipe
driver are:
cmd
type: string
The program to be run and the arguments to be passed.
This is string expanded. To handle multiple addresses
being given to a transport, the use of $( and $) can be
used to bracket a section of the command string which
is to be repeated for each address given to the tran-
sport. It is a configuration error for string expan-
sion to fail.
defer_child_errors
type: boolean
Generally, only child failures from the signal SIGTERM
are reattempted at a later time. If this is set, then
retries are performed at a later time if the exit code
is non-zero, or if the write failed on the pipe. This
is useful for treating errors from UUCP as configura-
tion or as temporary filespace problems.
group
type: string
The name of the group to setgid(2) to within the child
process. Useful only if the mailer is running as root.
ignore_status
type: boolean
If set, the exit status of the child process is
ignored. If this is not set, an exit value other than
0 is noted and mail is sent to the postmaster stating
this.
ignore_write_errors
type: boolean
If set, write errors are ignored. This is useful for
running programs that may not actually read their stan-
dard input. If this is not set, a write error will
cause mail to be returned to the sender.
log_output
type: boolean
The stdout and stderr of a command are logged and
returned to the sender in case of problems. The
current implementation is not very good as it actually
returns the logs for all such transports in the event
that any transports fail. This attribute is on by
default.
parent_env
type: boolean
Stuff the environment with data taken from the parent
of the input address, rather than the input address
itself. This is useful for the transport specifically
named pipe which is used by smail for delivery to
shell-command addresses. Here the recipient address
stored into the environment will then be the address
that produced the shell-command address, rather than
the shell-command address itself.
pipe_as_sender
type: boolean
If set, the child process' uid is taken from the real
uid at the time the message was read by smail. This
does not affect the group id for the child. This over-
rides the uid obtained from the pipe_as_user attribute.
pipe_as_user
type: boolean
Obtain a uid and, if `group' attribute is not given, a
gid associated with the address (such as the user for a
.forward file). Then set these via setuid(2) and set-
gid(2) in the child process.
NOTE: This attribute is on by default.
umask
type: number
file creation mask for the child process.
user
type: string
The name of the user to setuid(2) to within the child
process. Useful only if the mailer is running as root.
Section 8.5.1.1: Generating the command line.
This section defines how the `cmd' attribute is used to
produce the command which is actually exec'd in the child
process by the pipe driver.
Given <instance_list>, let <transport> be the associated
transport for each element in turn, and let <cmd_line> be
the associated `cmd' entry for the <transport>. We shall
build up the command line <cmd> for the transport call as
follows:
1. If there is only one of <instance_addresses>, copy
<cmd_line> to <cmd> replacing any occurrences of
$host and $addr with <next_host> and <next_address>
respectively. Replace any occurrences of $( and $)
with <NULL>.
2. If there is only one list <instance_host_addresses> (i.e.,
only one <next_host> is associated with the entry in
<instance_list>) then copy <cmd_line> to <temp> replacing
any occurrence of $host with <next_host>. There
should be occurrences of $addr between $( and $) pairs.
Form a list <replace_list> with a member for each
<next_address> in <instance_host_addresses> such that
each member is the string between $( and $) pairs with
$addr replaced by <next_address>. Then copy <temp>
to <cmd> replacing the text between $( and $) with the
strings in <replace_list>
3. In the general case of several <next_host> values for
an entry in <instance_list>, $host and $addr should
only occur between $( and $) pairs. Copy <cmd_line>
to <cmd> replacing all text between $( and $) pairs with
that same text where <next_host> and <next_address> values
are substituted for $host and $addr respectively.
In summary, the substitutions specific to commands are:
$( begin a per address replacement list
$) end a per address replacement list
Other command-line substitutions are described in Section 5.2.
Examples:
If a transport with a cmd attribute of:
cmd = "/path/send -f $sender -h $host $(-u $user$)
were given a list of <next_address> values:
Jane.Doe
Milo.Bloom@BloomPicayune.COM
x!y!z
The generated command might be:
/path/send -f Steve.Dallas -h BordingHouse.ORG
-u Jane.Doe
-u Milo.Bloom@BloomPicayune.COM
-u x!y!z
Section 8.5.1.2: The child process environment.
The environment of the child process is entirely initialized
and loaded with variables which may be useful in shell scripts
or intelligent mail processing programs. Exactly one
environment variable is passed through from the environment
handed to the smail program, the TZ variable defining the
timezone. The following portion of the environment is
independent of the recipient addresses:
BASENAME the basename for the spool file
GRADE the grade character
MESSAGE_ID the message ID as assigned by smail
PATH ``/bin:/usr/bin''
PRIMARY_NAME the official name for the host
SENDER the sender address
SHELL ``/bin/sh''
SPOOL_FILE the complete name for the spool file
UUCP_NAME the name for the host on the uucp network
VISIBLE_NAME the name for the host used in addresses
The rest of the environment is loaded from the input address,
or from the parent of the input address:
ADDR The recipient address (or one of the recipient
addresses, if more than one is given to the
driver).
HOME The home directory (or one of home directories,
if more than one recipient address is given to
the driver). If no home directory is associ-
ated with an address, ``/'' is used.
append_as_user
type: boolean
Get the uid and, perhaps, the gid from the user id and
group id associated with the address. For example, the
user associated with a forward file might be used.
This attribute is on by default.
check_path
type: boolean
If set, then verify the permissions on a complete path
for a file or dir attribute. This requires that all
directories leading to a file must be searchable by the
appending user (see the user, group and append_as_user
attributes). Under System V, this requires a stat(2)
call for each directory in the path, and is thus some-
what expensive.
check_user
type: boolean
Reject an address if the $user would contain a `/'.
This prevents a $user expansion from accessing a dif-
ferent directory.
dir
type: string
Defines a directory in which to write unique files.
Files written to this directory always begin with the
letter `q', while temporary files used in the creation
process begin with ``temp.'' This string is expanded
similarly to the file attribute. It is a configuration
error for this string expansion to fail.
expand_user
type: boolean
If set the value for $user value is string expanded
before the value for the file or dir attribute is
expanded. This is useful if a local-form address may
require `~' or `$' expansions.
file
type: string
Defines a file to append messages to. This string is
expanded, and the variables $user and $host are set
from the recipient address. It is a configuration
error for this string expansion to fail.
group
type: string
become this group. Similar to the user attribute.
mode
type: number
When creating a file, creat(2) it with this access
mode. The default is 0666.
prefix
type: string
This prefix is inserted in the file before the message.
This string is expanded, with $user and $host being
available from the recipient address. It is a confi-
guration error for this string expansion to fail.
suffix
type: string
This suffix is appended to the file after the message.
This string is expanded, with $user and $host being
available from the recipient address. It is a confi-
guration error for this string expansion to fail.
user
type: string
This become this user (effectively at least) when open-
ing or creating the file. Access permissions are
checked relative to this user, and the user will own
the file if it did not previously exist.
To better understand the use of some of these attributes,
consider the transport file entry:
file: driver=appendfile, from, received, returnpath, local;
file=$user, suffix="\n", check_path,
expand_user, append_as_user, mode=0664
This transport will be called when a file-form address is
produced by a director. If the forwardfile director produced
the address, a user ID and group ID may be associated with it.
If the aliasfile director produced, there will not be a user ID
or group ID associated with it.
When given a next_addr of ~/Incoming, with an associated
home directory of /u/joe-user and an associated user of
joe-user, the following steps occur:
a. next_host is expanded to /u/joe-user/Incoming.
b. the `file' attribute is also expanded to /u/joe-user/Incoming.
c. The directories `/', `/u' and `/u/joe-user' are checked
for accessibility by the user `joe-user'. If any of these
is not searchable, then delivery fails.
d. The file /u/joe-user/Incoming is opened for append access.
If it did not exist, it is created and will be owned by
`joe-user' and will have mode 0664.
e. The message is written with a local-form From_ line.
f. An extra newline is appended to the file, after the
message.
NOTE: smail will follow the local conventions on locking
protocols for mailbox files, which may involve creating
a .lock file or using an file lock system call.
Next, lets examine:
local: driver=appendfile, local, from, received, returnpath;
file=/usr/spool/mail/$user, append_as_user, check_user,
mode=0600
In this example, the next_addr is not expanded before expanding
the file attribute. Also, just to make sure, the next_addr is
verified to not contain a `/'. Given an input address of
`jane-doe', associated with the user `jane-doe', the file
`/usr/spool/mail/jane-doe' will be appended to. If it did not
previously exist, it will be owned by `jane-doe' and will have
mode 0600.
As an example of using this driver for simle queuing, consider:
queue_to_remote:
driver=appendfile, received, strict, hbsmtp, crlf,
-max_addrs, -max_chars;
dir=/usr/spool/smtpq, prefix="DEST<$host>\r\n"
This driver will create files in the directory /usr/spool/smtpq,
one file per message. Each file will be given a unique basename
and will be begin with the destination hostname in the form of a
pseudo smtp command. The message itself will have an envelope of
SMTP commands. There are no limits on the number of addresses
passed to a single invocation of the driver.
For example, it might create a file of:
DEST<jupiter.berkeley.edu>
MAIL FROM:<@sun.com:tron@uts.amdahl.com>
RCPT TO:<"John Public"@jupiter.berkeley.edu>
RCPT TO:<@jupiter.berkeley.edu:rms@saturn.berkely.edu>
DATA
Received: by uts.amdahl.com (smail /\--/\ 3.1);
id <A38a878-382a87C@uts.amdahl.com>
From: tron@uts.amdahl.com (Ronald S. Karr)
To: "John Public"@jupiter.berkely.edu
Subject: 2001 a space odyssey
Cc: <@jupiter.berkeley.edu:rms@saturn.berkely.edu>
So why did 2001 go to Saturn via Jupiter, while the
movie only went to Jupiter?
tron |-<=>-|
.
This file can then be picked up later by a separate program to
actually deliver the message to jupiter.berkeley.edu. For
example, this can be used in environments where only rudimentary
file transfer is possible between systems.
Section 8.5.3: The smtp driver.
Simple support exists in smail for delivery using SMTP over
TCP/IP. It is intended that eventually a complete smail
backend will exist to handle SMTP in a more efficient manner,
though in the mean time a built-in SMTP transport driver is
available.
The smtp driver accepts can be used for delivery of any number
of addresses to one remote host, where the remote host can be
specified either in form of a hostname known by the networking
software or by an internet number in square brackets, such as
[192.2.12.89]. For example, the routing drivers gethostbyaddr
and gethostbyname are suitable for matching addresses to be
delivered using the smtp driver.
The smtp driver currently has no attributes, and always
connects to the port associated with the `smtp' service from
the /etc/services file (generally port 25).
The smtp driver attempts to connect immediately and delivery a
single message. If access to the remote host is currently not
possible, the driver will tell smail that delivery should be
attempted at a later time.
An example of the use of the smtp driver is the entry:
# deliver using SMTP over TCP/IP to the remote host
smtp: -max_chars, -max_addrs, driver=smtp
If your site is on the Internet and gateways from the UUCP
zone, it may be reasonable to set the `strict' attribute.
Otherwise, this is probably not a good idea.
If the `local' attribute is not set, then the envelope sender
address passed to the remote host will always contain the
primary name for the local host, while the recipient addresses
passed in the envelope will always be in RFC822 mailbox form
or route addr form. This is in keeping with the RFC821 SMTP
standards document.
\f