SLOCAL(1)		      [mh.6] (MH.6.8)		     SLOCAL(1)

     NAME
	  slocal - special local mail delivery

     SYNOPSIS
	  /usr/local/lib/mh/slocal [address info sender]
	       [-addr address] [-info data] [-sender sender]
	       [-user username]	[-mailbox mbox]	[-file file]
	       [-maildelivery deliveryfile] [-verbose] [-noverbose]
	       [-debug]	[-help]

     DESCRIPTION
	  Slocal is a program designed	to  allow  you	to  have  your
	  inbound  mail	 processed  according  to  a  complex  set  of
	  selection criteria.	You  do	 not  normally	invoke	slocal
	  yourself,  rather  slocal  is	invoked	on your	behalf by your
	  system's Message Transfer Agent.

	  The message selection	criteria used by slocal	 is  specified
	  in the file .maildelivery in the user's home directory.  The
	  format of this file is given below.

	  The  message	delivery  address  and	message	  sender   are
	  determined   from   the   Message  Transfer  Agent  envelope
	  information, if possible.  Under SendMail, the  sender  will
	  obtained from	the UUCP From  line, if	present.  The user may
	  override  these  values  with	 command  line	arguments,  or
	  arguments to the `-addr' and `-sender' switches.

	  The message is normally read from the	standard  input.   The
	  `-file'  switch  sets	 the  name  of the file	from which the
	  message should be  read,  instead  of	 reading  stdin.   The
	  `-user' switch tells slocal the name of the user for whom it
	  is delivering	mail.  The `-mailbox' switch tells slocal  the
	  name of the user's maildrop file.

	  The `-info' switch may be used to pass an arbitrary argument
	  to  sub-processes  which  slocal  may	invoke on your behalf.
	  The `-verbose' switch	causes slocal to give  information  on
	  stdout  about	 its  progress.	  The `-debug' switch produces
	  more verbose debugging output	on stderr.

	Message	Transfer Agents
	  If your MTA is SendMail, you should include the line

		   | /usr/local/lib/mh/slocal -user username

	  in your .forward file	in your	 home  directory.   This  will
	  cause	SendMail to invoke slocal on your behalf.

	  If your  MTA	is  MMDF-I,  you  should  (symbolically)  link
	  /usr/local/lib/mh/slocal  to	the  file  bin/rcvmail in your

     Page 1					     (printed 9/30/94)

     SLOCAL(1)		      [mh.6] (MH.6.8)		     SLOCAL(1)

	  home directory.  This	will cause MMDF-I to invoke slocal  on
	  your behalf with the correct address info sender arguments.

	  If your MTA is MMDF-II, then you should not use slocal.   An
	  equivalent functionality is already provided by MMDF-II; see
	  maildelivery(5) for details.

	The Maildelivery File
	  The  .maildelivery  file  controls  how  local  delivery  is
	  performed.   Each line of this file consists of five fields,
	  separated by white-space or comma.  Since double-quotes  are
	  honored,  these  characters  may  be	included  in  a	single
	  argument by enclosing	the entire argument in	double-quotes.
	  A  double-quote  can	be  included  by  preceding  it	with a
	  backslash.  Lines  beginning	with  `#'  are	ignored.   The
	  format of each line in the .maildelivery file	is:

	       header	 pattern   action    result    string

	  header:
	       The name	of a header field that is to be	searched for a
	       pattern.	  This	is  any	 field	in  the	headers	of the
	       message that might be present.  The  following  special
	       fields are also defined:

	       source	 the out-of-band sender	information
	       addr	 the address that was used to  cause  delivery
			 to the	recipient
	       default	 this matches only if the message hasn't  been
			 delivered yet
	       *	 this always matches

	  pattern:
	       The sequence of characters to match  in	the  specified
	       header  field.	Matching is case-insensitive, but does
	       not use regular expressions.

	  action:
	       The action to take to deliver the message:

	       destroy	 This action always succeeds.

	       file or > Append	the  message  to  the  file  named  by
			 string.   The message is appended to the file
			 in the	maildrop format	which is used by  your
			 message transport system.  If the message can
			 be appended to	the  file,  then  this	action
			 succeeds.    When  writing  to	 the  file,  a
			 Delivery-Date:	date  header  is  added	 which
			 indicates  the	date and time that message was

     Page 2					     (printed 9/30/94)

     SLOCAL(1)		      [mh.6] (MH.6.8)		     SLOCAL(1)

			 appended to the file.

	       mbox	 Identical to file,  but  always  appends  the
			 message  using	 the format used by packf (the
			 MMDF mailbox format).

	       pipe or | Pipe the message as the standard input	to the
			 command  named	 by  string,  using the	Bourne
			 shell sh(1) to	interpret the  string.	 Prior
			 to  giving  the  string  to  the shell, it is
			 expanded   with   the	 following    built-in
			 variables:

			 $(sender) the out-of-band sender information
			 $(address) the	address	that was used to cause
				   delivery to the recipient
			 $(size)   the size of the message in bytes
			 $(reply-to) either  the  Reply-To:  or	 From:
				   field of the	message
			 $(info)   the	   out-of-band	   information
				   specified
	       qpipe or
	       <caret>	 Similar to pipe,  but	executes  the  command
			 directly,  after built-in variable expansion,
			 without  assistance  from  the	 shell.	  This
			 action	 can  be used to avoid quoting special
			 characters which your shell might interpret.

	  result:
	       Indicates how the action	should be performed:

	       A	 Perform the action.  If the action  succeeds,
			 then the message is considered	delivered.

	       R	 Perform  the  action.	 Regardless   of   the
			 outcome  of  the  action,  the	message	is not
			 considered delivered.

	       ?	 Perform the action only if  the  message  has
			 not  been delivered.  If the action succeeds,
			 then the message is considered	delivered.

	       N	 Perform the action only if  the  message  has
			 not  been  delivered  and the previous	action
			 succeeded.  If	this action succeeds, then the
			 message is considered delivered.

	  To summarize,	here's an example:

	  #field   pattern   action  result    string
	  # lines starting with	a '#' are ignored, as are blank	lines
	  #

     Page 3					     (printed 9/30/94)

     SLOCAL(1)		      [mh.6] (MH.6.8)		     SLOCAL(1)

	  # file mail with mmdf2 in the	To: line into file mmdf2.log
	  To	   mmdf2      file  mmdAf2.log
	  # Messages from mmdf pipe to the program err-message-archive
	  From	   mmdf	     /pbipne/err-mAessage-archive
	  # Anything with the Sender: address mh-workers
	  # file in mh.log if not filed	already
	  Sender   mh-workers file    m?h.log
	  # To:	unix - put in file unix-news
	  To	   Unix	       >    uniAx-news
	  # if the address is jpo=ack -	send an	acknowledgement	copy back
	  addr	   jpo=ack  /bi|n/resendR-r $(reply-to)
	  # anything from steve	- destroy!
	  From	   steve    destroy    A-
	  # anything not matched yet - put into	mailbox
	  default  -	       >     ma?ilbox
	  # always run rcvtty
	  *	   -	       |  /mh/lRib/rcvtty

	  The file is always read completely, so that several  matches
	  can	be  made  and  several	actions	 can  be  taken.   The
	  .maildelivery	file must be owned either by the  user	or  by
	  root,	 and  must  be	writable  only	by  the	owner.	If the
	  .maildelivery	file cannot be found, or does not  perform  an
	  action   which   delivers   the   message,   then  the  file
	  /usr/local/lib/mh/maildelivery is read according to the same
	  rules.   This	 file  must  be	 owned by the root and must be
	  writable only	by the root.  If this file cannot be found  or
	  does	not perform an action which delivers the message, then
	  standard delivery to the user's maildrop is performed.

	Sub-process environment
	  When	a  process  is	invoked,  its  environment  is:	   the
	  user/group-ids  are  set  to	recipient's  ids;  the working
	  directory is the recipient's home directory;	the  umask  is
	  0077;	the process has	no /dev/tty; the standard input	is set
	  to the message; the standard output  and  diagnostic	output
	  are set to /dev/null;	all other file-descriptors are closed;
	  the envariables $USER, $HOME,	$SHELL are set	appropriately,
	  and no other envariables exist.

	  The process is given a certain amount	of  time  to  execute.
	  If  the process does not exit	within this limit, the process
	  will be terminated with extreme prejudice.   The  amount  of
	  time	is  calculated	as  ((size x 60) + 300)	seconds, where
	  size is the number of	bytes in the message.

	  The exit status of the process is consulted  in  determining
	  the  success	of  the	 action.  An exit status of zero means
	  that the  action  succeeded.	 Any  other  exit  status  (or
	  abnormal termination)	means that the action failed.

     Page 4					     (printed 9/30/94)

     SLOCAL(1)		      [mh.6] (MH.6.8)		     SLOCAL(1)

	  In order to avoid any	time limitations, you might  implement
	  a  process  that  began by forking.  The parent would	return
	  the appropriate  value  immediately,	and  the  child	 could
	  continue  on,	 doing	whatever  it  wanted for as long as it
	  wanted.  This	approach is somewhat risky if  the  parent  is
	  going	 to  return  an	exit status of zero.  If the parent is
	  going	to return a non-zero exit status, then	this  approach
	  can lead to quicker delivery into your maildrop.

	Duplicate Message Suppression
	  slocal is able to detect and supress duplicate messages.  To
	  enable this, create two empty	files in your $HOME directory:
	  .maildelivery.pag and	 .maildelivery.dir.   These  are  ndbm
	  files	 which	are  used to store the Message-IDs of incoming
	  messages.

     FILES
	  /usr/local/lib/mh/mtstailor	      MH tailor	file
	  $HOME/.maildelivery		      The file controlling local delivery
	  /usr/local/lib/mh/maildelivery      Rather than the standard file
	  /var/mail/$USER		      The default maildrop

     SEE ALSO
	  rcvstore(1), mhook(1), mh-format(5)

     DEFAULTS
	  `-noverbose'
	  `-maildelivery .maildelivery'
	  `-mailbox /var/mail/$USER'
	  `-file' defaults to stdin
	  `-user' defaults to the current user

     CONTEXT
	  None

     HISTORY
	  Slocal  is  designed	to  be	backward-compatible  with  the
	  maildelivery	 facility  provided  by	 MMDF-II.   Thus,  the
	  .maildelivery	 file	syntax	 is   limited,	 as   is   the
	  functionality	of slocal.

	  In addition to an exit  status  of  zero,  the  MMDF	values
	  RP_MOK  (32)	and  RP_OK  (9)	mean that the message has been
	  fully	delivered.  Any	other non-zero exit status,  including
	  abnormal  termination,  is  interpreted  as  the  MMDF value
	  RP_MECH (200), which means use an alternate  route  (deliver
	  the message to the maildrop).

     BUGS
	  Only two return codes	are meaningful,	others should be.

     Page 5					     (printed 9/30/94)

     SLOCAL(1)		      [mh.6] (MH.6.8)		     SLOCAL(1)

	  Slocal is  designed  to  be  backwards-compatible  with  the
	  maildelivery functionality provided by MMDF-II.

	  Versions of MMDF  with  the  maildelivery  mechanism	aren't
	  entirely backwards-compatible	with earlier versions of MMDF.
	  If you have an MMDF-I	old-style hook,	the best you can do is
	  to have a one-line .maildelivery file:

	       default	-  pipe	 A  bin/rcvmail	  $(address)   $(info)
	  $(sender)

     Page 6					     (printed 9/30/94)