Mercurial > hg > Applications > mh
diff papers/realwork/text.tex @ 0:bce86c4163a3
Initial revision
author | kono |
---|---|
date | Mon, 18 Apr 2005 23:46:02 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/papers/realwork/text.tex Mon Apr 18 23:46:02 2005 +0900 @@ -0,0 +1,1121 @@ +% begin text + +\banner + +\section{Introduction} % mtr +The UCI version of the Rand Message Handling System, \MH/, +is a software system that performs two functions: +\underbar{first}, +it interfaces a user to a message transport system, +so the user may receive and send mail; +\underbar{second}, +it permits the user to maintain an organized mail environment to facilitate +the composition of new messages and the reading of old messages. +In short, +while not responsible for the delivery of messages, +\MH/ aids the user in handling mail. + +\MH/ was originally developed by the Rand Corporation, +and initially was proprietary software. +The Department of Information and Computer Science at +University of California, Irvine, +shortly after joining the Computer Science Network (CSnet), +acquired a copy of \MH/, +and began additional development of the software. +Since that time, +the Rand Corporation has declared \MH/ to be in the public domain, +and the UCI version of \MH/ has passed through four major releases. +The current version, \mh5, +is available from U.C.~Irvine for a nominal distribution fee, +or may be retrieved from the University of Delaware via anonymous FTP. + +Much credit must be given to the initial designers and implementors of \MH/: +Bruce Borden, Stockton Gaines, and Norman Shapiro. +Although \MH/ has suffered significant development at UCI +since Rand's initial release, +the fundamental concepts of \MH/'s environs have remained nearly unchanged. +In addition, +the authors of the current release gratefully acknowledge the comments of the +many sites which have run various releases of \MH/ in the past. +In particular, +the dozen or so beta test sites for \mh5 +provided tremendous help in stabilizing the current release. + +\MH/ runs on different versions of the \unix/ operating system +(such as Berkeley~4.2\bsd/ and various flavors of v7). +In addition, +\MH/ supports four different message transport interfaces: +\SendMail/\cite{EAllm83}, +the standard mailer for 4.2\bsd/ systems; +\MMDF/\cite{DCroc79} and \MMDFII/\cite{DKing84}, +the Multi-Channel Memo Distribution Facility developed by the University of +Delaware +which forms the software-backbone for CSnet\cite{DCome83} mail relay service; +SMTP, +the ARPA Internet Simple Mail Transfer Protocol\cite{SMTP}; +and, +a stand-alone delivery system. + +This paper is organized in a straight-forward fashion: +Initially, +the \MH/ philosophy of mail handling is presented, +along with a description of the environment which the \MH/ user is given to +process mail. +Following this, +certain advanced features of \MH/ are discussed in more detail, +such as facilities for selecting messages, +and ``advanced'' concepts in {\it draft} handling. +In addition, +user interface issues in mail handling are addressed, +and the merits of \MH/'s approach is critically examined. +Next, +the \mh5 distribution package is described. +Finally, +we conclude by discussing the authors' experience with \MH/ development +and introducing areas where \MH/ may be further developed. + +Although familiarity with \MH/ is not assumed on the part of the reader, +some knowledge of the \unix/ operating system is useful. +Appendix~A gives a short synopsis of the \MH/ commands. + +\section{The \MH/ Philosophy} % mtr +Although \MH/ has many traits which tend to distinguish it from other systems +which handle mail, +there is a single fundamental design decision which influences the interface +between \MH/ and the user: +\MH/ differs from most other systems in that it is composed of many small +programs instead of one very large one. +This architecture gives \MH/ much of its strength, +since intermediate and advanced users are able to take advantage of this +flexibility. + +The key to this flexibility is that the \unix/ shell +(usually the {\it C} shell or the {\it Bourne} shell), +is the user's interface to \MH/. +This means that when handling mail, +the entire power of the shell is at the user's disposal, +in addition to the +facilities which \MH/ provides. +Hence, +the user may intersperse mail handling commands with other commands in an +arbitrary fashion, +making use of command handling capabilities which +the user's shell provides. + +Furthermore, +rather than storing messages in a complicated data structure +within a monolithic file, +each message in \MH/ is a \unix/ file, +and each folder (an object which holds groups of messages) +in \MH/ is a \unix/ directory. +That is, +the directory- and file-structure of \unix/ is used directly. +As a result, +any \unix/ file-handling command can be applied to any message. + +To the novice, +this may not make much sense or may not seem important. +However, +as users of \MH/ become more experienced, +they find this capability attractive. +In addition, +this approach is often quite pleasing to system implementors, +because it minimizes the amount of coding to be performed, +and given a modular design, +changes to the software system can be maintained easily. +There are, however, performance penalties to be paid with this scheme. +This issue is considered later in the paper. + +Having described how \MH/ fits into the \unix/ environment, +we now discuss the mail handling environment which is available to the \MH/ +user. + +\subsection{The \MH/ Environs} % jlr +In the \file{\$HOME} directory of each \MH/ user, a file named +\profile/ contains static information about the user's \MH/ environment, +and default arguments for \MH/ programs. +For the latter case, +each line of profile takes the form: +\example program-name:\ options\endexample +Each \MH/ program consults the user's \profile/ for its options. +These options are consulted prior to evaluating any command-line arguments, +and so provide the \MH/ user the capability to customize the defaults for each +command. +Futher, by using the \unix/ link facility, +different names can be given to the same command. +Since each \MH/ command looks +in the \profile/ +for a component with the name by which it was invoked, +it's possible to have different defaults for the same program. +For example, +it is not uncommon to link \pgm{prompter} +(a simple prompting editor front-end) +under the name \pgm{rapid} in the +user's \file{bin/} directory, and add to the \profile/: +\example rapid:\ -prepend\ -rapid\endexample +As a result, +when \pgm{prompter} is invoked as \pgm{rapid}, +it automatically uses the \switch{prepend} and \switch{rapid} options. + +The profile component \eg{Path:} is the path to the user's +\MH/-directory, usually \Mail/. +In addition to containing the user's folders, +the \MH/-directory also contains {\it skeletons} and +{\it templates} used by the \MH/ programs, +and the user's \context/ file. +This latter file has the same format as the user's \profile/, +and contains the dynamic, +context-dependent information about the user's environment. +Whenever \MH/ looks for an \MH/-specific file, +such as a template or skeleton, +it first consults the user's \MH/-directory, +and then a system-wide library area. + +The \MH/ user always has a {\it current folder}, +which is the folder in which +the user is currently (or was last) working. +Since any \MH/ program which deals with folders implicitly manipulates this +information, +the name of the current folder is stored in the \file{context} +component \eg{Current-Folder:}. +Every folder has a {\it current message} known as \arg{cur}. +These values are the defaults for \MH/ commands which +accept folder and/or messages arguments. + +\MH/ programs make use of a set of envariables +which further customize their behavior. +The \file{\$MH} envariable, if present, +specifies the name of an alternate profile for the user. +This allows a user of \MH/ to +easily maintain multiple mail-handling environments. + +In terms of command syntax, +most \MH/ commands accept an optional {\it folder} argument, +such as \arg{+outbox}. +Unlike most \unix/ commands, +all \MH/ commands have switches which are words, rather than single letters. +Switches may be abbreviated to the least unambiguous prefix. +All \MH/ commands also support a \switch{help} switch, +which lists the syntax of the command along with available switches, +and the version number of the command. +Most \MH/ commands also take a \arg{msg} or \arg{msgs} argument +which takes the form of a message number (\eg{1}), a message range (\eg{1-2}), +a standard sequence name (\eg{cur}), +or a user-defined sequence name (\eg{select}). + +\tagdiagram{1}{An \MH/ Session}{session} +\subsection{An \MH/ Transcript} % jlr +Figure~\session\ contains a transcript of a simple \MH/ session. +First, \pgm{inc} is run to incorporate the new mail into the +user's \eg{+inbox} folder. + +A \pgm{scan} listing of the mail is printed while +it is being incorporated. +(The user could run \pgm{scan} explicitly to generate additional \pgm{scan} +listings later on.) +The \pgm{scan} listing gives the message number, followed +by the date, message sender, and subject. +(If the message originated from the user generating the listing, +the \eg{to:} addressee is displayed instead of the sender.) +If the subject is short, +the first part of the message body is displayed after the characters \eg{<<}. +The plus sign (`+') after +the message number indicates the current message. + +The user \pgm{show\/}s the message, and decides to \pgm{repl\/}y. +A reply draft +is created using the headers of the message being replied-to, +using the default \file{replcomps} template. +The default editor, \pgm{prompter}, is called to edit the draft. +When an EOT is typed, \pgm{prompter} exits and the +user is left at the \whatnow/ prompt. +The option \pgm{send} is chosen. +Since there were no problems in posting the draft with the message transport +system, +no additional output is produced. +(\MH/ is not verbose by default.) + +The user then decides to compose a new message. +The default skeleton, \file{components}, is copied to the draft, +and \pgm{prompter} is once again called. +After entering the addresses, subject, and body, +the user then \pgm{send\/}s the \file{draft} from the \whatnow/ prompt, +using \eg{send\ -verbose}, which causes +\MH/ to list out the message addresses as it submits them +to the message transport system. + +\section{Some \MH/ Features} % mtr +We now consider certain advanced features in \MH/. +These features have been chosen to demonstrate some useful capabilities +available to the \MH/ user. + +\subsection{Message Sequences and Selection} % jlr +\MH/ has several built-in message sequence names, which may +be used anywhere a \arg{msg} or \arg{msgs} argument is expected. +These are: +\arg{cur}, \arg{next}, \arg{prev}, \arg{first}, \arg{last}, and \arg{all}. +Message ranges may also be specified. +For example, \arg{all} is actually \arg{first-last}, and +\arg{+mh\ last:5} references the last five messages in your +\arg{+mh} folder. +A powerful capability of \MH/ is the ability to use not only the pre-defined +message sequence names, +but also arbitrary user-defined message sequence names. + +Although all \MH/ programs recognize user-defined sequences when appropriate, +the \pgm{pick} and \pgm{mark} commands can create and modify +user-defined message sequences. +The \pgm{mark} command allows low-level manipulation of sequences, +and is not particularly interesting in our discussion. + +The \pgm{pick} command selects certain messages out of a folder. +The criteria used for selection may be a search string and/or a date range. + +Searching is performed on either a specific header in the message +(e.g., \eg{To:}), +or anywhere within the message. +By default, +\pgm{pick} lists out the message numbers that matched +the selection criteria. +Thus, \pgm{pick} is useful in backquoted operations to the shell. +For example, to scan all the messages in the current folder from ``frated'', +the \MH/ user issues the command: +\example scan\ \bq{pick\ -from\ frated}\endexample +To perform more complicated message selection, +user-defined sequences are employed. +Supplying a \switch{sequence\ name} +argument to \pgm{pick}, will cause it to define the +sequence \arg{name} as those messages matched. + +Giving \pgm{pick} a list of messages causes it to limit its search to just +those messages. +For example, +to find all the messages in the current folder from ``frated'' also dated +before friday: +\example pick\ -from\ frated\ -sequence\ select\\ + pick\ select\ -before\ friday\ -sequence\ select\endexample +With the first \pgm{pick} command, +the sequence \eg{select} is defined +to be all those messages from ``frated''. +In the second command, only those messages already in the \eg{select} +sequence are searched, and the \eg{select} sequence is redefined to be +only those messages which are also +dated before friday. +Those messages could then be \pgm{show\/}n with: +\example show\ select\endexample +When a \switch{sequence\ name} argument is given to \pgm{pick}, +the default behavior --- listing the message numbers +matched --- is inhibited. +To re-enable this behavior, the \switch{list} option may be given. +As a result, +advanced users of \MH/ often put the following line in their \profile/: +\example pick:\ -sequence\ select\ -list\endexample +which allows them to easily make use of the \arg{select} sequence as the +messages last selected with \pgm{pick}. + +Often it is desirable to act upon those messages which +are {\it not} members of a given sequence. +For this purpose, +the \eg{Sequence-Negation:} profile entry is useful. +If the name of a user-defined sequence is prefixed with the value of the +sequence-negation profile entry, +\MH/ commands will operate upon those messages which are {\it not} members +of that sequence. +For example, given a profile entry of: +\example Sequence-Negation:\ not\endexample +those messages which +are not in the \arg{select} sequence could be \pgm{scan\/}'d with: +\example scan\ notselect\endexample + +Obviously, some confusion could result if an attempt was made +to define a sequence name +which began with the sequence-negation string (e.g., \eg{notselect}). +For this reason, \MH/ users will often use a single +character, +which their shell doesn't interpret, +as their sequence-negation string +(e.g., up-caret (`\^{}') for {\it C} Shell users, +and exclamation-mark (`!') for {\it Bourne} shell users). + +\MH/ also provides a way of automatically remembering the last +message list given to +an \MH/ command. +This facility is implemented by using a profile entry called +\eg{Previous-Sequence:}. + +\subsection{Draft Handling} % jlr +After the initial edit of a message draft, +the \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} programs +give the user a \whatnow/ prompt. +The valid responses include: +\pgm{edit} to re-edit the draft, +\pgm{quit} to exit without sending the draft, +\pgm{send} to send the draft, and +\pgm{push} to send the draft in the background. + +When the \pgm{send} option is given, +the draft is posted with the message transport system. +If there problems posting the draft, +the \whatnow/ prompt is re-issued, +so errors in the draft may be corrected. + +Since posting the draft can be slow, +the \pgm{push} option allows the \MH/ user to send the draft in the +background, and return immediately to the shell. +If there are problems posting the message, +the user will not see the diagnostics produced by +the message transport system. +For this reason, +if \pgm{push} is used instead of \pgm{send}, +and the message is not successfully posted, +\MH/ mails a message to the user +containing any diagnostics which the message transport system produced +along with a copy of the message. +Later, +the draft may be re-edited by entering \eg{comp\ -use}. + +A relatively new feature of \MH/ is the ability to use a folder to store +multiple drafts. +These drafts are kept in an ordinary \MH/ folder, +and may be operated upon by \MH/ commands. +To enable this feature, +the \MH/ user selects a folder-name for the draft-folder, +and creates an entry in the \profile/: +\example Draft-Folder:\ +foldername\endexample +From this point on, +when a message is composed, +the draft will be created as a message in that folder, +instead of using the \file{draft} file in the user's \MH/ directory. +Unfortunately, +if posting problems occur on a message which has been \pgm{push\/}'d, +it may be difficult to re-edit the draft with +\eg{comp\ -use}. +This might be the case if the user had started composing another message, +while that first draft was being posted. +In that event, +the current-message in the draft-folder would no longer point +to the failed draft. + +There is a solution for this problem, however. +By default, +\pgm{push} assumes the \switch{forward} option, +which says that if the message draft fails to be posted, +it should be forwarded back to the user in the +error report which \pgm{push} generates. +The failed draft may then be extracted with the \pgm{burst} program +(discussed later). + +\subsection{BBoards} % mtr +\MH/ has a convenient interface to the UCI BBoards facility\cite{MRose84a}.% +\nfootnote{The UCI BBoards facility can run under either the \MMDF/ or +\SendMail/, +or in a more restricted form under stand-alone \MH/.} +This facility permits the efficient distribution of interest group messages +on a single host, +to a group of hosts under a single administration, +and to the ARPA Internet community. + +Although most readers are probably familiar with the concept of an interest +group in the Internet context, a brief description is now given. +Observant readers will notice that the distributed nature of the +``network news'' (a.k.a.~USENET) +tends to avoid many of the problems described below. + +Described simply, an interest group is composed of a number of subscribers +with a common interest. +These subscribers post mail to a single address, known as the +{\it distribution} address (e.g., {\tx MH-Workers@UCI}. +From this distribution address, a copy of the message is sent to each +subscriber. +Each group has a {\it moderator}, +who is the person that runs the group. +This moderator can usually be reached at a special address, +known as the {\it request} address (e.g., {\tx MH-Workers-Request@UCI}). +Usually, the responsibilities of the moderator are quite simple, +since the mail system handles distribution to subscribers automatically. +In some interest groups, +instead of each separate message being distributed directly to subscribers, +a batch of (hopefully related) messages +are put into a {\it digest} format by the +moderator and then sent to the subscribers. +(This is similar to a newsletter format.) +Although this requires more work on the part of the moderator +and introduces delays, +such groups tend to be better organized. + +Unfortunately, some problems arise with the scheme outlined above. +First, if two users on the same host subscribe to the same interest group, +two copies of the message are delivered. +This is wasteful of both processor and disk resources at that host. + +Second, +some groups carry a lot of traffic. +Although subscription to a group does indicate interest on the part of a +subscriber, +it is usually not interesting to get 50 or so messages delivered +each day +to the user's private maildrop, +interspersed with {\it personal} mail, +which is likely to be of a much more important and timely nature. + +Third, if a subscriber's address in a distribution list +becomes ``bad'' somehow and causes failed mail to be returned, +the originator of the message is normally notified. +It is not uncommon for a large list to have several bogus addresses. +This results in the originator being flooded with ``error messages'' from +mailers across the Internet stating that a given address on the list was +bad. +Needless to say, +the originator usually does not care if the bogus addresses got a copy +of the message or not. +The originator is merely interested in posting a message +to the group at large. +On the other hand, +the moderator of the group does care if there are bogus addresses on the list, +but ironically does not receive notification. + +To solve these problems, +the UCI BBoards facility introduces a new entity into the picture: +a {\it distribution channel}. +All interest group mail is handled by +the special mail system component. +The distribution address for an interest-group +maps mail for that interest-group to the distribution channel, +which then performs +several actions. +First, if local delivery is to be performed, +a copy of the message is placed in a global maildrop for the interest +group with a timestamp and a unique number. +Local users can read messages posted for the interest group by reading this +``public'' maildrop. +Second, if further distribution is to take place, +a copy of the message is sent to the distribution address in such a way that +if any of the addresses are bogus, +failure notices will be returned to the local maintainer of the group +address list, rather than the originator of the message. + +This scheme has several advantages: +First, messages delivered to the local host are processed and saved once +in a globally accessible area. +The UCI BBoards facility supports software which allows a user to query an +interest group for new messages and to read and process +those messages in the \MH/-style. +Second, once a host administrator subscribes to an interest group, +each user may join or quit the list's readership without +contacting anyone. +Third, a hierarchical distribution scheme can be constructed to +reduce the amount of delivery effort. +Finally, errors are prevented from propagating. +When an address on the distribution list goes bad, +the list moderator who is responsible for the address is notified. +If a local moderator does not exist, +then the local PostMaster is notified (not the global group moderator). + +In addition to solving the problems outlined above, +the UCI BBoards facility supports several other capabilities. +BBoards may be automatically archived in order to conserve disk space and +reduce processing time when reading current items. +Also, +the archives can be separately maintained on tape for access by interested +researchers. + +Special alias files may be generated which allow the \MH/ user to shorten +address entry. +For example, instead of sending to {\tx SF-Lovers@Rutgers}, +a user of \MH/ usually sends to \eg{SF-Lovers} and the \MH/ aliasing +facility automatically makes the appropriate expansion in the headers of the +outgoing message. +Hence, +the user need only know the name of an interest group and not its global +network address. + +Finally, the UCI BBoards facility supports {\it private} interest groups +using the \unix/ group access mechanism. +This allows a group of people on the same or different machines to conduct a +private discussion. + +The practical upshot of all this is that the UCI BBoards facility automates +the vast majority of BBoards handling from the point of view of both the +PostMaster and the user. + +\MH/ provides three programs to deal with interest groups. +The \pgm{bbc} program is used to check on the status of one or more groups, +and to optionally start an \MH/ shell on those groups which the user is +interested in. +The \pgm{bbl} program can be used to manually perform maintenance on a +discussion group beyond the normal automatic capabilities of the UCI BBoards +facility. +Finally, +the \pgm{msh} program implements an \MH/ shell for reading BBoards, +in which nearly all of the \MH/ commands are implemented in a single program. + +Observant readers may note that the use of \pgm{msh} is contrary to the \MH/ +philosophy of using relatively small, single-purpose programs. +Sadly, +the authors admit that this is true. +In an effort to minimize use of system resources however, +BBoards are kept in maildrop format instead of folders.% +\nfootnote{When the message transport system delivers a message to a user +it stores it in a single file, called a {\it maildrop}. +Since many messages may be present in a single maildrop, +(in theory) there is a unique string acting as a separator between messages +in the maildrop. +Although this is convenient for storage of messages, +it makes retrieval more difficult unless a separate index into the maildrop +is kept. +This latter approach is taken by the \pgm{msg} program available with \MMDFII/ +and by \pgm{msh} as well.} +Some research has gone into overcoming this problem to restore +\MH/'s purity of purpose, +but all solutions proposed to date are either unworkable or require +significant recoding of \MH/'s internals. + +\subsection{Bursting} % jlr +Internet interest group mail is often sent out in digest form. +The experienced \MH/ user may wish to deal with the digest messages on +an individual basis, however. +The \pgm{burst} program allows the \MH/ user to extract these digest +messages, +and store each as an individual \MH/ message. + +\pgm{Burst} will also extract forwarded messages generated by \pgm{forw} +(or the forwarded message in the error report generated by \pgm{push}, +as described above). +Although \pgm{burst} cannot always decapsulate +messages encapsulated by sites not running \MH/, +it adheres to the proposed standard described in \cite{MRose85b}. + +\subsection{Distributed Mail} % mtr +The ARPA Internet community consists of many types of heterogeneous nodes. +Some hosts are large mainframe computers, +others are personal workstations. +All communicate using the \milstd/ TCP/IP protocol suite\cite{IP,TCP}. +Messages which conform to the Standard for the Format of ARPA Internet Text +Messages\cite{DCroc82} +are exchanged using the Simple Mail Transfer Protocol\cite{SMTP}. + +On smaller nodes in the ARPA Internet, +it is often impractical to maintain +a message transport system (e.g., \SendMail/). +For example, +a workstation may not have sufficient resources (cycles, disk space) +in order to permit an SMTP server and associated local mail delivery system +to be kept resident and continuously running. +Furthermore, +the workstation could be off-net for extended periods of time. +Similarly, +it may be expensive (or impossible) to keep a personal computer +interconnected to an IP-style network for long periods of time. +In other words, +the node is lacking the resource known as ``connectivity''. + +Despite this, +it is often desirable to be able to manage mail with \MH/ on these smaller +nodes, +and they often support a user agent to aid the tasks of mail handling. +To solve this problem, +a network node which can support a message transport entity +(known as {\it service} host) offers +a maildrop service to these less endowed nodes +(known as {\it client} hosts). +The Post Office Protocol\cite{JReyn84} (POP) is intended to permit a +workstation to dynamically access a maildrop on a service host to pick-up +mail.% +\nfootnote{Actually, +there are three different descriptions of the POP. +The first, cited in \cite{JReyn84}, +was the original description of the protocol, +which suffered from certain problems. +Since then, +two alternate descriptions have been developed. +The official revision of the POP\cite{MButl85}, +and the revision of the POP which \MH/ uses +(which is documented in an internal memorandum in the \MH/ release). +This paper considers the POP in the context of the \MH/ release.} +The level of access includes the ability to +determine the number of messages in the maildrop and the size of each message, +as well as to retrieve and delete individual messages. +More sophisticated implementations of the POP server +are able to distinguish between the header and body portion of each message, +and send $n$ lines of a message to the POP client. +This capability is useful in thinly connected environments where conservation +of bandwidth is important. +By utilizing a more intelligent POP client, +a user may generate ``scan~listings'' and decide dynamically which messages +are worth taking delivery on. +The philosophy of the POP is to put intelligence in the +POP clients and not the POP servers. + +The current release of \MH/ supports the above model fully. +A POP client program is available to retrieve a maildrop from a POP service +host. +In addition, +using the SMTP configuration for delivery in \MH/ +(either in conjunction with \SendMail/ or the \MMDF/), +a user is able to specify a search-list of service hosts (and/or networks) +to try to post mail. +Using this search-list, +when an \MH/ user posts a draft, +the \pgm{post} program will attempt to establish an SMTP connection +with each host in the search-list to post the message until it succeeds. +Initial experimentation using the POP and \MH/ +in a local network environment has proved quite successful. + +\section{User Interface Issues in \MH/} % mtr +At this point, +it is perhaps useful to take a step backwards and examine the success +and problems of \MH/'s approach to user interfaces. + +\subsection{Creeping Featurism} % mtr +A complaint often heard about systems which undergo substantial development +by many people over a number of years, is that more and more options are +introduced which add little to the functionality but greatly increase the +amount of information a user needs to know in order to get useful work done. +This is usually referred to as {\it creeping featurism}. + +Unfortunately \MH/, +having undergone six years of off-and-on development by ten or so +well-meaning programmers (the present authors included), +suffers mightily from this. +For example, +the \pgm{send} command has twenty-five visible switches, +and at least nine hidden switches, +for a total of thirty-four. +The poor user who types \example send\ -help\endexample watches the options +scroll off the screen +(since the \switch{help} switch also lists out four other lines of +information).% +\nfootnote{Recently, +this was fixed by compressing the way in which switches are presented. +The solution is only temporary however, +as \pgm{send} will no doubt acquire an {\it endless} number of switches in +the years to come.} +The sad part is that all of these switches are useful in one form or another. + +There are a lot of good things to be said for the +``one program, one function'' philosophy of system design. +In the \MH/ case, however, +each program really does only one mail handling activity +(with a few minor exceptions). +The options associated with each command are present to modify the program's +behavior to perform similar, but slightly different tasks. +In further defense of \MH/, +note that there are~32 \MH/ commands at present, +all performing different tasks. + +The problem with creeping featurism though, +is that while the functionality of the system increases sub-linearly, +the complexity of the system increases linearly. +That is, +although the number of switches that a program takes might double, +it is unlikely that the program's functionality or capabilities will double. + +\subsection{Templates versus Switches} % mtr +One way to trim the explosion of available options, +while still increasing functionality, +is to introduce options with a richer domain. +Hence, +instead of using options which take {\it on} or {\it off} forms +or simple numeric or string values, +the possible values which an option might take on is given a large space. +There are several ways that this might be accomplished. + +\tagdiagram{2}{Draft Skeleton}{components} +The \pgm{comp}, \pgm{dist}, and \pgm{forw} programs +use draft {\it skeletons} (simple form fill-in files) to construct the +general format of the draft being composed. +An example of a draft skeleton used for composing new messages +(by \pgm{comp\/}) is shown in Figure~\components. +The approach is to let the user specify (and later edit) both arbitrary +headers of draft and the body of the draft. +Note while most of the fields are empty, +the first \eg{Fcc:} field already contains a value. +By using the simple prompting editor, \pgm{prompter}, +the user can speedily enter the headers of the message. +The \pgm{prompter} program given the skeleton in Figure~\components\ would +prompt the user for the contents of each field, +except for the second \eg{fcc:}, +which it would include verbatim. +It would then read the body of the message up to an end-of-file. +Naturally, +the \MH/ user is free to use {\it any} editor to edit {\it any} part of the +draft (headers or body). +This example +demonstrates the flexibility achieved by not limiting what headers a +draft may contain (which most mail sending programs do), +while still retaining the simplicity of being able to treat the entire +message draft as a \unix/ file. + +\tagdiagram{3}{Reply Template}{replcomps} +Another more interesting approach is used by the \pgm{repl} command, +which constructs a draft in reply-to a previously received message. +Instead of adding switches to indicate which fields of the draft should be +derived from the message being replied-to, +and how they should be derived, +a single option, +the ability to specify a {\it template}, was made available. +An example of a reply template is shown in Figure~\replcomps. +Put simply, +based on the presence of certain fields in the message being replied-to, +and a few switches given by the user, +using the reply template, +\pgm{repl} generates the reply draft automatically. + +\tagdiagram{4}{The \file{tripcomps} Reply Template}{tripcomps} +This facility, for example, +can be used to generate automatic replies.% +\nfootnote{\MH/ supports the notion of a user-defined {\it mail hook} +which is invoked each time a user receives mail.} +One function might be to write a \pgm{rcvtrip} shell script +which automatically answered messages when mail wasn't being read for a +period of time +(e.g., while attending a conference). +An example of a reply template at the heart of such a script +is shown in Figure~\tripcomps. + +\tagdiagram{5}{The \file{bombcomps} Reply Template}{bombcomps} +Finally, +another application might be to utilize +the highly useful letter bomb protocol.% +\nfootnote{The authors wish to credit Ron Natalie of the Ballistics Research +Laboratory in Aberdeen, Maryland for formalizing the +use of this protocol in the ARPA Internet community.} +The important thing to note about this template is that it generates not only +the headers of the reply draft (with a creative \eg{Reply-to:} address), +but the body as well. +Hence, +the commands +\example + repl\ -form\ bombcomps\ -noedit\ ;\ rmm\\ + What\ now?\ push% +\endexample +are very handy for dealing with disturbing mail in a straight-forward manner. +Of course, \pgm{repl} could be linked to \pgm{bomb} in the user's \file{bin/} +directory and an appropriate line could be added to the user's \MH/ profile, +in order to further shorten type-in. + +\tagdiagram{6}{Display Template}{mhlforward} +A variation on the reply template is the {\it display template}. +A display template, as used by the \pgm{mhl} program, +contains instructions on how to format a message. +In addition to being used by \pgm{show}, et.~al., +the \pgm{forw} program can also use a display template to format each +message being forwarded. +Similarly, +although \pgm{repl} uses a reply template to construct the draft +being composed, +it also may use a display template to format the body of the message +being replied-to for enclosure in the reply. +Furthermore, +the \pgm{post} program may use a display template to format the body of a +blind-carbon-copy. +An example of a display template used for formatting forwarded messages +is shown in Figure~\mhlforward. + +As with reply templates, +display templates can offer a lot of functionality. +For example, +the one line display template: +\example + body:nocomponent,overflowtext=,overflowoffset=0,width=10000% +\endexample +can be used to extract the body of a message, +while ignoring the headers. +Hence, +if a \pgm{shar} archive arrived in the mail, +a convenient way to unpack it, +assuming the above display template was called \file{mhl.body}, +would be: +\example show\ -form\ mhl.body\ |\ sh\endexample + +The biggest win with display templates, +of course, +is that all those annoying header lines which mailers +everywhere generate can be simply and easily filtered out. + +\subsection{Modularity versus Monolithicity} % jlr +Since \MH/ is a set of programs +which perform separate tasks, +as opposed to being a single, monolithic program, +the power of the shell is used directly to aid in mail-handling. +One powerful capability which this design achieves is the ability to extend +the \MH/ command set, +by developing shell scripts which use the standard \MH/ +programs to accomplish complicated or specialized tasks. + +\tagdiagram{7}{The \pgm{mpick} Script}{mpick} +For example, +in the \MH/ distribution there is a shell script +called \pgm{mpick} (shown in Figure~\mpick) +which tries to locate all the messages which pertain to a given discussion, +by looking at the \eg{Message-ID:} and \eg{In-reply-to:} headers, +to find matching message-ids.% +\nfootnote{Note that the shell scripts included in the \MH/ distribution +are written for the {\it Bourne} shell, +and have a `:' as the first character of the first line, +so they will be portable to all versions of \unix/, +not just those which support the +Berkeley `\#!' enhancement.} + +\tagdiagram{8}{The \pgm{append} Editor}{appended} +Unfortunately, some parts of \MH/ are somewhat monolithic. +An example of this is the \whatnow/ prompt. +There are only a few options at this prompt, +and one cannot give a normal shell command. +Some \MH/ users seem to feel that more options should be added to +the \whatnow/ prompt, such as an \pgm{insert-file} option. +It was argued that just about any editor would allow you to +insert a file, and another \whatnow/ option was not needed. +These users persisted, however, so the +problem was solved, by writing a trivial shell +script ``editor'' (see Figure~\appended) +which could be invoked by the \pgm{edit} option: +\example What now?\ edit\ append\ filename\endexample + +A better interface at this point is really needed, however. +One possibility is to simply pass any unrecognized commands on +to a shell for interpretation, supplying the path name of the draft file +as an argument. +A solution which shows more promise is to give you a sub-shell +{\it instead} of the \whatnow/ prompt, +and setup certain envariables so that +the \MH/ commands would act upon the \file{draft} by default. +For example, \pgm{show} with no \arg{msgs} arguments +would show the draft instead of the current message. +This alternative has recently been implemented and is under testing. + +\section{The \MH/ Distribution} % mtr +The \mh5 distribution is now briefly described, +both in terms of static configuration methods +and dynamic tailoring. +Appendix~B describes the mechanics of receiving an \mh5 distribution. + +\subsection{Configurable \MH/} % jlr +The \MH/ distribution currently runs on a large number of different \unix/ +versions, +ranging from MicroSoft XENIX to Berkeley 4.2\bsd/. +All the code which is specific to a particular target environment is +enabled via the C-preprocessor \eg{\#ifdef} mechanism, +so compilation under different versions of \unix/ is trivial. +There are, +however, +a large number of compile-time options which may vary from site to site, +so an automated configuration method was needed. + +\tagdiagram{9}{Sample \MH/ Configuration File}{mhconfig} +The \MH/-installer must create a configuration file, +which contains a list of the compile-time options +and the values which are desired for them. +Compile-time options include the installation location for \MH/, +what kind of message transport system is to be used, +and the default editor for the installation. +An example of such a configuration file is shown in Figure~\mhconfig. + +After creating this file (several examples are included in the distribution), +the installer runs the \pgm{mhconfig} program, +which customizes the \file{Makefile\/}s and some of the programs, +for that site's particular installation. +No hand-editing of any source code should be necessary, +under normal circumstances. + +\subsection{Interface to the Message Transport System} % jlr & mtr +\MH/ will run with a number of message transport systems, +including \SendMail/, \MMDFII/, and a small stand-alone system. +One flexible method of posting mail is through an SMTP connection. +There are a couple of major wins in using this configuration: +First, +none of the \MH/ programs need to know where the interface programs to +the message transport system are located, +which makes them easier to move between systems. +Second, +mail can be posted on relay hosts, +and the local host of an \MH/ user may not need a message transport system at +all (as alluded to in the preceeding discussion on the POP). + +\tagdiagram{10}{Sample MTS Tailor File}{mtstailor} +Those parts of \MH/ which interact with the local message transport agent +read additional tailoring information when they start.% +\nfootnote{This simple facility is based on a more extensive +tailoring capability found in \MMDFII/.} +This information includes +the location of standard and alternate maildrops, +maildrop delimiter strings, +the locking directory and locking style, +and other tailoring information specific for the particular +message transport system in use +(e.g., the default server search-list when mail is posted with the SMTP). +In most cases, +by using a tailor file, +each site running a similar \MH/ configuration is able to simply transfer +\MH/ binaries between hosts. +An example of such a tailor file is shown in Figure~\mtstailor. + +A continuing question which is often raised is how intelligent should user +agents (like \MH/ and UCB \pgm{Mail}\/) be with respect to the environment in +which they operate. +At present, \MH/ likes to determine +the official hostnames for addresses when posting mail. +Many argue that this is improper or unnecessary behavior for a user agent, +and that the local message transport agent should handle these functions. +Unfortunately, +this implies that the message transport agent should munge headers when mail +is posted to remove local host aliases and only permit address fields with +fully-qualified addresses. +Sadly, neither \SendMail/ nor \MMDFII/ really gets this right +(flames to \file{/dev/null} please). +The current \MH/ maintainers believe that the resolution of host aliases to +official names should be a well-supported interface with the local message +transport agent. +However, to provide equal time to those who hold opposite views, +\MH/ supports a configuration option called \eg{DUMB} which disables \MH/'s +attempts to resolve addresses into fully-qualified strings. + +\section{Concluding Remarks} % jlr and mtr +While \MH/ has undergone significant development since +the original +Rand release, the authors have +tried to keep the fundamental concepts of +\MH/ unchanged. + % specific vs. general +The authors have continually had to battle against +well-meaning \MH/ users who wanted to make \MH/ +more like other (less powerful) user agents. +More and more ``features'' were often suggested for \MH/, +usually at the expense of making \MH/ less general, and more specific. +In nearly all cases, the ``features'' which these users wanted +were already present in \MH/ in a slightly different form, +or could be realized by simply writing a short shell script. +A classic example is the repeated requests by one user to have \pgm{dist} +take a list of messages rather than a single message and distribute each one +of them in turn. +A simple shell script which called \pgm{dist} repeatedly, +perhaps with ``canned'' arguments so the user typed in addressing information +only once, would easily meet this request. + + % generality +A number of \MH/ comands have a large number of options. +When adding options, the authors have tried to make the options +general, while still accomodating the requests of specific users. +An example of a specific request which was implemented as a +general feature is the \eg{Previous-Sequence} profile entry +(mentioned above). +If you use this profile entry, every \MH/ command is forced to write +out \context/ changes, making every command somewhat slower. +Since only a few users wanted this capability, it was implemented +in such a way that users who didn't want it, didn't have to pay +the cost of slowing down every \MH/ command. + + % naive user :: MH +\MH/ has a powerful tailoring capability provided by the \profile/. +Using profile entries, users may +customize their own environment without affecting others. +Novice users often take advantage of the \MH/-tailoring +capabilities to try to make \MH/ work similarly to +other user agents they've used. +This has the advantage of allowing them to quickly begin +using \MH/ to handle their mail. +However, since these novice users don't take advantange of all the +capabilities of \MH/, +they frequently will complain about things they think can't +be done with \MH/, or could be done ``better'' some other way. +Fortunately, +as these users become more experienced with both \MH/ and \unix/, +they can modify their environment to take better advantage of +all of \MH/'s capabilities. +Novice \MH/ users who see features lacking +are encouraged to take a better look at what \MH/ {\it can} do, +instead of trying to make \MH/ into something it isn't. +This may sound rather inflammatory, +but it would really be a much nicer world for us all if users of software +systems would read the manual prior to asking questions. + + % speed consideration +For a moment, let's consider the evolution of one \MH/ feature which has +proved itself to be very useful. +As users began employing \MH/ to handle their mail, +the number of messages that could be processed +in a given amount of time increased greatly. +As the volume of messages increased however, +it became clear that some \MH/ operations were too slow, +in particular the interaction with the (slow) message transport system. +To overcome this problem, the \pgm{push} option +was added at the \whatnow/ prompt. +Originally, this option was hidden from novice users +and did little more than send the message in the background: +any output generated by +the background \pgm{send} process would be printed +asyncronously on the terminal. +If a message failed posting with the message transport system, +it would simply be left in the \file{draft} file. + +Gradually, other features were added to \pgm{push}. +Since users wanted to be able to send more than one draft +at a time, \pgm{push} was changed to optionally +rename the draft file before posting it. +(This is what the hidden \switch{unique} option does.) +Having message transport system diagnostics +written asyncronously on the user's terminal was annoying, +so \pgm{push} was made to intercept these diagnostics, +and mail the user a report containing them. +Although the diagnostic report mailed back by \pgm{push} contains +the name of the draft which failed, +a useful added feature was the ability to have \pgm{push} +include the failed draft as well. +Eventually, the draft-folder mechanism was implemented to make +handling multiple message drafts much easier. + + +\subsection{TODO} % mtr +There are, no doubt, a number of improvements which could be made to \MH/. +At the present time, +what further development should \MH/ suffer? +Although not by any means inclusive, +here's a list: +\smallskip +{\advance\leftskip by\parindent +\item{1.} Performance Enhancements\hbreak +Hardware gets faster all the time, but people always complain that software +is too slow. +Owing to its user interface style, +\MH/ is somewhat slower than monolithic programs like UCB \pgm{Mail}. +It would be nice if \MH/ could be tuned or accelerated somehow. + +\item{2.} Port to System~5\hbreak +\MH/ runs on 4.2\bsd/~\unix/ and Version~7 variants. +It should not be difficult to port \MH/ to a SYS5 environment. +This should significantly increase the number of hosts +on which \MH/ can run. +The authors, +lacking a SYS5 machine (and experience with SYS5) to perform the port, +are actively seeking a System~5 guru to attempt this feat. + +\item{3.} Interface to the Network News\hbreak +Not all sites that run \MH/ are in the ARPA Internet, +and as such the UCI BBoards facility may not be of much use to them. +A good \MH/ interface to the network news would allow users on hosts with a +news feed to employ the same interface for reading and sending both mail and +news. + +\item{4.} Programmed Instruction for Beginners\hbreak +The complexity of \MH/ is often intimidating to new users. +It would be nice to develop a set of \pgm{learn} lessons for those users who +don't like \pgm{man} pages and non-interactive tutorials. + +\item{5.} Message List Expansion\hbreak +At present, when a list of messages is given to an \MH/ command, +it expands the list and processes each message in numerical order +rather than the order in which the messages were given +(e.g., \eg{show\ 2\ 1} \pgm{show\/}s message~1 +and then message~2). +It would be nice if \MH/ processed messages in the order +they were given. + +\item{6.} Context Changes\hbreak +In nearly all cases, +an \MH/ command does not write out context changes until it is about to exit +successfully. +There is some controversy as to whether this is the correct behavior +in all cases. +Some argue that once an \MH/ command has fully parsed its argument list, +the context should be updated. +\par}