comparison discussion.roff @ 159:8b411125645d

Corrections and improvements by Kate, Phil, Matou, Michi, Lydi.
author markus schnalke <meillo@marmaro.de>
date Mon, 09 Jul 2012 11:16:30 +0200
parents 0cce17978f0a
children 5c01017be420
comparison
equal deleted inserted replaced
158:a6dc418ab0a4 159:8b411125645d
19 The community around nmh has a similar understanding. 19 The community around nmh has a similar understanding.
20 In fundamental difference, mmh shall be a MUA only. 20 In fundamental difference, mmh shall be a MUA only.
21 I believe that the development of all-in-one mail systems is obsolete. 21 I believe that the development of all-in-one mail systems is obsolete.
22 Today, email is too complex to be fully covered by single projects. 22 Today, email is too complex to be fully covered by single projects.
23 Such a project won't be able to excel in all aspects. 23 Such a project won't be able to excel in all aspects.
24 Instead, the aspects of email should be covered my multiple projects, 24 Instead, the aspects of email should be covered by multiple projects,
25 which then can be combined to form a complete system. 25 which then can be combined to form a complete system.
26 Excellent implementations for the various aspects of email exist already. 26 Excellent implementations for the various aspects of email exist already.
27 Just to name three examples: Postfix is a specialized MTA, 27 Just to name three examples: Postfix is a specialized MTA,
28 .\" XXX homepages verlinken
28 Procmail is a specialized MDA, and Fetchmail is a specialized MRA. 29 Procmail is a specialized MDA, and Fetchmail is a specialized MRA.
29 I believe that it is best to use such specialized tools instead of 30 I believe that it is best to use such specialized tools instead of
30 providing the same function again as a side-component in the project. 31 providing the same function again as a side-component in the project.
31 .P 32 .P
32 Doing something well, requires to focus on a small set of specific aspects. 33 Doing something well, requires to focus on a small set of specific aspects.
63 Removing the mail transfer facilities had been the first work task 64 Removing the mail transfer facilities had been the first work task
64 in the mmh project. 65 in the mmh project.
65 .P 66 .P
66 Focusing on one mail agent role only is motivated by Eric Allman's 67 Focusing on one mail agent role only is motivated by Eric Allman's
67 experience with Sendmail. 68 experience with Sendmail.
68 He identified limiting Sendmail the MTA task had be one reason for 69 He identified the limitation of Sendmail to the MTA task as one reason for
69 its success: 70 its success:
70 .[ [ 71 .[ [
71 costales sendmail 72 costales sendmail
72 .], p. xviii] 73 .], p. xviii]
73 .QS 74 .QS
76 This was a departure of the dominant through of the time, 77 This was a departure of the dominant through of the time,
77 in which routing logic, local delivery, and often the network code 78 in which routing logic, local delivery, and often the network code
78 were incorporated directly into the user agents. 79 were incorporated directly into the user agents.
79 .QE 80 .QE
80 .P 81 .P
81 In mmh, the Mail Submission Agent (MSA) is called 82 In nmh, the Mail Submission Agent (MSA) is called
82 \fIMessage Transfer Service\fP (MTS). 83 \fIMessage Transfer Service\fP (MTS).
83 This facility, implemented by the 84 This facility, implemented by the
84 .Pn post 85 .Pn post
85 command, established network connections and spoke SMTP to submit 86 command, established network connections and spoke SMTP to submit
86 messages for relay to the outside world. 87 messages to be relayed to the outside world.
87 The changes in email demanded changes in this part of nmh too. 88 The changes in email demanded changes in this part of nmh too.
88 Encryption and authentication for network connections 89 Encryption and authentication for network connections
89 needed to be supported, hence TLS and SASL were introduced into nmh. 90 needed to be supported, hence TLS and SASL were introduced into nmh.
90 This added complexity to nmh without improving it in its core functions. 91 This added complexity to nmh without improving it in its core functions.
91 Also, keeping up with recent developments in the field of 92 Also, keeping up with recent developments in the field of
124 to be added soon, too, and likewise for any other changes in mail transfer. 125 to be added soon, too, and likewise for any other changes in mail transfer.
125 Not so for mmh because it has dropped the support for retrieving mail 126 Not so for mmh because it has dropped the support for retrieving mail
126 from remote locations. 127 from remote locations.
127 .Ci ab7b48411962d26439f92f35ed084d3d6275459c 128 .Ci ab7b48411962d26439f92f35ed084d3d6275459c
128 Instead, it depends on an external tool to cover this task. 129 Instead, it depends on an external tool to cover this task.
129 In mmh exist two paths for messages to enter mmh's mail storage: 130 In mmh, two paths exist for messages to enter mmh's mail storage:
130 (1) Mail can be incorporated with 131 (1) Mail can be incorporated with
131 .Pn inc 132 .Pn inc
132 from the system maildrop, or (2) with 133 from the system maildrop, or (2) with
133 .Pn rcvstore 134 .Pn rcvstore
134 by reading them, one at a time, from the standard input. 135 by reading them, one at a time, from the standard input.
137 mail system to being a MUA only. 138 mail system to being a MUA only.
138 Now, of course, mmh depends on third-party software. 139 Now, of course, mmh depends on third-party software.
139 An external MSA is required to transfer mail to the outside world; 140 An external MSA is required to transfer mail to the outside world;
140 an external MRA is required to retrieve mail from remote machines. 141 an external MRA is required to retrieve mail from remote machines.
141 There exist excellent implementations of such software, 142 There exist excellent implementations of such software,
142 which do this specific task likely better than the internal 143 which likely are superior than the internal version.
143 versions had done it. 144 Additionally, the best suiting programs can be freely chosen.
144 Also, the best suiting programs can be freely chosen.
145 .P 145 .P
146 As it had already been possible to use an external MSA or MRA, 146 As it had already been possible to use an external MSA or MRA,
147 why not keep the internal version for convenience? 147 why not keep the internal version for convenience?
148 .\" XXX ueberleitung
148 The question whether there is sense in having a fall-back pager in all 149 The question whether there is sense in having a fall-back pager in all
149 the command line tools, for the cases when 150 the command line tools, for the cases when
150 .Pn more 151 .Pn more
151 or 152 or
152 .Pn less 153 .Pn less
200 There is no more need to concern with changes in network transfer. 201 There is no more need to concern with changes in network transfer.
201 This independence is received by depending on an external program 202 This independence is received by depending on an external program
202 that covers the field. 203 that covers the field.
203 Today, this is a reasonable exchange. 204 Today, this is a reasonable exchange.
204 .P 205 .P
206 .\" XXX ueberleitung ???
205 Functionality can be added in three different ways: 207 Functionality can be added in three different ways:
206 .BU 208 .BU
207 Implementing the function originally in the project. 209 Implementing the function originally in the project.
208 .BU 210 .BU
209 Depending on a library that provides the function. 211 Depending on a library that provides the function.
210 .BU 212 .BU
211 Depending on a program that provides the function. 213 Depending on a program that provides the function.
212 .P 214 .P
213 Whereas adding the function originally to the project increases the 215 .\" XXX Rework sentence
216 While adding the function originally to the project increases the
214 code size most and requires most maintenance and development work, 217 code size most and requires most maintenance and development work,
215 it makes the project most independent of other software. 218 it makes the project most independent of other software.
216 Using libraries or external programs require less maintenance work 219 Using libraries or external programs require less maintenance work
217 but introduces dependencies on external software. 220 but introduces dependencies on external software.
218 Programs have the smallest interfaces and provide the best separation 221 Programs have the smallest interfaces and provide the best separation
219 but possibly limit the information exchange. 222 but possibly limit the information exchange.
220 External libraries are stronger connected than external programs, 223 External libraries are stronger connected than external programs,
221 thus information can be exchanged more flexible. 224 thus information can be exchanged more flexible.
222 Adding code to a project increases maintenance work. 225 Adding code to a project increases maintenance work.
223 .\" XXX ref 226 .\" XXX ref
224 Implementing complex functions originally in the project adds 227 Implementing complex functions in the project itself adds
225 a lot of code. 228 a lot of code.
226 This should be avoided if possible. 229 This should be avoided if possible.
227 Hence, the dependencies only change in kind, not in their existence. 230 Hence, the dependencies only change in kind, not in their existence.
228 In mmh, library dependencies on 231 In mmh, library dependencies on
229 .Pn libsasl2 232 .Pn libsasl2
230 and 233 and
231 .Pn libcrypto /\c 234 .Pn libcrypto /\c
232 .Pn libssl 235 .Pn libssl
233 were treated against program dependencies on an MSA and an MRA. 236 were traded against program dependencies on an MSA and an MRA.
234 This also meant treating build-time dependencies against run-time 237 This also meant trading build-time dependencies against run-time
235 dependencies. 238 dependencies.
236 Besides program dependencies providing the stronger separation 239 Besides program dependencies providing the stronger separation
237 and being more flexible, they also allowed 240 and being more flexible, they also allowed
238 over 6\|000 lines of code to be removed from mmh. 241 over 6\|000 lines of code to be removed from mmh.
239 This made mmh's code base about 12\|% smaller. 242 This made mmh's code base about 12\|% smaller.
244 .P 247 .P
245 Users of MH should not have problems to set up an external MSA and MRA. 248 Users of MH should not have problems to set up an external MSA and MRA.
246 Also, the popular MSAs and MRAs have large communities and a lot 249 Also, the popular MSAs and MRAs have large communities and a lot
247 of documentation available. 250 of documentation available.
248 Choices for MSAs range from full-featured MTAs like 251 Choices for MSAs range from full-featured MTAs like
252 .\" XXX refs
249 .I Postfix 253 .I Postfix
250 over mid-size MTAs like 254 over mid-size MTAs like
251 .I masqmail 255 .I masqmail
252 and 256 and
253 .I dma 257 .I dma
290 .BU 294 .BU
291 .Pn rcvtty 295 .Pn rcvtty
292 was removed 296 was removed
293 .Ci 14767c94b3827be7c867196467ed7aea5f6f49b0 297 .Ci 14767c94b3827be7c867196467ed7aea5f6f49b0
294 because its use case of writing to the user's terminal 298 because its use case of writing to the user's terminal
295 on receiving of mail is obsolete. 299 on receival of mail is obsolete.
296 If users like to be informed of new mail, the shell's 300 If users like to be informed of new mail, the shell's
297 .Ev MAILPATH 301 .Ev MAILPATH
298 variable or graphical notifications are technically more appealing. 302 variable or graphical notifications are technically more appealing.
299 Writing directly to terminals is hardly ever wanted today. 303 Writing directly to terminals is hardly ever wanted today.
300 If though one wants to have it this way, the standard tool 304 If though one wants to have it this way, the standard tool
303 .VS 307 .VS
304 scan -file - | write `id -un` 308 scan -file - | write `id -un`
305 VE 309 VE
306 .BU 310 .BU
307 .Pn viamail 311 .Pn viamail
312 .\" XXX was macht viamail
308 was removed 313 was removed
309 .Ci eda72d6a7a7c20ff123043fb7f19c509ea01f932 314 .Ci eda72d6a7a7c20ff123043fb7f19c509ea01f932
310 when the new attachment system was activated, because 315 when the new attachment system was activated, because
311 .Pn forw 316 .Pn forw
312 could then cover the task itself. 317 could then cover the task itself.
315 was rewritten as a shell script wrapper around 320 was rewritten as a shell script wrapper around
316 .Pn forw . 321 .Pn forw .
317 .Ci 0e82199cf3c991a173e0ac8aa776efdb3ded61e6 322 .Ci 0e82199cf3c991a173e0ac8aa776efdb3ded61e6
318 .BU 323 .BU
319 .Pn msgchk 324 .Pn msgchk
325 .\" XXX was macht msgchk
320 was removed 326 was removed
321 .Ci bb9360ead7eb7a3fedcce2eeedfc660014e41dbe , 327 .Ci bb9360ead7eb7a3fedcce2eeedfc660014e41dbe ,
322 because it lost its use case when POP support was removed. 328 because it lost its use case when POP support was removed.
323 A call to 329 A call to
324 .Pn msgchk 330 .Pn msgchk
341 .Pn msh 347 .Pn msh
342 was removed 348 was removed
343 .Ci 916690191222433a6923a4be54b0d8f6ac01bd02 349 .Ci 916690191222433a6923a4be54b0d8f6ac01bd02
344 because the tool was in conflict with the philosophy of MH. 350 because the tool was in conflict with the philosophy of MH.
345 It provided an interactive shell to access the features of MH, 351 It provided an interactive shell to access the features of MH,
346 but it wasn't just a shell, tailored to the needs of mail handling. 352 but it wasn't just a shell tailored to the needs of mail handling.
347 Instead it was one large program that had several MH tools built in. 353 Instead it was one large program that had several MH tools built in.
348 This conflicts with the major feature of MH of being a tool chest. 354 This conflicts with the major feature of MH of being a tool chest.
349 .Pn msh 's 355 .Pn msh 's
350 main use case had been accessing Bulletin Boards, which have seized to 356 main use case had been accessing Bulletin Boards, which have ceased to
351 be popular. 357 be popular.
352 .P 358 .P
353 Removing 359 Removing
354 .Pn msh , 360 .Pn msh ,
355 together with the truly archaic code relicts 361 together with the truly archaic code relicts
420 is not split off. 426 is not split off.
421 I defer the decision over 427 I defer the decision over
422 .Pn slocal 428 .Pn slocal
423 in need for deeper investigation. 429 in need for deeper investigation.
424 In the meanwhile, it remains part of mmh. 430 In the meanwhile, it remains part of mmh.
425 That does not hurt because 431 However, its continued existence is not significant because
426 .Pn slocal 432 .Pn slocal
427 is unrelated to the rest of the project. 433 is unrelated to the rest of the project.
428 434
429 435
430 436
431 .H2 "Displaying Messages 437 .H2 "Displaying Messages
432 .Id mhshow 438 .Id mhshow
433 .P 439 .P
434 Since the very beginning, already in the first concept paper, 440 Since the very beginning, already in the first concept paper,
441 .\" XXX ref!!!
435 .Pn show 442 .Pn show
436 had been MH's message display program. 443 had been MH's message display program.
437 .Pn show 444 .Pn show
438 mapped message numbers and sequences to files and invoked 445 mapped message numbers and sequences to files and invoked
439 .Pn mhl 446 .Pn mhl
507 .P 514 .P
508 Today, non-MIME messages are rather seen to be a special case of 515 Today, non-MIME messages are rather seen to be a special case of
509 MIME messages, although it is the other way round. 516 MIME messages, although it is the other way round.
510 As 517 As
511 .Pn mhshow 518 .Pn mhshow
512 had already be able to display non-MIME messages, it appeared natural 519 had already been able to display non-MIME messages, it appeared natural
513 to drop 520 to drop
514 .Pn show 521 .Pn show
515 in favor of using 522 in favor of using
516 .Pn mhshow 523 .Pn mhshow
517 exclusively. 524 exclusively.
552 .Cf mhshow ) 559 .Cf mhshow )
553 Once the tools behaved more alike, the replacing appeared to be 560 Once the tools behaved more alike, the replacing appeared to be
554 even more natural. 561 even more natural.
555 Today, mmh's new 562 Today, mmh's new
556 .Pn show 563 .Pn show
557 became the one single message display program again, with the difference 564 has become the one single message display program once more,
565 with the difference
558 that today it handles MIME messages as well as non-MIME messages. 566 that today it handles MIME messages as well as non-MIME messages.
559 The outcome of the transition is one program less to maintain, 567 The outcome of the transition is one program less to maintain,
560 no second display program for users to deal with, 568 no second display program for users to deal with,
561 and less system complexity. 569 and less system complexity.
562 .P 570 .P
563 Still, removing the old 571 Still, removing the old
564 .Pn show 572 .Pn show
565 hurts in one regard: It had been such a simple program. 573 hurts in one regard: It had been such a simple program.
566 Its lean elegance is missing to the new 574 Its lean elegance is missing from the new
567 .Pn show . 575 .Pn show ,
568 But there is no chance; 576 .\" XXX
569 supporting MIME demands for higher essential complexity. 577 however there is no alternative;
578 supporting MIME demands higher essential complexity.
570 579
571 .ig 580 .ig
572 XXX 581 XXX
573 Consider including text on scan listings here 582 Consider including text on scan listings here
574 583
589 Customization is a double-edged sword. 598 Customization is a double-edged sword.
590 It allows better suiting setups, but not for free. 599 It allows better suiting setups, but not for free.
591 There is the cost of code complexity to be able to customize. 600 There is the cost of code complexity to be able to customize.
592 There is the cost of less tested setups, because there are 601 There is the cost of less tested setups, because there are
593 more possible setups and especially corner-cases. 602 more possible setups and especially corner-cases.
594 And, there is the cost of choice itself. 603 Additionally, there is the cost of choice itself.
595 The code complexity directly affects the developers. 604 The code complexity directly affects the developers.
596 Less tested code affects both, users and developers. 605 Less tested code affects both, users and developers.
597 The problem of choice affects the users, for once by having to 606 The problem of choice affects the users, for once by having to choose,
598 choose, but also by more complex interfaces that require more documentation. 607 but also by more complex interfaces that require more documentation.
599 Whenever options add little advantages, they should be considered for 608 Whenever options add few advantages but increase the complexity of the
600 removal. 609 system, they should be considered for removal.
601 I have reduced the number of project-specific configure options from 610 I have reduced the number of project-specific configure options from
602 fifteen to three. 611 fifteen to three.
603 612
604 .U3 "Mail Transfer Facilities 613 .U3 "Mail Transfer Facilities
605 .P 614 .P
609 The switches 618 The switches
610 .Sw --with-tls 619 .Sw --with-tls
611 and 620 and
612 .Sw --with-cyrus-sasl 621 .Sw --with-cyrus-sasl
613 had activated the support for transfer encryption and authentication. 622 had activated the support for transfer encryption and authentication.
623 .\" XXX cf
624 .\" XXX gruende kurz wiederholen
614 This is not needed anymore. 625 This is not needed anymore.
615 .Ci fecd5d34f65597a4dfa16aeabea7d74b191532c3 626 .Ci fecd5d34f65597a4dfa16aeabea7d74b191532c3
616 .Ci 156d35f6425bea4c1ed3c4c79783dc613379c65b 627 .Ci 156d35f6425bea4c1ed3c4c79783dc613379c65b
617 .P 628 .P
629 .\" XXX cf
630 .\" XXX ``For the same reason ...''
618 The configure switch 631 The configure switch
619 .Sw --enable-pop 632 .Sw --enable-pop
620 activated the message retrieval facility. 633 activated the message retrieval facility.
621 The code area that would be conditionally compiled in for TLS and SASL 634 The code area that would be conditionally compiled in for TLS and SASL
622 support had been small. 635 support had been small.
623 The conditionally compiled code area for POP support had been much larger. 636 The conditionally compiled code area for POP support had been much larger.
624 Whereas the code base changes would only slightly change on toggling 637 Whereas the code base changes would only slightly change on toggling
625 TLS or SASL support, it changed much on toggling POP support. 638 TLS or SASL support, it changed much on toggling POP support.
626 The changes in the code base could hardly be overviewed. 639 The changes in the code base could hardly be overviewed.
627 By having POP support togglable a second code base had been created, 640 By having POP support togglable, a second code base had been created,
628 one that needed to be tested. 641 one that needed to be tested.
629 This situation is basically similar for the conditional TLS and SASL 642 This situation is basically similar for the conditional TLS and SASL
630 code, but there the changes are minor and can yet be overviewed. 643 code, but there the changes are minor and can yet be overviewed.
631 Still, conditional compilation of a code base creates variations 644 Still, conditional compilation of a code base creates variations
632 of the original program. 645 of the original program.
636 .Sw --with-mts 649 .Sw --with-mts
637 defined the default transport service, either 650 defined the default transport service, either
638 .Ar smtp 651 .Ar smtp
639 or 652 or
640 .Ar sendmail . 653 .Ar sendmail .
654 .\" XXX naechster Satz ganz raus?
641 In mmh this fixed to 655 In mmh this fixed to
642 .Ar sendmail . 656 .Ar sendmail .
643 .Ci f6aa95b724fd8c791164abe7ee5468bf5c34f226 657 .Ci f6aa95b724fd8c791164abe7ee5468bf5c34f226
644 With 658 With
645 .Sw --with-smtpservers 659 .Sw --with-smtpservers
652 .U3 "Backup Prefix 666 .U3 "Backup Prefix
653 .P 667 .P
654 The backup prefix is the string that was prepended to message 668 The backup prefix is the string that was prepended to message
655 filenames to tag them as deleted. 669 filenames to tag them as deleted.
656 By default it had been the comma character `\f(CW,\fP'. 670 By default it had been the comma character `\f(CW,\fP'.
671 .\" XXX Zeitlich ordnen
657 In July 2000, Kimmo Suominen introduced 672 In July 2000, Kimmo Suominen introduced
658 the configure option 673 the configure option
659 .Sw --with-hash-backup 674 .Sw --with-hash-backup
660 to change the default to the hash symbol `\f(CW#\fP'. 675 to change the default to the hash symbol `\f(CW#\fP'.
661 The choice was probably personal preference, because first, the 676 The choice was probably personal preference, because first, the
679 .Cl "rm ./#13 ./#15" 694 .Cl "rm ./#13 ./#15"
680 needs to be used. 695 needs to be used.
681 Using the hash as backup prefix can be seen as a precaution against 696 Using the hash as backup prefix can be seen as a precaution against
682 data loss. 697 data loss.
683 .P 698 .P
684 I removed the configure option but added the profile entry 699 First, I removed the configure option but added the profile entry
685 .Pe backup-prefix , 700 .Pe backup-prefix ,
686 which allows to specify an arbitrary string as backup prefix. 701 which allows to specify an arbitrary string as backup prefix.
687 .Ci 6c40d481d661d532dd527eaf34cebb6d3f8ed086 702 .Ci 6c40d481d661d532dd527eaf34cebb6d3f8ed086
688 Profile entries are the common method to change mmh's behavior. 703 Profile entries are the common method to change mmh's behavior.
689 This change did not remove the choice but moved it to a location where 704 This change did not remove the choice but moved it to a location where
821 .I ndbm 836 .I ndbm
822 vanished and 120 lines of complex autoconf code could be saved. 837 vanished and 120 lines of complex autoconf code could be saved.
823 .Ci ecd6d6a20cb7a1507e3a20d6c4cb3a1cf14c6bbf 838 .Ci ecd6d6a20cb7a1507e3a20d6c4cb3a1cf14c6bbf
824 The change removed functionality too, but that is minor to the 839 The change removed functionality too, but that is minor to the
825 improvement by dropping the dependency and the complex autoconf code. 840 improvement by dropping the dependency and the complex autoconf code.
841 .\" XXX argument: slocal ist sowieso nicht teil vom mmh kern
826 842
827 .U3 "mh-e Support 843 .U3 "mh-e Support
828 .P 844 .P
829 The configure option 845 The configure option
830 .Sw --disable-mhe 846 .Sw --disable-mhe
847 .Sw --disable-mhe 863 .Sw --disable-mhe
848 configure option was removed 864 configure option was removed
849 .Ci a7ce7b4a580d77b6c2c4d980812beb589aa4c643 865 .Ci a7ce7b4a580d77b6c2c4d980812beb589aa4c643
850 Removing the option removed a second code setup that would have 866 Removing the option removed a second code setup that would have
851 needed to be tested. 867 needed to be tested.
868 .\" XXX datum?
852 This change was first done in nmh and thereafter merged into mmh. 869 This change was first done in nmh and thereafter merged into mmh.
853 .P 870 .P
854 The interface changes in mmh require mh-e to be adjusted in order 871 The interface changes in mmh require mh-e to be adjusted in order
855 to be able to use mmh as back-end. 872 to be able to use mmh as back-end.
856 This will require minor changes to mh-e, but removing the 873 This will require minor changes to mh-e, but removing the
916 motivated by the fact that 933 motivated by the fact that
917 .Pn spost 934 .Pn spost
918 hadn't supported it already. 935 hadn't supported it already.
919 .Ci 2abae0bfd0ad5bf898461e50aa4b466d641f23d9 936 .Ci 2abae0bfd0ad5bf898461e50aa4b466d641f23d9
920 Username extensions are possible in mmh, but less convenient to use. 937 Username extensions are possible in mmh, but less convenient to use.
938 .\" XXX covered by next paragraph
921 .\" XXX format file %(getenv USERNAME_EXTENSION) 939 .\" XXX format file %(getenv USERNAME_EXTENSION)
922 .P 940 .P
923 The 941 The
924 .I draft_from 942 .I draft_from
925 masquerading type instructed 943 masquerading type instructed
976 For example: 994 For example:
977 .Cl "-truncate" . 995 .Cl "-truncate" .
978 Every program in mmh has two generic switches: 996 Every program in mmh has two generic switches:
979 .Sw -help , 997 .Sw -help ,
980 to print a short message on how to use the program, and 998 to print a short message on how to use the program, and
981 .Sw -Version , 999 .Sw -Version
982 to tell what version of mmh the program belongs to. 1000 [sic!], to tell what version of mmh the program belongs to.
983 .P 1001 .P
984 Switches change the behavior of programs. 1002 Switches change the behavior of programs.
985 Programs that do one thing in one way require no switches. 1003 Programs that do one thing in one way require no switches.
986 In most cases, doing something in exactly one way is too limiting. 1004 In most cases, doing something in exactly one way is too limiting.
987 If there is basically one task to accomplish, but it should be done 1005 If there is basically one task to accomplish, but it should be done
1048 have remained in mmh's 1066 have remained in mmh's
1049 .Pn send . 1067 .Pn send .
1050 (These numbers include two generic switches, help and version.) 1068 (These numbers include two generic switches, help and version.)
1051 .P 1069 .P
1052 The figure displays the number of switches for each of the tools 1070 The figure displays the number of switches for each of the tools
1053 that is available in both, nmh and mmh. 1071 that is available in both nmh and mmh.
1054 The tools are sorted by the number of switches they had in nmh. 1072 The tools are sorted by the number of switches they had in nmh.
1055 Visible and hidden switches were counted, 1073 Visible and hidden switches were counted,
1056 but not the generic help and version switches. 1074 but not the generic help and version switches.
1057 Whereas in the beginning of the project, the average tool had 11 switches, 1075 Whereas in the beginning of the project, the average tool had 11 switches,
1058 now it has no more than 5 \(en only half as many. 1076 now it has no more than 5 \(en only half as many.
1106 .Pn send . 1124 .Pn send .
1107 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 1125 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860
1108 The only flexibility removed with this change is having multiple 1126 The only flexibility removed with this change is having multiple
1109 draft folders within one profile. 1127 draft folders within one profile.
1110 I consider this a theoretical problem only. 1128 I consider this a theoretical problem only.
1111 In the same go, the 1129 At the same time, the
1112 .Sw -draft 1130 .Sw -draft
1113 switch of 1131 switch of
1114 .Pn anno , 1132 .Pn anno ,
1115 .Pn refile , 1133 .Pn refile ,
1116 and 1134 and
1117 .Pn send 1135 .Pn send
1118 was removed. 1136 was removed.
1119 The special-casing of `the' draft message became irrelevant after 1137 The special treatment of \fIthe\fP draft message became irrelevant after
1120 the rework of the draft system. 1138 the rework of the draft system.
1121 (df. Sec. 1139 (cf. Sec.
1122 .Cf draft-folder ) 1140 .Cf draft-folder )
1123 Equally, 1141 Equally,
1124 .Pn comp 1142 .Pn comp
1125 lost its 1143 lost its
1126 .Sw -file 1144 .Sw -file
1268 .Pn mhbuild 1286 .Pn mhbuild
1269 and 1287 and
1270 .Pn mhlist 1288 .Pn mhlist
1271 were removed, doing real size calculations always now 1289 were removed, doing real size calculations always now
1272 .Ci 8d8f1c3abc586c005c904e52c4adbfe694d2201c , 1290 .Ci 8d8f1c3abc586c005c904e52c4adbfe694d2201c ,
1273 as 1291 as nmh's
1292 .Mp mhbuild (1)
1293 man page states
1274 ``This provides an accurate count at the expense of a small delay.'' 1294 ``This provides an accurate count at the expense of a small delay.''
1275 This small delay is not noticable on modern systems. 1295 This small delay is not noticable on modern systems.
1276 .P 1296 .P
1277 The 1297 The
1278 .Sw -[no]check 1298 .Sw -[no]check
1301 and 1321 and
1302 .Sw -wcache 1322 .Sw -wcache
1303 switches was completely removed. 1323 switches was completely removed.
1304 .Ci d1fefd9f614e4dc3cda16da6c69133c1b2005269 1324 .Ci d1fefd9f614e4dc3cda16da6c69133c1b2005269
1305 External MIME parts are rare today, having a caching facility 1325 External MIME parts are rare today, having a caching facility
1306 for them is appears to be unnecessary. 1326 for them appears to be unnecessary.
1307 .P 1327 .P
1308 In pre-MIME times, 1328 In pre-MIME times,
1309 .Pn mhl 1329 .Pn mhl
1310 had covered many tasks that are part of MIME handling today. 1330 had covered many tasks that are part of MIME handling today.
1311 Therefore, 1331 Therefore,
1320 1340
1321 .U3 "Header Printing 1341 .U3 "Header Printing
1322 .P 1342 .P
1323 .Pn folder 's 1343 .Pn folder 's
1324 data output is self-explaining enough that 1344 data output is self-explaining enough that
1325 displaying the header line makes few sense. 1345 displaying the header line makes little sense.
1326 Hence, the 1346 Hence, the
1327 .Sw -[no]header 1347 .Sw -[no]header
1328 switch was removed and headers are never printed. 1348 switch was removed and headers are never printed.
1329 .Ci 601cc73d1fa05ce96faa728f036d6c51b91701c7 1349 .Ci 601cc73d1fa05ce96faa728f036d6c51b91701c7
1330 .P 1350 .P
1377 was removed, but it can now be replaced by specifying 1397 was removed, but it can now be replaced by specifying
1378 .Sw -editor 1398 .Sw -editor
1379 with an empty argument. 1399 with an empty argument.
1380 .Ci 75fca31a5b9d5c1a99c74ab14c94438d8852fba9 1400 .Ci 75fca31a5b9d5c1a99c74ab14c94438d8852fba9
1381 (Specifying 1401 (Specifying
1382 .Cl "-editor true 1402 .Cl "-editor /bin/true
1383 is nearly the same, only differing by the previous editor being set.) 1403 is nearly the same, only differing by the previous editor being set.)
1384 .P 1404 .P
1385 The more important change is the removal of the 1405 The more important change is the removal of the
1386 .Sw -nowhatnowproc 1406 .Sw -nowhatnowproc
1387 switch. 1407 switch.
1402 .P 1422 .P
1403 Effectively, the 1423 Effectively, the
1404 .Sw -nowhatnowproc 1424 .Sw -nowhatnowproc
1405 switch creates only a draft message. 1425 switch creates only a draft message.
1406 As 1426 As
1407 .Cl "-whatnowproc true 1427 .Cl "-whatnowproc /bin/true
1408 causes the same behavior, the 1428 causes the same behavior, the
1409 .Sw -nowhatnowproc 1429 .Sw -nowhatnowproc
1410 switch was removed for being redundant. 1430 switch was removed for being redundant.
1411 Likely, the 1431 Likely, the
1412 .Sw -nowhatnowproc 1432 .Sw -nowhatnowproc
1452 .Sw -[no]bell 1472 .Sw -[no]bell
1453 .Ci e11983f44e59d8de236affa5b0d0d3067c192e24 ) 1473 .Ci e11983f44e59d8de236affa5b0d0d3067c192e24 )
1454 nor page the output itself (\c 1474 nor page the output itself (\c
1455 .Sw -length 1475 .Sw -length
1456 .Ci 5b9d883db0318ed2b84bb82dee880d7381f99188 ). 1476 .Ci 5b9d883db0318ed2b84bb82dee880d7381f99188 ).
1477 .\" XXX Ref
1457 Generally, the pager to use is no longer specified with the 1478 Generally, the pager to use is no longer specified with the
1458 .Sw -[no]moreproc 1479 .Sw -[no]moreproc
1459 command line switches for 1480 command line switches for
1460 .Pn mhl 1481 .Pn mhl
1461 and 1482 and
1505 is a bug fix, supported by the comments 1526 is a bug fix, supported by the comments
1506 ``\-[no]reverse under #ifdef BERK (I really HATE this)'' 1527 ``\-[no]reverse under #ifdef BERK (I really HATE this)''
1507 by Rose and 1528 by Rose and
1508 ``Lists messages in reverse order with the `\-reverse' switch. 1529 ``Lists messages in reverse order with the `\-reverse' switch.
1509 This should be considered a bug.'' by Romine in the documentation. 1530 This should be considered a bug.'' by Romine in the documentation.
1531 .\" XXX Ref: welche datei genau.
1510 The question remains why neither Rose and Romine had fixed this 1532 The question remains why neither Rose and Romine had fixed this
1511 bug in the eighties when they wrote these comments nor has anyone 1533 bug in the eighties when they wrote these comments nor has anyone
1512 thereafter. 1534 thereafter.
1513 1535
1514 1536
1561 1583
1562 1584
1563 .\" -------------------------------------------------------------- 1585 .\" --------------------------------------------------------------
1564 .H1 "Modernizing 1586 .H1 "Modernizing
1565 .P 1587 .P
1566 In the over thirty years of MH's existence, its code base was 1588 In the more thirty years of MH's existence, its code base was
1567 extended more and more. 1589 increasingly extended.
1568 New features entered the project and became alternatives to the 1590 New features entered the project and became alternatives to the
1569 existing behavior. 1591 existing behavior.
1570 Relicts from several decades have gathered in the code base, 1592 Relicts from several decades have gathered in the code base,
1571 but seldom obsolete features were dropped. 1593 but seldom obsolete features were dropped.
1572 This section describes the removing of old code 1594 This section describes the removing of old code
1576 .Cf code-style . 1598 .Cf code-style .
1577 1599
1578 1600
1579 .H2 "Code Relicts 1601 .H2 "Code Relicts
1580 .P 1602 .P
1581 My position to drop obsolete functions of mmh, in order to remove old code, 1603 My position regarding the removal of obsolete functions of mmh,
1582 is much more revolutional than the nmh community likes to have it. 1604 .\" XXX ``in order to remove old code,''
1583 Working on an experimental version, I was able to quickly drop 1605 is much more revolutional than the nmh community appreciates.
1606 Working on an experimental version, I was quickly able to drop
1584 functionality I considered ancient. 1607 functionality I considered ancient.
1585 The need for consensus with peers would have slowed this process down. 1608 The need for consensus with peers would have slowed this process down.
1586 Without the need to justify my decisions, I was able to rush forward. 1609 Without the need to justify my decisions, I was able to rush forward.
1587 In December 2011, Paul Vixie motivated the nmh developers to just 1610 In December 2011, Paul Vixie motivated the nmh developers to just
1611 .\" XXX ugs
1588 do the work: 1612 do the work:
1589 .[ 1613 .[
1590 paul vixie edginess nmh-workers 1614 paul vixie edginess nmh-workers
1591 .] 1615 .]
1592 .QS 1616 .QS
1601 let's push forward, aggressively. 1625 let's push forward, aggressively.
1602 .QE 1626 .QE
1603 .LP 1627 .LP
1604 I did so already in the months before. 1628 I did so already in the months before.
1605 I pushed forward. 1629 I pushed forward.
1630 .\" XXX semicolon ?
1606 I simply dropped the cruft. 1631 I simply dropped the cruft.
1607 .P 1632 .P
1608 The decision to drop a feature was based on literature research and 1633 The decision to drop a feature was based on literature research and
1609 careful thinking, but whether having had contact to this particular 1634 careful thinking, but whether having had contact with this particular
1610 feature within my own computer life served as a rule of thumb. 1635 feature within my own computer life served as a rule of thumb.
1611 Always, I explained my reasons in the commit messages 1636 I explained my reasons in the commit messages
1612 in the version control system. 1637 in the version control system.
1613 Hence, others can comprehend my view and argue for undoing the change 1638 Hence, others can comprehend my view and argue for undoing the change
1614 if I have missed an important aspect. 1639 if I have missed an important aspect.
1615 I was quick in dropping parts. 1640 I was quick in dropping parts.
1616 I rather re-included falsely dropped parts than going a slower pace. 1641 I rather re-included falsely dropped parts than going at a slower pace.
1617 Mmh is experimental work; it required tough decisions. 1642 Mmh is experimental work; it required tough decisions.
1643 .\" XXX ``exp. work'' schon oft gesagt
1618 1644
1619 1645
1620 .U3 "Forking 1646 .U3 "Forking
1621 .P 1647 .P
1622 Being a tool chest, MH creates many processes. 1648 Being a tool chest, MH creates many processes.
1623 In earlier times 1649 In earlier times
1624 .Fu fork() 1650 .Fu fork()
1625 had been an expensive system call, because the process's image needed 1651 had been an expensive system call, because the process's image needed
1626 to be duplicated completely at once. 1652 to be completely duplicated at once.
1627 This was especially painful in the common case when the image gets 1653 This expensive work was especially unnecessary in the commonly occuring
1628 replaced by a call to 1654 case wherein the image is replaced by a call to
1629 .Fu exec() 1655 .Fu exec()
1630 right after having forked the child process. 1656 right after having forked the child process.
1631 The 1657 The
1632 .Fu vfork() 1658 .Fu vfork()
1633 system call was invented to speed up this particular case. 1659 system call was invented to speed up this particular case.
1670 were prone to failure. 1696 were prone to failure.
1671 Hence, many of the 1697 Hence, many of the
1672 .Fu fork() 1698 .Fu fork()
1673 calls in the code were wrapped into loops to retry the 1699 calls in the code were wrapped into loops to retry the
1674 .Fu fork() 1700 .Fu fork()
1675 several times, to increase the changes to succeed, eventually. 1701 several times, to increase the chances to succeed, eventually.
1676 On modern systems, a failing 1702 On modern systems, a failing
1677 .Fu fork() 1703 .Fu fork()
1678 call is unusual. 1704 call is unusual.
1679 Hence, in the rare case when 1705 Hence, in the rare case when
1680 .Fu fork() 1706 .Fu fork()
1693 Hence, the support for 1719 Hence, the support for
1694 .Hd Encrypted 1720 .Hd Encrypted
1695 header fields is removed in mmh. 1721 header fields is removed in mmh.
1696 .Ci 064527f7b57ab050e5af13e15ad99aeeab125857 1722 .Ci 064527f7b57ab050e5af13e15ad99aeeab125857
1697 .BU 1723 .BU
1698 Native support for 1724 The native support for
1699 .Hd Face 1725 .Hd Face
1700 header fields has been removed, as well. 1726 header fields has been removed, as well.
1701 .Ci 8e5be81f784682822f5e868c1bf3c8624682bd23 1727 .Ci 8e5be81f784682822f5e868c1bf3c8624682bd23
1702 This feature is similar to the 1728 This feature is similar to the
1703 .Hd X-Face 1729 .Hd X-Face
1704 header field in its intent, 1730 header field in its intent,
1705 but takes a different approach to store the image. 1731 but takes a different approach to store the image.
1706 Instead of encoding the image data directly into the header field, 1732 Instead of encoding the image data directly into the header field,
1707 it contains the hostname and UDP port where the image 1733 it contains the hostname and UDP port where the image
1708 date can be retrieved. 1734 date can be retrieved.
1709 There exists even a third Face system, 1735 There is even a third Face system,
1710 which is the successor of 1736 which is the successor of
1711 .Hd X-Face , 1737 .Hd X-Face ,
1712 although it re-uses the 1738 although it re-uses the
1713 .Hd Face 1739 .Hd Face
1714 header field. 1740 header field.
1748 .P 1774 .P
1749 This type of format is conceptionally similar to the mbox format, 1775 This type of format is conceptionally similar to the mbox format,
1750 but uses a different message delimiter (`\fL\\1\\1\\1\\1\fP', 1776 but uses a different message delimiter (`\fL\\1\\1\\1\\1\fP',
1751 commonly written as `\fL^A^A^A^A\fP', instead of `\fLFrom\0\fP'). 1777 commonly written as `\fL^A^A^A^A\fP', instead of `\fLFrom\0\fP').
1752 Mbox is the de-facto standard maildrop format on Unix, 1778 Mbox is the de-facto standard maildrop format on Unix,
1753 whereas the MMDF maildrop format became forgotten. 1779 whereas the MMDF maildrop format is now forgotten.
1754 I did drop MMDF maildrop format support. 1780 By dropping the MMDF maildrop format support,
1755 Mbox is the only packed mailbox format supported in mmh. 1781 mbox became the only packed mailbox format supported in mmh.
1756 .P 1782 .P
1757 The simplifications within the code were moderate. 1783 The simplifications within the code were moderate.
1758 Mainly, the reading and writing of MMDF mailbox files was removed. 1784 Mainly, the reading and writing of MMDF mailbox files was removed.
1759 But also, switches of 1785 But also, switches of
1760 .Pn packf 1786 .Pn packf
1771 I have not worked on them yet because 1797 I have not worked on them yet because
1772 .Fu m_getfld() 1798 .Fu m_getfld()
1773 is heavily optimized and thus dangerous to touch. 1799 is heavily optimized and thus dangerous to touch.
1774 The risk of damaging the intricate workings of the optimized code is 1800 The risk of damaging the intricate workings of the optimized code is
1775 too high. 1801 too high.
1776 .\" XXX: move somewhere else
1777 This problem is known to the developers of nmh, too.
1778 They also avoid touching this minefield.
1779 1802
1780 1803
1781 .U3 "Prompter's Control Keys 1804 .U3 "Prompter's Control Keys
1782 .P 1805 .P
1783 The program 1806 The program
1810 1833
1811 .U3 "Hardcopy Terminal Support 1834 .U3 "Hardcopy Terminal Support
1812 .P 1835 .P
1813 More of a funny anecdote is a check for being connected to a 1836 More of a funny anecdote is a check for being connected to a
1814 hardcopy terminal. 1837 hardcopy terminal.
1815 It remained in the code until Spring 2012, when I finally removed it 1838 It remained in the code until spring 2012, when I finally removed it
1816 .Ci b7764c4a6b71d37918a97594d866258f154017ca . 1839 .Ci b7764c4a6b71d37918a97594d866258f154017ca .
1817 I would be truly happy to see such a terminal in action today,
1818 maybe even being able to work on it.
1819 But I fear my chances are null.
1820 .P 1840 .P
1821 The check only prevented a pager to be placed between the printing 1841 The check only prevented a pager to be placed between the printing
1822 program (\c 1842 program (\c
1823 .Pn mhl ) 1843 .Pn mhl )
1824 and the terminal. 1844 and the terminal.
1829 .Pe Pager 1849 .Pe Pager
1830 or the environment variable 1850 or the environment variable
1831 .Ev PAGER 1851 .Ev PAGER
1832 to 1852 to
1833 .Pn cat 1853 .Pn cat
1834 does the job. 1854 is sufficient.
1835 1855
1836 1856
1837 1857
1838 1858
1839 .H2 "Attachments 1859 .H2 "Attachments
1857 and parts of arbitrary type following. 1877 and parts of arbitrary type following.
1858 .P 1878 .P
1859 MH's MIME support is a direct implementation of the RFCs. 1879 MH's MIME support is a direct implementation of the RFCs.
1860 The perception of the topic described in the RFCs is clearly visible 1880 The perception of the topic described in the RFCs is clearly visible
1861 in MH's implementation. 1881 in MH's implementation.
1862 In result, MH had all the MIME features but no idea of attachments. 1882 .\" XXX rewrite ``no idea''.
1883 As a result,
1884 MH had all the MIME features but no idea of attachments.
1863 But users don't need all the MIME features, 1885 But users don't need all the MIME features,
1864 they want convenient attachment handling. 1886 they want convenient attachment handling.
1865 1887
1866 1888
1867 .U3 "Composing MIME Messages 1889 .U3 "Composing MIME Messages
1871 .Ci 7480dbc14bc90f2d872d434205c0784704213252 1893 .Ci 7480dbc14bc90f2d872d434205c0784704213252
1872 In the file 1894 In the file
1873 .Fn docs/README-ATTACHMENTS , 1895 .Fn docs/README-ATTACHMENTS ,
1874 he described his motivation to do so as such: 1896 he described his motivation to do so as such:
1875 .QS 1897 .QS
1876 Although nmh contains the necessary functionality for MIME message handing, 1898 Although nmh contains the necessary functionality for MIME message
1877 the interface to this functionality is pretty obtuse. 1899 handing [sic!], the interface to this functionality is pretty obtuse.
1878 There's no way that I'm ever going to convince my partner to write 1900 There's no way that I'm ever going to convince my partner to write
1879 .Pn mhbuild 1901 .Pn mhbuild
1880 composition files! 1902 composition files!
1881 .QE 1903 .QE
1882 .LP 1904 .LP
1907 profile entry is used to specify 1929 profile entry is used to specify
1908 the name of the attachment header field. 1930 the name of the attachment header field.
1909 It is pre-defined to 1931 It is pre-defined to
1910 .Hd Attach . 1932 .Hd Attach .
1911 .P 1933 .P
1912 To add an attachment to a draft, simply add an attachment header: 1934 To add an attachment to a draft, a header line needs to be added:
1913 .VS 1935 .VS
1914 To: bob 1936 To: bob
1915 Subject: The file you wanted 1937 Subject: The file you wanted
1916 Attach: /path/to/the/file-bob-wanted 1938 Attach: /path/to/the/file-bob-wanted
1917 -------- 1939 --------
1925 anno -append -nodate -component Attach -text /path/to/attachment 1947 anno -append -nodate -component Attach -text /path/to/attachment
1926 VE 1948 VE
1927 Drafts with attachment headers are converted to MIME automatically by 1949 Drafts with attachment headers are converted to MIME automatically by
1928 .Pn send . 1950 .Pn send .
1929 The conversion to MIME is invisible to the user. 1951 The conversion to MIME is invisible to the user.
1930 The draft stored in the draft folder is always in source form, with 1952 The draft stored in the draft folder is always in source form with
1931 attachment headers. 1953 attachment headers.
1932 If the MIMEification fails, for instance because the file to attach 1954 If the MIMEification fails, for instance because the file to attach
1933 is not accessible, the original draft is not changed. 1955 is not accessible, the original draft is not changed.
1934 .P 1956 .P
1935 The attachment system handles the forwarding of messages, too. 1957 The attachment system handles the forwarding of messages, too.
1936 If the attachment header value starts with a plus character (`+'), 1958 If the attachment header value starts with a plus character (`+'),
1937 like in 1959 like in
1938 .Cl "Attach: +bob 30 42" , 1960 .Cl "Attach: +bob 30 42" ,
1939 The given messages in the specified folder will be attached. 1961 the given messages in the specified folder will be attached.
1940 This allowed to simplify 1962 This allowed to simplify
1941 .Pn forw . 1963 .Pn forw .
1942 .Ci f41f04cf4ceca7355232cf7413e59afafccc9550 1964 .Ci f41f04cf4ceca7355232cf7413e59afafccc9550
1943 .P 1965 .P
1944 Closely related to attachments is non-ASCII text content, 1966 Closely related to attachments is non-ASCII text content,
1949 If the user did not call `mime', a broken message would be sent. 1971 If the user did not call `mime', a broken message would be sent.
1950 Therefore, the 1972 Therefore, the
1951 .Pe automimeproc 1973 .Pe automimeproc
1952 profile entry could be specified to have the `mime' command invoked 1974 profile entry could be specified to have the `mime' command invoked
1953 automatically each time. 1975 automatically each time.
1954 Unfortunately, this approach conflicted with with attachment system 1976 Unfortunately, this approach conflicted with attachment system
1955 because the draft would already be in MIME format at the time 1977 because the draft would already be in MIME format at the time
1956 when the attachment system wanted to MIMEify it. 1978 when the attachment system wanted to MIMEify it.
1957 To use nmh's attachment system, `mime' must not be called at the 1979 To use nmh's attachment system, `mime' must not be called at the
1958 WhatNow prompt and 1980 WhatNow prompt and
1959 .Pe automimeproc 1981 .Pe automimeproc
1966 Mmh's current solution is even more elaborate. 1988 Mmh's current solution is even more elaborate.
1967 Any necessary MIMEification is done automatically. 1989 Any necessary MIMEification is done automatically.
1968 There is no `mime' command at the WhatNow prompt anymore. 1990 There is no `mime' command at the WhatNow prompt anymore.
1969 The draft will be converted automatically to MIME when either an 1991 The draft will be converted automatically to MIME when either an
1970 attachment header or non-ASCII text is present. 1992 attachment header or non-ASCII text is present.
1971 Further more, the special meaning of the hash character (`#') 1993 Furthermore, the hash character (`#') is not special any more
1972 at line beginnings in the draft message is removed. 1994 at line beginnings in the draft message.
1973 Users need not at all deal with the whole topic. 1995 .\" XXX REF ?
1996 Users need not concern themselves with the whole topic at all.
1974 .P 1997 .P
1975 Although the new approach does not anymore support arbitrary MIME 1998 Although the new approach does not anymore support arbitrary MIME
1976 compositions directly, the full power of 1999 compositions directly, the full power of
1977 .Pn mhbuild 2000 .Pn mhbuild
1978 can still be accessed. 2001 can still be accessed.
1983 .Cl "edit mhbuild 2006 .Cl "edit mhbuild
1984 to convert it to MIME. 2007 to convert it to MIME.
1985 Because the resulting draft does neither contain non-ASCII characters 2008 Because the resulting draft does neither contain non-ASCII characters
1986 nor has it attachment headers, the attachment system will not touch it. 2009 nor has it attachment headers, the attachment system will not touch it.
1987 .P 2010 .P
1988 The approach taken in mmh is tailored towards todays most common case: 2011 The approach taken in mmh is tailored towards today's most common case:
1989 a text part with possibly attachments. 2012 a text part, possibly with attachments.
1990 This case is simplified a lot for users. 2013 This case was simplified.
1991 2014
1992 2015
1993 .U3 "MIME Type Guessing 2016 .U3 "MIME Type Guessing
1994 .P 2017 .P
1995 The use of 2018 From the programmer's point of view, the use of
1996 .Pn mhbuild 2019 .Pn mhbuild
1997 composition drafts had one notable advantage over attachment headers 2020 composition drafts had one notable advantage over attachment headers:
1998 from the programmer's point of view: The user provides the appropriate 2021 The user provides the appropriate MIME types for files to include.
1999 MIME types for files to include.
2000 The attachment system needs to find out the correct MIME type itself. 2022 The attachment system needs to find out the correct MIME type itself.
2001 This is a difficult task, yet it spares the user irritating work. 2023 This is a difficult task, yet it spares the user irritating work.
2002 Determining the correct MIME type of content is partly mechanical, 2024 Determining the correct MIME type of content is partly mechanical,
2003 partly intelligent work. 2025 partly intelligent work.
2004 Forcing the user to find out the correct MIME type, 2026 Forcing the user to find out the correct MIME type,
2024 but not to be used by programs. 2046 but not to be used by programs.
2025 It varies much. 2047 It varies much.
2026 Nevertheless, modern versions of GNU 2048 Nevertheless, modern versions of GNU
2027 .Pn file , 2049 .Pn file ,
2028 which is prevalent on the popular GNU/Linux systems, 2050 which is prevalent on the popular GNU/Linux systems,
2029 provides MIME type output in machine-readable form. 2051 provide MIME type output in machine-readable form.
2030 Although this solution is highly system-dependent, 2052 Although this solution is highly system-dependent,
2031 it solves the difficult problem well. 2053 it solves the difficult problem well.
2032 On systems where GNU 2054 On systems where GNU
2033 .Pn file , 2055 .Pn file ,
2034 version 5.04 or higher, is available it should be used. 2056 version 5.04 or higher, is available it should be used.
2048 If no MIME type can be determined, text content gets sent as 2070 If no MIME type can be determined, text content gets sent as
2049 `text/plain' and anything else under the generic fall-back type 2071 `text/plain' and anything else under the generic fall-back type
2050 `application/octet-stream'. 2072 `application/octet-stream'.
2051 It is not possible in mmh to override the automatic MIME type guessing 2073 It is not possible in mmh to override the automatic MIME type guessing
2052 for a specific file. 2074 for a specific file.
2053 To do so, the user would need to know in advance for which file 2075 To do so, either the user would need to know in advance for which file
2054 the automatic guessing does fail, or the system would require interaction. 2076 the automatic guessing fails, or the system would require interaction.
2055 I consider both cases impractical. 2077 I consider both cases impractical.
2056 The existing solution should be sufficient. 2078 The existing solution should be sufficient.
2057 If not, the user may always fall back to 2079 If not, the user may always fall back to
2058 .Pn mhbuild 2080 .Pn mhbuild
2059 composition drafts and ignore the attachment system. 2081 composition drafts and ignore the attachment system.
2134 .Sw -force 2156 .Sw -force
2135 option. 2157 option.
2136 Users will likely need to invoke 2158 Users will likely need to invoke
2137 .Pn mhstore 2159 .Pn mhstore
2138 a second time with 2160 a second time with
2139 .Sw -force 2161 .Sw -force .
2140 then. 2162 Eventually, only the user can decide in the specific case.
2141 Eventually, only the user can decide in the concrete case.
2142 This requires interaction, which I like to avoid if possible. 2163 This requires interaction, which I like to avoid if possible.
2143 Appending a unique suffix to the filename is another bad option. 2164 Appending a unique suffix to the filename is another bad option.
2144 For now, the behavior remains as it is. 2165 For now, the behavior remains as it is.
2145 .P 2166 .P
2146 In mmh, only MIME parts of type message are special in 2167 In mmh, only MIME parts of type message are special in
2147 .Pn mhstore 's 2168 .Pn mhstore 's
2148 .Sw -auto 2169 .Sw -auto
2149 mode. 2170 mode.
2150 Instead of storing message/rfc822 parts as files to disk, 2171 Instead of storing message/rfc822 parts as files to disk,
2151 they are stored as messages into the current mail folder. 2172 they are stored as messages into the current mail folder.
2152 The same applies to message/partial, only, the parts are reassembled 2173 The same applies to message/partial, although the parts are
2153 automatically before. 2174 automatically reassembled beforehand.
2154 Parts of type message/external-body are not automatically retrieved 2175 MIME parts of type message/external-body are not automatically retrieved
2155 anymore. Instead, Information on how to retrieve them is output. 2176 anymore.
2177 Instead, information on how to retrieve them is output.
2156 Not supporting this rare case saved nearly one thousand lines of code. 2178 Not supporting this rare case saved nearly one thousand lines of code.
2157 .Ci 55e1d8c654ee0f7c45b9361ce34617983b454c32 2179 .Ci 55e1d8c654ee0f7c45b9361ce34617983b454c32
2158 .\" XXX mention somewhere else too: (The profile entry `nmh-access-ftp' 2180 .\" XXX mention somewhere else too: (The profile entry `nmh-access-ftp'
2159 .\" and sbr/ruserpass.c for reading ~/.netrc are gone now.) 2181 .\" and sbr/ruserpass.c for reading ~/.netrc are gone now.)
2160 Not special anymore is `application/octet-stream; type=tar'. 2182 `application/octet-stream; type=tar' is not special anymore.
2161 Automatically extracting such MIME parts had been the dangerous part 2183 Automatically extracting such MIME parts had been the dangerous part
2162 of the 2184 of the
2163 .Sw -auto 2185 .Sw -auto
2164 mode. 2186 mode.
2165 .Ci 94c80042eae3383c812d9552089953f9846b1bb6 2187 .Ci 94c80042eae3383c812d9552089953f9846b1bb6
2184 information on how to display the individual parts. 2206 information on how to display the individual parts.
2185 I adjusted 2207 I adjusted
2186 .Pn mhshow 's 2208 .Pn mhshow 's
2187 behavior to the modern view on the topic. 2209 behavior to the modern view on the topic.
2188 .P 2210 .P
2189 Note that this section completely ignores the original 2211 One should note that this section completely ignores the original
2190 .Pn show 2212 .Pn show
2191 program, because it was not capable to display MIME messages 2213 program, because it was not capable to display MIME messages
2192 and is no longer part of mmh. 2214 and is no longer part of mmh.
2193 Although 2215 Although
2194 .Pn mhshow 2216 .Pn mhshow
2195 was renamed to 2217 was renamed to
2196 .Pn show 2218 .Pn show
2197 in mmh, this section uses the name 2219 in mmh, this section uses the name
2198 .Pn mhshow , 2220 .Pn mhshow ,
2199 in order to avoid confusion. 2221 in order to avoid confusion.
2222 .\" XXX ref to other section
2200 .P 2223 .P
2201 In mmh, the basic idea is that 2224 In mmh, the basic idea is that
2202 .Pn mhshow 2225 .Pn mhshow
2203 should display a message in one single pager session. 2226 should display a message in one single pager session.
2204 Therefore, 2227 Therefore,