Annotation of 43BSD/contrib/mh/papers/realwork/text.tex, revision 1.1

1.1     ! root        1: % begin text
        !             2: 
        !             3: \banner
        !             4: 
        !             5: \section{Introduction}                         % mtr
        !             6: The UCI version of the Rand Message Handling System, \MH/,
        !             7: is a software system that performs two functions:
        !             8: \underbar{first},
        !             9: it interfaces a user to a message transport system,
        !            10: so the user may receive and send mail;
        !            11: \underbar{second},
        !            12: it permits the user to maintain an organized mail environment to facilitate
        !            13: the composition of new messages and the reading of old messages.
        !            14: In short,
        !            15: while not responsible for the delivery of messages,
        !            16: \MH/ aids the user in handling mail.
        !            17: 
        !            18: \MH/ was originally developed by the Rand Corporation,
        !            19: and initially was proprietary software.
        !            20: The Department of Information and Computer Science at
        !            21: University of California, Irvine,
        !            22: shortly after joining the Computer Science Network (CSnet),
        !            23: acquired a copy of \MH/,
        !            24: and began additional development of the software.
        !            25: Since that time,
        !            26: the Rand Corporation has declared \MH/ to be in the public domain,
        !            27: and the UCI version of \MH/ has passed through four major releases.
        !            28: The current version, \mh5,
        !            29: is available from U.C.~Irvine for a nominal distribution fee,
        !            30: or may be retrieved from the University of Delaware via anonymous FTP.
        !            31: 
        !            32: Much credit must be given to the initial designers and implementors of \MH/:
        !            33: Bruce Borden, Stockton Gaines, and Norman Shapiro.
        !            34: Although \MH/ has suffered significant development at UCI
        !            35: since Rand's initial release,
        !            36: the fundamental concepts of \MH/'s environs have remained nearly unchanged.
        !            37: In addition,
        !            38: the authors of the current release gratefully acknowledge the comments of the
        !            39: many sites which have run various releases of \MH/ in the past.
        !            40: In particular,
        !            41: the dozen or so beta test sites for \mh5
        !            42: provided tremendous help in stabilizing the current release.
        !            43: 
        !            44: \MH/ runs on different versions of the \unix/ operating system
        !            45: (such as Berkeley~4.2\bsd/ and various flavors of v7).
        !            46: In addition,
        !            47: \MH/ supports four different message transport interfaces:
        !            48: \SendMail/\cite{EAllm83},
        !            49: the standard mailer for 4.2\bsd/ systems;
        !            50: \MMDF/\cite{DCroc79} and \MMDFII/\cite{DKing84},
        !            51: the Multi-Channel Memo Distribution Facility developed by the University of
        !            52: Delaware
        !            53: which forms the software-backbone for CSnet\cite{DCome83} mail relay service;
        !            54: SMTP,
        !            55: the ARPA Internet Simple Mail Transfer Protocol\cite{SMTP};
        !            56: and,
        !            57: a stand-alone delivery system.
        !            58: 
        !            59: This paper is organized in a straight-forward fashion:
        !            60: Initially,
        !            61: the \MH/ philosophy of mail handling is presented,
        !            62: along with a description of the environment which the \MH/ user is given to
        !            63: process mail.
        !            64: Following this,
        !            65: certain advanced features of \MH/ are discussed in more detail,
        !            66: such as facilities for selecting messages,
        !            67: and ``advanced'' concepts in {\it draft} handling.
        !            68: In addition,
        !            69: user interface issues in mail handling are addressed,
        !            70: and the merits of \MH/'s approach is critically examined.
        !            71: Next,
        !            72: the \mh5 distribution package is described.
        !            73: Finally,
        !            74: we conclude by discussing the authors' experience with \MH/ development
        !            75: and introducing areas where \MH/ may be further developed.
        !            76: 
        !            77: Although familiarity with \MH/ is not assumed on the part of the reader,
        !            78: some knowledge of the \unix/ operating system is useful.
        !            79: Appendix~A gives a short synopsis of the \MH/ commands.
        !            80: 
        !            81: \section{The \MH/ Philosophy}                  % mtr
        !            82: Although \MH/ has many traits which tend to distinguish it from other systems
        !            83: which handle mail,
        !            84: there is a single fundamental design decision which influences the interface
        !            85: between \MH/ and the user:
        !            86: \MH/ differs from most other systems in that it is composed of many small
        !            87: programs instead of one very large one.
        !            88: This architecture gives \MH/ much of its strength,
        !            89: since intermediate and advanced users are able to take advantage of this
        !            90: flexibility.
        !            91: 
        !            92: The key to this flexibility is that the \unix/ shell
        !            93: (usually the {\it C} shell or the {\it Bourne} shell),
        !            94: is the user's interface to \MH/.
        !            95: This means that when handling mail,
        !            96: the entire power of the shell is at the user's disposal,
        !            97: in addition to the
        !            98: facilities which \MH/ provides.
        !            99: Hence,
        !           100: the user may intersperse mail handling commands with other commands in an
        !           101: arbitrary fashion,
        !           102: making use of command handling capabilities which
        !           103: the user's shell provides.
        !           104: 
        !           105: Furthermore,
        !           106: rather than storing messages in a complicated data structure
        !           107: within a monolithic file,
        !           108: each message in \MH/ is a \unix/ file,
        !           109: and each folder (an object which holds groups of messages)
        !           110: in \MH/  is a \unix/ directory.
        !           111: That is,
        !           112: the directory- and file-structure of \unix/ is used directly.
        !           113: As a result,
        !           114: any \unix/ file-handling command can be applied to any message.
        !           115: 
        !           116: To the novice,
        !           117: this may not make much sense or may not seem important.
        !           118: However,
        !           119: as users of \MH/ become more experienced,
        !           120: they find this capability attractive.
        !           121: In addition,
        !           122: this approach is often quite pleasing to system implementors,
        !           123: because it minimizes the amount of coding to be performed,
        !           124: and given a modular design,
        !           125: changes to the software system can be maintained easily.
        !           126: There are, however, performance penalties to be paid with this scheme.
        !           127: This issue is considered later in the paper.
        !           128: 
        !           129: Having described how \MH/ fits into the \unix/ environment,
        !           130: we now discuss the mail handling environment which is available to the \MH/
        !           131: user.
        !           132: 
        !           133: \subsection{The \MH/ Environs}                 % jlr
        !           134: In the \file{\$HOME} directory of each \MH/ user, a file named
        !           135: \profile/ contains static information about the user's \MH/ environment, 
        !           136: and default arguments for \MH/ programs.
        !           137: For the latter case,
        !           138: each line of profile takes the form:
        !           139: \example program-name:\ options\endexample
        !           140: Each \MH/ program consults the user's \profile/ for its options.
        !           141: These options are consulted prior to evaluating any command-line arguments,
        !           142: and so provide the \MH/ user the capability to customize the defaults for each
        !           143: command.
        !           144: Futher, by using the \unix/ link facility,
        !           145: different names can be given to the same command.
        !           146: Since each \MH/ command looks
        !           147: in the \profile/
        !           148: for a component with the name by which it was invoked,
        !           149: it's possible to have different defaults for the same program.
        !           150: For example,
        !           151: it is not uncommon to link \pgm{prompter}
        !           152: (a simple prompting editor front-end)
        !           153: under the name \pgm{rapid} in the
        !           154: user's \file{bin/} directory, and add to the \profile/:
        !           155: \example rapid:\ -prepend\ -rapid\endexample
        !           156: As a result,
        !           157: when \pgm{prompter} is invoked as \pgm{rapid},
        !           158: it automatically uses the \switch{prepend} and \switch{rapid} options.
        !           159: 
        !           160: The profile component \eg{Path:} is the path to the user's
        !           161: \MH/-directory, usually \Mail/.
        !           162: In addition to containing the user's folders,
        !           163: the \MH/-directory also contains {\it skeletons} and
        !           164: {\it templates} used by the \MH/ programs,
        !           165: and the user's \context/ file.
        !           166: This latter file has the same format as the user's \profile/,
        !           167: and contains the dynamic,
        !           168: context-dependent information about the user's environment.
        !           169: Whenever \MH/ looks for an \MH/-specific file,
        !           170: such as a template or skeleton,
        !           171: it first consults the user's \MH/-directory,
        !           172: and then a system-wide library area.
        !           173: 
        !           174: The \MH/ user always has a {\it current folder},
        !           175: which is the folder in which
        !           176: the user is currently (or was last) working.
        !           177: Since any \MH/ program which deals with folders implicitly manipulates this
        !           178: information,
        !           179: the name of the  current folder is stored in the \file{context}
        !           180: component \eg{Current-Folder:}.
        !           181: Every folder has a {\it current message} known as \arg{cur}.
        !           182: These values are the defaults for \MH/ commands which
        !           183: accept folder and/or messages arguments.
        !           184: 
        !           185: \MH/ programs make use of a set of envariables
        !           186: which further customize their behavior.
        !           187: The \file{\$MH} envariable, if present,
        !           188: specifies the name of an alternate profile for the user.
        !           189: This allows a user of \MH/ to
        !           190: easily maintain multiple mail-handling environments.
        !           191: 
        !           192: In terms of command syntax,
        !           193: most \MH/ commands accept an optional {\it folder} argument,
        !           194: such as \arg{+outbox}.
        !           195: Unlike most \unix/ commands,
        !           196: all \MH/ commands have switches which are words, rather than single letters.
        !           197: Switches may be abbreviated to the least unambiguous prefix.
        !           198: All \MH/ commands also support a \switch{help} switch,
        !           199: which lists the syntax of the command along with available switches,
        !           200: and the version number of the command.
        !           201: Most \MH/ commands also take a \arg{msg} or \arg{msgs} argument
        !           202: which takes the form of a message number (\eg{1}), a message range (\eg{1-2}),
        !           203: a standard sequence name (\eg{cur}),
        !           204: or a user-defined sequence name (\eg{select}).
        !           205: 
        !           206: \tagdiagram{1}{An \MH/ Session}{session}
        !           207: \subsection{An \MH/ Transcript}                        % jlr
        !           208: Figure~\session\ contains a transcript of a simple \MH/ session.
        !           209: First, \pgm{inc} is run to incorporate the new mail into the 
        !           210: user's \eg{+inbox} folder.
        !           211: 
        !           212: A \pgm{scan} listing of the mail is printed while
        !           213: it is being incorporated.
        !           214: (The user could run \pgm{scan} explicitly to generate additional \pgm{scan}
        !           215: listings later on.)
        !           216: The \pgm{scan} listing gives the message number, followed
        !           217: by the date, message sender, and subject.
        !           218: (If the message originated from the user generating the listing,
        !           219: the \eg{to:} addressee is displayed instead of the sender.)
        !           220: If the subject is short,
        !           221: the first part of the message body is displayed after the characters \eg{<<}.
        !           222: The plus sign (`+') after
        !           223: the message number indicates the current message.
        !           224: 
        !           225: The user \pgm{show\/}s the message, and decides to \pgm{repl\/}y.
        !           226: A reply draft
        !           227: is created using the headers of the message being replied-to,
        !           228: using the default \file{replcomps} template.
        !           229: The default editor, \pgm{prompter}, is called to edit the draft.
        !           230: When an EOT is typed, \pgm{prompter} exits and the
        !           231: user is left at the \whatnow/ prompt.
        !           232: The option \pgm{send} is chosen.
        !           233: Since there were no problems in posting the draft with the message transport
        !           234: system, 
        !           235: no additional output is produced.
        !           236: (\MH/ is not verbose by default.)
        !           237: 
        !           238: The user then decides to compose a new message.
        !           239: The default skeleton, \file{components}, is copied to the draft,
        !           240: and \pgm{prompter} is once again called.
        !           241: After entering the addresses, subject, and body,
        !           242: the user then \pgm{send\/}s the \file{draft} from the \whatnow/ prompt,
        !           243: using \eg{send\ -verbose}, which causes
        !           244: \MH/ to list out the message addresses as it submits them
        !           245: to the message transport system.
        !           246: 
        !           247: \section{Some \MH/ Features}                   % mtr
        !           248: We now consider certain advanced features in \MH/.
        !           249: These features have been chosen to demonstrate some useful capabilities
        !           250: available to the \MH/ user.
        !           251: 
        !           252: \subsection{Message Sequences and Selection}   % jlr
        !           253: \MH/ has several built-in message sequence names, which may
        !           254: be used anywhere a \arg{msg} or \arg{msgs} argument is expected.
        !           255: These are:
        !           256: \arg{cur}, \arg{next}, \arg{prev}, \arg{first}, \arg{last}, and \arg{all}.
        !           257: Message ranges may also be specified.
        !           258: For example, \arg{all} is actually \arg{first-last}, and
        !           259: \arg{+mh\ last:5} references the last five messages in your
        !           260: \arg{+mh} folder.
        !           261: A powerful capability of \MH/ is the ability to use not only the pre-defined
        !           262: message sequence names,
        !           263: but also arbitrary user-defined message sequence names.
        !           264: 
        !           265: Although all \MH/ programs recognize user-defined sequences when appropriate, 
        !           266: the \pgm{pick} and \pgm{mark} commands can create and modify 
        !           267: user-defined message sequences.
        !           268: The \pgm{mark} command allows low-level manipulation of sequences,
        !           269: and is not particularly interesting in our discussion.
        !           270: 
        !           271: The \pgm{pick} command selects certain messages out of a folder.
        !           272: The criteria used for selection may be a search string and/or a date range.
        !           273: 
        !           274: Searching is performed on either a specific header in the message
        !           275: (e.g., \eg{To:}),
        !           276: or anywhere within the message.
        !           277: By default,
        !           278: \pgm{pick} lists out the message numbers that matched
        !           279: the selection criteria.
        !           280: Thus, \pgm{pick} is useful in backquoted operations to the shell.
        !           281: For example, to scan all the messages in the current folder from ``frated'',
        !           282: the \MH/ user issues the command:
        !           283: \example scan\ \bq{pick\ -from\ frated}\endexample
        !           284: To perform more complicated message selection,
        !           285: user-defined sequences are employed.
        !           286: Supplying a \switch{sequence\ name}
        !           287: argument to \pgm{pick}, will cause it to define the
        !           288: sequence \arg{name} as those messages matched.
        !           289: 
        !           290: Giving \pgm{pick} a list of messages causes it to limit its search to just
        !           291: those messages.
        !           292: For example,
        !           293: to find all the messages in the current folder from ``frated'' also dated
        !           294: before friday:
        !           295: \example pick\ -from\ frated\ -sequence\ select\\
        !           296:         pick\ select\ -before\ friday\ -sequence\ select\endexample
        !           297: With the first \pgm{pick} command,
        !           298: the sequence \eg{select} is defined
        !           299: to be all those messages from ``frated''.
        !           300: In the second command, only those messages already in the \eg{select}
        !           301: sequence are searched, and the \eg{select} sequence is redefined to be
        !           302: only those messages which are also
        !           303: dated before friday.
        !           304: Those messages could then be \pgm{show\/}n with:
        !           305: \example show\ select\endexample
        !           306: When a \switch{sequence\ name} argument is given to \pgm{pick},
        !           307: the default behavior --- listing the message numbers
        !           308: matched --- is inhibited.
        !           309: To re-enable this behavior, the \switch{list} option may be given.
        !           310: As a result,
        !           311: advanced users of \MH/ often put the following line in their \profile/:
        !           312: \example pick:\ -sequence\ select\ -list\endexample
        !           313: which allows them to easily make use of the \arg{select} sequence as the
        !           314: messages last selected with \pgm{pick}.
        !           315: 
        !           316: Often it is desirable to act upon those messages which
        !           317: are {\it not} members of a given sequence.
        !           318: For this purpose,
        !           319: the \eg{Sequence-Negation:} profile entry is useful.
        !           320: If the name of a user-defined sequence is prefixed with the value of the
        !           321: sequence-negation profile entry,
        !           322: \MH/ commands will operate upon those messages which are {\it not} members
        !           323: of that sequence.
        !           324: For example, given a profile entry of:
        !           325: \example Sequence-Negation:\ not\endexample
        !           326: those messages which
        !           327: are not in the \arg{select} sequence could be \pgm{scan\/}'d with:
        !           328: \example scan\ notselect\endexample
        !           329: 
        !           330: Obviously, some confusion could result if an attempt was made
        !           331: to define a sequence name
        !           332: which began with the sequence-negation string (e.g., \eg{notselect}).
        !           333: For this reason, \MH/ users will often use a single
        !           334: character,
        !           335: which their shell doesn't interpret,
        !           336: as their sequence-negation string
        !           337: (e.g., up-caret (`\^{}') for {\it C} Shell users,
        !           338: and exclamation-mark (`!') for {\it Bourne} shell users).
        !           339: 
        !           340: \MH/ also provides a way of automatically remembering the last
        !           341: message list given to
        !           342: an \MH/ command.
        !           343: This facility is implemented by using a profile entry called
        !           344: \eg{Previous-Sequence:}.
        !           345: 
        !           346: \subsection{Draft Handling}                    % jlr
        !           347: After the initial edit of a message draft,
        !           348: the \pgm{comp}, \pgm{dist}, \pgm{forw}, and \pgm{repl} programs
        !           349: give the user a \whatnow/ prompt.
        !           350: The valid responses include:
        !           351: \pgm{edit} to re-edit the draft,
        !           352: \pgm{quit} to exit without sending the draft,
        !           353: \pgm{send} to send the draft, and
        !           354: \pgm{push} to send the draft in the background.
        !           355: 
        !           356: When the \pgm{send} option is given,
        !           357: the draft is posted with the message transport system.
        !           358: If there problems posting the draft,
        !           359: the \whatnow/ prompt is re-issued,
        !           360: so errors in the draft may be corrected.
        !           361: 
        !           362: Since posting the draft can be slow,
        !           363: the \pgm{push} option allows the \MH/ user to send the draft in the
        !           364: background, and return immediately to the shell.
        !           365: If there are problems posting the message,
        !           366: the user will not see the diagnostics produced by
        !           367: the message transport system.
        !           368: For this reason,
        !           369: if \pgm{push} is used instead of \pgm{send},
        !           370: and the message is not successfully posted,
        !           371: \MH/ mails a message to the user
        !           372: containing any diagnostics which the message transport system produced
        !           373: along with a copy of the message.
        !           374: Later,
        !           375: the draft may be re-edited by entering \eg{comp\ -use}.
        !           376: 
        !           377: A relatively new feature of \MH/ is the ability to use a folder to store
        !           378: multiple drafts.
        !           379: These drafts are kept in an ordinary \MH/ folder,
        !           380: and may be operated upon by \MH/ commands.
        !           381: To enable this feature,
        !           382: the \MH/ user selects a folder-name for the draft-folder,
        !           383: and creates an entry in the \profile/:
        !           384: \example Draft-Folder:\ +foldername\endexample
        !           385: From this point on,
        !           386: when a message is composed,
        !           387: the draft will be created as a message in that folder,
        !           388: instead of using the \file{draft} file in the user's \MH/ directory.
        !           389: Unfortunately,
        !           390: if posting problems occur on a message which has been \pgm{push\/}'d,
        !           391: it may be difficult to re-edit the draft with
        !           392: \eg{comp\ -use}.
        !           393: This might be the case if the user had started composing another message,
        !           394: while that first draft was being posted.
        !           395: In that event,
        !           396: the current-message in the draft-folder would no longer point
        !           397: to the failed draft.
        !           398: 
        !           399: There is a solution for this problem, however.
        !           400: By default,
        !           401: \pgm{push} assumes the \switch{forward} option,
        !           402: which says that if the message draft fails to be posted,
        !           403: it should be forwarded back to the user in the
        !           404: error report which \pgm{push} generates.
        !           405: The failed draft may then be extracted with the \pgm{burst} program
        !           406: (discussed later).
        !           407: 
        !           408: \subsection{BBoards}                           % mtr
        !           409: \MH/ has a convenient interface to the UCI BBoards facility\cite{MRose84a}.%
        !           410: \nfootnote{The UCI BBoards facility can run under either the \MMDF/ or
        !           411: \SendMail/,
        !           412: or in a more restricted form under stand-alone \MH/.}
        !           413: This facility permits the efficient distribution of interest group messages
        !           414: on a single host,
        !           415: to a group of hosts under a single administration,
        !           416: and to the ARPA Internet community.
        !           417: 
        !           418: Although most readers are probably familiar with the concept of an interest
        !           419: group in the Internet context, a brief description is now given.
        !           420: Observant readers will notice that the distributed nature of the
        !           421: ``network news'' (a.k.a.~USENET)
        !           422: tends to avoid many of the problems described below.
        !           423: 
        !           424: Described simply, an interest group is composed of a number of subscribers
        !           425: with a common interest.
        !           426: These subscribers post mail to a single address, known as the
        !           427: {\it distribution} address (e.g., {\tx MH-Workers@UCI}.
        !           428: From this distribution address, a copy of the message is sent to each
        !           429: subscriber.
        !           430: Each group has a {\it moderator},
        !           431: who is the person that runs the group.
        !           432: This moderator can usually be reached at a special address,
        !           433: known as the {\it request} address (e.g., {\tx MH-Workers-Request@UCI}).
        !           434: Usually, the responsibilities of the moderator are quite simple,
        !           435: since the mail system handles distribution to subscribers automatically.
        !           436: In some interest groups,
        !           437: instead of each separate message being distributed directly to subscribers,
        !           438: a batch of (hopefully related) messages
        !           439: are put into a {\it digest} format by the
        !           440: moderator and then sent to the subscribers.
        !           441: (This is similar to a newsletter format.)
        !           442: Although this requires more work on the part of the moderator
        !           443: and introduces delays,
        !           444: such groups tend to be better organized.
        !           445: 
        !           446: Unfortunately, some problems arise with the scheme outlined above.
        !           447: First, if two users on the same host subscribe to the same interest group,
        !           448: two copies of the message are delivered.
        !           449: This is wasteful of both processor and disk resources at that host.
        !           450: 
        !           451: Second,
        !           452: some groups carry a lot of traffic.
        !           453: Although subscription to a group does indicate interest on the part of a
        !           454: subscriber,
        !           455: it is usually not interesting to get 50 or so messages delivered
        !           456: each day
        !           457: to the user's private maildrop,
        !           458: interspersed with {\it personal} mail,
        !           459: which is likely to be of a much more important and timely nature.
        !           460: 
        !           461: Third, if a subscriber's address in a distribution list 
        !           462: becomes ``bad'' somehow and causes failed mail to be returned,
        !           463: the originator of the message is normally notified.
        !           464: It is not uncommon for a large list to have several bogus addresses.
        !           465: This results in the originator being flooded with ``error messages'' from
        !           466: mailers across the Internet stating that a given address on the list was
        !           467: bad.
        !           468: Needless to say,
        !           469: the originator usually does not care if the bogus addresses got a copy
        !           470: of the message or not.
        !           471: The originator is merely interested in posting a message
        !           472: to the group at large.
        !           473: On the other hand,
        !           474: the moderator of the group does care if there are bogus addresses on the list,
        !           475: but ironically does not receive notification.
        !           476: 
        !           477: To solve these problems,
        !           478: the UCI BBoards facility introduces a new entity into the picture:
        !           479: a {\it distribution channel}.
        !           480: All interest group mail is handled by 
        !           481: the special mail system component.
        !           482: The distribution address for an interest-group
        !           483: maps mail for that interest-group to the distribution channel,
        !           484: which then performs
        !           485: several actions.
        !           486: First, if local delivery is to be performed,
        !           487: a copy of the message is placed in a global maildrop for the interest
        !           488: group with a timestamp and a unique number.
        !           489: Local users can read messages posted for the interest group by reading this
        !           490: ``public'' maildrop.
        !           491: Second, if further distribution is to take place,
        !           492: a copy of the message is sent to the distribution address in such a way that
        !           493: if any of the addresses are bogus,
        !           494: failure notices will be returned to the local maintainer of the group
        !           495: address list, rather than the originator of the message.
        !           496: 
        !           497: This scheme has several advantages:
        !           498: First, messages delivered to the local host are processed and saved once
        !           499: in a globally accessible area.
        !           500: The UCI BBoards facility supports software which allows a user to query an
        !           501: interest group for new messages and to read and process
        !           502: those messages in the \MH/-style.
        !           503: Second, once a host administrator subscribes to an interest group,
        !           504: each user may join or quit the list's readership without
        !           505: contacting anyone.
        !           506: Third, a hierarchical distribution scheme can be constructed to
        !           507: reduce the amount of delivery effort.
        !           508: Finally, errors are prevented from propagating.
        !           509: When an address on the distribution list goes bad,
        !           510: the list moderator who is responsible for the address is notified.
        !           511: If a local moderator does not exist,
        !           512: then the local PostMaster is notified (not the global group moderator).
        !           513: 
        !           514: In addition to solving the problems outlined above,
        !           515: the UCI BBoards facility supports several other capabilities.
        !           516: BBoards may be automatically archived in order to conserve disk space and
        !           517: reduce processing time when reading current items.
        !           518: Also,
        !           519: the archives can be separately maintained on tape for access by interested
        !           520: researchers.
        !           521: 
        !           522: Special alias files may be generated which allow the \MH/ user to shorten
        !           523: address entry.
        !           524: For example, instead of sending to {\tx SF-Lovers@Rutgers},
        !           525: a user of \MH/ usually sends to \eg{SF-Lovers} and the \MH/ aliasing
        !           526: facility automatically makes the appropriate expansion in the headers of the
        !           527: outgoing message.
        !           528: Hence,
        !           529: the user need only know the name of an interest group and not its global
        !           530: network address.
        !           531: 
        !           532: Finally, the UCI BBoards facility supports {\it private} interest groups
        !           533: using the \unix/ group access mechanism.
        !           534: This allows a group of people on the same or different machines to conduct a
        !           535: private discussion.
        !           536: 
        !           537: The practical upshot of all this is that the UCI BBoards facility automates
        !           538: the vast majority of BBoards handling from the point of view of both the
        !           539: PostMaster and the user.
        !           540: 
        !           541: \MH/ provides three programs to deal with interest groups.
        !           542: The \pgm{bbc} program is used to check on the status of one or more groups,
        !           543: and to optionally start an \MH/ shell on those groups which the user is
        !           544: interested in.
        !           545: The \pgm{bbl} program can be used to manually perform maintenance on a
        !           546: discussion group beyond the normal automatic capabilities of the UCI BBoards
        !           547: facility.
        !           548: Finally,
        !           549: the \pgm{msh} program implements an \MH/ shell for reading BBoards,
        !           550: in which nearly all of the \MH/ commands are implemented in a single program.
        !           551: 
        !           552: Observant readers may note that the use of \pgm{msh} is contrary to the \MH/
        !           553: philosophy of using relatively small, single-purpose programs.
        !           554: Sadly,
        !           555: the authors admit that this is true.
        !           556: In an effort to minimize use of system resources however,
        !           557: BBoards are kept in maildrop format instead of folders.%
        !           558: \nfootnote{When the message transport system delivers a message to a user
        !           559: it stores it in a single file, called a {\it maildrop}.
        !           560: Since many messages may be present in a single maildrop,
        !           561: (in theory) there is a unique string acting as a separator between messages
        !           562: in the maildrop.
        !           563: Although this is convenient for storage of messages,
        !           564: it makes retrieval more difficult unless a separate index into the maildrop
        !           565: is kept.
        !           566: This latter approach is taken by the \pgm{msg} program available with \MMDFII/
        !           567: and by \pgm{msh} as well.}
        !           568: Some research has gone into overcoming this problem to restore
        !           569: \MH/'s purity of purpose,
        !           570: but all solutions proposed to date are either unworkable or require
        !           571: significant recoding of \MH/'s internals.
        !           572: 
        !           573: \subsection{Bursting}                  % jlr
        !           574: Internet interest group mail is often sent out in digest form.
        !           575: The experienced \MH/ user may wish to deal with the digest messages on
        !           576: an individual basis, however.
        !           577: The \pgm{burst} program allows the \MH/ user to extract these digest
        !           578: messages,
        !           579: and store each as an individual \MH/ message.
        !           580: 
        !           581: \pgm{Burst} will also extract forwarded messages generated by \pgm{forw}
        !           582: (or the forwarded message in the error report generated by \pgm{push},
        !           583: as described above).
        !           584: Although \pgm{burst} cannot always decapsulate
        !           585: messages encapsulated by sites not running \MH/,
        !           586: it adheres to the proposed standard described in \cite{MRose85b}.
        !           587: 
        !           588: \subsection{Distributed Mail}                  % mtr
        !           589: The ARPA Internet community consists of many types of heterogeneous nodes.
        !           590: Some hosts are large mainframe computers,
        !           591: others are personal workstations.
        !           592: All communicate using the \milstd/ TCP/IP protocol suite\cite{IP,TCP}.
        !           593: Messages which conform to the Standard for the Format of ARPA Internet Text
        !           594: Messages\cite{DCroc82}
        !           595: are exchanged using the Simple Mail Transfer Protocol\cite{SMTP}.
        !           596: 
        !           597: On smaller nodes in the ARPA Internet,
        !           598: it is often impractical to maintain
        !           599: a message transport system (e.g., \SendMail/).
        !           600: For example,
        !           601: a workstation may not have sufficient resources (cycles, disk space)
        !           602: in order to permit an SMTP server and associated local mail delivery system
        !           603: to be kept resident and continuously running.
        !           604: Furthermore,
        !           605: the workstation could be off-net for extended periods of time.
        !           606: Similarly,
        !           607: it may be expensive (or impossible) to keep a personal computer
        !           608: interconnected to an IP-style network for long periods of time.
        !           609: In other words,
        !           610: the node is lacking the resource known as ``connectivity''.
        !           611: 
        !           612: Despite this,
        !           613: it is often desirable to be able to manage mail with \MH/ on these smaller
        !           614: nodes,
        !           615: and they often support a user agent to aid the tasks of mail handling.
        !           616: To solve this problem,
        !           617: a network node which can support a message transport entity
        !           618: (known as {\it service} host) offers
        !           619: a maildrop service to these less endowed nodes
        !           620: (known as {\it client} hosts).
        !           621: The Post Office Protocol\cite{JReyn84} (POP) is intended to permit a
        !           622: workstation to dynamically access a maildrop on a service host to pick-up
        !           623: mail.%
        !           624: \nfootnote{Actually,
        !           625: there are three different descriptions of the POP.
        !           626: The first, cited in \cite{JReyn84},
        !           627: was the original description of the protocol,
        !           628: which suffered from certain problems.
        !           629: Since then,
        !           630: two alternate descriptions have been developed.
        !           631: The official revision of the POP\cite{MButl85},
        !           632: and the revision of the POP which \MH/ uses
        !           633: (which is documented in an internal memorandum in the \MH/ release).
        !           634: This paper considers the POP in the context of the \MH/ release.}
        !           635: The level of access includes the ability to
        !           636: determine the number of messages in the maildrop and the size of each message,
        !           637: as well as to retrieve and delete individual messages.
        !           638: More sophisticated implementations of the POP server
        !           639: are able to distinguish between the header and body portion of each message,
        !           640: and send $n$ lines of a message to the POP client.
        !           641: This capability is useful in thinly connected environments where conservation
        !           642: of bandwidth is important.
        !           643: By utilizing a more intelligent POP client,
        !           644: a user may generate ``scan~listings'' and decide dynamically which messages
        !           645: are worth taking delivery on.
        !           646: The philosophy of the POP is to put intelligence in the 
        !           647: POP clients and not the POP servers.
        !           648: 
        !           649: The current release of \MH/ supports the above model fully.
        !           650: A POP client program is available to retrieve a maildrop from a POP service
        !           651: host.
        !           652: In addition,
        !           653: using the SMTP configuration for delivery in \MH/
        !           654: (either in conjunction with \SendMail/ or the \MMDF/),
        !           655: a user is able to specify a search-list of service hosts (and/or networks)
        !           656: to try to post mail.
        !           657: Using this search-list,
        !           658: when an \MH/ user posts a draft,
        !           659: the \pgm{post} program will attempt to establish an SMTP connection
        !           660: with each host in the search-list to post the message until it succeeds.
        !           661: Initial experimentation using the POP and \MH/
        !           662: in a local network environment has proved quite successful.
        !           663: 
        !           664: \section{User Interface Issues in \MH/}                % mtr
        !           665: At this point,
        !           666: it is perhaps useful to take a step backwards and examine the success
        !           667: and problems of \MH/'s approach to user interfaces.
        !           668: 
        !           669: \subsection{Creeping Featurism}                        % mtr
        !           670: A complaint often heard about systems which undergo substantial development
        !           671: by many people over a number of years, is that more and more options are
        !           672: introduced which add little to the functionality but greatly increase the
        !           673: amount of information a user needs to know in order to get useful work done.
        !           674: This is usually referred to as {\it creeping featurism}.
        !           675: 
        !           676: Unfortunately \MH/,
        !           677: having undergone six years of off-and-on development by ten or so
        !           678: well-meaning programmers (the present authors included),
        !           679: suffers mightily from this.
        !           680: For example,
        !           681: the \pgm{send} command has twenty-five visible switches,
        !           682: and at least nine hidden switches,
        !           683: for a total of thirty-four.
        !           684: The poor user who types \example send\ -help\endexample watches the options
        !           685: scroll off the screen
        !           686: (since the \switch{help} switch also lists out four other lines of
        !           687: information).%
        !           688: \nfootnote{Recently,
        !           689: this was fixed by compressing the way in which switches are presented.
        !           690: The solution is only temporary however,
        !           691: as \pgm{send} will no doubt acquire an {\it endless} number of switches in
        !           692: the years to come.}
        !           693: The sad part is that all of these switches are useful in one form or another.
        !           694: 
        !           695: There are a lot of good things to be said for the
        !           696: ``one program, one function'' philosophy of system design.
        !           697: In the \MH/ case, however,
        !           698: each program really does only one mail handling activity
        !           699: (with a few minor exceptions).
        !           700: The options associated with each command are present to modify the program's
        !           701: behavior to perform similar, but slightly different tasks.
        !           702: In further defense of \MH/,
        !           703: note that there are~32 \MH/ commands at present,
        !           704: all performing different tasks.
        !           705: 
        !           706: The problem with creeping featurism though,
        !           707: is that while the functionality of the system increases sub-linearly,
        !           708: the complexity of the system increases linearly.
        !           709: That is,
        !           710: although the number of switches that a program takes might double,
        !           711: it is unlikely that the program's functionality or capabilities will double.
        !           712: 
        !           713: \subsection{Templates versus Switches}         % mtr
        !           714: One way to trim the explosion of available options,
        !           715: while still increasing functionality,
        !           716: is to introduce options with a richer domain.
        !           717: Hence,
        !           718: instead of using options which take {\it on} or {\it off} forms
        !           719: or simple numeric or string values,
        !           720: the possible values which an option might take on is given a large space.
        !           721: There are several ways that this might be accomplished.
        !           722: 
        !           723: \tagdiagram{2}{Draft Skeleton}{components}
        !           724: The \pgm{comp}, \pgm{dist}, and \pgm{forw} programs
        !           725: use draft {\it skeletons} (simple form fill-in files) to construct the
        !           726: general format of the draft being composed.
        !           727: An example of a draft skeleton used for composing new messages
        !           728: (by \pgm{comp\/}) is shown in Figure~\components.
        !           729: The approach is to let the user specify (and later edit) both arbitrary
        !           730: headers of draft and the body of the draft.
        !           731: Note while most of the fields are empty,
        !           732: the first \eg{Fcc:} field already contains a value.
        !           733: By using the simple prompting editor, \pgm{prompter},
        !           734: the user can speedily enter the headers of the message.
        !           735: The \pgm{prompter} program given the skeleton in Figure~\components\ would
        !           736: prompt the user for the contents of each field,
        !           737: except for the second \eg{fcc:},
        !           738: which it would include verbatim.
        !           739: It would then read the body of the message up to an end-of-file.
        !           740: Naturally,
        !           741: the \MH/ user is free to use {\it any} editor to edit {\it any} part of the
        !           742: draft (headers or body).
        !           743: This example 
        !           744: demonstrates the flexibility achieved by not limiting what headers a
        !           745: draft may contain (which most mail sending programs do),
        !           746: while still retaining the simplicity of being able to treat the entire
        !           747: message draft as a \unix/ file.
        !           748: 
        !           749: \tagdiagram{3}{Reply Template}{replcomps}
        !           750: Another more interesting approach is used by the \pgm{repl} command,
        !           751: which constructs a draft in reply-to a previously received message.
        !           752: Instead of adding switches to indicate which fields of the draft should be
        !           753: derived from the message being replied-to,
        !           754: and how they should be derived,
        !           755: a single option,
        !           756: the ability to specify a {\it template}, was made available.
        !           757: An example of a reply template is shown in Figure~\replcomps.
        !           758: Put simply,
        !           759: based on the presence of certain fields in the message being replied-to,
        !           760: and a few switches given by the user,
        !           761: using the reply template,
        !           762: \pgm{repl} generates the reply draft automatically.
        !           763: 
        !           764: \tagdiagram{4}{The \file{tripcomps} Reply Template}{tripcomps}
        !           765: This facility, for example,
        !           766: can be used to generate automatic replies.%
        !           767: \nfootnote{\MH/ supports the notion of a user-defined {\it mail hook}
        !           768: which is invoked each time a user receives mail.}
        !           769: One function might be to write a \pgm{rcvtrip} shell script
        !           770: which automatically answered messages when mail wasn't being read for a
        !           771: period of time
        !           772: (e.g., while attending a conference).
        !           773: An example of a reply template at the heart of such a script
        !           774: is shown in Figure~\tripcomps.
        !           775: 
        !           776: \tagdiagram{5}{The \file{bombcomps} Reply Template}{bombcomps}
        !           777: Finally,
        !           778: another application might be to utilize
        !           779: the highly useful letter bomb protocol.%
        !           780: \nfootnote{The authors wish to credit Ron Natalie of the Ballistics Research
        !           781: Laboratory in Aberdeen, Maryland for formalizing the
        !           782: use of this protocol in the ARPA Internet community.}
        !           783: The important thing to note about this template is that it generates not only
        !           784: the headers of the reply draft (with a creative \eg{Reply-to:} address),
        !           785: but the body as well.
        !           786: Hence,
        !           787: the commands
        !           788: \example
        !           789:     repl\ -form\ bombcomps\ -noedit\ ;\ rmm\\
        !           790:     What\ now?\ push%
        !           791: \endexample
        !           792: are very handy for dealing with disturbing mail in a straight-forward manner.
        !           793: Of course, \pgm{repl} could be linked to \pgm{bomb} in the user's \file{bin/}
        !           794: directory and an appropriate line could be added to the user's \MH/ profile,
        !           795: in order to further shorten type-in.
        !           796: 
        !           797: \tagdiagram{6}{Display Template}{mhlforward}
        !           798: A variation on the reply template is the {\it display template}.
        !           799: A display template, as used by the \pgm{mhl} program,
        !           800: contains instructions on how to format a message.
        !           801: In addition to being used by \pgm{show}, et.~al.,
        !           802: the \pgm{forw} program can also use a display template to format each
        !           803: message being forwarded.
        !           804: Similarly,
        !           805: although \pgm{repl} uses a reply template to construct the draft
        !           806: being composed,
        !           807: it also may use a display template to format the body of the message
        !           808: being replied-to for enclosure in the reply.
        !           809: Furthermore,
        !           810: the \pgm{post} program may use a display template to format the body of a
        !           811: blind-carbon-copy.
        !           812: An example of a display template used for formatting forwarded messages
        !           813: is shown in Figure~\mhlforward.
        !           814: 
        !           815: As with reply templates,
        !           816: display templates can offer a lot of functionality.
        !           817: For example,
        !           818: the one line display template:
        !           819: \example
        !           820:     body:nocomponent,overflowtext=,overflowoffset=0,width=10000%
        !           821: \endexample
        !           822: can be used to extract the body of a message,
        !           823: while ignoring the headers.
        !           824: Hence,
        !           825: if a \pgm{shar} archive arrived in the mail,
        !           826: a convenient way to unpack it,
        !           827: assuming the above display template was called \file{mhl.body},
        !           828: would be:
        !           829: \example show\ -form\ mhl.body\ |\ sh\endexample
        !           830: 
        !           831: The biggest win with display templates,
        !           832: of course,
        !           833: is that all those annoying header lines which mailers
        !           834: everywhere generate can be simply and easily filtered out.
        !           835: 
        !           836: \subsection{Modularity versus Monolithicity}   % jlr
        !           837: Since \MH/ is a set of programs
        !           838: which perform separate tasks,
        !           839: as opposed to being a single, monolithic program,
        !           840: the power of the shell is used directly to aid in mail-handling.
        !           841: One powerful capability which this design achieves is the ability to extend
        !           842: the \MH/ command set,
        !           843: by developing shell scripts which use the standard \MH/
        !           844: programs to accomplish complicated or specialized tasks.
        !           845: 
        !           846: \tagdiagram{7}{The \pgm{mpick} Script}{mpick}
        !           847: For example,
        !           848: in the \MH/ distribution there is a shell script
        !           849: called \pgm{mpick} (shown in Figure~\mpick)
        !           850: which tries to locate all the messages which pertain to a given discussion,
        !           851: by looking at the \eg{Message-ID:} and \eg{In-reply-to:} headers,
        !           852: to find matching message-ids.%
        !           853: \nfootnote{Note that the shell scripts included in the \MH/ distribution
        !           854: are written for the {\it Bourne} shell,
        !           855: and have a `:' as the first character of the first line,
        !           856: so they will be portable to all versions of \unix/,
        !           857: not just those which support the
        !           858: Berkeley `\#!' enhancement.}
        !           859: 
        !           860: \tagdiagram{8}{The \pgm{append} Editor}{appended}
        !           861: Unfortunately, some parts of \MH/ are somewhat monolithic.
        !           862: An example of this is the \whatnow/ prompt.
        !           863: There are only a few options at this prompt,
        !           864: and one cannot give a normal shell command.
        !           865: Some \MH/ users seem to feel that more options should be added to
        !           866: the \whatnow/ prompt, such as an \pgm{insert-file} option.
        !           867: It was argued that just about any editor would allow you to 
        !           868: insert a file, and another \whatnow/ option was not needed.
        !           869: These users persisted, however, so the
        !           870: problem was solved, by writing a trivial shell
        !           871: script ``editor'' (see Figure~\appended)
        !           872: which could be invoked by the \pgm{edit} option:
        !           873: \example What now?\ edit\ append\ filename\endexample
        !           874: 
        !           875: A better interface at this point is really needed, however.
        !           876: One possibility is to simply pass any unrecognized commands on
        !           877: to a shell for interpretation, supplying the path name of the draft file
        !           878: as an argument.
        !           879: A solution which shows more promise is to give you a sub-shell
        !           880: {\it instead} of the \whatnow/ prompt,
        !           881: and setup certain envariables so that
        !           882: the \MH/ commands would act upon the \file{draft} by default.
        !           883: For example, \pgm{show} with no \arg{msgs} arguments
        !           884: would show the draft instead of the current message.
        !           885: This alternative has recently been implemented and is under testing.
        !           886: 
        !           887: \section{The \MH/ Distribution}                        % mtr
        !           888: The \mh5 distribution is now briefly described,
        !           889: both in terms of static configuration methods
        !           890: and dynamic tailoring.
        !           891: Appendix~B describes the mechanics of receiving an \mh5 distribution.
        !           892: 
        !           893: \subsection{Configurable \MH/}                 % jlr
        !           894: The \MH/ distribution currently runs on a large number of different \unix/
        !           895: versions,
        !           896: ranging from MicroSoft XENIX to Berkeley 4.2\bsd/.
        !           897: All the code which is specific to a particular target environment is
        !           898: enabled via the C-preprocessor \eg{\#ifdef} mechanism,
        !           899: so compilation under different versions of \unix/ is trivial.
        !           900: There are,
        !           901: however,
        !           902: a large number of compile-time options which may vary from site to site,
        !           903: so an automated configuration method was needed.
        !           904: 
        !           905: \tagdiagram{9}{Sample \MH/ Configuration File}{mhconfig}
        !           906: The \MH/-installer must create a configuration file,
        !           907: which contains a list of the compile-time options
        !           908: and the values which are desired for them.
        !           909: Compile-time options include the installation location for \MH/,
        !           910: what kind of message transport system is to be used,
        !           911: and the default editor for the installation.
        !           912: An example of such a configuration file is shown in Figure~\mhconfig.
        !           913: 
        !           914: After creating this file (several examples are included in the distribution),
        !           915: the installer runs the \pgm{mhconfig} program,
        !           916: which customizes the \file{Makefile\/}s and some of the programs,
        !           917: for that site's particular installation.
        !           918: No hand-editing of any source code should be necessary,
        !           919: under normal circumstances.
        !           920: 
        !           921: \subsection{Interface to the Message Transport System} % jlr & mtr
        !           922: \MH/ will run with a number of message transport systems,
        !           923: including \SendMail/, \MMDFII/, and a small stand-alone system.
        !           924: One flexible method of posting mail is through an SMTP connection.
        !           925: There are a couple of major wins in using this configuration: 
        !           926: First,
        !           927: none of the \MH/ programs need to know where the interface programs to
        !           928: the message transport system are located,
        !           929: which makes them easier to move between systems.
        !           930: Second,
        !           931: mail can be posted on relay hosts,
        !           932: and the local host of an \MH/ user may not need a message transport system at
        !           933: all (as alluded to in the preceeding discussion on the POP).
        !           934: 
        !           935: \tagdiagram{10}{Sample MTS Tailor File}{mtstailor}
        !           936: Those parts of \MH/ which interact with the local message transport agent
        !           937: read additional tailoring information when they start.%
        !           938: \nfootnote{This simple facility is based on a more extensive
        !           939: tailoring capability found in \MMDFII/.}
        !           940: This information includes
        !           941: the location of standard and alternate maildrops,
        !           942: maildrop delimiter strings,
        !           943: the locking directory and locking style,
        !           944: and other tailoring information specific for the particular
        !           945: message transport system in use
        !           946: (e.g., the default server search-list when mail is posted with the SMTP).
        !           947: In most cases,
        !           948: by using a tailor file,
        !           949: each site running a similar \MH/ configuration is able to simply transfer
        !           950: \MH/ binaries between hosts.
        !           951: An example of such a tailor file is shown in Figure~\mtstailor.
        !           952: 
        !           953: A continuing question which is often raised is how intelligent should user
        !           954: agents (like \MH/ and UCB \pgm{Mail}\/) be with respect to the environment in
        !           955: which they operate.
        !           956: At present, \MH/ likes to determine 
        !           957: the official hostnames for addresses when posting mail.
        !           958: Many argue that this is improper or unnecessary behavior for a user agent,
        !           959: and that the local message transport agent should handle these functions.
        !           960: Unfortunately,
        !           961: this implies that the message transport agent should munge headers when mail
        !           962: is posted to remove local host aliases and only permit address fields with
        !           963: fully-qualified addresses.
        !           964: Sadly, neither \SendMail/ nor \MMDFII/ really gets this right
        !           965: (flames to \file{/dev/null} please).
        !           966: The current \MH/ maintainers believe that the resolution of host aliases to
        !           967: official names should be a well-supported interface with the local message
        !           968: transport agent.
        !           969: However, to provide equal time to those who hold opposite views,
        !           970: \MH/ supports a configuration option called \eg{DUMB} which disables \MH/'s
        !           971: attempts to resolve addresses into fully-qualified strings.
        !           972: 
        !           973: \section{Concluding Remarks}                   % jlr and mtr
        !           974: While \MH/ has undergone significant development since
        !           975: the original
        !           976: Rand release, the authors have
        !           977: tried to keep the fundamental concepts of
        !           978: \MH/ unchanged.
        !           979:                                                % specific vs. general
        !           980: The authors have continually had to battle against
        !           981: well-meaning \MH/ users who wanted to make \MH/
        !           982: more like other (less powerful) user agents.
        !           983: More and more ``features'' were often suggested for \MH/,
        !           984: usually at the expense of making \MH/ less general, and more specific.
        !           985: In nearly all cases, the ``features'' which these users wanted
        !           986: were already present in \MH/ in a slightly different form,
        !           987: or could be realized by simply writing a short shell script.
        !           988: A classic example is the repeated requests by one user to have \pgm{dist}
        !           989: take a list of messages rather than a single message and distribute each one
        !           990: of them in turn.
        !           991: A simple shell script which called \pgm{dist} repeatedly,
        !           992: perhaps with ``canned'' arguments so the user typed in addressing information
        !           993: only once, would easily meet this request.
        !           994: 
        !           995:                                                % generality
        !           996: A number of \MH/ comands have a large number of options.
        !           997: When adding options, the authors have tried to make the options
        !           998: general, while still accomodating the requests of specific users.
        !           999: An example of a specific request which was implemented as a
        !          1000: general feature is the \eg{Previous-Sequence} profile entry
        !          1001: (mentioned above).
        !          1002: If you use this profile entry, every \MH/ command is forced to write
        !          1003: out \context/ changes, making every command somewhat slower.
        !          1004: Since only a few users wanted this capability, it was implemented
        !          1005: in such a way that users who didn't want it, didn't have to pay
        !          1006: the cost of slowing down every \MH/ command.
        !          1007: 
        !          1008:                                                % naive user :: MH
        !          1009: \MH/ has a powerful tailoring capability provided by the \profile/.
        !          1010: Using profile entries, users may
        !          1011: customize their own environment without affecting others.
        !          1012: Novice users often take advantage of the \MH/-tailoring
        !          1013: capabilities to try to make \MH/ work similarly to
        !          1014: other user agents they've used.
        !          1015: This has the advantage of allowing them to quickly begin
        !          1016: using \MH/ to handle their mail.
        !          1017: However, since these novice users don't take advantange of all the
        !          1018: capabilities of \MH/,
        !          1019: they frequently will complain about things they think can't
        !          1020: be done with \MH/, or could be done ``better'' some other way.
        !          1021: Fortunately,
        !          1022: as these users become more experienced with both \MH/ and \unix/,
        !          1023: they can modify their environment to take better advantage of
        !          1024: all of \MH/'s capabilities.
        !          1025: Novice \MH/ users who see features lacking
        !          1026: are encouraged to take a better look at what \MH/ {\it can} do,
        !          1027: instead of trying to make \MH/ into something it isn't.
        !          1028: This may sound rather inflammatory,
        !          1029: but it would really be a much nicer world for us all if users of software
        !          1030: systems would read the manual prior to asking questions.
        !          1031: 
        !          1032:                                                % speed consideration
        !          1033: For a moment, let's consider the evolution of one \MH/ feature which has
        !          1034: proved itself to be very useful.
        !          1035: As users began employing \MH/ to handle their mail,
        !          1036: the number of messages that could be processed
        !          1037: in a given amount of time increased greatly.
        !          1038: As the volume of messages increased however,
        !          1039: it became clear that some \MH/ operations were too slow,
        !          1040: in particular the interaction with the (slow) message transport system.
        !          1041: To overcome this problem, the \pgm{push} option
        !          1042: was added at the \whatnow/ prompt.
        !          1043: Originally, this option was hidden from novice users
        !          1044: and did little more than send the message in the background:
        !          1045: any output generated by
        !          1046: the background \pgm{send} process would be printed
        !          1047: asyncronously on the terminal.
        !          1048: If a message failed posting with the message transport system,
        !          1049: it would simply be left in the \file{draft} file.
        !          1050: 
        !          1051: Gradually, other features were added to \pgm{push}.
        !          1052: Since users wanted to be able to send more than one draft
        !          1053: at a time, \pgm{push} was changed to optionally
        !          1054: rename the draft file before posting it.
        !          1055: (This is what the hidden \switch{unique} option does.)
        !          1056: Having message transport system diagnostics
        !          1057: written asyncronously on the user's terminal was annoying,
        !          1058: so \pgm{push} was made to intercept these diagnostics,
        !          1059: and mail the user a report containing them.
        !          1060: Although the diagnostic report mailed back by \pgm{push} contains
        !          1061: the name of the draft which failed,
        !          1062: a useful added feature was the ability to have \pgm{push}
        !          1063: include the failed draft as well.
        !          1064: Eventually, the draft-folder mechanism was implemented to make
        !          1065: handling multiple message drafts much easier.
        !          1066: 
        !          1067: 
        !          1068: \subsection{TODO}                              % mtr
        !          1069: There are, no doubt, a number of improvements which could be made to \MH/.
        !          1070: At the present time,
        !          1071: what further development should \MH/ suffer?
        !          1072: Although not by any means inclusive,
        !          1073: here's a list:
        !          1074: \smallskip
        !          1075: {\advance\leftskip by\parindent
        !          1076: \item{1.} Performance Enhancements\hbreak
        !          1077: Hardware gets faster all the time, but people always complain that software
        !          1078: is too slow.
        !          1079: Owing to its user interface style,
        !          1080: \MH/ is somewhat slower than monolithic programs like UCB \pgm{Mail}.
        !          1081: It would be nice if \MH/ could be tuned or accelerated somehow.
        !          1082: 
        !          1083: \item{2.} Port to System~5\hbreak
        !          1084: \MH/ runs on 4.2\bsd/~\unix/ and Version~7 variants.
        !          1085: It should not be difficult to port \MH/ to a SYS5 environment.
        !          1086: This should significantly increase the number of hosts
        !          1087: on which \MH/ can run.
        !          1088: The authors,
        !          1089: lacking a SYS5 machine (and experience with SYS5) to perform the port,
        !          1090: are actively seeking a System~5 guru to attempt this feat.
        !          1091: 
        !          1092: \item{3.} Interface to the Network News\hbreak
        !          1093: Not all sites that run \MH/ are in the ARPA Internet,
        !          1094: and as such the UCI BBoards facility may not be of much use to them.
        !          1095: A good \MH/ interface to the network news would allow users on hosts with a
        !          1096: news feed to employ the same interface for reading and sending both mail and
        !          1097: news.
        !          1098: 
        !          1099: \item{4.} Programmed Instruction for Beginners\hbreak
        !          1100: The complexity of \MH/ is often intimidating to new users.
        !          1101: It would be nice to develop a set of \pgm{learn} lessons for those users who
        !          1102: don't like \pgm{man} pages and non-interactive tutorials.
        !          1103: 
        !          1104: \item{5.} Message List Expansion\hbreak
        !          1105: At present, when a list of messages is given to an \MH/ command,
        !          1106: it expands the list and processes each message in numerical order
        !          1107: rather than the order in which the messages were given
        !          1108: (e.g., \eg{show\ 2\ 1} \pgm{show\/}s message~1
        !          1109: and then message~2).
        !          1110: It would be nice if \MH/ processed messages in the order
        !          1111: they were given.
        !          1112: 
        !          1113: \item{6.} Context Changes\hbreak
        !          1114: In nearly all cases,
        !          1115: an \MH/ command does not write out context changes until it is about to exit
        !          1116: successfully.
        !          1117: There is some controversy as to whether this is the correct behavior
        !          1118: in all cases.
        !          1119: Some argue that once an \MH/ command has fully parsed its argument list,
        !          1120: the context should be updated.
        !          1121: \par}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.