Compare this file to the similar file:
Show the results in this format:

.tr ~
.de NP
.IP "\fI\\$1\fP" 10
.de II
.nr P- \\n()P	 \" save the preceeding IP space
.nr )P 0	\" now set it to 0
.NP "\\$1\fP"
.nr )P \\n(P-	 \" restore the preceeding IP space
.ds M \fI.maildelivery\fP
.TH MAILDELIVERY 5 "1 October, 1985"
User delivery specification file
The delivery of mail by the local channel can run through various
courses, including using a user tailorable file.
The delivery follows the following strategy, giving up at any point
it considers the message delivered.
.IP "1)" 4
If the address indicates a pipe or file default
then that is carried out.
.IP "2)" 4
The file \*M
(or something similar) in the home directory is read if it exists
and the actions in it are followed.
.IP "3)" 4
A system-wide file is consulted next, such as
.I /usr/lib/maildelivery
and the actions are similar to 2.
.IP "4)" 4
If the message still hasn't been delivered, then it is put into
the user's normal mailbox 
.RI ( .mail
.IR mailbox )
depending on the system.
The format of the \*M file is
.B field
.I <FS>
.B pattern
.I <FS>
.B action
.I <FS>
.B result
.I <FS>
.B string
.NP field
is name of a field that is to be searched for a pattern.
This is any header field that you might find in a message.
The most commonly used headers are usually
From, to, cc, subject and sender.
As well as the standard headers, there are some psuedo-headers
that are can also be used. These are :-
.II source
The out of band sender information. This is the address MMDF would
use for reporting delivery problems with the message.
.II addr
the address that was used to mail to you, normally 'yourname' or 
\&'yourname=string' (see below).
.II default
if the message hasn't been delivered yet, this field is matched.
.II *
this case is always true regardless of any other action.
.NP pattern
is some sequence of characters that may be matched in the
.IR field .
Case is not significant.
.IP \fIaction\fP 10
is one of the mail delivery actions supported by the
local channel.  Currently the supported actions are
.B file
.BR > ,
appends the message to the given file, with delimiters;
.B pipe
.BR | ,
which starts up a process with the message
as the standard input;
.B destroy
which throws the message away.
There is also
.B qpipe
.BR ^ ,
which fakes a pipe command and is quicker than the standard pipe,
but does not do header reformatting.
For piped commands, the exit status of the command is significant.
An exit status of 0 implies that the command succeeded and everything
went well. An exit status of octal 0300-0377 indicates that a permanent
failure occured and the message should be rejected; these error codes
are given in mmdf.h. Any other exit
status indicates a temporary failure and the delivery attempt will
be aborted and restarted at a later time.
.NP result
is one of the letters A, R or ? which stand for
Accept, Reject and "Accept if not delivered yet".
They have the following effects:
If the result of this line's action is OK, then the message can be
considered delivered.
The message is not to be considered delivered by this action.
.II ?
This is equivalent to
.I A
except that the action is not carried
out if the message has already been accepted.
The file is always read completely so that several matches
can be made, and several actions taken.
As a security check, the \*M file must be owned by either
the user or root, and must not have group or general
write permission. In addition the system delivery file has the above
restrictions but must also be owned by root.
If the field specified does not need a pattern a dash (\-)
or similar symbol is usually inserted to show that the field is present
but not used.
The field separator character can be either a tab, space or comma (,).
These characters can be included in a string by quoting them with
double quotes (") (double quotes can be included with a backslash '\e').
MMDF treats local addresses which contain an equals sign ('=')
in a special manner.  Everything in a local address
from an equals sign to the '@' is ignored and passed on to the
local channel.  The local channel will make the entire string available
for matching against the
.I addr
string of the \*M file.
For example, if you were to
subscribe to a digest as "foo=digest@bar.NET",
.B submit
and the local channel will verify
that it is legal to deliver
to "foo", but then the entire string "foo=digest" will be available
for string matching against the \*M file for the
.B addr
The environment in which piped programs are run
contains a few standard features, specifically:
.ne 5
HOME is set to the user's home directory.
USER is set to the user's login name.
SHELL is set to the user's login shell (defaults to /bin/sh).
The default umask is set up to 077, this gives a very protective
creation mask.
Initgroups is called if the 4.2 version of UNIX is running.
If further requirements are needed, then a shell script
can be run first to set up more complex environments.
There are certain built-in variables that you can give to
a piped program.  These are
.IR $(sender) ,
.IR $(address) ,
.IR $(size) ,
.I $(reply-to)
.IR $(info) .
.I $(sender)
is set to the return address for the message.
.I $(address)
is set to the address that was used to mail to you, normally `yourname'
or `yourname=string'.
.I $(size)
is set to the size in bytes of this message.
.I $(reply-to)
is set to the Reply-To: field (or the From: field if the former is
missing) and so can be used for automatic replies.
.I $(info)
is the info field from the internal mail header and is probably only
of interest to the system maintainers.
Here is a rough idea of what a \*M file looks like:
.ne 12
# lines \fIstarting\fP with a '#' are ignored.
# as are blank lines
# file mail with mmdf2 in the "To:" line into file mmdf2.log
# Messages from mmdf pipe to the program err-message-archive
# Anything with the "Sender:" address "uk-mmdf-workers"
# file in mmdf2.log if not filed already
# "To:" unix \- put in file unix-news
# if the address is jpo=mmdf \- pipe into mmdf-redist
# if the address is jpo=ack \- send an acknowledgement copy back
# anything from steve \- destroy!
# anything not matched yet \- put into mailbox
# always run rcvalert
\- the file's normal location.
/usr/lib/maildelivery \-
the system file. This should be protected against attack.  It
may contain contents such as:
.ne 4
This allows interfacing to non-standard mail systems,
ones that don't believe in delimiter-separated mailboxes.
And why not?