|
|
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}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.