|
|
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.