comparison discussion.roff @ 217:f3f65376bef9

A big bunch of corrections in 2.1 and 2.2.
author markus schnalke <meillo@marmaro.de>
date Sat, 14 Jul 2012 18:04:32 +0200
parents 9317d789cef9
children 8c537982d718
comparison
equal deleted inserted replaced
216:91999f2cddeb 217:f3f65376bef9
1 .H0 "Discussion 1 .H0 "Discussion
2 .P 2 .P
3 This main chapter discusses the practical work accomplished in the 3 This main chapter discusses the practical work accomplished in the
4 mmh project. 4 mmh project.
5 It is structured along the goals set for the project. 5 It is structured along the goals chosen for the project.
6 The concrete work undertaken 6 A selection of the work undertaken
7 is described in the examples of how the general goals were achieved. 7 is described.
8 The discussion compares the current version of mmh with the state of 8 .P
9 nmh just before the mmh project started, i.e. fall 2011. 9 This discussion compares the present version of mmh with the state of
10 Current changes of nmh will be mentioned only as side notes. 10 nmh at the time when the mmh project had started, i.e. fall 2011.
11 .\" XXX where do I discuss the parallel development of nmh? 11 Recent changes in nmh are seldom part of the discussion.
12 Sometimes they are mentioned in side notes.
12 .P 13 .P
13 For the reader's convenience, the structure of modern email systems 14 For the reader's convenience, the structure of modern email systems
14 is depicted in the figure. 15 is depicted in the following figure.
15 It illustrates the path a message takes from sender to recipient. 16 It illustrates the path a message takes from sender to recipient.
16 .sp 17
18 .sp 1.5
17 .KS 19 .KS
18 .in 2c 20 .in 2c
19 .so input/mail-agents.pic 21 .so input/mail-agents.pic
20 .KE 22 .KE
21 .sp 23 .sp 1.5
24
22 .LP 25 .LP
23 The ellipses denote mail agents, i.e. different jobs in email processing: 26 The ellipses denote mail agents, i.e. different jobs in email processing.
27 These are:
24 .IP "Mail User Agent (MUA) 28 .IP "Mail User Agent (MUA)
25 The only program the user interacts directly with. 29 The only program users directly interact with.
26 It includes functions to compose new mail, display received mail, 30 It includes functions to compose new mail, display received mail,
27 and to manage the mail storage. 31 and to manage the mail storage.
28 Also called \fImail client\fP. 32 It is called a \fImail client\fP as well.
29 .IP "Mail Submission Agent (MSA) 33 .IP "Mail Submission Agent (MSA)
30 A special kind of Mail Transfer Agent, used to submit mail into the 34 A special kind of Mail Transfer Agent, used to submit mail into the
31 mail transport system. 35 mail transport system.
36 Often it is also called an MTA.
32 .IP "Mail Transfer Agent (MTA) 37 .IP "Mail Transfer Agent (MTA)
33 A node in the mail transport system. 38 A node in the mail transport system.
34 Transfers incoming mail to a transport node nearer to the final destination. 39 It transfers incoming mail to a transport node nearer to the
35 It may be the final destination itself. 40 final destination.
41 An MTA may be the final destination itself.
36 .IP "Mail Delivery Agent (MDA) 42 .IP "Mail Delivery Agent (MDA)
37 Delivers mail by storing it onto disk, usually according to a set of rules. 43 Delivers mail according to a set of rules.
44 Usually, the messages are stored to disk.
38 .IP "Mail Retrieval Agent (MRA) 45 .IP "Mail Retrieval Agent (MRA)
39 Initiates the transfer of mail from a remote server to the local machine. 46 Initiates the transfer of mail from a remote location to the local machine.
40 (The dashed arrow represents the pull request.) 47 (The dashed arrow in the figure represents the pull request.)
41 .P 48 .LP
42 The dashed boxes represent groups that usually reside on single machines. 49 The dashed boxes represent entities that usually reside on single machines.
43 The box on the lower left represents the sender's local system. 50 The box on the lower left represents the sender's system.
44 The box on the upper left represents the first mail transfer node. 51 The box on the upper left represents the first mail transfer node.
45 The box on the upper right represents the transfer node responsible for the 52 The box on the upper right represents the transfer node responsible for the
46 destination address. 53 destination address.
47 The box on the lower right represents the recipient's local system. 54 The box on the lower right represents the recipient's system.
48 Often, the boxes above the dotted line are servers on the Internet. 55 Often, the boxes above the dotted line are servers on the Internet.
49 Many mail clients, including nmh, have all of the components below 56 Many mail clients, including nmh, include all of the components below
50 the dotted line implemented. 57 the dotted line.
51 Not so in mmh, which is an MUA only. 58 This is not the case for mmh; it implements the MUA only.
52 59
53 60
54 61
55 62
56 63
57 64
58 .\" -------------------------------------------------------------- 65 .\" --------------------------------------------------------------
59 .H1 "Streamlining 66 .H1 "Streamlining
60 67
61 .P 68 .P
62 MH once provided anything necessary for email handling. 69 MH once provided a complete email system.
63 The community around nmh has the similar understanding that nmh should 70 The community around nmh tries to keep nmh in similar shape.
64 provide a complete email system.
65 In fundamental contrast, mmh shall be an MUA only. 71 In fundamental contrast, mmh shall be an MUA only.
66 I believe that the development of all-in-one mail systems is obsolete. 72 I believe that the development of all-in-one mail systems is obsolete.
67 Today, email is too complex to be fully covered by a single project. 73 Today, email is too complex to be fully covered by a single project.
68 Such a project will not be able to excel in all aspects. 74 Such a project will not be able to excel in all aspects.
69 Instead, the aspects of email should be covered by multiple projects, 75 Instead, the aspects of email should be covered by multiple projects,
70 which then can be combined to form a complete system. 76 which then can be combined to form a complete system.
71 Excellent implementations for the various aspects of email already exist. 77 Excellent implementations for the various aspects of email already exist.
72 Just to name three examples: Postfix is a specialized MTA, 78 Just to name three examples: Postfix
73 .\" XXX homepages verlinken 79 .[
74 Procmail is a specialized MDA, and Fetchmail is a specialized MRA. 80 postfix website
81 .]
82 is a specialized MTA, Procmail
83 .[
84 procmail website
85 .]
86 is a specialized MDA, and Fetchmail
87 .[
88 fetchmail website
89 .]
90 is a specialized MRA.
75 I believe that it is best to use such specialized tools instead of 91 I believe that it is best to use such specialized tools instead of
76 providing the same function again as a side-component in the project. 92 providing the same function once more as a side component.
77 .\" XXX mail agent picture here
78 .P 93 .P
79 Doing something well requires focusing on a small set of specific aspects. 94 Doing something well requires focusing on a small set of specific aspects.
80 Under the assumption that development focussed on a particular area 95 Under the assumption that development which is focussed on a particular
81 produces better results there, specialized projects will be superior 96 area produces better results there, specialized projects will be superior
82 in their field of focus. 97 in their field of focus.
83 Hence, all-in-one mail system projects \(en no matter if monolithic 98 Hence, all-in-one mail system projects \(en no matter if monolithic
84 or modular \(en will never be the best choice in any of the fields. 99 or modular \(en will never be the best choice in any of the fields.
85 Even in providing the best consistent all-in-one system, they are likely 100 Even in providing the most consistent all-in-one system, they are likely
86 to be beaten by projects that focus only on integrating existing mail 101 to be beaten by projects that focus exclusively on the creation
87 components to create a homogeneous system. 102 of a homogeneous system by integrating existing mail components.
88 .P 103 .P
89 The limiting resource in the community development of free software 104 Usually, the limiting resource in the community development of
90 is usually man power. 105 free software is man power.
91 .\" XXX FIXME ref! 106 .\" XXX FIXME ref!
92 If the development power is spread over a large development area, 107 If the development effort is spread over a large development area,
93 it becomes even more difficult to compete with the specialists in the 108 it becomes more difficult to compete with the specialists in the
94 various fields. 109 various fields.
95 The concrete situation for MH-based mail systems is even tougher, 110 The concrete situation for MH-based mail systems is even tougher,
96 given their small and aged community, concerning both developers and users. 111 given their small and aged community, concerning both developers and users.
97 .P 112 .P
98 In consequence, I believe that the available development resources 113 In consequence, I believe that the available development resources
102 117
103 118
104 .H2 "Mail Transfer Facilities 119 .H2 "Mail Transfer Facilities
105 .Id mail-transfer-facilities 120 .Id mail-transfer-facilities
106 .P 121 .P
107 In contrast to nmh, which also provides mail submission and mail retrieval 122 The removal of the mail transfer facilities, effectively dropping the
108 agents, mmh is an MUA only. 123 MSA and MRA, had been the first work task in the mmh project.
109 This general difference initiated the development of mmh. 124 The desire for this change initiated the creation of the mmh project.
110 The removal of the mail transfer facilities was the first work task
111 in the mmh project.
112 .P 125 .P
113 Focusing on one mail agent role only, is motivated by Eric Allman's 126 Focusing on one mail agent role only, is motivated by Eric Allman's
114 experience with Sendmail. 127 experience with Sendmail.
115 He identified the limitation of Sendmail to the MTA task as one reason for 128 He identified the limitation of Sendmail
116 its success: 129 .[
130 sendmail website
131 .]
132 to the MTA task as one reason for its success:
117 .[ [ 133 .[ [
118 costales sendmail 134 costales sendmail
119 .], p. xviii] 135 .], p. xviii]
120 .QS 136 .QS
121 Second, I limited myself to the routing function \(en 137 Second, I limited myself to the routing function \(en
122 I wouldn't write user agents or delivery back-ends. 138 I wouldn't write user agents or delivery back-ends.
123 This was a departure of the dominant through of the time, 139 This was a departure of the dominant thought of the time,
124 in which routing logic, local delivery, and often the network code 140 in which routing logic, local delivery, and often the network code
125 were incorporated directly into the user agents. 141 were incorporated directly into the user agents.
126 .QE 142 .QE
127 .P 143 .P
128 In nmh, the MSA is called \fIMessage Transfer Service\fP (MTS). 144 In nmh, the MSA is called \fIMessage Transfer Service\fP (MTS).
129 This facility, implemented by the 145 This facility, implemented by the
130 .Pn post 146 .Pn post
131 command, established network connections and spoke SMTP to submit 147 command, establishes network connections and spoke SMTP to submit
132 messages to be relayed to the outside world. 148 messages to be relayed to the outside world.
133 The changes in email demanded changes in this part of nmh as well. 149 When email transfer changed, this part needed to be changed as well.
134 Encryption and authentication for network connections 150 Encryption and authentication for network connections
135 needed to be supported, hence TLS and SASL were introduced into nmh. 151 needed to be supported, hence TLS and SASL were introduced into nmh.
136 This added complexity to nmh without improving it in its core functions. 152 This added complexity without improving the core functions.
137 Also, keeping up with recent developments in the field of 153 Furthermore, keeping up with recent developments in the field of
138 mail transfer requires development power and specialists. 154 mail transfer requires development power and specialists.
139 In mmh, this whole facility was simply cut off. 155 In mmh, this whole facility was simply cut off
140 .Ci f6aa95b724fd8c791164abe7ee5468bf5c34f226 156 .Ci f6aa95b724fd8c791164abe7ee5468bf5c34f226
141 .Ci fecd5d34f65597a4dfa16aeabea7d74b191532c3 157 .Ci fecd5d34f65597a4dfa16aeabea7d74b191532c3
142 .Ci 156d35f6425bea4c1ed3c4c79783dc613379c65b 158 .Ci 156d35f6425bea4c1ed3c4c79783dc613379c65b .
143 Instead, mmh depends on an external MSA. 159 Instead, mmh depends on an external MSA.
144 The only outgoing interface available to mmh is the 160 All outgoing mail in mmh goes through the
145 .Pn sendmail 161 .Pn sendmail
146 command, which almost any MSA provides. 162 command, which almost any MSA provides.
147 If not, a wrapper program can be written. 163 If not, a wrapper program can be written.
148 It must read the message from the standard input, extract the 164 It must read the message from the standard input, extract the
149 recipient addresses from the message header, and hand the message 165 recipient addresses from the message header, and hand the message
150 over to the MSA. 166 over to the MSA.
151 For example, a wrapper script for qmail would be: 167 For example, a wrapper script for qmail
168 .[
169 qmail website
170 .]
171 would be:
152 .VS 172 .VS
153 #!/bin/sh 173 #!/bin/sh
154 exec qmail-inject # ignore command line arguments 174 exec qmail-inject # ignore command line arguments
155 VE 175 VE
156 The requirement to parse the recipient addresses out of the message header 176 The requirement to parse the recipient addresses out of the message header
157 is likely to be removed in the future. 177 may be removed in the future.
158 Then mmh would pass the recipient addresses as command line arguments. 178 Mmh could pass the recipient addresses as command line arguments.
159 This appears to be the better interface. 179 This appears to be the better interface.
160 .\" XXX implement it
161 .P 180 .P
162 To retrieve mail, the 181 To retrieve mail, the
163 .Pn inc 182 .Pn inc
164 command acted as an MRA. 183 command in nmh acts as MRA.
165 It established network connections 184 It establishes network connections
166 and spoke POP3 to retrieve mail from remote servers. 185 and speaks POP3 to retrieve mail from remote servers.
167 As with mail submission, the network connections required encryption and 186 As with mail submission, the network connections required encryption and
168 authentication, thus TLS and SASL were added. 187 authentication, thus TLS and SASL were added to nmh.
169 Support for message retrieval through IMAP will soon become necessary 188 Support for message retrieval through IMAP will soon become necessary
170 additions, too, and likewise for any other changes in mail transfer. 189 additions, too, and likewise for any other changes in mail transfer.
171 Not so for mmh because it has dropped the support for retrieving mail 190 But not in mmh because it has dropped the support for retrieving mail
172 from remote locations. 191 from remote locations
173 .Ci ab7b48411962d26439f92f35ed084d3d6275459c 192 .Ci ab7b48411962d26439f92f35ed084d3d6275459c .
174 Instead, it depends on an external tool to cover this task. 193 Instead, it depends on an external tool to cover this task.
175 Mmh has two paths for messages to enter mmh's mail storage: 194 Mmh has two paths for messages to enter mmh's mail storage:
176 (1) Mail can be incorporated with 195 (1) Mail can be incorporated with
177 .Pn inc 196 .Pn inc
178 from the system maildrop, or (2) with 197 from the system maildrop, or (2) with
179 .Pn rcvstore 198 .Pn rcvstore
180 by reading them, one at a time, from the standard input. 199 by reading them, one at a time, from the standard input.
181 .P 200 .P
182 With the removal of the MSA and MRA, mmh converted from an all-in-one 201 With the removal of the MSA and MRA, mmh converted from a complete
183 mail system to being an MUA only. 202 mail system to only an MUA.
184 Now, of course, mmh depends on third-party software. 203 Now, of course, mmh depends on third-party software.
185 An external MSA is required to transfer mail to the outside world; 204 An external MSA is required to transfer mail to the outside world;
186 an external MRA is required to retrieve mail from remote machines. 205 an external MRA is required to retrieve mail from remote machines.
187 Excellent implementations of such software exist, 206 Excellent implementations of such software exist.
188 which likely are superior than the internal version. 207 They likely are superior to the internal versions that were removed.
189 Additionally, the best suiting programs can be freely chosen. 208 Additionally, the best suiting programs can be chosen freely.
190 .P 209 .P
191 As it had already been possible to use an external MSA or MRA, 210 As it had already been possible to use an external MSA and MRA,
192 why not keep the internal version for convenience? 211 why should the internal version not be kept for convenience?
193 .\" XXX ueberleitung 212 .\" XXX commas correct?
194 The question whether there is sense in having a fall-back pager in all 213 Transfered to a different area,
214 the question whether there is sense in having a fall-back pager in all
195 the command line tools, for the cases when 215 the command line tools, for the cases when
196 .Pn more 216 .Pn more
197 or 217 or
198 .Pn less 218 .Pn less
199 are not available, appears to be ridiculous. 219 are not available, appears to be ridiculous.
200 Of course, MSAs and MRAs are more complex than text pagers 220 Of course, MSAs and MRAs are more complex than text pagers
201 and not necessarily available but still the concept of orthogonal 221 and not necessarily available but still the concept of orthogonal
202 design holds: ``Write programs that do one thing and do it well.'' 222 design holds: ``Write programs that do one thing and do it well''.
203 .[ 223 .[
204 mcilroy unix phil 224 mcilroy unix phil
205 p. 53 225 p. 53
206 .] 226 .]
207 .[ 227 .[
213 Develop projects that focus on one thing and do it well. 233 Develop projects that focus on one thing and do it well.
214 Projects which have grown complex should be split, for the same 234 Projects which have grown complex should be split, for the same
215 reasons that programs which have grown complex should be split. 235 reasons that programs which have grown complex should be split.
216 If it is conceptionally more elegant to have the MSA and MRA as 236 If it is conceptionally more elegant to have the MSA and MRA as
217 separate projects then they should be separated. 237 separate projects then they should be separated.
218 In my opinion, this is the case here. 238 In my opinion, this is the case.
219 The RFCs propose this separation by clearly distinguishing the different 239 The RFCs suggest this separation by clearly distinguishing the
220 mail handling tasks [RFC\|821]. 240 different mail handling tasks [RFC\|821].
221 The small interfaces between the mail agents support the separation. 241 The small interfaces between the mail agents support the
222 .P 242 separation as well.
223 Email once had been small and simple. 243 .P
244 Once, email had been small and simple.
224 At that time, 245 At that time,
225 .Pn /bin/mail 246 .Pn /bin/mail
226 had covered everything there was to email and still was small and simple. 247 had covered everything there was to email and still was small and simple.
227 Later, the essential complexity of email increased. 248 Later, the essential complexity of email increased.
228 (Essential complexity is the complexity defined by the problem itself.\0 249 (Essential complexity is the complexity defined by the problem itself.\&
229 .[[ 250 .[ [
230 brooks no silver bullet 251 brooks no silver bullet
231 .]]) 252 .]])
232 Email systems reacted to this change: they grew. 253 Consequently, email systems grew.
233 RFCs started to introduce the concept of mail agents to separate the 254 RFCs started to introduce the concept of mail agents to separate the
234 various tasks because they became more extensive and new tasks appeared. 255 various roles because they became more extensive and because
235 As the mail systems grew even more, parts were split off. 256 new roles appeared.
257 As mail system implementations grew, parts of them were split off.
236 For instance, a POP server was included in the original MH; 258 For instance, a POP server was included in the original MH;
237 it was removed in nmh. 259 it was removed in nmh.
238 Now is the time to go one step further and split off the MSA and MRA, too. 260 Now is the time to go one step further and split off the MSA and MRA,
261 as well.
239 Not only does this decrease the code size of the project, 262 Not only does this decrease the code size of the project,
240 more importantly, it unburdens mmh of the whole field of 263 more importantly, it unburdens mmh of the whole field of
241 message transfer with all its implications for the project. 264 message transfer, with all its implications for the project.
242 There is no more need for concern with changes in network transfer. 265 There is no more need for concern with changes in network transfer.
243 This independence is gained by depending on an external program 266 This independence is gained by depending on external components
244 that covers the field. 267 that cover the field.
245 Today, this is a reasonable exchange. 268 .P
246 .P 269 In general, functionality can be added in three different ways:
247 .\" XXX ueberleitung ???
248 Functionality can be added in three different ways:
249 .LI 1 270 .LI 1
250 Implementing the function in the project itself. 271 By implementing the function in the project itself.
251 .LI 2 272 .LI 2
252 Depending on a library that provides the function. 273 By depending on a library that provides the function.
253 .LI 3 274 .LI 3
254 Depending on a program that provides the function. 275 By depending on a program that provides the function.
255 .LP 276 .LP
256 .\" XXX Rework sentence 277 .\" XXX Rework sentence
257 While implementing the function in the project itself leads to the 278 While implementing the function in the project itself leads to the
258 largest increase in code size and requires the most maintenance 279 largest increase in code size and requires the most maintenance
259 and development work, 280 and development work,
260 it increases the project's independence of other software the most. 281 it keeps the project's dependence on other software lowest.
261 Using libraries or external programs requires less maintenance work 282 Using libraries or external programs requires less maintenance work
262 but introduces dependencies on external software. 283 but introduces dependencies on external projects.
263 Programs have the smallest interfaces and provide the best separation, 284 Programs have the smallest interfaces and provide the best separation,
264 but possibly limit the information exchange. 285 but possibly limit the information exchange.
265 External libraries are more strongly connected than external programs, 286 External libraries are more strongly connected than external programs,
266 thus information can be exchanged in a more flexible manner. 287 thus information can be exchanged in a more flexible manner.
267 Adding code to a project increases maintenance work. 288 Adding code to a project increases maintenance work.
268 .\" XXX ref 289 .\" XXX ref
269 Implementing complex functions in the project itself adds 290 As implementing complex functions in the project itself adds
270 a lot of code. 291 a lot of code, this should be avoided if possible.
271 This should be avoided if possible. 292 Thus, the dependencies only change in their character,
272 Hence, the dependencies only change in their character,
273 not in their existence. 293 not in their existence.
274 In mmh, library dependencies on 294 In mmh, library dependencies on
275 .Pn libsasl2 295 .Pn libsasl2
276 and 296 and
277 .Pn libcrypto /\c 297 .Pn libcrypto /\c
289 project's internal versions, the common user even gains functionality. 309 project's internal versions, the common user even gains functionality.
290 .P 310 .P
291 Users of MH should not have problems setting up an external MSA and MRA. 311 Users of MH should not have problems setting up an external MSA and MRA.
292 Also, the popular MSAs and MRAs have large communities and a lot 312 Also, the popular MSAs and MRAs have large communities and a lot
293 of available documentation. 313 of available documentation.
294 Choices for MSAs range from full-featured MTAs such as 314
295 .\" XXX refs 315 Choices for MSAs range from small forwarders such as
296 .I Postfix , 316 .[
297 over mid-size MTAs such as 317 ssmtp website
298 .I masqmail 318 .]
299 and 319 and,
300 .I dma , 320 .[
301 to small forwarders such as 321 nullmailer website
302 .I ssmtp 322 .]
303 and 323 over mid-size MTAs including
304 .I nullmailer . 324 .[
305 Choices for MRAs include 325 masqmail website
306 .I fetchmail , 326 .]
307 .I getmail , 327 and,
308 .I mpop 328 .[
309 and 329 dma dragonfly mail agent website
310 .I fdm . 330 .]
331 up to full-featured MTAs as for instance.
332 .[
333 postfix website
334 .]
335 MRAs are provided for example by
336 .[ [
337 fetchmail website
338 .]
339 .[
340 getmail website
341 .]
342 .[
343 mpop website
344 .]
345 .[
346 fdm website
347 .]].
311 348
312 349
313 .H2 "Non-MUA Tools 350 .H2 "Non-MUA Tools
314 .P 351 .P
315 One goal of mmh is to remove the tools that are not part of the MUA's task. 352 One goal of mmh is to remove the tools that do not significantly
316 Furthermore, any tools that do not significantly improve the MUA's job 353 contribute to the MUA's job.
317 should be removed. 354 Loosely related and rarely used tools distract from a lean appearance,
318 Loosely related and rarely used tools distract from the lean appearance. 355 and require maintenance work without adding much to the core task.
319 They require maintenance work without adding much to the core task. 356 By removing these tools, mmh became more streamlined and focused.
320 By removing these tools, the project shall become more streamlined
321 and focused.
322 In mmh, the following tools are not available anymore:
323 .BU 357 .BU
324 .Pn conflict 358 .Pn conflict
325 was removed 359 was removed
326 .Ci 8b235097cbd11d728c07b966cf131aa7133ce5a9 360 .Ci 8b235097cbd11d728c07b966cf131aa7133ce5a9
327 because it is a mail system maintenance tool that is not MUA-related. 361 because it is a mail system maintenance tool and not MUA-related.
328 It even checked 362 It even checked
329 .Fn /etc/passwd 363 .Fn /etc/passwd
330 and 364 and
331 .Fn /etc/group 365 .Fn /etc/group
332 for consistency, which is completely unrelated to email. 366 for consistency, which is completely unrelated to email.
341 because its use case of writing to the user's terminal 375 because its use case of writing to the user's terminal
342 on reception of mail is obsolete. 376 on reception of mail is obsolete.
343 If users like to be informed of new mail, the shell's 377 If users like to be informed of new mail, the shell's
344 .Ev MAILPATH 378 .Ev MAILPATH
345 variable or graphical notifications are technically more appealing. 379 variable or graphical notifications are technically more appealing.
346 Writing directly to terminals is hardly ever desired today. 380 Writing to terminals directly is hardly ever desired today.
347 If, though, one prefers this approach, the standard tool 381 If, though, one prefers this approach, the standard tool
348 .Pn write 382 .Pn write
349 can be used in a way similar to: 383 can be used in a way similar to:
350 .VS 384 .VS
351 scan -file - | write `id -un` 385 scan -file - | write `id -un`
373 .Pn msgchk 407 .Pn msgchk
374 provided hardly more information than: 408 provided hardly more information than:
375 .VS 409 .VS
376 ls -l /var/mail/meillo 410 ls -l /var/mail/meillo
377 VE 411 VE
378 It did distinguish between old and new mail, but 412 Yet, it distinguished between old and new mail, but
379 these details can be retrieved with 413 these details can be retrieved with
380 .Pn stat (1), 414 .Pn stat (1),
381 too. 415 too.
382 A small shell script could be written to print the information 416 A small shell script could be written to print the information
383 in a similar way, if truly necessary. 417 in a similar way, if truly necessary.
389 .BU 423 .BU
390 .Pn msh 424 .Pn msh
391 was removed 425 was removed
392 .Ci 916690191222433a6923a4be54b0d8f6ac01bd02 426 .Ci 916690191222433a6923a4be54b0d8f6ac01bd02
393 because the tool was in conflict with the philosophy of MH. 427 because the tool was in conflict with the philosophy of MH.
394 It provided an interactive shell to access the features of MH, 428 It provided an interactive shell to access the features of MH.
395 but it was not just a shell tailored to the needs of mail handling. 429 However, it was not just a shell tailored to the needs of mail handling,
396 Instead, it was one large program that had several MH tools built in. 430 but one large program that had several MH tools built in.
397 This conflicts with the major feature of MH of being a tool chest. 431 This conflicted with the major feature of MH of being a tool chest.
398 .Pn msh 's 432 .Pn msh 's
399 main use case had been accessing Bulletin Boards, which have ceased to 433 main use case had been accessing Bulletin Boards, which have ceased to
400 be popular. 434 be popular.
401 .P 435 .P
402 Removing 436 Removing
414 .Pn rcvtty 448 .Pn rcvtty
415 and 449 and
416 .Pn msgchk 450 .Pn msgchk
417 are assumed to be rarely used and can be implemented in different ways, 451 are assumed to be rarely used and can be implemented in different ways,
418 why should one keep them? 452 why should one keep them?
419 Removing them streamlines mmh. 453 Removing them streamlined mmh.
420 .Pn viamail 's 454 .Pn viamail 's
421 use case is now partly obsolete and partly covered by 455 use case is now partly obsolete and partly covered by
422 .Pn forw , 456 .Pn forw ,
423 hence there's no reason to still maintain it. 457 hence there is no reason to still maintain it.
424 .Pn conflict 458 .Pn conflict
425 is not related to the mail client, and 459 is not related to the mail client, and
426 .Pn msh 460 .Pn msh
427 conflicts with the basic concept of MH. 461 conflicts with the basic concept of MH.
428 These two tools might still be useful, but they should not be part of mmh. 462 These two tools might still be useful, but they should not be part of mmh.
429 .P 463 .P
430 Finally, there is 464 Finally, there is
431 .Pn slocal . 465 .Pn slocal ,
432 .Pn slocal 466 which is an MDA and thus not directly MUA-related.
433 is an MDA and thus not directly MUA-related. 467 It should be removed from mmh because including it conflicts with
434 It should be removed from mmh, because including it conflicts with
435 the idea that mmh is an MUA only. 468 the idea that mmh is an MUA only.
436 .Pn slocal
437 should rather become a separate project.
438 However, 469 However,
439 .Pn slocal 470 .Pn slocal
440 provides rule-based processing of messages, like filing them into 471 provides rule-based processing of messages, like filing them into
441 different folders, which is otherwise not available in mmh. 472 different folders, which is otherwise not available in mmh.
442 Although 473 Although
454 .Pn slocal 485 .Pn slocal
455 would become yet another independent MDA, like 486 would become yet another independent MDA, like
456 .I procmail . 487 .I procmail .
457 Then 488 Then
458 .Pn slocal 489 .Pn slocal
459 could be installed without the complete MH system. 490 could be installed without a complete MH system.
460 Likewise, mmh users could decide to use 491 Likewise, mmh users could decide to use
461 .I procmail 492 .I procmail
462 without having a second, unused MDA, 493 without having a second, unused MDA, i.e.
463 .Pn slocal , 494 .Pn slocal ,
464 installed. 495 installed.
465 That appears to be conceptionally the best solution. 496 That appears to be conceptionally the best solution.
466 Yet, 497 Yet,
467 .Pn slocal 498 .Pn slocal
468 is not split off. 499 is not split off.
469 I defer the decision over 500 I defer the decision over
470 .Pn slocal 501 .Pn slocal
471 out of a need for deeper investigation. 502 out of a need for deeper investigation.
472 In the meanwhile, it remains part of mmh. 503 In the meanwhile, it remains part of mmh
473 However, its continued existence is not significant because 504 as its continued existence is not significant;
474 .Pn slocal 505 .Pn slocal
475 is unrelated to the rest of the project. 506 is unrelated to the rest of the project.
476 507
477 508
478 509
486 .Pn show 517 .Pn show
487 mapped message numbers and sequences to files and invoked 518 mapped message numbers and sequences to files and invoked
488 .Pn mhl 519 .Pn mhl
489 to have the files formatted. 520 to have the files formatted.
490 With MIME, this approach was not sufficient anymore. 521 With MIME, this approach was not sufficient anymore.
491 MIME messages can consist of multiple parts. Some parts are not 522 MIME messages can consist of multiple parts.
492 directly displayable and text content might be encoded in 523 Some parts, like binary attachments or text content in foreign charsets,
493 foreign charsets. 524 are not directly displayable.
494 .Pn show 's 525 .Pn show 's
495 understanding of messages and 526 understanding of messages and
496 .Pn mhl 's 527 .Pn mhl 's
497 display capabilities could not cope with the task any longer. 528 display capabilities could not cope with the task any longer.
498 .P 529 .P
499 Instead of extending these tools, additional tools were written from 530 Instead of extending these tools, additional tools were written from
500 scratch and added to the MH tool chest. 531 scratch and were added to the MH tool chest.
501 Doing so is encouraged by the tool chest approach. 532 Doing so is encouraged by the tool chest approach.
502 Modular design is a great advantage for extending a system, 533 Modular design is a great advantage for extending a system,
503 as new tools can be added without interfering with existing ones. 534 as new tools can be added without interfering with existing ones.
504 First, the new MIME features were added in form of the single program 535 First, the new MIME features were added in form of the single program
505 .Pn mhn . 536 .Pn mhn .
506 The command 537 The command
507 .Cl "mhn -show 42 538 .Cl "mhn -show 42
508 would show the MIME message numbered 42. 539 had then shown the message number
540 .Fn 42 ,
541 interpreting MIME.
509 With the 1.0 release of nmh in February 1999, Richard Coleman finished 542 With the 1.0 release of nmh in February 1999, Richard Coleman finished
510 the split of 543 the split of
511 .Pn mhn 544 .Pn mhn
512 into a set of specialized tools, which together covered the 545 into a set of specialized tools, which together covered the
513 multiple aspects of MIME. 546 multiple aspects of MIME.
538 .Pn show 571 .Pn show
539 or 572 or
540 .Pn mhshow , 573 .Pn mhshow ,
541 whatever was more appropriate. 574 whatever was more appropriate.
542 .P 575 .P
543 Having two similar tools for essentially the same task is redundant. 576 Having two similar tools for basically the same task is redundancy.
544 Usually, users would not distinguish between 577 Usually, users do not distinguish between
545 .Pn show 578 .Pn show
546 and 579 and
547 .Pn mhshow 580 .Pn mhshow
548 in their daily mail reading. 581 in their daily mail reading.
549 Having two separate display programs was therefore mainly unnecessary 582 Having two separate display programs was therefore unnecessary
550 from a user's point of view. 583 from a user's point of view.
551 Besides, the development of both programs needed to be in sync, 584 Besides, the development of both programs needed to be in sync,
552 to ensure that the programs behaved in a similar way, 585 to ensure that the programs behaved in a similar way,
553 because they were used like a single tool. 586 because they were used like a single tool.
554 Different behavior would have surprised the user. 587 Different behavior would have surprised the user.
555 .P 588 .P
556 Today, non-MIME messages are rather seen to be a special case of 589 Today, non-MIME messages are rather seen to be a special case of
557 MIME messages, although it is the other way round. 590 MIME messages, although it is the other way round.
558 As 591 As
559 .Pn mhshow 592 .Pn mhshow
560 had already been able to display non-MIME messages, it appeared natural 593 already had been able to display non-MIME messages, it appeared natural
561 to drop 594 to drop
562 .Pn show 595 .Pn show
563 in favor of using 596 in favor of using
564 .Pn mhshow 597 .Pn mhshow
565 exclusively. 598 exclusively
566 .Ci 4c1efddfd499300c7e74263e57d8aa137e84c853 599 .Ci 4c1efddfd499300c7e74263e57d8aa137e84c853 .
567 Removing 600 Removing
568 .Pn show 601 .Pn show
569 is no loss in function, because functionally 602 is no loss in function, because
570 .Pn mhshow 603 .Pn mhshow
571 covers it completely. 604 covers it completely.
572 The old behavior of 605 Yet, the old behavior of
573 .Pn show 606 .Pn show
574 can still be emulated with the simple command line: 607 can still be emulated with the simple command line:
575 .VS 608 .VS
576 mhl `mhpath c` 609 mhl `mhpath c`
577 VE 610 VE
584 .Pn show 617 .Pn show
585 was gone. 618 was gone.
586 It is clear that such a rename may confuse future developers when 619 It is clear that such a rename may confuse future developers when
587 trying to understand the history. 620 trying to understand the history.
588 Nevertheless, I consider the convenience on the user's side, 621 Nevertheless, I consider the convenience on the user's side,
589 to call 622 to outweigh the inconvenience for understanding the evolution
590 .Pn show 623 of the tools.
591 when they want a message to be displayed, to outweigh the inconvenience
592 on the developer's side when understanding the project history.
593 .P 624 .P
594 To prepare for the transition, 625 To prepare for the transition,
595 .Pn mhshow 626 .Pn mhshow
596 was reworked to behave more like 627 was reworked to behave more like
597 .Pn show 628 .Pn show
598 first. 629 first (cf. Sec.
599 (cf. Sec. 630 .Cf mhshow ).
600 .Cf mhshow )
601 .\" XXX code commits? 631 .\" XXX code commits?
602 Once the tools behaved more alike, the replacing appeared to be 632 Once the tools behaved more alike, the replacing appeared to be
603 even more natural. 633 even more natural.
604 Today, mmh's new 634 Today, mmh's new
605 .Pn show 635 .Pn show
606 has become the one single message display program once more, 636 has become the one single message display program once again,
607 with the difference 637 with the difference
608 that today it handles MIME messages as well as non-MIME messages. 638 that today it handles MIME messages as well as non-MIME messages.
609 The outcome of the transition is one program less to maintain, 639 The outcomes of the transition are one program less to maintain,
610 no second display program for users to deal with, 640 no second display program for users to deal with,
611 and less system complexity. 641 and less system complexity.
612 .P 642 .P
613 Still, removing the old 643 Still, removing the old
614 .Pn show 644 .Pn show
643 There is the cost of less tested setups, because there are 673 There is the cost of less tested setups, because there are
644 more possible setups and especially corner cases. 674 more possible setups and especially corner cases.
645 Additionally, there is the cost of choice itself. 675 Additionally, there is the cost of choice itself.
646 The code complexity directly affects the developers. 676 The code complexity directly affects the developers.
647 Less tested code affects both users and developers. 677 Less tested code affects both users and developers.
648 The problem of choice affects the users, for once by having to choose, 678 The problem of choice affects the users, for once by having to choose
649 but also by more complex interfaces that require more documentation. 679 but also by more complex interfaces that require more documentation.
650 Whenever options add few advantages but increase the complexity of the 680 Whenever options add few advantages but increase the complexity of the
651 system, they should be considered for removal. 681 system, they should be considered for removal.
652 I have reduced the number of project-specific configure options from 682 I have reduced the number of project-specific configure options from
653 fifteen to three. 683 15 to 3.
654 684
655 .U3 "Mail Transfer Facilities 685 .U3 "Mail Transfer Facilities
656 .P 686 .P
657 With the removal of the mail transfer facilities five configure 687 With the removal of the mail transfer facilities 5 configure
658 options vanished: 688 options vanished:
659 .P 689 .P
660 The switches 690 The switches
661 .Sw --with-tls 691 .Sw --with-tls
662 and 692 and
663 .Sw --with-cyrus-sasl 693 .Sw --with-cyrus-sasl
664 had activated the support for transfer encryption and authentication. 694 had activated the support for transfer encryption and authentication.
665 .\" XXX cf 695 .\" XXX cf
666 .\" XXX gruende kurz wiederholen 696 .\" XXX gruende kurz wiederholen
667 This is not needed anymore. 697 They are not needed anymore.
668 .Ci fecd5d34f65597a4dfa16aeabea7d74b191532c3 698 .Ci fecd5d34f65597a4dfa16aeabea7d74b191532c3
669 .Ci 156d35f6425bea4c1ed3c4c79783dc613379c65b 699 .Ci 156d35f6425bea4c1ed3c4c79783dc613379c65b
670 .P 700 .P
671 .\" XXX cf 701 .\" XXX cf
672 .\" XXX ``For the same reason ...'' 702 .\" XXX ``For the same reason ...''
673 The configure switch 703 The configure switch
674 .Sw --enable-pop 704 .Sw --enable-pop
675 activated the message retrieval facility. 705 activated the message retrieval facility.
676 The code area that would be conditionally compiled in for TLS and SASL 706 Whereas the code area that had been conditionally compiled in
677 support had been small. 707 for TLS and SASL support was small,
678 The conditionally compiled code area for POP support had been much larger. 708 the conditionally compiled code area for POP support was much larger.
679 Whereas the code base changes would only slightly change on toggling 709 The code base had only changed slightly on toggling TLS or SASL
680 TLS or SASL support, it changed much on toggling POP support. 710 support but it had changed much on toggling POP support.
681 The changes in the code base could hardly be overviewed. 711 The changes in the code base could hardly be overviewed.
682 By having POP support togglable, a second code base had been created, 712 By having POP support togglable, a second code base had been created,
683 one that needed to be tested. 713 one that needed to be tested.
684 This situation is basically similar for the conditional TLS and SASL 714 This situation is basically similar for the conditional TLS and SASL
685 code, but there the changes are minor and can yet be overviewed. 715 code, but there the changes are minor and can yet be overviewed.
687 of the original program. 717 of the original program.
688 More variations require more testing and maintenance work. 718 More variations require more testing and maintenance work.
689 .P 719 .P
690 Two other options only specified default configuration values: 720 Two other options only specified default configuration values:
691 .Sw --with-mts 721 .Sw --with-mts
692 defined the default transport service. 722 defined the default transport service
693 .Ci f6aa95b724fd8c791164abe7ee5468bf5c34f226 723 .Ci f6aa95b724fd8c791164abe7ee5468bf5c34f226 .
694 With 724 With
695 .Sw --with-smtpservers 725 .Sw --with-smtpservers
696 default SMTP servers could be specified. 726 default SMTP servers could be specified
697 .Ci 128545e06224233b7e91fc4c83f8830252fe16c9 727 .Ci 128545e06224233b7e91fc4c83f8830252fe16c9 .
698 Both of them became irrelevant when the SMTP transport service was removed. 728 Both of them became irrelevant when the SMTP transport service was removed.
699 .\" XXX code ref 729 .\" XXX code ref
700 In mmh, all messages are handed over to 730 In mmh, all messages are handed over to
701 .Pn sendmail 731 .Pn sendmail
702 for transportation. 732 for transportation.
710 .\" XXX Zeitlich ordnen 740 .\" XXX Zeitlich ordnen
711 In July 2000, Kimmo Suominen introduced 741 In July 2000, Kimmo Suominen introduced
712 the configure option 742 the configure option
713 .Sw --with-hash-backup 743 .Sw --with-hash-backup
714 to change the default to the hash character `\f(CW#\fP'. 744 to change the default to the hash character `\f(CW#\fP'.
715 The choice was probably personal preference, because first, the 745 This choice was probably personal preference, but,
716 option was named 746 being related or not, words that start with the hash character
717 .Sw --with-backup-prefix.
718 and had the prefix character as argument.
719 But giving the hash character as argument caused too many problems
720 for Autoconf,
721 thus the option was limited to use the hash character as the default prefix.
722 This supports the assumption, that the choice for the hash was
723 personal preference only.
724 Being related or not, words that start with the hash character
725 introduce a comment in the Unix shell. 747 introduce a comment in the Unix shell.
726 Thus, the command line 748 Thus, the command line
727 .Cl "rm #13 #15 749 .Cl "rm #13 #15
728 calls 750 calls
729 .Pn rm 751 .Pn rm
730 without arguments because the first hash character starts the comment 752 without arguments because the first hash character starts a comment
731 that reaches until the end of the line. 753 that reaches until the end of the line.
732 To delete the backup files, 754 To delete the backup files,
733 .Cl "rm ./#13 ./#15" 755 .Cl "rm ./#13 ./#15"
734 needs to be used. 756 needs to be used.
735 Using the hash as backup prefix can be seen as a precaution against 757 Thus, using the hash as backup prefix may be seen as a precaution
736 data loss. 758 against backup loss.
737 .P 759 .P
738 First, I removed the configure option but added the profile entry 760 First, I removed the configure option but added the profile entry
739 .Pe backup-prefix , 761 .Pe Backup-Prefix ,
740 which allows to specify an arbitrary string as backup prefix. 762 which allowed to specify an arbitrary string as backup prefix
741 .Ci 6c40d481d661d532dd527eaf34cebb6d3f8ed086 763 .Ci 6c40d481d661d532dd527eaf34cebb6d3f8ed086 .
742 Profile entries are the common method to change mmh's behavior.
743 This change did not remove the choice but moved it to a location where 764 This change did not remove the choice but moved it to a location where
744 it suited better. 765 it suited better, in my eyes.
745 .P 766 .P
746 Eventually, however, the new trash folder concept 767 Eventually however, the new trash folder concept
747 (cf. Sec. 768 (cf. Sec.
748 .Cf trash-folder ) 769 .Cf trash-folder )
749 removed the need for the backup prefix completely. 770 removed the need for the backup prefix completely.
750 .Ci 8edc5aaf86f9f77124664f6801bc6c6cdf258173 771 .Ci 8edc5aaf86f9f77124664f6801bc6c6cdf258173
751 .Ci ca0b3e830b86700d9e5e31b1784de2bdcaf58fc5 772 .Ci ca0b3e830b86700d9e5e31b1784de2bdcaf58fc5
778 and, 799 and,
779 .[ 800 .[
780 posix 1992 801 posix 1992
781 .] 802 .]
782 respectively.) 803 respectively.)
783 As a first step, these two tools were hard-coded as defaults. 804 As a first step, these two tools were hard-coded as defaults
784 .Ci 5d43a99db70c12a673028c7758c20cbe3e13ef5f 805 .Ci 5d43a99db70c12a673028c7758c20cbe3e13ef5f .
785 Not changed were the 806 Not changed were the
786 .Pe editor 807 .Pe editor
787 and 808 and
788 .Pe moreproc 809 .Pe moreproc
789 profile entries, which allowed the user to override the system defaults. 810 profile entries, which allowed the user to override the system defaults.
790 Later, the concept was reworked to respect the standard environment 811 Later, the concept was reworked again to respect the standard
791 variables 812 environment variables
792 .Ev VISUAL 813 .Ev VISUAL
793 and 814 and
794 .Ev PAGER 815 .Ev PAGER
795 if they are set. 816 if they are set.
796 Today, mmh determines the editor to use in the following order, 817 Today, mmh determines the editor to use in the following order,
797 taking the first available and non-empty item: 818 taking the first available and non-empty item
819 .Ci f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b :
798 .LI 1 820 .LI 1
799 Environment variable 821 Environment variable
800 .Ev MMHEDITOR 822 .Ev MMHEDITOR
801 .LI 2 823 .LI 2
802 Profile entry 824 Profile entry
809 .Ev EDITOR 831 .Ev EDITOR
810 .LI 5 832 .LI 5
811 Command 833 Command
812 .Pn vi . 834 .Pn vi .
813 .LP 835 .LP
814 .Ci f85f4b7ae62e3d05a945dcd46ead51f0a2a89a9b 836 The pager to use is determined in a similar order
815 .P 837 .Ci 0c4214ea2aec6497d0d67b436bbee9bc1d225f1e :
816 The pager to use is determined in a similar order,
817 also taking the first available and non-empty item:
818 .LI 1 838 .LI 1
819 Environment variable 839 Environment variable
820 .Ev MMHPAGER 840 .Ev MMHPAGER
821 .LI 2 841 .LI 2
822 Profile entry 842 Profile entry
828 .Ev PAGER 848 .Ev PAGER
829 .LI 4 849 .LI 4
830 Command 850 Command
831 .Pn more . 851 .Pn more .
832 .LP 852 .LP
833 .Ci 0c4214ea2aec6497d0d67b436bbee9bc1d225f1e
834 .P
835 By respecting the 853 By respecting the
836 .Ev VISUAL /\c 854 .Ev VISUAL /\c
837 .Ev EDITOR 855 .Ev EDITOR
838 and 856 and
839 .Ev PAGER 857 .Ev PAGER
840 environment variables, 858 environment variables,
841 the new behavior confirms better to the common style on Unix systems. 859 the new behavior complies with the common style on Unix systems.
842 Additionally, the new approach is more uniform and clearer to users. 860 It is more uniform and clearer for users.
843 861
844 862
845 .U3 "ndbm 863 .U3 "ndbm
846 .P 864 .P
847 .Pn slocal 865 .Pn slocal
848 used to depend on 866 used to depend on the database library
849 .I ndbm , 867 .I ndbm .
850 a database library. 868 The database is used to store the
851 The database is used to store the `\fLMessage-ID\fP's of all 869 .Hd Message-ID
852 messages delivered. 870 header field values of all messages delivered.
853 This enables 871 This enabled
854 .Pn slocal 872 .Pn slocal
855 to suppress delivering the same message to the same user twice. 873 to suppress delivering the same message to the same user twice.
856 (This features was enabled by the 874 This features was enabled by the
857 .Sw -suppressdup 875 .Sw -suppressdup
858 switch.) 876 switch.
859 .P 877 .P
860 A variety of versions of the database library exist. 878 As a variety of versions of the database library exist,
861 .[ 879 .[
862 wolter unix incompat notes dbm 880 wolter unix incompat notes dbm
863 .] 881 .]
864 Complicated autoconf code was needed to detect them correctly. 882 complicated autoconf code was needed to detect them correctly.
865 Furthermore, the configure switches 883 Furthermore, the configure switches
866 .Sw --with-ndbm=ARG 884 .Sw --with-ndbm=ARG
867 and 885 and
868 .Sw --with-ndbmheader=ARG 886 .Sw --with-ndbmheader=ARG
869 were added to help with difficult setups that would 887 were added to help with difficult setups that would
870 not be detected automatically or correctly. 888 not be detected automatically or not correctly.
871 .P 889 .P
872 By removing the suppress duplicates feature of 890 By removing the suppress duplicates feature of
873 .Pn slocal , 891 .Pn slocal ,
874 the dependency on 892 the dependency on
875 .I ndbm 893 .I ndbm
876 vanished and 120 lines of complex autoconf code could be saved. 894 vanished and 120 lines of complex autoconf code could be saved
877 .Ci ecd6d6a20cb7a1507e3a20d6c4cb3a1cf14c6bbf 895 .Ci ecd6d6a20cb7a1507e3a20d6c4cb3a1cf14c6bbf .
878 The change removed functionality too, but that is minor to the 896 The change removed functionality but that is considered minor to the
879 improvement by dropping the dependency and the complex autoconf code. 897 improvement of dropping the dependency and the complex autoconf code.
880 .\" XXX argument: slocal ist sowieso nicht teil vom mmh kern 898 .\" XXX argument: slocal ist sowieso nicht teil vom mmh kern
881 899
882 .U3 "mh-e Support 900 .U3 "MH-E Support
883 .P 901 .P
884 The configure option 902 The configure option
885 .Sw --disable-mhe 903 .Sw --disable-mhe
886 was removed when the mh-e support was reworked. 904 was removed when the MH-E support was reworked.
887 Mh-e is the Emacs front-end to MH. 905 MH-E is the Emacs front-end to MH.
906 .[
907 mh-e emacs website
908 .]
888 It requires MH to provide minor additional functions. 909 It requires MH to provide minor additional functions.
889 The 910 The
890 .Sw --disable-mhe 911 .Sw --disable-mhe
891 configure option could switch these extensions off. 912 configure option had switched off these extensions.
892 After removing the support for old versions of mh-e, 913 After removing the support for old versions of MH-E,
893 only the 914 only the
894 .Sw -build 915 .Sw -build
895 switches of 916 switches of
896 .Pn forw 917 .Pn forw
897 and 918 and
898 .Pn repl 919 .Pn repl
899 are left to be mh-e extensions. 920 are left to be MH-E extensions.
900 They are now always built in because they add little code and complexity. 921 They are now always built in because they add little code and complexity.
901 In consequence, the 922 In consequence, the
902 .Sw --disable-mhe 923 .Sw --disable-mhe
903 configure option was removed 924 configure option was removed
904 .Ci a7ce7b4a580d77b6c2c4d980812beb589aa4c643 925 .Ci a7ce7b4a580d77b6c2c4d980812beb589aa4c643 .
905 Removing the option removed a second code setup that would have 926 Dropping the option also removed a variant of the code base
906 needed to be tested. 927 that would have needed to be tested.
907 .\" XXX datum? 928 This change was undertaken in January 2012 in nmh and
908 This change was first accomplished in nmh and thereafter merged into mmh. 929 thereafter merged into mmh.
909 .P 930
910 The interface changes in mmh require mh-e to be adjusted in order
911 to be able to use mmh as back-end.
912 This will require minor changes to mh-e, but removing the
913 .Sw -build
914 switches would require more rework.
915 931
916 .U3 "Masquerading 932 .U3 "Masquerading
917 .P 933 .P
918 The configure option 934 The configure option
919 .Sw --enable-masquerade 935 .Sw --enable-masquerade
920 could take up to three arguments: 936 could take up to three arguments:
921 `draft_from', `mmailid', and `username_extension'. 937 .Ar draft_from ,
938 .Ar mmailid ,
939 and
940 .Ar username_extension .
922 They activated different types of address masquerading. 941 They activated different types of address masquerading.
923 All of them were implemented in the SMTP-speaking 942 All of them were implemented in the SMTP-speaking
924 .Pn post 943 .Pn post
925 command, which provided an MSA. 944 command.
926 Address masquerading is an MTA's task and mmh does not cover 945 Address masquerading is an MTA's task and mmh does not cover
927 this field anymore. 946 this field anymore.
928 Hence, true masquerading needs to be implemented in the external MTA. 947 Hence, true masquerading needs to be implemented in the external MTA.
929 .P 948 .P
930 The 949 The
933 available in the original MH. 952 available in the original MH.
934 It provided a 953 It provided a
935 .I username 954 .I username
936 to 955 to
937 .I fakeusername 956 .I fakeusername
938 mapping, based on the password file's GECOS field. 957 mapping, based on the
939 The man page 958 .Fn passwd 's
959 GECOS field.
960 Nmh's man page
940 .Mp mh-tailor (5) 961 .Mp mh-tailor (5)
941 described the use case as being the following: 962 described the use case as being the following:
942 .QS 963 .QS
943 This is useful if you want the messages you send to always 964 This is useful if you want the messages you send to always
944 appear to come from the name of an MTA alias rather than your 965 appear to come from the name of an MTA alias rather than your
963 specified by the 984 specified by the
964 .Ev USERNAME_EXTENSION 985 .Ev USERNAME_EXTENSION
965 environment variable, to it. 986 environment variable, to it.
966 This provided support for the 987 This provided support for the
967 .I user-extension 988 .I user-extension
968 feature of qmail and the similar 989 feature of qmail
990 .[ [
991 sill qmail handbook
992 .], p. 141]
993 and the similar
969 .I "plussed user 994 .I "plussed user
970 processing of sendmail. 995 processing of Sendmail.
971 The decision to remove this username_extension masquerading was 996 .[ [
972 motivated by the fact that 997 sendmail costales
998 .], p. 476]
999 The decision to remove this username_extension masquerading
1000 was motivated by the fact that
973 .Pn spost 1001 .Pn spost
974 had not supported it already. 1002 had not supported it yet.
975 .Ci 2abae0bfd0ad5bf898461e50aa4b466d641f23d9 1003 Username extensions can be used in mmh, but less convenient.
976 Username extensions are possible in mmh, but less convenient to use.
977 .\" XXX covered by next paragraph 1004 .\" XXX covered by next paragraph
978 .\" XXX format file %(getenv USERNAME_EXTENSION) 1005 .\" XXX format file %(getenv USERNAME_EXTENSION)
1006 .Ci 2abae0bfd0ad5bf898461e50aa4b466d641f23d9
979 .P 1007 .P
980 The 1008 The
981 .I draft_from 1009 .I draft_from
982 masquerading type instructed 1010 masquerading type instructed
983 .Pn post 1011 .Pn post
984 to use the value of the 1012 to use the value of the
985 .Hd From 1013 .Hd From
986 header field as SMTP envelope sender. 1014 header field as SMTP envelope sender.
987 Sender addresses could be replaced completely. 1015 Sender addresses could be replaced completely.
988 .Ci b14ea6073f77b4359aaf3fddd0e105989db9
989 Mmh offers a kind of masquerading similar in effect, but 1016 Mmh offers a kind of masquerading similar in effect, but
990 with technical differences. 1017 with technical differences.
991 As mmh does not transfer messages itself, the local MTA has final control 1018 As mmh does not transfer messages itself, the local MTA has final control
992 over the sender's address. Any masquerading mmh introduces may be reverted 1019 over the sender's address.
993 by the MTA. 1020 Any masquerading mmh introduces may be reverted by the MTA.
994 In times of pedantic spam checking, an MTA will take care to use 1021 In times of pedantic spam checking, an MTA will take care to use
995 sensible envelope sender addresses to keep its own reputation up. 1022 sensible envelope sender addresses to keep its own reputation up.
996 Nonetheless, the MUA can set the 1023 Nonetheless, the MUA can set the
997 .Hd From 1024 .Hd From
998 header field and thereby propose 1025 header field and thereby propose a sender address to the MTA.
999 a sender address to the MTA.
1000 The MTA may then decide to take that one or generate the canonical sender 1026 The MTA may then decide to take that one or generate the canonical sender
1001 address for use as envelope sender address. 1027 address for use as envelope sender address.
1028 .Ci b14ea6073f77b4359aaf3fddd0e105989db9
1002 .P 1029 .P
1003 In mmh, the MTA will always extract the recipient and sender from the 1030 In mmh, the MTA will always extract the recipient and sender from the
1004 message header (\c 1031 message header (\c
1005 .Pn sendmail 's 1032 .Pn sendmail 's
1006 .Sw -t 1033 .Sw -t
1013 .U3 "Remaining Options 1040 .U3 "Remaining Options
1014 .P 1041 .P
1015 Two configure options remain in mmh. 1042 Two configure options remain in mmh.
1016 One is the locking method to use: 1043 One is the locking method to use:
1017 .Sw --with-locking=[dot|fcntl|flock|lockf] . 1044 .Sw --with-locking=[dot|fcntl|flock|lockf] .
1018 The idea of removing all methods except the portable dot locking 1045 The idea of removing all methods except the portable
1046 .I "dot locking
1019 and having that one as the default is appealing, but this change 1047 and having that one as the default is appealing, but this change
1020 requires deeper technical investigation into the topic. 1048 requires deeper technical investigation into the topic.
1021 The other option, 1049 The other option,
1022 .Sw --enable-debug , 1050 .Sw --enable-debug ,
1023 compiles the programs with debugging symbols and does not strip them. 1051 compiles the programs with debugging symbols.
1024 This option is likely to stay. 1052 This option is likely to stay.
1025 1053
1026 1054
1027 1055
1028 1056
1029 .H2 "Command Line Switches 1057 .H2 "Command Line Switches
1030 .P 1058 .P
1031 The command line switches of MH tools are similar to the X Window style. 1059 The command line switches of MH tools follow a style similar to
1060 the X Window System style.
1032 .\" XXX ref 1061 .\" XXX ref
1033 They consist of a single dash (`\fL-\fP') followed by a word. 1062 The switches consist of a single dash (`\fL-\fP') followed by a word.
1063 For example
1064 .Cl -truncate .
1034 To ease typing, the word can be abbreviated, given the remaining 1065 To ease typing, the word can be abbreviated, given the remaining
1035 prefix remains unambiguous. 1066 prefix is unambiguous.
1036 If no other switch starts with the letter `t', then any of 1067 If no other switch starts with the letter `t', then any of
1037 .Cl "-truncate" , 1068 .Cl "-truncate" ,
1038 .Cl "-trunc" , 1069 .Cl "-trunc" ,
1039 .Cl "-tr" , 1070 .Cl "-tr" ,
1040 and 1071 and
1058 (with capital `V'), to tell what version of mmh the program belongs to. 1089 (with capital `V'), to tell what version of mmh the program belongs to.
1059 .P 1090 .P
1060 Switches change the behavior of programs. 1091 Switches change the behavior of programs.
1061 Programs that do one thing in one way require no switches. 1092 Programs that do one thing in one way require no switches.
1062 In most cases, doing something in exactly one way is too limiting. 1093 In most cases, doing something in exactly one way is too limiting.
1063 If there is basically one task to accomplish, but it should be done 1094 If one task should be accomplished in various ways,
1064 in various ways, switches are a good approach to alter the behavior 1095 switches are a good approach to alter the behavior of a program.
1065 of a program.
1066 Changing the behavior of programs provides flexibility and customization 1096 Changing the behavior of programs provides flexibility and customization
1067 to users, but at the same time it complicates the code, documentation and 1097 to users, but at the same time it complicates the code,
1068 usage of the program. 1098 the documentation, and the usage of the program.
1069 .\" XXX: Ref 1099 .\" XXX: Ref
1070 Therefore, the number of switches should be kept small. 1100 Therefore, the number of switches should be kept small.
1071 A small set of well-chosen switches does no harm. 1101 A small set of well-chosen switches is best.
1072 But usually, the number of switches increases over time. 1102 Usually, the number of switches increases over time.
1073 Already in 1985, Rose and Romine have identified this as a major 1103 Already in 1985, Rose and Romine have identified this as a major
1074 problem of MH: 1104 problem of MH:
1075 .[ [ 1105 .[ [
1076 rose romine real work 1106 rose romine real work
1077 .], p. 12] 1107 .], p. 12]
1085 Unfortunately MH, having undergone six years of off-and-on development by 1115 Unfortunately MH, having undergone six years of off-and-on development by
1086 ten or so well-meaning programmers (the present authors included), 1116 ten or so well-meaning programmers (the present authors included),
1087 suffers mightily from this. 1117 suffers mightily from this.
1088 .QE 1118 .QE
1089 .P 1119 .P
1090 Being reluctant to adding new switches \(en or `options', 1120 Being reluctant to adding new switches (or \fIoptions\fP,
1091 as Rose and Romine call them \(en is one part of a counter-action, 1121 as Rose and Romine call them) is one part of a counter-action,
1092 the other part is removing hardly used switches. 1122 the other part is removing hardly used switches.
1093 Nmh's tools had lots of switches already implemented, 1123 Nmh's tools have lots of switches already implemented.
1094 hence, cleaning up by removing some of them was the more important part 1124 Hence, cleaning up by removing some of them was the more important part
1095 of the counter-action. 1125 of the counter-action.
1096 Removing existing functionality is always difficult because it 1126 Removing existing functionality is always difficult because it
1097 breaks programs that use these functions. 1127 breaks programs that use these functions.
1098 Also, for every obsolete feature, there'll always be someone who still 1128 Also, for every obsolete feature, there'll always be someone who still
1099 uses it and thus opposes its removal. 1129 uses it and thus opposes its removal.
1103 future needs will demand adding further features, 1133 future needs will demand adding further features,
1104 worsening the situation more and more. 1134 worsening the situation more and more.
1105 Rose and Romine added in a footnote, 1135 Rose and Romine added in a footnote,
1106 ``[...] 1136 ``[...]
1107 .Pn send 1137 .Pn send
1108 will no doubt acquire an endless number of switches in the years to come.'' 1138 will no doubt acquire an endless number of switches in the years to come''
1139 .[ [
1140 rose romine real work
1141 .], p. 12].
1109 Although clearly humorous, the comment points to the nature of the problem. 1142 Although clearly humorous, the comment points to the nature of the problem.
1110 Refusing to add any new switches would encounter the problem at its root, 1143 Refusing to add any new switches would encounter the problem at its root,
1111 but this is not practical. 1144 but this is not practical.
1112 New needs will require new switches and it would be unwise to block 1145 New needs will require new switches and it would be unwise to block
1113 them strictly. 1146 them strictly.
1121 .Pn send . 1154 .Pn send .
1122 In nmh, they increased up to 32 visible and 12 hidden ones. 1155 In nmh, they increased up to 32 visible and 12 hidden ones.
1123 At the time of writing, no more than 4 visible switches and 1 hidden switch 1156 At the time of writing, no more than 4 visible switches and 1 hidden switch
1124 have remained in mmh's 1157 have remained in mmh's
1125 .Pn send . 1158 .Pn send .
1126 These numbers include two generic switches, 1159 These numbers include the two generic switches,
1127 .Sw -help 1160 .Sw -help
1128 and 1161 and
1129 .Sw -Version . 1162 .Sw -Version .
1163 .P
1130 Hidden switches are ones not documented. 1164 Hidden switches are ones not documented.
1131 In mmh, 12 tools have hidden switches. 1165 In mmh, 12 tools have hidden switches.
1132 9 of them are 1166 9 of them are
1133 .Sw -debug 1167 .Sw -debug
1134 switches, the other 6 provide special interfaces for internal use. 1168 switches, the other 6 provide special interfaces for internal use.
1135 .P 1169 .P
1136 The figure displays the number of switches for each of the tools 1170 The following figure displays the number of switches for each of the tools
1137 that is available in both nmh and mmh. 1171 that is available in both nmh and mmh.
1138 The tools are sorted by the number of switches they had in nmh. 1172 The tools are sorted by the number of switches they had in nmh.
1139 Visible and hidden switches were counted, 1173 Both visible and hidden switches were counted,
1140 but not the generic help and version switches. 1174 but not the generic help and version switches.
1141 Whereas in the beginning of the project, the average tool had 11 switches, 1175 Whereas in the beginning of the project, the average tool had 11 switches,
1142 now it has no more than 5 \(en only half as many. 1176 now it has no more than 5 \(en only half as many.
1143 If the `no' switches and similar inverse variant are folded onto 1177 If the `no' switches and similar inverse variant are folded onto
1144 their counter-parts, the average tool had 8 switches in pre-mmh times and 1178 their counter-parts, the average tool had 8 switches in pre-mmh times and
1156 This was the case for network mail transfer, for instance. 1190 This was the case for network mail transfer, for instance.
1157 Sometimes, however, the work flow was the other way: 1191 Sometimes, however, the work flow was the other way:
1158 I looked through the 1192 I looked through the
1159 .Mp mh-chart (7) 1193 .Mp mh-chart (7)
1160 man page to identify the tools with apparently too many switches. 1194 man page to identify the tools with apparently too many switches.
1161 Then considering the value of each of the switches by examining 1195 Then I considered the benefit of each switch by examining
1162 the tool's man page and source code, aided by recherche and testing. 1196 the tool's man page and source code, aided by literature research
1163 This way, the removal of functions was suggested by the aim to reduce 1197 and testing.
1164 the number of switches per command.
1165 1198
1166 1199
1167 .U3 "Draft Folder Facility 1200 .U3 "Draft Folder Facility
1168 .P 1201 .P
1169 A change early in the project was the complete transition from 1202 A change early in the project was the complete transition from
1170 the single draft message to the draft folder facility. 1203 the single draft message to the draft folder facility
1171 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 1204 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 .
1172 .\" XXX ref to section ... 1205 .\" XXX ref to section ...
1173 The draft folder facility was introduced in the mid-eighties, when 1206 The draft folder facility was introduced in the mid-eighties, when
1174 Rose and Romine called it a ``relatively new feature''. 1207 Rose and Romine called it a ``relatively new feature''.
1175 .[ 1208 .[
1176 rose romine real work 1209 rose romine real work
1177 .] 1210 .]
1178 Since then, the facility had existed but was inactive by default. 1211 Since then, the facility was included, inactive by default.
1179 The default activation and the related rework of the tools made it 1212 By making it permanently active and by related rework of the tools, the
1180 possible to remove the
1181 .Sw -[no]draftfolder , 1213 .Sw -[no]draftfolder ,
1182 and 1214 and
1183 .Sw -draftmessage 1215 .Sw -draftmessage
1184 switches from 1216 switches could be removed from
1185 .Pn comp , 1217 .Pn comp ,
1186 .Pn repl , 1218 .Pn repl ,
1187 .Pn forw , 1219 .Pn forw ,
1188 .Pn dist , 1220 .Pn dist ,
1189 .Pn whatnow , 1221 .Pn whatnow ,
1190 and 1222 and
1191 .Pn send . 1223 .Pn send
1192 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 1224 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 .
1193 The only flexibility removed with this change is having multiple 1225 The only flexibility lost with this change is having multiple
1194 draft folders within one profile. 1226 draft folders within one profile.
1195 I consider this a theoretical problem only. 1227 I consider this a theoretical problem only.
1196 At the same time, the 1228 At the same time, the
1197 .Sw -draft 1229 .Sw -draft
1198 switch of 1230 switch of
1200 .Pn refile , 1232 .Pn refile ,
1201 and 1233 and
1202 .Pn send 1234 .Pn send
1203 was removed. 1235 was removed.
1204 The special treatment of \fIthe\fP draft message became irrelevant after 1236 The special treatment of \fIthe\fP draft message became irrelevant after
1205 the rework of the draft system. 1237 the rework of the draft system
1206 (cf. Sec. 1238 (cf. Sec.
1207 .Cf draft-folder ) 1239 .Cf draft-folder ).
1208 Furthermore, 1240 Furthermore,
1209 .Pn comp 1241 .Pn comp
1210 no longer needs a 1242 no longer needs a
1211 .Sw -file 1243 .Sw -file
1212 switch as the draft folder facility together with the 1244 switch as the draft folder facility together with the
1218 .P 1250 .P
1219 .Pn anno 1251 .Pn anno
1220 had the switches 1252 had the switches
1221 .Sw -[no]inplace 1253 .Sw -[no]inplace
1222 to either annotate the message in place and thus preserve hard links, 1254 to either annotate the message in place and thus preserve hard links,
1223 or annotate a copy to replace the original message, breaking hard links. 1255 or annotate a copy to replace the original message.
1256 The latter approach broke hard links.
1224 Following the assumption that linked messages should truly be the 1257 Following the assumption that linked messages should truly be the
1225 same message, and annotating it should not break the link, the 1258 same message and annotating it should not break the link, the
1226 .Sw -[no]inplace 1259 .Sw -[no]inplace
1227 switches were removed and the previous default 1260 switches were removed and the previous default
1228 .Sw -inplace 1261 .Sw -inplace
1229 was made the only behavior. 1262 was made the definitive behavior
1230 .Ci c8195849d2e366c569271abb0f5f60f4ebf0b4d0 1263 .Ci c8195849d2e366c569271abb0f5f60f4ebf0b4d0 .
1231 The 1264 The
1232 .Sw -[no]inplace 1265 .Sw -[no]inplace
1233 switches of 1266 switches of
1234 .Pn repl , 1267 .Pn repl ,
1235 .Pn forw , 1268 .Pn forw ,
1236 and 1269 and
1237 .Pn dist 1270 .Pn dist
1238 could be removed, too, as they were simply passed through to 1271 could be removed, as well, as they were simply passed through to
1239 .Pn anno . 1272 .Pn anno .
1240 .P 1273 .P
1241 .Pn burst 1274 .Pn burst
1242 also had 1275 also had
1243 .Sw -[no]inplace 1276 .Sw -[no]inplace
1244 switches, but with different meaning. 1277 switches, but with a different meaning.
1245 With 1278 With
1246 .Sw -inplace , 1279 .Sw -inplace ,
1247 the digest had been replaced by the table of contents (i.e. the 1280 the digest had been replaced by the table of contents (i.e. the
1248 introduction text) and the burst messages were placed right 1281 introduction text) and the burst messages were placed right
1249 after this message, renumbering all following messages. 1282 after this message, renumbering all following messages.
1250 Also, any trailing text of the digest was lost, though, 1283 Also, any trailing text of the digest was lost, though,
1251 in practice, it usually consists of an end-of-digest marker only. 1284 in practice, it usually consists of an end-of-digest marker only.
1252 Nontheless, this behavior appeared less elegant than the 1285 Nonetheless, this behavior appeared less elegant than the
1253 .Sw -noinplace 1286 .Sw -noinplace
1254 behavior, which already had been the default. 1287 behavior, which already had been the default.
1255 Nmh's 1288 Nmh's
1256 .Mp burst (1) 1289 .Mp burst (1)
1257 man page reads: 1290 man page reads:
1282 switches as well to supply the contents of a form file as a string 1315 switches as well to supply the contents of a form file as a string
1283 on the command line directly. 1316 on the command line directly.
1284 In consequence, the following two lines equaled: 1317 In consequence, the following two lines equaled:
1285 .VS 1318 .VS
1286 scan -form scan.mailx 1319 scan -form scan.mailx
1287 scan -format "`cat .../scan.mailx`" 1320 scan -format "`cat /path/to/scan.mailx`"
1288 VE 1321 VE
1289 The 1322 The
1290 .Sw -format 1323 .Sw -format
1291 switches were dropped in favor for extending the 1324 switches were dropped in favor for extending the
1292 .Sw -form 1325 .Sw -form
1293 switches. 1326 switches
1294 .Ci f51956be123db66b00138f80464d06f030dbb88d 1327 .Ci f51956be123db66b00138f80464d06f030dbb88d .
1295 If their argument starts with an equal sign (`='), 1328 If their argument starts with an equal sign (`\fL=\fP'),
1296 then the rest of the argument is taken as a format string, 1329 then the rest of the argument is taken as a format string,
1297 otherwise the arguments is treated as the name of a format file. 1330 otherwise the arguments is treated as the name of a format file.
1298 Thus, now the following two lines equal: 1331 Thus, now the following two lines equal:
1299 .VS 1332 .VS
1300 scan -form scan.mailx 1333 scan -form scan.mailx
1301 scan -form "=`cat .../scan.mailx`" 1334 scan -form "=`cat /path/to/scan.mailx`"
1302 VE 1335 VE
1303 This rework removed the prefix collision between 1336 This rework removed the prefix collision between
1304 .Sw -form 1337 .Sw -form
1305 and 1338 and
1306 .Sw -format . 1339 .Sw -format .
1307 Now, typing 1340 Typing `\fL-fo\fP' is sufficient to specify form file or format string.
1308 .Sw -fo
1309 suffices to specify form or format string.
1310 .P 1341 .P
1311 The different meaning of 1342 The different meaning of
1312 .Sw -format 1343 .Sw -format
1313 for 1344 for
1345 .Pn forw
1346 and
1314 .Pn repl 1347 .Pn repl
1315 and
1316 .Pn forw
1317 was removed in mmh. 1348 was removed in mmh.
1318 .Pn forw 1349 .Pn forw
1319 was completely switched to MIME-type forwarding, thus removing the 1350 was completely switched to MIME-type forwarding, thus removing the
1320 .Sw -[no]format . 1351 .Sw -[no]format
1321 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1 1352 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1 .
1322 For 1353 For
1323 .Pn repl , 1354 .Pn repl ,
1324 the 1355 the
1325 .Sw -[no]format 1356 .Sw -[no]format
1326 switches were reworked to 1357 switches were reworked to
1327 .Sw -[no]filter 1358 .Sw -[no]filter
1328 switches. 1359 switches
1329 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 1360 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 .
1330 The 1361 The
1331 .Sw -format 1362 .Sw -format
1332 switches of 1363 switches of
1333 .Pn send 1364 .Pn send
1334 and 1365 and
1335 .Pn post , 1366 .Pn post ,
1336 which had a third meaning, 1367 which had a third meaning, were removed likewise
1337 were removed likewise. 1368 .Ci f3cb7cde0e6f10451b6848678d95860d512224b9 .
1338 .Ci f3cb7cde0e6f10451b6848678d95860d512224b9
1339 Eventually, the ambiguity of the 1369 Eventually, the ambiguity of the
1340 .Sw -format 1370 .Sw -format
1341 switches was resolved by not anymore having any such switch in mmh. 1371 switches is resolved by not having such switches anymore in mmh.
1342 1372
1343 1373
1344 .U3 "MIME Tools 1374 .U3 "MIME Tools
1345 .P 1375 .P
1346 The MIME tools, which were once part of 1376 The MIME tools, which once were part of
1347 .Pn mhn 1377 .Pn mhn
1348 .\" XXX
1349 (whatever that stood for), 1378 (whatever that stood for),
1350 had several switches that added little practical value to the programs. 1379 had several switches that added little practical value to the programs.
1351 The 1380 The
1352 .Sw -[no]realsize 1381 .Sw -[no]realsize
1353 switches of 1382 switches of
1354 .Pn mhbuild 1383 .Pn mhbuild
1355 and 1384 and
1356 .Pn mhlist 1385 .Pn mhlist
1357 were removed, doing real size calculations always now 1386 were removed
1358 .Ci 8d8f1c3abc586c005c904e52c4adbfe694d2201c , 1387 .Ci 8d8f1c3abc586c005c904e52c4adbfe694d2201c .
1359 as nmh's 1388 Real size calculations are done always now because nmh's
1360 .Mp mhbuild (1) 1389 .Mp mhbuild (1)
1361 man page states 1390 man page states that
1362 ``This provides an accurate count at the expense of a small delay.'' 1391 ``This provides an accurate count at the expense of a small delay''
1363 This small delay is not noticable on modern systems. 1392 with the small delay not being noticable on modern systems.
1364 .P 1393 .P
1365 The 1394 The
1366 .Sw -[no]check 1395 .Sw -[no]check
1367 switches were removed together with the support for 1396 switches were removed together with the support for
1368 .Hd Content-MD5 1397 .Hd Content-MD5
1369 header fields [RFC\|1864]. 1398 header fields [RFC\|1864]
1370 .Ci 31dc797eb5178970d68962ca8939da3fd9a8efda
1371 (cf. Sec. 1399 (cf. Sec.
1372 .Cf content-md5 ) 1400 .Cf content-md5 )
1401 .Ci 31dc797eb5178970d68962ca8939da3fd9a8efda .
1373 .P 1402 .P
1374 The 1403 The
1375 .Sw -[no]ebcdicsafe 1404 .Sw -[no]ebcdicsafe
1376 and 1405 and
1377 .Sw -[no]rfc934mode 1406 .Sw -[no]rfc934mode
1378 switches of 1407 switches of
1379 .Pn mhbuild 1408 .Pn mhbuild
1380 were removed because they are considered obsolete. 1409 were removed because they are considered obsolete
1381 .Ci 01a3480928da485b4d6109d36d751dfa71799d58 1410 .Ci 01a3480928da485b4d6109d36d751dfa71799d58
1382 .Ci 3363e2624dce0eb8164cf8b3f1ab385c8ff72e88 1411 .Ci 3363e2624dce0eb8164cf8b3f1ab385c8ff72e88 .
1383 .P 1412 .P
1384 Content caching of external MIME parts, activated with the 1413 Content caching of external MIME parts, activated with the
1385 .Sw -rcache 1414 .Sw -rcache
1386 and 1415 and
1387 .Sw -wcache 1416 .Sw -wcache
1388 switches was completely removed. 1417 switches was completely removed
1389 .Ci d1fefd9f614e4dc3cda16da6c69133c1b2005269 1418 .Ci d1fefd9f614e4dc3cda16da6c69133c1b2005269 .
1390 External MIME parts are rare today, having a caching facility 1419 External MIME parts are rare today, having a caching facility
1391 for them appears to be unnecessary. 1420 for them appears to be unnecessary.
1392 .P 1421 .P
1393 In pre-MIME times, 1422 In pre-MIME times,
1394 .Pn mhl 1423 .Pn mhl
1395 had covered many tasks that are part of MIME handling today. 1424 had covered many tasks that are part of MIME handling today.
1396 Therefore, 1425 Therefore,
1397 .Pn mhl 1426 .Pn mhl
1398 could be simplified to a large extend, reducing the number of its 1427 could be simplified to a large extend, reducing the number of its
1399 switches from 21 to 6. 1428 switches from 21 to 6
1400 .Ci 350ad6d3542a07639213cf2a4fe524e829c1e7b6 1429 .Ci 350ad6d3542a07639213cf2a4fe524e829c1e7b6
1401 .Ci 0e46503be3c855bddaeae3843e1b659279c35d70 1430 .Ci 0e46503be3c855bddaeae3843e1b659279c35d70 .
1402 1431
1403 1432
1404 1433
1405 1434
1406 .U3 "Header Printing 1435 .U3 "Header Printing
1408 .Pn folder 's 1437 .Pn folder 's
1409 data output is self-explaining enough that 1438 data output is self-explaining enough that
1410 displaying the header line makes little sense. 1439 displaying the header line makes little sense.
1411 Hence, the 1440 Hence, the
1412 .Sw -[no]header 1441 .Sw -[no]header
1413 switch was removed and headers are never printed. 1442 switch was removed and headers are never printed
1414 .Ci 601cc73d1fa05ce96faa728f036d6c51b91701c7 1443 .Ci 601cc73d1fa05ce96faa728f036d6c51b91701c7 .
1415 .P 1444 .P
1416 In 1445 In
1417 .Pn mhlist , 1446 .Pn mhlist ,
1418 the 1447 the
1419 .Sw -[no]header 1448 .Sw -[no]header
1420 switches were removed, too. 1449 switches were removed, as well
1421 .Ci b24f96523aaf60e44e04a3ffb1d22e69a13a602f 1450 .Ci b24f96523aaf60e44e04a3ffb1d22e69a13a602f .
1422 But in this case headers are always printed, 1451 In this case, the headers are printed always because the output
1423 because the output is not self-explaining. 1452 is not self-explaining.
1424 .P 1453 .P
1425 .Pn scan 1454 .Pn scan
1426 also had 1455 also had
1427 .Sw -[no]header 1456 .Sw -[no]header
1428 switches. 1457 switches.
1429 Printing the header had been sensible until the introduction of 1458 Printing this header had been sensible until the introduction of
1430 format strings made it impossible to display the column headings. 1459 format strings made it impossible to display column headings.
1431 Only the folder name and the current date remained to be printed. 1460 Only the folder name and the current date remained to be printed.
1432 As this information can be perfectly retrieved by 1461 As this information can be perfectly generated with
1433 .Pn folder 1462 .Pn folder
1434 and 1463 and
1435 .Pn date , 1464 .Pn date ,
1436 consequently, the switches were removed. 1465 the switches were removed
1437 .Ci c477dc5d1d03fa6d9a8ab3dd3508c63cbddc044e 1466 .Ci c477dc5d1d03fa6d9a8ab3dd3508c63cbddc044e .
1438 .P 1467 .P
1439 By removing all 1468 By removing all
1440 .Sw -header 1469 .Sw -header
1441 switches, the collision with 1470 switches, the collision with
1442 .Sw -help 1471 .Sw -help
1457 .Pn repl , 1486 .Pn repl ,
1458 .Pn forw , 1487 .Pn forw ,
1459 .Pn dist , 1488 .Pn dist ,
1460 and 1489 and
1461 .Pn whatnow 1490 .Pn whatnow
1462 was removed, but it can now be replaced by specifying 1491 was removed and replaced by specifying
1463 .Sw -editor 1492 .Sw -editor
1464 with an empty argument. 1493 with an empty argument
1465 .Ci 75fca31a5b9d5c1a99c74ab14c94438d8852fba9 1494 .Ci 75fca31a5b9d5c1a99c74ab14c94438d8852fba9 .
1466 (Specifying 1495 (Specifying
1467 .Cl "-editor /bin/true 1496 .Cl "-editor /bin/true
1468 is nearly the same, only differing by the previous editor being set.) 1497 is nearly the same. It differs only in setting the previous editor.)
1469 .P 1498 .P
1470 The more important change is the removal of the 1499 The more important change is the removal of the
1471 .Sw -nowhatnowproc 1500 .Sw -nowhatnowproc
1472 switch. 1501 switch
1473 .Ci ee4f43cf2ef0084ec698e4e87159a94c01940622 1502 .Ci ee4f43cf2ef0084ec698e4e87159a94c01940622 .
1474 This switch had introduced an awkward behavior, as explained in nmh's 1503 This switch had once introduced an awkward behavior,
1475 man page for 1504 as explained in nmh's man page for
1476 .Mp comp (1): 1505 .Mp comp (1):
1477 .QS 1506 .QS
1478 The 1507 The
1479 .Sw -editor 1508 .Sw -editor
1480 .Ar editor 1509 .Ar editor
1497 will prevent any edit from occurring.) 1526 will prevent any edit from occurring.)
1498 .QE 1527 .QE
1499 .P 1528 .P
1500 Effectively, the 1529 Effectively, the
1501 .Sw -nowhatnowproc 1530 .Sw -nowhatnowproc
1502 switch creates only a draft message. 1531 switch caused only only a draft message to be created.
1503 As 1532 As
1504 .Cl "-whatnowproc /bin/true 1533 .Cl "-whatnowproc /bin/true
1505 causes the same behavior, the 1534 does the same, the
1506 .Sw -nowhatnowproc 1535 .Sw -nowhatnowproc
1507 switch was removed for being redundant. 1536 switch was removed for being redundant.
1508 Likely, the
1509 .Sw -nowhatnowproc
1510 switch was intended to be used by front-ends.
1511 1537
1512 1538
1513 1539
1514 .U3 "Various 1540 .U3 "Various
1515 .BU 1541 .BU
1520 no longer needed their 1546 no longer needed their
1521 .Sw -mbox 1547 .Sw -mbox
1522 and 1548 and
1523 .Sw -mmdf 1549 .Sw -mmdf
1524 switches. 1550 switches.
1551 The behavior of
1525 .Sw -mbox 1552 .Sw -mbox
1526 is the sole behavior now. 1553 is the sole behavior now
1527 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0 1554 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0 .
1528 Further rework in both tools made the 1555 Further rework in both tools made the
1529 .Sw -file 1556 .Sw -file
1530 switch unnecessary. 1557 switch unnecessary
1531 .Ci ca1023716d4c2ab890696f3e41fa0d94267a940e 1558 .Ci ca1023716d4c2ab890696f3e41fa0d94267a940e .
1532 1559
1533 .BU 1560 .BU
1534 Mmh's tools will no longer clear the screen (\c 1561 Mmh's tools do no longer clear the screen (\c
1535 .Pn scan 's 1562 .Pn scan 's
1536 and 1563 and
1537 .Pn mhl 's 1564 .Pn mhl 's
1538 .Sw -[no]clear 1565 .Sw -[no]clear
1539 switches 1566 switches
1540 .Ci e57b17343dcb3ff373ef4dd089fbe778f0c7c270 1567 .Ci e57b17343dcb3ff373ef4dd089fbe778f0c7c270
1541 .Ci 943765e7ac5693ae177fd8d2b5a2440e53ce816e ). 1568 .Ci 943765e7ac5693ae177fd8d2b5a2440e53ce816e ).
1542 Neither will 1569 Neither does
1543 .Pn mhl 1570 .Pn mhl
1544 ring the bell (\c 1571 ring the bell (\c
1545 .Sw -[no]bell 1572 .Sw -[no]bell
1546 .Ci e11983f44e59d8de236affa5b0d0d3067c192e24 ) 1573 .Ci e11983f44e59d8de236affa5b0d0d3067c192e24 )
1547 nor page the output itself (\c 1574 nor does it page the output itself (\c
1548 .Sw -length 1575 .Sw -length
1549 .Ci 5b9d883db0318ed2b84bb82dee880d7381f99188 ). 1576 .Ci 5b9d883db0318ed2b84bb82dee880d7381f99188 ).
1550 .\" XXX Ref 1577 .\" XXX Ref
1551 Generally, the pager to use is no longer specified with the 1578 Generally, the pager to use is no longer specified with the
1552 .Sw -[no]moreproc 1579 .Sw -[no]moreproc
1553 command line switches for 1580 command line switches for
1554 .Pn mhl 1581 .Pn mhl
1555 and 1582 and
1556 .Pn show /\c 1583 .Pn show /\c
1557 .Pn mhshow . 1584 .Pn mhshow
1558 .Ci 39e87a75b5c2d3572ec72e717720b44af291e88a 1585 .Ci 39e87a75b5c2d3572ec72e717720b44af291e88a .
1559 1586
1560 .BU 1587 .BU
1561 In order to avoid prefix collisions among switch names, the 1588 In order to avoid prefix collisions among switch names, the
1562 .Sw -version 1589 .Sw -version
1563 switch was renamed to 1590 switch was renamed to
1564 .Sw -Version 1591 .Sw -Version
1565 (with capital `V'). 1592 (with capital `V')
1566 .Ci 32b2354dbaf4bf934936eb5b102a4a3d2fdd209a 1593 .Ci 32b2354dbaf4bf934936eb5b102a4a3d2fdd209a .
1567 Every program has the 1594 Every program has the
1568 .Sw -version 1595 .Sw -version
1569 switch but its first three letters collided with the 1596 switch but its first three letters collided with the
1570 .Sw -verbose 1597 .Sw -verbose
1571 switch, present in many programs. 1598 switch, present in many programs.
1602 The removal of the 1629 The removal of the
1603 .Sw -[no]reverse 1630 .Sw -[no]reverse
1604 switches of 1631 switches of
1605 .Pn scan 1632 .Pn scan
1606 .Ci 8edc5aaf86f9f77124664f6801bc6c6cdf258173 1633 .Ci 8edc5aaf86f9f77124664f6801bc6c6cdf258173
1607 is a bug fix, supported by the comments 1634 is a bug fix.
1635 This is supported by the comments
1608 ``\-[no]reverse under #ifdef BERK (I really HATE this)'' 1636 ``\-[no]reverse under #ifdef BERK (I really HATE this)''
1609 by Rose and 1637 by Rose and
1610 ``Lists messages in reverse order with the `\-reverse' switch. 1638 ``Lists messages in reverse order with the `\-reverse' switch.
1611 This should be considered a bug.'' by Romine in the documentation. 1639 This should be considered a bug'' by Romine in the changelogs.
1612 .\" XXX Ref: welche datei genau. 1640 The question remains why neither Rose nor Romine have fixed this
1613 The question remains why neither Rose and Romine had fixed this 1641 bug in the eighties when they wrote these comments.
1614 bug in the eighties when they wrote these comments nor has anyone 1642
1615 thereafter. 1643
1616 1644
1617
1618 .ig
1619
1620 forw: [no]dashstuffing(mhl)
1621
1622 mhshow: [no]pause [no]serialonly
1623
1624 mhmail: resent queued
1625 inc: snoop, (pop)
1626
1627 mhl: [no]faceproc folder sleep
1628 [no]dashstuffing(forw) digest list volume number issue number
1629
1630 prompter: [no]doteof
1631
1632 refile: [no]preserve [no]unlink [no]rmmproc
1633
1634 send: [no]forward [no]mime [no]msgid
1635 [no]push split [no]unique (sasl) width snoop [no]dashstuffing
1636 attach attachformat
1637 whatnow: (noedit) attach
1638
1639 slocal: [no]suppressdups
1640
1641 spost: [no]filter [no]backup width [no]push idanno
1642 [no]check(whom) whom(whom)
1643
1644 whom: ???
1645
1646 ..
1647
1648
1649 .ig
1650
1651 .P
1652 In the best case, all switches are unambiguous on the first character,
1653 or on the three-letter prefix for the `no' variants.
1654 Reducing switch prefix collisions, shortens the necessary prefix length
1655 the user must type.
1656 Having less switches helps best.
1657
1658 ..
1659
1660
1661 .\" XXX: whatnow prompt commands
1662 1645
1663 1646
1664 1647
1665 1648
1666 .\" -------------------------------------------------------------- 1649 .\" --------------------------------------------------------------
1668 .P 1651 .P
1669 In the more than thirty years of MH's existence, its code base was 1652 In the more than thirty years of MH's existence, its code base was
1670 increasingly extended. 1653 increasingly extended.
1671 New features entered the project and became alternatives to the 1654 New features entered the project and became alternatives to the
1672 existing behavior. 1655 existing behavior.
1673 Relics from several decades have gathered in the code base, 1656 Relics from several decades have gathered in the code base
1674 but seldom obsolete features were dropped. 1657 but seldom obsolete features were dropped.
1675 This section describes the removing of old code 1658 This section describes the removing of old code
1676 and the modernizing of the default setup. 1659 and the modernizing of the default setup.
1677 It focuses on the functional aspect only; 1660 It focuses on the functional aspect only;
1678 the non-functional aspects of code style are discussed in Sec. 1661 the non-functional aspects of code style are discussed in Sec.
1679 .Cf code-style . 1662 .Cf code-style .
1680 1663
1681 1664
1682 .H2 "Code Relics 1665 .H2 "Code Relics
1683 .P 1666 .P
1684 My position regarding the removal of obsolete functions of mmh, 1667 My position regarding the removal of obsolete code
1685 .\" XXX ``in order to remove old code,''
1686 is much more revolutional than the nmh community appreciates. 1668 is much more revolutional than the nmh community appreciates.
1687 Working on an experimental version, I was quickly able to drop 1669 Working on an experimental version, I was able to quickly drop
1688 functionality I considered ancient. 1670 functionality that I considered ancient.
1689 The need for consensus with peers would have slowed this process down. 1671 The need for consensus with peers would have slowed this process down.
1690 Without the need to justify my decisions, I was able to rush forward. 1672 Without the need to justify my decisions, I was able to rush forward.
1673 .P
1691 In December 2011, Paul Vixie motivated the nmh developers to just 1674 In December 2011, Paul Vixie motivated the nmh developers to just
1692 .\" XXX ugs
1693 do the work: 1675 do the work:
1694 .[ 1676 .[
1695 paul vixie edginess nmh-workers 1677 paul vixie edginess nmh-workers
1696 .] 1678 .]
1697 .QS 1679 .QS
1722 I rather include falsely dropped parts again, than going at a slower pace. 1704 I rather include falsely dropped parts again, than going at a slower pace.
1723 Mmh is experimental work; it requires tough decisions. 1705 Mmh is experimental work; it requires tough decisions.
1724 .\" XXX ``exp. work'' schon oft gesagt 1706 .\" XXX ``exp. work'' schon oft gesagt
1725 1707
1726 1708
1727 .U3 "Forking 1709 .U3 "Process Forking
1728 .P 1710 .P
1729 Being a tool chest, MH creates many processes. 1711 Being a tool chest, MH creates many processes.
1730 In earlier times 1712 In earlier times
1731 .Fu fork() 1713 .Fu fork()
1732 had been an expensive system call, because the process's image needed 1714 had been an expensive system call, because the process's image needed
1764 nmh-workers vixie edginess 1746 nmh-workers vixie edginess
1765 .] 1747 .]
1766 I replaced all calls to 1748 I replaced all calls to
1767 .Fu vfork() 1749 .Fu vfork()
1768 with calls to 1750 with calls to
1769 .Fu fork() . 1751 .Fu fork()
1770 .Ci 40821f5c1316e9205a08375e7075909cc9968e7d 1752 .Ci 40821f5c1316e9205a08375e7075909cc9968e7d .
1771 .P 1753 .P
1772 Related to the costs of 1754 Related to the costs of
1773 .Fu fork() 1755 .Fu fork()
1774 is the probability of its success. 1756 is the probability of its success.
1775 In the eighties, on heavy loaded systems, calls to 1757 In the eighties, on heavy loaded systems, calls to
1777 were prone to failure. 1759 were prone to failure.
1778 Hence, many of the 1760 Hence, many of the
1779 .Fu fork() 1761 .Fu fork()
1780 calls in the code were wrapped into loops to retry the 1762 calls in the code were wrapped into loops to retry the
1781 .Fu fork() 1763 .Fu fork()
1782 several times, to increase the chances to succeed, eventually. 1764 several times, to increase the chances to succeed eventually.
1783 On modern systems, a failing 1765 On modern systems, a failing
1784 .Fu fork() 1766 .Fu fork()
1785 call is unusual. 1767 call is unusual.
1786 Hence, in the rare case when 1768 Hence, in the rare case when
1787 .Fu fork() 1769 .Fu fork()
1788 fails, mmh programs simply abort. 1770 fails, mmh programs simply abort
1789 .Ci 5fbf37ee68e018998ada61eeab73e035b26834b6 1771 .Ci 5fbf37ee68e018998ada61eeab73e035b26834b6 .
1790 1772
1791 1773
1792 .U3 "Header Fields 1774 .U3 "Header Fields
1793 .BU 1775 .BU
1794 The 1776 The
1797 but already marked as legacy in RFC\|2822. 1779 but already marked as legacy in RFC\|2822.
1798 Today, OpenPGP provides the basis for standardized exchange of encrypted 1780 Today, OpenPGP provides the basis for standardized exchange of encrypted
1799 messages [RFC\|4880, RFC\|3156]. 1781 messages [RFC\|4880, RFC\|3156].
1800 Hence, the support for 1782 Hence, the support for
1801 .Hd Encrypted 1783 .Hd Encrypted
1802 header fields is removed in mmh. 1784 header fields is removed in mmh
1803 .Ci 064527f7b57ab050e5af13e15ad99aeeab125857 1785 .Ci 064527f7b57ab050e5af13e15ad99aeeab125857 .
1804 .BU 1786 .BU
1805 The native support for 1787 The native support for
1806 .Hd Face 1788 .Hd Face
1807 header fields has been removed, as well. 1789 header fields has been removed, as well
1808 .Ci 8e5be81f784682822f5e868c1bf3c8624682bd23 1790 .Ci 8e5be81f784682822f5e868c1bf3c8624682bd23 .
1809 This feature is similar to the 1791 This feature is similar to the
1810 .Hd X-Face 1792 .Hd X-Face
1811 header field in its intent, 1793 header field in its intent,
1812 but takes a different approach to store the image. 1794 but takes a different approach to store the image.
1813 Instead of encoding the image data directly into the header field, 1795 Instead of encoding the image data directly into the header field,
1816 There is even a third Face system, 1798 There is even a third Face system,
1817 which is the successor of 1799 which is the successor of
1818 .Hd X-Face , 1800 .Hd X-Face ,
1819 although it re-uses the 1801 although it re-uses the
1820 .Hd Face 1802 .Hd Face
1821 header field. 1803 header field name.
1822 It was invented in 2005 and supports colored PNG images. 1804 It was invented in 2005 and supports colored PNG images.
1823 None of the Face systems described here is popular today. 1805 None of the Face systems described here is popular today.
1824 Hence, mmh has no direct support for them. 1806 Hence, mmh has no direct support for them.
1825 .BU 1807 .BU
1826 .Id content-md5 1808 .Id content-md5
1838 The TCP includes a checksum field therefore. 1820 The TCP includes a checksum field therefore.
1839 These two approaches in combinations render the 1821 These two approaches in combinations render the
1840 .Hd Content-MD5 1822 .Hd Content-MD5
1841 header field superfluous. 1823 header field superfluous.
1842 Not a single one out of 4\|200 messages from two decades 1824 Not a single one out of 4\|200 messages from two decades
1843 in an nmh-workers mailing list archive contains a 1825 in the nmh-workers mailing list archive
1826 .[
1827 nmh-workers mailing list archive website
1828 .]
1829 contains a
1844 .Hd Content-MD5 1830 .Hd Content-MD5
1845 header field. 1831 header field.
1846 Neither did any of the 60\|000 messages in my personal mail storage. 1832 Neither did any of the 60\|000 messages in my personal mail storage.
1847 Removing the support for this header field, 1833 Removing the support for this header field
1834 .Ci 31dc797eb5178970d68962ca8939da3fd9a8efda ,
1848 removed the last place where MD5 computation was needed. 1835 removed the last place where MD5 computation was needed.
1849 .Ci 31dc797eb5178970d68962ca8939da3fd9a8efda
1850 Hence, the MD5 code could be removed as well. 1836 Hence, the MD5 code could be removed as well.
1851 Over 500 lines of code vanished by this one change. 1837 Over 500 lines of code vanished by this one change.
1852 1838
1853 1839
1854 .U3 "MMDF maildrop support 1840 .U3 "MMDF maildrop support
1855 .P 1841 .P
1856 This type of format is conceptionally similar to the mbox format, 1842 This type of maildrop format is conceptionally similar to the mbox format,
1857 but uses a different message delimiter (`\fL\\1\\1\\1\\1\fP', 1843 but uses a different message delimiter (`\fL\\1\\1\\1\\1\fP',
1858 commonly written as `\fL^A^A^A^A\fP', instead of `\fLFrom\0\fP'). 1844 commonly written as `\fL^A^A^A^A\fP', instead of `\fLFrom\0\fP').
1859 Mbox is the de-facto standard maildrop format on Unix, 1845 Mbox is the de-facto standard maildrop format on Unix,
1860 whereas the MMDF maildrop format is now forgotten. 1846 whereas the MMDF maildrop format is now forgotten.
1861 By dropping the MMDF maildrop format support, 1847 Mbox remains as the only packed mailbox format, supported in mmh.
1862 mbox became the only packed mailbox format supported in mmh.
1863 .P 1848 .P
1864 The simplifications within the code were moderate. 1849 The simplifications within the code were moderate.
1865 Mainly, the reading and writing of MMDF mailbox files was removed. 1850 Mainly, the reading and writing of MMDF mailbox files was removed.
1866 But also, switches of 1851 But also, switches of
1867 .Pn packf 1852 .Pn packf
1868 and 1853 and
1869 .Pn rcvpack 1854 .Pn rcvpack
1870 could be removed. 1855 could be removed
1871 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0 1856 .Ci 3916ab66ad5d183705ac12357621ea8661afd3c0 .
1872 In the message parsing function 1857 In the message parsing function
1873 .Fn sbr/m_getfld.c , 1858 .Fn sbr/m_getfld.c ,
1874 knowledge of MMDF packed mail boxes was removed. 1859 knowledge of MMDF packed mail boxes was removed
1875 .Ci 684ec30d81e1223a282764452f4902ed4ad1c754 1860 .Ci 684ec30d81e1223a282764452f4902ed4ad1c754 .
1876 Further code structure simplifications may be possible there, 1861 Further code structure simplifications may be possible there,
1877 because only one single packed mailbox format is left to be supported. 1862 because only one single packed mailbox format is left to be supported.
1878 I have not worked on them yet because 1863 I have not worked on them yet because
1879 .Fu m_getfld() 1864 .Fu m_getfld()
1880 is heavily optimized and thus dangerous to touch. 1865 is heavily optimized and thus dangerous to touch.
1885 .U3 "Prompter's Control Keys 1870 .U3 "Prompter's Control Keys
1886 .P 1871 .P
1887 The program 1872 The program
1888 .Pn prompter 1873 .Pn prompter
1889 queries the user to fill in a message form. 1874 queries the user to fill in a message form.
1890 When used by 1875 When used as
1891 .Pn comp
1892 as
1893 .Cl "comp -editor prompter" , 1876 .Cl "comp -editor prompter" ,
1894 the resulting behavior is similar to 1877 the resulting behavior is similar to
1895 .Pn mailx . 1878 .Pn mailx .
1896 Apparently, 1879 Apparently,
1897 .Pn prompter 1880 .Pn prompter
1938 1921
1939 1922
1940 .H2 "Attachments 1923 .H2 "Attachments
1941 .P 1924 .P
1942 The mind model of email attachments is unrelated to MIME. 1925 The mind model of email attachments is unrelated to MIME.
1943 Although the MIME RFCs [RFC\|2045\(enRFC\|2049] define the technical 1926 Although the MIME RFCs [RFC\|2045\(en2049] define the technical
1944 requirements for having attachments, they do not mention the word 1927 requirements for having attachments, they do not mention the term.
1945 attachment.
1946 Instead of attachments, MIME talks about ``multi-part message bodies'' 1928 Instead of attachments, MIME talks about ``multi-part message bodies''
1947 [RFC\|2045], a more general concept. 1929 [RFC\|2045], a more general concept.
1948 Multi-part messages are messages 1930 Multi-part messages are messages
1949 ``in which one or more different 1931 ``in which one or more different
1950 sets of data are combined in a single body'' 1932 sets of data are combined in a single body''
1951 [RFC\|2046]. 1933 [RFC\|2046].
1952 MIME keeps its descriptions generic; 1934 MIME keeps its descriptions generic;
1953 it does not imply specific usage models. 1935 it does not imply specific usage models.
1954 One usage model became prevalent: attachments. 1936 Today, one usage model is prevalent: attachments.
1955 The idea is having a main text document with files of arbitrary kind 1937 The idea is having a main text document with files of arbitrary kind
1956 attached to it. 1938 attached to it.
1957 In MIME terms, this is a multi-part message having a text part first 1939 In MIME terms, this is a multi-part message having a text part first
1958 and parts of arbitrary type following. 1940 and parts of arbitrary type following.
1959 .P 1941 .P
1968 1950
1969 1951
1970 .U3 "Composing MIME Messages 1952 .U3 "Composing MIME Messages
1971 .P 1953 .P
1972 In order to improve the situation on the message composing side, 1954 In order to improve the situation on the message composing side,
1973 Jon Steinhart had added an attachment system to nmh in 2002. 1955 Jon Steinhart had added an attachment system to nmh in 2002
1974 .Ci 7480dbc14bc90f2d872d434205c0784704213252 1956 .Ci 7480dbc14bc90f2d872d434205c0784704213252 .
1975 In the file 1957 In the file
1976 .Fn docs/README-ATTACHMENTS , 1958 .Fn docs/README-ATTACHMENTS ,
1977 he described his motivation to do so as such: 1959 he described his motivation to do so:
1978 .QS 1960 .QS
1979 Although nmh contains the necessary functionality for MIME message 1961 Although nmh contains the necessary functionality for MIME message
1980 handing [sic!], the interface to this functionality is pretty obtuse. 1962 handing [sic!], the interface to this functionality is pretty obtuse.
1981 There's no way that I'm ever going to convince my partner to write 1963 There's no way that I'm ever going to convince my partner to write
1982 .Pn mhbuild 1964 .Pn mhbuild
1990 They allow attachments to be added, listed, and deleted. 1972 They allow attachments to be added, listed, and deleted.
1991 MIME messages are automatically created when drafts with attachments 1973 MIME messages are automatically created when drafts with attachments
1992 are sent. 1974 are sent.
1993 .QE 1975 .QE
1994 .LP 1976 .LP
1995 Unfortunately, the attachment system, 1977 Unfortunately, the attachment system, like every new facilities in nmh,
1996 like any new facilities in nmh,
1997 was inactive by default. 1978 was inactive by default.
1998 .P 1979 .P
1999 During my work in Argentina, I tried to improve the attachment system. 1980 During my time in Argentina, I tried to improve the attachment system.
2000 But, because of great opposition in the nmh community, 1981 But, after long discussions my patch died as a proposal on the
2001 my patch died as a proposal on the mailing list, after long discussions. 1982 mailing list because of great opposition in the nmh community.
2002 .[ 1983 .[
2003 nmh-workers attachment proposal 1984 nmh-workers attachment proposal
2004 .] 1985 .]
2005 In January 2012, I extended the patch and applied it to mmh. 1986 In January 2012, I extended the patch and applied it to mmh
2006 .Ci 8ff284ff9167eff8f5349481529332d59ed913b1 1987 .Ci 8ff284ff9167eff8f5349481529332d59ed913b1 .
2007 In mmh, the attachment system is active by default. 1988 In mmh, the attachment system is active by default.
2008 Instead of command line switches, the 1989 Instead of command line switches, the
2009 .Pe Attachment-Header 1990 .Pe Attachment-Header
2010 profile entry is used to specify 1991 profile entry is used to specify
2011 the name of the attachment header field. 1992 the name of the attachment header field.
2039 If the attachment header value starts with a plus character (`\fL+\fP'), 2020 If the attachment header value starts with a plus character (`\fL+\fP'),
2040 like in 2021 like in
2041 .Cl "Attach: +bob 30 42" , 2022 .Cl "Attach: +bob 30 42" ,
2042 the given messages in the specified folder will be attached. 2023 the given messages in the specified folder will be attached.
2043 This allowed to simplify 2024 This allowed to simplify
2044 .Pn forw . 2025 .Pn forw
2045 .Ci f41f04cf4ceca7355232cf7413e59afafccc9550 2026 .Ci f41f04cf4ceca7355232cf7413e59afafccc9550 .
2046 .P 2027 .P
2047 Closely related to attachments is non-ASCII text content, 2028 Closely related to attachments is non-ASCII text content,
2048 because it requires MIME too. 2029 because it requires MIME as well.
2049 In nmh, the user needed to call `mime' at the WhatNow prompt 2030 In nmh, the user needed to call `mime' at the WhatNow prompt
2050 to have the draft converted to MIME. 2031 to have the draft converted to MIME.
2051 This was necessary whenever the draft contained non-ASCII characters. 2032 This was necessary whenever the draft contained non-ASCII characters.
2052 If the user did not call `mime', a broken message would be sent. 2033 If the user did not call `mime', a broken message would be sent.
2053 Therefore, the 2034 Therefore, the
2082 .P 2063 .P
2083 Although the new approach does not anymore support arbitrary MIME 2064 Although the new approach does not anymore support arbitrary MIME
2084 compositions directly, the full power of 2065 compositions directly, the full power of
2085 .Pn mhbuild 2066 .Pn mhbuild
2086 can still be accessed. 2067 can still be accessed.
2087 Given no attachment headers are included, the user can create 2068 Given no attachment headers are included, users can create
2088 .Pn mhbuild 2069 .Pn mhbuild
2089 composition drafts like in nmh. 2070 composition drafts like in nmh.
2090 Then, at the WhatNow prompt, he needs to invoke 2071 Then, at the WhatNow prompt, they can invoke
2091 .Cl "edit mhbuild 2072 .Cl "edit mhbuild
2092 to convert it to MIME. 2073 to convert the draft to MIME.
2093 Because the resulting draft does neither contain non-ASCII characters 2074 Because the resulting draft neither contains non-ASCII characters
2094 nor has it attachment headers, the attachment system will not touch it. 2075 nor has it attachment headers, the attachment system will not touch it.
2095 .P 2076 .P
2096 The approach taken in mmh is tailored towards today's most common case: 2077 The approach taken in mmh is tailored towards today's most common case:
2097 a text part, possibly with attachments. 2078 a text part, possibly with attachments.
2098 This case was simplified. 2079 This case was simplified.
2102 .P 2083 .P
2103 From the programmer's point of view, the use of 2084 From the programmer's point of view, the use of
2104 .Pn mhbuild 2085 .Pn mhbuild
2105 composition drafts had one notable advantage over attachment headers: 2086 composition drafts had one notable advantage over attachment headers:
2106 The user provides the appropriate MIME types for files to include. 2087 The user provides the appropriate MIME types for files to include.
2107 The attachment system needs to find out the correct MIME type itself. 2088 The new attachment system needs to find out the correct MIME type itself.
2108 This is a difficult task, yet it spares the user irritating work. 2089 This is a difficult task.
2109 Determining the correct MIME type of content is partly mechanical, 2090 Determining the correct MIME type of content is partly mechanical,
2110 partly intelligent work. 2091 partly intelligent work.
2111 Forcing the user to find out the correct MIME type, 2092 Forcing the user to find out the correct MIME type,
2112 forces him to do partly mechanical work. 2093 forces him to do partly mechanical work.
2113 Letting the computer do the work can lead to bad choices for difficult 2094 Letting the computer do the work can lead to bad choices for difficult
2114 content. 2095 content.
2115 For mmh, the latter option was chosen. 2096 For mmh, the latter option was chosen to spare the user the work
2097 .Ci 3baec236a39c5c89a9bda8dbd988d643a21decc6 .
2116 .P 2098 .P
2117 Determining the MIME type by the suffix of the file name is a dumb 2099 Determining the MIME type by the suffix of the file name is a dumb
2118 approach, yet it is simple to implement and provides good results 2100 approach, yet it is simple to implement and provides good results
2119 for the common cases. 2101 for the common cases.
2102 If no MIME type can be determined, text content is sent as `text/plain',
2103 anything else under the generic fall-back type `application/octet-stream'.
2120 Mmh implements this approach in the 2104 Mmh implements this approach in the
2121 .Pn print-mimetype 2105 .Pn print-mimetype
2122 script. 2106 script
2123 .Ci 4b5944268ea0da7bb30598a27857304758ea9b44 2107 .Ci 4b5944268ea0da7bb30598a27857304758ea9b44 .
2124 Using it is the default choice.
2125 .P 2108 .P
2126 A far better, though less portable, approach is the use of 2109 A far better, though less portable, approach is the use of
2127 .Pn file . 2110 .Pn file .
2128 This standard tool tries to determine the type of files. 2111 This standard tool tries to determine the type of files.
2129 Unfortunately, its capabilities and accuracy varies from system to system. 2112 Unfortunately, its capabilities and accuracy varies from system to system.
2130 Additionally, its output was only intended for human beings, 2113 Additionally, its output was only intended for human beings,
2131 but not to be used by programs. 2114 but not to be used by programs.
2132 It varies much.
2133 Nevertheless, modern versions of GNU 2115 Nevertheless, modern versions of GNU
2134 .Pn file , 2116 .Pn file ,
2135 which is prevalent on the popular GNU/Linux systems, 2117 which are prevalent on the popular GNU/Linux systems,
2136 provide MIME type output in machine-readable form. 2118 provide MIME type output in machine-readable form.
2137 Although this solution is highly system-dependent, 2119 Although this solution is system-dependent,
2138 it solves the difficult problem well. 2120 it solves the difficult problem well.
2139 On systems where GNU 2121 On systems where GNU
2140 .Pn file , 2122 .Pn file ,
2141 version 5.04 or higher, is available it should be used. 2123 version 5.04 or higher, is available it should be used.
2142 One needs to specify the following profile entry to do so: 2124 One needs to specify the following profile entry to do so:
2143 .Ci 3baec236a39c5c89a9bda8dbd988d643a21decc6
2144 .VS 2125 .VS
2145 Mime-Type-Query: file -b --mime 2126 Mime-Type-Query: file -b --mime
2146 VE 2127 VE
2147 .LP 2128 .LP
2148 Other versions of 2129 Other versions of
2149 .Pn file 2130 .Pn file
2150 might possibly be usable with wrapper scripts to reformat the output. 2131 might possibly be usable with wrapper scripts that reformat the output.
2151 The diversity among 2132 The diversity among
2152 .Pn file 2133 .Pn file
2153 implementations is great; one needs to check the local variant. 2134 implementations is great; one needs to check the local variant.
2154 .P 2135 .P
2155 If no MIME type can be determined, text content gets sent as
2156 `text/plain' and anything else under the generic fall-back type
2157 `application/octet-stream'.
2158 It is not possible in mmh to override the automatic MIME type guessing 2136 It is not possible in mmh to override the automatic MIME type guessing
2159 for a specific file. 2137 for a specific file.
2160 To do so, either the user would need to know in advance for which file 2138 To do so, either the user would need to know in advance for which file
2161 the automatic guessing fails, or the system would require interaction. 2139 the automatic guessing fails or the system would require interaction.
2162 I consider both cases impractical. 2140 I consider both cases impractical.
2163 The existing solution should be sufficient. 2141 The existing solution should be sufficient.
2164 If not, the user may always fall back to 2142 If not, the user may always fall back to
2165 .Pn mhbuild 2143 .Pn mhbuild
2166 composition drafts and ignore the attachment system. 2144 composition drafts and bypass the attachment system.
2167 2145
2168 2146
2169 .U3 "Storing Attachments 2147 .U3 "Storing Attachments
2170 .P 2148 .P
2171 Extracting MIME parts of a message and storing them to disk is performed by 2149 Extracting MIME parts of a message and storing them to disk is performed by
2206 .Ci 41b6eadbcecf63c9a66aa5e582011987494abefb 2184 .Ci 41b6eadbcecf63c9a66aa5e582011987494abefb
2207 .LI 2 2185 .LI 2
2208 Tar files are not extracted automatically any more. 2186 Tar files are not extracted automatically any more.
2209 Thus, the rest of the file system will not be touched. 2187 Thus, the rest of the file system will not be touched.
2210 .Ci 94c80042eae3383c812d9552089953f9846b1bb6 2188 .Ci 94c80042eae3383c812d9552089953f9846b1bb6
2211 .LP 2189 .P
2212 Now, the outcome of mmh's 2190 In mmh, the result of
2213 .Cl "mhstore -auto 2191 .Cl "mhstore -auto
2214 can be foreseen from the output of 2192 can be foreseen from the output of
2215 .Cl "mhlist -verbose" . 2193 .Cl "mhlist -verbose" .
2216 .P 2194 Although the
2217 The
2218 .Sw -noauto 2195 .Sw -noauto
2219 mode is seen to be more powerful but less convenient. 2196 mode is considered to be more powerful, it is less convenient and
2220 On the other hand,
2221 .Sw -auto 2197 .Sw -auto
2222 is safe now and 2198 is safe now.
2223 storing attachments under their original name is intuitive. 2199 Additionally, storing attachments under their original name
2200 is intuitive.
2224 Hence, 2201 Hence,
2225 .Sw -auto 2202 .Sw -auto
2226 serves better as the default option. 2203 serves better as the default option
2227 .Ci 3410b680416c49a7617491af38bc1929855a331d 2204 .Ci 3410b680416c49a7617491af38bc1929855a331d .
2228 .P 2205 .P
2229 Files are stored into the directory given by the 2206 Files are stored into the directory given by the
2230 .Pe Nmh-Storage 2207 .Pe Nmh-Storage
2231 profile entry, if set, or 2208 profile entry, if set, or
2232 into the current working directory, otherwise. 2209 into the current working directory, otherwise.
2233 Storing to different directories is only possible with 2210 Storing to different directories is only possible with
2234 .Pe mhstore-store-* 2211 .Pe mhstore-store-*
2235 profile entries. 2212 profile entries.
2236 .P 2213 .P
2237 Still, in both modes, existing files get overwritten silently. 2214 Still existing files get overwritten silently in both modes.
2238 This can be considered a bug. 2215 This can be considered a bug.
2239 Yet, each other behavior has its draw-backs, too. 2216 Yet, each other behavior has its draw-backs, too.
2240 Refusing to replace files requires adding a 2217 Refusing to replace files requires adding a
2241 .Sw -force 2218 .Sw -force
2242 option. 2219 switch.
2243 Users will likely need to invoke 2220 Users will likely need to invoke
2244 .Pn mhstore 2221 .Pn mhstore
2245 a second time with 2222 a second time with
2246 .Sw -force . 2223 .Sw -force .
2247 Eventually, only the user can decide in the specific case. 2224 Eventually, only the user can decide in the specific case.
2258 The same applies to message/partial, although the parts are 2235 The same applies to message/partial, although the parts are
2259 automatically reassembled beforehand. 2236 automatically reassembled beforehand.
2260 MIME parts of type message/external-body are not automatically retrieved 2237 MIME parts of type message/external-body are not automatically retrieved
2261 anymore. 2238 anymore.
2262 Instead, information on how to retrieve them is output. 2239 Instead, information on how to retrieve them is output.
2263 Not supporting this rare case saved nearly one thousand lines of code. 2240 Not supporting this rare case saved nearly one thousand lines of code
2264 .Ci 55e1d8c654ee0f7c45b9361ce34617983b454c32 2241 .Ci 55e1d8c654ee0f7c45b9361ce34617983b454c32 .
2265 .\" XXX mention somewhere else too: (The profile entry `nmh-access-ftp' 2242 .\" XXX mention somewhere else too: (The profile entry `nmh-access-ftp'
2266 .\" and sbr/ruserpass.c for reading ~/.netrc are gone now.) 2243 .\" and sbr/ruserpass.c for reading ~/.netrc are gone now.)
2267 `application/octet-stream; type=tar' is not special anymore. 2244 The MIME type `application/octet-stream; type=tar' is not special anymore.
2268 Automatically extracting such MIME parts had been the dangerous part 2245 The automatically extracting of such MIME parts had been the
2269 of the 2246 dangerous part of the
2270 .Sw -auto 2247 .Sw -auto
2271 mode. 2248 mode
2272 .Ci 94c80042eae3383c812d9552089953f9846b1bb6 2249 .Ci 94c80042eae3383c812d9552089953f9846b1bb6 .
2273 2250
2274 2251
2275 2252
2276 .U3 "Showing MIME Messages 2253 .U3 "Showing MIME Messages
2277 .P 2254 .P
2278 The program 2255 The program
2279 .Pn mhshow 2256 .Pn mhshow
2280 had been written to display MIME messages. 2257 was written to display MIME messages.
2281 It implemented the conceptional view of the MIME RFCs. 2258 It implemented the conceptional view of the MIME RFCs.
2282 Nmh's 2259 Nmh's
2283 .Pn mhshow 2260 .Pn mhshow
2284 handled each MIME part independently, presenting them separately 2261 handles each MIME part independently, presenting them separately
2285 to the user. 2262 to the user.
2286 This does not match today's understanding of email attachments, 2263 This does not match today's understanding of email attachments,
2287 where displaying a message is seen to be a single, integrated operation. 2264 where displaying a message is seen to be a single, integrated operation.
2288 Today, email messages are expected to consist of a main text part 2265 Today, email messages are expected to consist of a main text part
2289 plus possibly attachments. 2266 plus possibly attachments.
2290 They are not any more seen to be arbitrary MIME hierarchies with 2267 They are no more seen to be arbitrary MIME hierarchies with
2291 information on how to display the individual parts. 2268 information on how to display the individual parts.
2292 I adjusted 2269 I adjusted
2293 .Pn mhshow 's 2270 .Pn mhshow 's
2294 behavior to the modern view on the topic. 2271 behavior to the modern view on the topic.
2295 .P 2272 .P
2296 One should note that this section completely ignores the original 2273 (One should note that this section completely ignores the original
2297 .Pn show 2274 .Pn show
2298 program, because it was not capable to display MIME messages 2275 program, because it was not capable to display MIME messages
2299 and is no longer part of mmh. 2276 and is no longer part of mmh.
2300 .\" XXX ref to other section 2277 .\" XXX ref to other section
2301 Although 2278 Although
2302 .Pn mhshow 2279 .Pn mhshow
2303 was renamed to 2280 was renamed to
2304 .Pn show 2281 .Pn show
2305 in mmh, this section uses the name 2282 in mmh, this section uses the name
2306 .Pn mhshow , 2283 .Pn mhshow ,
2307 in order to avoid confusion. 2284 in order to avoid confusion.)
2308 .P 2285 .P
2309 In mmh, the basic idea is that 2286 In mmh, the basic idea is that
2310 .Pn mhshow 2287 .Pn mhshow
2311 should display a message in one single pager session. 2288 should display a message in one single pager session.
2312 Therefore, 2289 Therefore,
2313 .Pn mhshow 2290 .Pn mhshow
2314 invokes a pager session for all its output, 2291 invokes a pager session for all its output,
2315 whenever it prints to a terminal. 2292 whenever it prints to a terminal
2316 .Ci a4197ea6ffc5c1550e8b52d5a654bcaaaee04a4e 2293 .Ci a4197ea6ffc5c1550e8b52d5a654bcaaaee04a4e .
2317 In consequence, 2294 In consequence,
2318 .Pn mhl 2295 .Pn mhl
2319 does no more invoke a pager. 2296 does no more invoke a pager
2320 .Ci 0e46503be3c855bddaeae3843e1b659279c35d70 2297 .Ci 0e46503be3c855bddaeae3843e1b659279c35d70 .
2321 With 2298 With
2322 .Pn mhshow 2299 .Pn mhshow
2323 replacing the original 2300 replacing the original
2324 .Pn show , 2301 .Pn show ,
2325 output from 2302 the output of
2326 .Pn mhl 2303 .Pn mhl
2327 does not go to the terminal directly, but through 2304 no longer goes to the terminal directly, but through
2328 .Pn mhshow . 2305 .Pn mhshow .
2329 Hence, 2306 Hence,
2330 .Pn mhl 2307 .Pn mhl
2331 does not need to invoke a pager. 2308 does not need to invoke a pager.
2332 The one and only job of 2309 The one and only job of
2333 .Pn mhl 2310 .Pn mhl
2334 is to format messages or parts of them. 2311 is to format messages or parts of them.
2335 The only place in mmh, where a pager is invoked is 2312 The only place in mmh, where a pager is invoked is
2336 .Pn mhshow . 2313 .Pn mhshow .
2337 .P 2314 .P
2315 In the intended setup, only text content is be displayed,
2316 in a single pager session.
2317 Non-text content needs to be converted to text by appropriate
2318 .Pe mhshow-show-*
2319 profile entries before, if this is possible and wanted.
2320 A common example for this are PDF files.
2321 .ig \"XXX
2338 .Pe mhshow-show-* 2322 .Pe mhshow-show-*
2339 profile entries can be used to display MIME parts in a specific way. 2323 profile entries can be used to display MIME parts in a specific way.
2340 For instance, PDF and Postscript files could be converted to plain text
2341 to display them in the terminal. 2324 to display them in the terminal.
2342 In mmh, MIME parts will always be displayed serially. 2325 ..
2326 In mmh, MIME parts are always displayed serially.
2343 The request to display the MIME type `multipart/parallel' in parallel 2327 The request to display the MIME type `multipart/parallel' in parallel
2344 is ignored. 2328 is ignored.
2345 It is simply treated as `multipart/mixed'. 2329 It is simply treated as `multipart/mixed'
2346 .Ci d0581ba306a7299113a346f9b4c46ce97bc4cef6 2330 .Ci d0581ba306a7299113a346f9b4c46ce97bc4cef6 .
2347 This could already be requested with the, now removed, 2331 This was already possible to requested with the, now removed,
2348 .Sw -serialonly 2332 .Sw -serialonly
2349 switch of 2333 switch of
2350 .Pn mhshow . 2334 .Pn mhshow .
2351 As MIME parts are always processed exclusively, i.e. serially, 2335 As MIME parts are always processed exclusively, i.e. serially,
2352 the `%e' escape in 2336 the `\fL%e\fP' escape in
2353 .Pe mhshow-show-* 2337 .Pe mhshow-show-*
2354 profile entries became useless and was thus removed. 2338 profile entries became useless and was thus removed
2355 .Ci a20d405db09b7ccca74d3e8c57550883da49e1ae 2339 .Ci a20d405db09b7ccca74d3e8c57550883da49e1ae .
2356 .P 2340 .P
2357 In the intended setup, only text content would be displayed.
2358 Non-text content would be converted to text by appropriate
2359 .Pe mhshow-show-*
2360 profile entries before, if possible and wanted.
2361 All output would be displayed in a single pager session.
2362 Other kinds of attachments are ignored. 2341 Other kinds of attachments are ignored.
2363 With 2342 With
2364 .Pe mhshow-show-* 2343 .Pe mhshow-show-*
2365 profile entries for them, they can be displayed serially along 2344 profile entries for them, they can be displayed serially along
2366 the message. 2345 the message.
2368 .P 2347 .P
2369 To display text content in foreign charsets, they need to be converted 2348 To display text content in foreign charsets, they need to be converted
2370 to the native charset. 2349 to the native charset.
2371 Therefore, 2350 Therefore,
2372 .Pe mhshow-charset-* 2351 .Pe mhshow-charset-*
2373 profile entries used to be needed. 2352 profile entries were needed.
2374 In mmh, the conversion is performed automatically by piping the 2353 In mmh, the conversion is performed automatically by piping the
2375 text through the 2354 text through the
2376 .Pn iconv 2355 .Pn iconv
2377 command, if necessary. 2356 command, if necessary
2378 .Ci 2433122c20baccb10b70b49c04c6b0497b5b3b60 2357 .Ci 2433122c20baccb10b70b49c04c6b0497b5b3b60 .
2379 Custom 2358 Custom
2380 .Pe mhshow-show-* 2359 .Pe mhshow-show-*
2381 rules for textual content might need a 2360 rules for textual content might need a
2382 .Cl "iconv -f %c %f | 2361 .Cl "iconv -f %c %f |
2383 prefix to have the text converted to the native charset. 2362 prefix to have the text converted to the native charset.
2409 2388
2410 .H2 "Signing and Encrypting 2389 .H2 "Signing and Encrypting
2411 .P 2390 .P
2412 Nmh offers no direct support for digital signatures and message encryption. 2391 Nmh offers no direct support for digital signatures and message encryption.
2413 This functionality needed to be added through third-party software. 2392 This functionality needed to be added through third-party software.
2414 In mmh, the functionality should be included because it 2393 In mmh, the functionality is included because it
2415 is a part of modern email and likely wanted by users of mmh. 2394 is a part of modern email and is likely wanted by users of mmh.
2416 A fresh mmh installation should support signing and encrypting 2395 A fresh mmh installation supports signing and encrypting
2417 out-of-the-box. 2396 out-of-the-box.
2418 Therefore, Neil Rickert's 2397 Therefore, Neil Rickert's
2419 .Pn mhsign 2398 .Pn mhsign
2420 and 2399 and
2421 .Pn mhpgp 2400 .Pn mhpgp
2422 scripts 2401 scripts
2423 .[ 2402 .[
2424 neil rickert mhsign mhpgp 2403 neil rickert mhsign mhpgp
2425 .] 2404 .]
2426 were included into mmh 2405 were included
2427 .Ci f45cdc98117a84f071759462c7ae212f4bc5ab2e 2406 .Ci f45cdc98117a84f071759462c7ae212f4bc5ab2e
2428 .Ci 58cf09aa36e9f7f352a127158bbf1c5678bc6ed8 . 2407 .Ci 58cf09aa36e9f7f352a127158bbf1c5678bc6ed8 .
2429 The scripts fit well because they are lightweight and 2408 The scripts fit well because they are lightweight and
2430 similar of style to the existing tools. 2409 similar of style to the existing tools.
2431 Additionally, no licensing difficulties appeared, 2410 Additionally, no licensing difficulties appeared
2432 as they are part of the public domain. 2411 as they are part of the public domain.
2433 .P 2412 .P
2434 .Pn mhsign 2413 .Pn mhsign
2435 handles the signing and encrypting part. 2414 handles the signing and encrypting part.
2436 It comprises about 250 lines of shell code and interfaces between 2415 It comprises about 250 lines of shell code and interfaces between
2437 .Pn gnupg 2416 .Pn gnupg "
2438 and 2417 .[
2439 the MH system. 2418 gnupg website
2419 .]
2420 and the MH system.
2440 It was meant to be invoked manually at the WhatNow prompt, but in mmh, 2421 It was meant to be invoked manually at the WhatNow prompt, but in mmh,
2441 .Pn send 2422 .Pn send
2442 invokes 2423 invokes
2443 .pn mhsign 2424 .Pn mhsign
2444 automatically 2425 automatically
2445 .Ci c7b5e1df086bcc37ff40163ee67571f076cf6683 . 2426 .Ci c7b5e1df086bcc37ff40163ee67571f076cf6683 .
2446 Special header fields were introduced to request this action. 2427 Special header fields were introduced to request this action.
2447 If a draft contains the 2428 If a draft contains the
2448 .Hd Sign 2429 .Hd Sign
2449 header field, 2430 header field,
2450 .Pn send 2431 .Pn send
2451 will initiate the signing. 2432 will initiate the signing.
2452 The signing key is either chosen automatically or specified by the 2433 The signing key is either chosen automatically or it is specified by the
2453 .Pe Pgpkey 2434 .Pe Pgpkey
2454 profile entry. 2435 profile entry.
2455 .Pn send 2436 .Pn send
2456 always create signatures using the PGP/MIME standard, \" REF XXX 2437 always create signatures using the PGP/MIME standard [RFC\|4880],
2457 but by manually invoking 2438 but by invoking
2458 .Pn mhsign , 2439 .Pn mhsign
2459 old-style non-MIME signatures can be created as well. 2440 manually, old-style non-MIME signatures can be created as well.
2460 To encrypt an outgoing message, the draft needs to contain an 2441 To encrypt an outgoing message, the draft needs to contain an
2461 .Hd Enc 2442 .Hd Enc
2462 header field. 2443 header field.
2463 Public keys of all recipients are searched for in the gnupg keyring and 2444 Public keys of all recipients are searched for in the gnupg keyring and
2464 in a file called 2445 in a file called
2473 .P 2454 .P
2474 .Pn mhpgp 2455 .Pn mhpgp
2475 is the companion to 2456 is the companion to
2476 .Pn mhsign . 2457 .Pn mhsign .
2477 It verifies signatures and decrypts messages. 2458 It verifies signatures and decrypts messages.
2478 Encrypted messages can either be temporarily decrypted for display 2459 Encrypted messages can be either temporarily decrypted and displayed
2479 or permanently decrypted and stored into the current folder. 2460 or permanently decrypted and stored into the current folder.
2480 Currently, 2461 Currently,
2481 .Pn mhpgp 2462 .Pn mhpgp
2482 needs to be invoked manually. 2463 needs to be invoked manually.
2483 The integration into 2464 The integration into
2484 .Pn show 2465 .Pn show
2485 and 2466 and
2486 .Pn mhstore 2467 .Pn mhstore
2487 to verify signatures and decrypt messages as needs 2468 to verify signatures and decrypt messages as needed
2488 is planned but not realized yet. 2469 is planned but not yet realized.
2489 .P 2470 .P
2490 Both scripts were written for nmh, hence they needed to be adjust 2471 Both scripts were written for nmh.
2472 Hence they needed to be adjust
2491 according to the differences between nmh and mmh. 2473 according to the differences between nmh and mmh.
2492 For instance, they use the backup prefix no longer. 2474 For instance, they use the backup prefix no longer.
2493 Furthermore, compatibility support for old PGP features was dropped. 2475 Furthermore, compatibility support for old PGP features was dropped.
2494 .P 2476 .P
2495 The integrated message signing and encrypting support is one of the 2477 The integrated message signing and encrypting support is one of the
2496 most recent features in mmh. 2478 most recent features in mmh.
2497 It has not yet had the time to mature. 2479 It has not had the time to mature.
2498 User feedback and personal experience need to be accumulated to 2480 User feedback and personal experience need to be accumulated to
2499 direct the further development of the facility. 2481 direct the further development of the facility.
2500 Although the feedback and experience is still missing, 2482 Already it seems to be worthwhile to consider adding
2501 it seems to be worthwhile to consider adding
2502 .Sw -[no]sign 2483 .Sw -[no]sign
2503 and 2484 and
2504 .Sw -[no]enc 2485 .Sw -[no]enc
2505 switches to 2486 switches to
2506 .Pn send , 2487 .Pn send ,
2525 2506
2526 .U3 "Draft Folder 2507 .U3 "Draft Folder
2527 .Id draft-folder 2508 .Id draft-folder
2528 .P 2509 .P
2529 In the beginning, MH had the concept of a draft message. 2510 In the beginning, MH had the concept of a draft message.
2530 This is the file 2511 This was a file named
2531 .Fn draft 2512 .Fn draft
2532 in the MH directory, which is treated special. 2513 in the MH directory, which was treated special.
2533 On composing a message, this draft file was used. 2514 On composing a message, this draft file was used.
2534 When starting to compose another message before the former one was sent, 2515 When starting to compose another message before the former one was sent,
2535 the user had to decide among: 2516 the user had to decide among:
2536 .LI 1 2517 .LI 1
2537 Using the old draft to finish and send it before starting with a new one. 2518 Using the old draft to finish and send it before starting with a new one.
2538 .LI 2 2519 .LI 2
2539 Discarding the old draft and replacing it with a new one. 2520 Discarding the old draft and replacing it with a new one.
2540 .LI 3 2521 .LI 3
2541 Preserving the old draft by refiling it to a folder. 2522 Preserving the old draft by refiling it to a folder.
2542 .LP 2523 .LP
2543 It was only possible to work in alternation on multiple drafts. 2524 Working on multiple drafts was only possible in alternation.
2544 Therefore, the current draft needed to be refiled to a folder and 2525 For that, the current draft needed to be refiled to a folder and
2545 another one re-used for editing. 2526 another one re-used for editing.
2546 Working on multiple drafts at the same time was impossible. 2527 Working on multiple drafts at the same time was impossible.
2547 The usual approach of switching to a different MH context did not 2528 The usual approach of switching to a different MH context did not
2548 help anything. 2529 help anything.
2549 .P 2530 .P
2559 .P 2540 .P
2560 Not using the draft folder facility has the single advantage of having 2541 Not using the draft folder facility has the single advantage of having
2561 the draft file at a static location. 2542 the draft file at a static location.
2562 This is simple in simple cases but the concept does not scale for more 2543 This is simple in simple cases but the concept does not scale for more
2563 complex cases. 2544 complex cases.
2564 The concept of the draft message is too limited for the problem. 2545 The concept of the draft message is too limited for the problem
2546 it tries to solve.
2565 Therefore the draft folder was introduced. 2547 Therefore the draft folder was introduced.
2566 It is the more powerful and more natural concept. 2548 It is the more powerful and more natural concept.
2567 The draft folder is a folder like any other folder in MH. 2549 The draft folder is a folder like any other folder in MH.
2568 Its messages can be listed like any other messages. 2550 Its messages can be listed like any other messages.
2569 A draft message is no longer a special case. 2551 A draft message is no longer a special case.
2571 Hence corner cases were removed. 2553 Hence corner cases were removed.
2572 .P 2554 .P
2573 The trivial part of the work was activating the draft folder with a 2555 The trivial part of the work was activating the draft folder with a
2574 default name. 2556 default name.
2575 I chose the name 2557 I chose the name
2576 .Fn +drafts 2558 .Fn +drafts ,
2577 for obvious reasons. 2559 for obvious reasons.
2578 In consequence, the command line switches 2560 In consequence, the command line switches
2579 .Sw -draftfolder 2561 .Sw -draftfolder
2580 and 2562 and
2581 .Sw -draftmessage 2563 .Sw -draftmessage
2582 could be removed. 2564 could be removed.
2583 More difficult but also more improving was updating the tools to the 2565 More difficult but also more improving was updating the tools to the
2584 new concept. 2566 new concept.
2585 For nearly three decades, the tools needed to support two draft handling 2567 For nearly three decades, the tools needed to support two draft handling
2586 approaches. 2568 approaches.
2587 By fully switching to the draft folder, the tools could be simplified 2569 By fully switching to the draft folder, the tools could be
2588 by dropping the awkward draft message handling code. 2570 simplified by dropping the awkward draft message handling code.
2589 .Sw -draft 2571 .Sw -draft
2590 switches were removed because operating on a draft message is no longer 2572 switches were removed because operating on a draft message is no longer
2591 special. 2573 special.
2592 It became indistinguishable to operating on any other message. 2574 It became indistinguishable to operating on any other message.
2593 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 2575 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860
2601 .Pn comp 2583 .Pn comp
2602 still has 2584 still has
2603 .Sw -[no]use 2585 .Sw -[no]use
2604 for switching between two modes: 2586 for switching between two modes:
2605 .LI 1 2587 .LI 1
2606 .Sw -use 2588 Modifying an existing draft, with
2607 to modify an existing draft. 2589 .Sw -use .
2608 .LI 2 2590 .LI 2
2609 .Sw -nouse 2591 Composing a new draft, possibly taking some existing message as template,
2610 to compose a new draft, possibly taking some existing message as template. 2592 with
2593 .Sw -nouse ,
2594 the default.
2611 .LP 2595 .LP
2612 In either case, the behavior of 2596 In either case, the behavior of
2613 .Pn comp 2597 .Pn comp
2614 is deterministic. 2598 is deterministic.
2615 .P 2599 .P
2621 In contrast to the other tools, 2605 In contrast to the other tools,
2622 .Pn send 2606 .Pn send
2623 takes the draft folder as its default folder. 2607 takes the draft folder as its default folder.
2624 .P 2608 .P
2625 Dropping the draft message concept in favor for the draft folder concept, 2609 Dropping the draft message concept in favor for the draft folder concept,
2626 removed special cases with regular cases. 2610 replaced special cases with regular cases.
2627 This simplified the source code of the tools, as well as the concepts. 2611 This simplified the source code of the tools, as well as the concepts.
2628 In mmh, draft management does not break with the MH concepts 2612 In mmh, draft management does not break with the MH concepts
2629 but applies them. 2613 but applies them.
2630 .Cl "scan +drafts" , 2614 .Cl "scan +drafts" ,
2631 for instance, is a truly natural request. 2615 for instance, is a truly natural request.
2616 .P
2632 Most of the work was already performed by Rose in the eighties. 2617 Most of the work was already performed by Rose in the eighties.
2633 The original improvement of mmh is dropping the old draft message approach 2618 The original improvement of mmh is dropping the old draft message approach
2634 and thus simplifying the tools, the documentation and the system as a whole. 2619 and thus simplifying the tools, the documentation,
2620 and the system as a whole.
2635 Although my part in the draft handling improvement was small, 2621 Although my part in the draft handling improvement was small,
2636 it was an important one. 2622 it was important.
2637 2623
2638 2624
2639 .U3 "Trash Folder 2625 .U3 "Trash Folder
2640 .Id trash-folder 2626 .Id trash-folder
2641 .P 2627 .P
2653 .VS 2639 .VS
2654 find $HOME/Mail -type f -name ',*' -ctime +7 -delete 2640 find $HOME/Mail -type f -name ',*' -ctime +7 -delete
2655 VE 2641 VE
2656 In such a setup, the original message could be restored 2642 In such a setup, the original message could be restored
2657 within the grace time interval by stripping the 2643 within the grace time interval by stripping the
2658 backup prefix from the file name. 2644 backup prefix from the file name \(en usually but not always.
2659 But the user could not rely on this statement.
2660 If the last message of a folder with six messages (\fL1-6\fP) was removed, 2645 If the last message of a folder with six messages (\fL1-6\fP) was removed,
2661 message 2646 message
2662 .Fn 6 , 2647 .Fn 6 ,
2663 became file 2648 became file
2664 .Fn ,6 . 2649 .Fn ,6 .
2665 If then a new message entered the same folder, it would be named with 2650 If then a new message entered the same folder, it would be named with
2666 the number one above the highest existing message number. 2651 the number one above the highest existing message number.
2667 In this case the message would be named 2652 In this case the message would be named
2668 .Fn 6 2653 .Fn 6 ,
2669 then. 2654 reusing the number.
2670 If this new message would be removed as well, 2655 If this new message would be removed as well,
2671 then the backup of the former message is overwritten. 2656 then the backup of the former message becomes overwritten.
2672 Hence, the ability to restore removed messages did not only depend on 2657 Hence, the ability to restore removed messages did not only depend on
2673 the sweeping cron job but also on the removing of further messages. 2658 the sweeping cron job but also on the removing of further messages.
2674 It is undesirable to have such obscure and complex mechanisms. 2659 It is undesirable to have such obscure and complex mechanisms.
2675 The user should be given a small set of clear assertions, such as 2660 The user should be given a small set of clear assertions, such as
2676 ``Removed files are restorable within a seven-day grace time.'' 2661 ``Removed files are restorable within a seven-day grace time.''
2677 With the addition ``... unless a message with the same name in the 2662 With the addition ``... unless a message with the same name in the
2678 same folder is removed before.'' the statement becomes complex. 2663 same folder is removed before.'' the statement becomes complex.
2679 A user will hardly be able to keep track of any removal to know 2664 A user will hardly be able to keep track of all removals to know
2680 if the assertion still holds true for a specific file. 2665 if the assertion still holds true for a specific file.
2681 In practice, the real mechanism is unclear to the user. 2666 In practice, the real mechanism is unclear to the user.
2682 The consequences of further removals are not obvious. 2667 .P
2683 .P 2668 Furthermore, the backup files were scattered within the whole mail storage.
2684 Furthermore, the backup files are scattered within the whole mail storage. 2669 This complicated managing them.
2685 This complicates managing them. 2670 It was possible with the help of
2686 It is possible with the help of
2687 .Pn find , 2671 .Pn find ,
2688 but everything would be more convenient 2672 but everything is more convenient
2689 if the deleted messages would be collected in one place. 2673 if the deleted messages are collected in one place.
2690 .P 2674 .P
2691 The profile entry 2675 The profile entry
2692 .Pe rmmproc 2676 .Pe rmmproc
2693 (previously named 2677 (previously named
2694 .Pe Delete-Prog ) 2678 .Pe Delete-Prog )
2695 was introduced very early to improve the situation. 2679 was introduced very early to improve the situation.
2696 It could be set to any command, which would be executed to remove 2680 It could be set to any command, which would be executed to remove
2697 the specified messages. 2681 the specified messages.
2698 This would override the default action described above. 2682 This had overridden the default action, described above.
2699 Refiling the to-be-removed files to a trash folder is the usual example. 2683 Refiling the to-be-removed files to a trash folder was the usual example.
2700 Nmh's man page 2684 Nmh's man page
2701 .Mp rmm (1) 2685 .Mp rmm (1)
2702 proposes to set the 2686 proposes to set the
2703 .Pe rmmproc 2687 .Pe rmmproc
2704 to 2688 to
2705 .Cl "refile +d 2689 .Cl "refile +d
2706 to move messages to the trash folder, 2690 to move messages to the trash folder
2707 .Fn +d , 2691 .Fn +d
2708 instead of renaming them with the backup prefix. 2692 instead of renaming them with the backup prefix.
2709 The man page proposes additionally the expunge command 2693 The man page additionally proposes the expunge command
2710 .Cl "rm `mhpath +d all` 2694 .Cl "rm `mhpath +d all`
2711 to empty the trash folder. 2695 to empty the trash folder.
2712 .P 2696 .P
2713 Removing messages in such a way has advantages. 2697 Removing messages in such a way has advantages:
2698 .LI 1
2714 The mail storage is prevented from being cluttered with removed messages 2699 The mail storage is prevented from being cluttered with removed messages
2715 because they are all collected in one place. 2700 because they are all collected in one place.
2716 Existing and removed messages are thus separated more strictly. 2701 Existing and removed messages are thus separated more strictly.
2702 .LI 2
2717 No backup files are silently overwritten. 2703 No backup files are silently overwritten.
2718 But most important is the ability to keep removed messages in the MH domain. 2704 .LI 3
2705 Most important, however, removed messages are kept in the MH domain.
2719 Messages in the trash folder can be listed like those in any other folder. 2706 Messages in the trash folder can be listed like those in any other folder.
2720 Deleted messages can be displayed like any other messages. 2707 Deleted messages can be displayed like any other messages.
2721 .Pn refile 2708 .Pn refile
2722 can restore deleted messages. 2709 can restore deleted messages.
2723 All operations on deleted files are still covered by the MH tools. 2710 All operations on deleted files are still covered by the MH tools.
2738 .Sw -unlink 2725 .Sw -unlink
2739 switch causes the files to be unlinked. 2726 switch causes the files to be unlinked.
2740 .Ci 8edc5aaf86f9f77124664f6801bc6c6cdf258173 2727 .Ci 8edc5aaf86f9f77124664f6801bc6c6cdf258173
2741 .Ci ca0b3e830b86700d9e5e31b1784de2bdcaf58fc5 2728 .Ci ca0b3e830b86700d9e5e31b1784de2bdcaf58fc5
2742 .P 2729 .P
2743 Dropping the legacy approach and converting to the new approach completely 2730 Dropping the legacy approach and converting to the new approach
2744 simplified the code base. 2731 completely, simplified the code base.
2745 The relationship between 2732 The relationship between
2746 .Pn rmm 2733 .Pn rmm
2747 and 2734 and
2748 .Pn refile 2735 .Pn refile
2749 was inverted. 2736 was inverted.
2750 In mmh, 2737 In mmh,
2751 .Pn rmm 2738 .Pn rmm
2752 invokes 2739 invokes
2753 .Pn refile , 2740 .Pn refile .
2754 which used to be the other way round. 2741 That used to be the other way round.
2755 Yet, the relationship is simpler now. 2742 Yet, the relationship is simpler now.
2756 Loops, like described in nmh's man page for 2743 Loops, like described in nmh's man page for
2757 .Mp refile (1), 2744 .Mp refile (1),
2758 can no longer occur: 2745 can no longer occur:
2759 .QS 2746 .QS
2787 2774
2788 2775
2789 .H2 "Modern Defaults 2776 .H2 "Modern Defaults
2790 .P 2777 .P
2791 Nmh has a bunch of convenience-improving features inactive by default, 2778 Nmh has a bunch of convenience-improving features inactive by default,
2792 although one can expect every new user wanting to have them active. 2779 although one can expect every new user to want them active.
2793 The reason they are inactive by default is the wish to stay compatible 2780 The reason they are inactive by default is the wish to stay compatible
2794 with old versions. 2781 with old versions.
2795 But what is the definition for old versions? 2782 But what are old versions?
2796 Still, the highly useful draft folder facility has not been activated 2783 Still, the highly useful draft folder facility has not been activated
2797 by default although it was introduced over twenty-five years ago. 2784 by default although it was introduced over twenty-five years ago.
2798 .[ 2785 .[
2799 rose romine real work 2786 rose romine real work
2800 .] 2787 .]
2801 The community seems not to care. 2788 The community seems not to care.
2802 This is one of several examples that require new users to first build up 2789 .P
2803 a profile before they can access the modern features of nmh. 2790 In nmh, new users are required to first build up
2791 a profile before they can access the modern features.
2804 Without an extensive profile, the setup is hardly usable 2792 Without an extensive profile, the setup is hardly usable
2805 for modern emailing. 2793 for modern emailing.
2806 The point is not the customization of the setup, 2794 The point is not the customization of the setup,
2807 but the need to activate generally useful facilities. 2795 but the need to activate generally useful facilities.
2808 .P 2796 Yet, the real problem lies less in enabling the features,
2809 Yet, the real problem lies less in enabling the features, as this is 2797 as this is straight forward as soon as one knows what he wants.
2810 straight forward as soon as one knows what he wants.
2811 The real problem is that new users need deep insight into the project 2798 The real problem is that new users need deep insight into the project
2812 to find out about inactive features nmh already provides. 2799 to discover the available but inactive features.
2813 To give an example, I needed one year of using nmh 2800 To give an example, I needed one year of using nmh
2814 before I became aware of the existence of the attachment system. 2801 before I became aware of the existence of the attachment system.
2815 One could argue that this fact disqualifies my reading of the 2802 One could argue that this fact disqualifies my reading of the
2816 documentation. 2803 documentation.
2817 If I would have installed nmh from source back then, I could agree. 2804 If I would have installed nmh from source back then, I could agree.
2818 Yet, I had used a prepackaged version and had expected that it would 2805 Yet, I had used a pre-packaged version and had expected that it would
2819 just work. 2806 just work.
2820 Nevertheless, I had been convinced by the concepts of MH already 2807 Nevertheless, I had been convinced by the concepts of MH already
2821 and I am a software developer, 2808 and I am a software developer,
2822 still I required a lot of time to discover the cool features. 2809 still I required a lot of time to discover the cool features.
2823 How can we expect users to be even more advanced than me, 2810 How can we expect users to be even more advanced than me,
2824 just to allow them use MH in a convenient and modern way? 2811 just to enable them to use MH in a convenient and modern way?
2825 Unless they are strongly convinced of the concepts, they will fail. 2812 Unless they are strongly convinced of the concepts, they will fail.
2826 I have seen friends of me giving up disappointed 2813 I have seen friends of me giving up disappointed
2827 before they truly used the system, 2814 before they truly used the system,
2828 although they had been motivated in the beginning. 2815 although they had been motivated in the beginning.
2829 They suffer hard enough to get used to the tool chest approach, 2816 New users suffer hard enough to get used to the tool chest approach,
2830 we developers should spare them further inconveniences. 2817 we developers should spare them further inconveniences.
2831 .P 2818 .P
2832 Maintaining compatibility for its own sake is bad, 2819 Maintaining compatibility for its own sake is bad,
2833 because the code base collects more and more compatibility code. 2820 because the code base will collect more and more compatibility code.
2834 Sticking to the compatibility code means remaining limited; 2821 Sticking to the compatibility code means remaining limited;
2835 whereas adjusting to the changes renders the compatibility unnecessary. 2822 whereas adjusting to the changes renders the compatibility unnecessary.
2836 Keeping unused alternatives in the code is a bad choice as they likely 2823 Keeping unused alternatives in the code for longer than a short
2837 gather bugs, by not being well tested. 2824 grace time is a bad choice as they likely
2825 gather bugs by not being constantly tested.
2838 Also, the increased code size and the greater number of conditions 2826 Also, the increased code size and the greater number of conditions
2839 increase the maintenance costs. 2827 increase the maintenance costs.
2840 If any MH implementation would be the back-end of widespread 2828 If any MH implementation would be the back-end of widespread
2841 email clients with large user bases, compatibility would be more 2829 email clients with large user bases, compatibility would be more
2842 important. 2830 important.
2843 Yet, it appears as if this is not the case. 2831 Yet, it appears as if this is not the case.
2844 Hence, compatibility is hardly important for technical reasons. 2832 Hence, compatibility is hardly important for technical reasons.
2845 Its importance originates rather from personal reasons. 2833 Its importance originates from personal reasons rather.
2846 Nmh's user base is small and old. 2834 Nmh's user base is small and old.
2847 Changing the interfaces would cause inconvenience to long-term users of MH. 2835 Changing the interfaces causes inconvenience to long-term users of MH.
2848 It would force them to change their many years old MH configurations. 2836 It forces them to change their many years old MH configurations.
2849 I do understand this aspect, but by sticking to the old users, 2837 I do understand this aspect, but by sticking to the old users,
2850 new users are kept away. 2838 new users are kept from entering the world of MH.
2851 Yet, the future lies in new users. 2839 But the future lies in new users.
2852 In consequence, mmh invites new users by providing a convenient 2840 In consequence, mmh invites new users by providing a convenient
2853 and modern setup, readily usable out-of-the-box. 2841 and modern setup, readily usable out-of-the-box.
2854 .P 2842 .P
2855 In mmh, all modern features are active by default and many previous 2843 In mmh, all modern features are active by default and many previous
2856 approaches are removed or only accessible in manual ways. 2844 approaches are removed or only accessible in a manual way.
2857 New default features include: 2845 New default features include:
2858 .BU 2846 .BU
2859 The attachment system (\c 2847 The attachment system (\c
2860 .Hd Attach ). 2848 .Hd Attach )
2861 .Ci 8ff284ff9167eff8f5349481529332d59ed913b1 2849 .Ci 8ff284ff9167eff8f5349481529332d59ed913b1 .
2862 .BU 2850 .BU
2863 The draft folder facility (\c 2851 The draft folder facility (\c
2864 .Fn +drafts ). 2852 .Fn +drafts )
2865 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 2853 .Ci 337338b404931f06f0db2119c9e145e8ca5a9860 .
2866 .BU 2854 .BU
2867 The unseen sequence (`u') 2855 The unseen sequence (`u')
2868 .Ci c2360569e1d8d3678e294eb7c1354cb8bf7501c1 2856 .Ci c2360569e1d8d3678e294eb7c1354cb8bf7501c1
2869 and the sequence negation prefix (`!'). 2857 and the sequence negation prefix (`!')
2870 .Ci db74c2bd004b2dc9bf8086a6d8bf773ac051f3cc 2858 .Ci db74c2bd004b2dc9bf8086a6d8bf773ac051f3cc .
2871 .BU 2859 .BU
2872 Quoting the original message in the reply. 2860 Quoting the original message in the reply
2873 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 2861 .Ci 67411b1f95d6ec987b4c732459e1ba8a8ac192c6 .
2874 .BU 2862 .BU
2875 Forwarding messages using MIME. 2863 Forwarding messages using MIME
2876 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1 2864 .Ci 6e271608b7b9c23771523f88d23a4d3593010cf1 .
2877 .LP 2865 .LP
2878 In consequence, a setup with a profile that defines only the path to the 2866 An mmh setup with a profile that defines only the path to the
2879 mail storage, is already convenient to use. 2867 mail storage, is already convenient to use.
2880 Again, Paul Vixie's ``edginess'' call supports the direction I took: 2868 Again, Paul Vixie's supports the direction I took:
2881 ``the `main branch' should just be modern''. 2869 ``the `main branch' should just be modern''.
2882 .[ 2870 .[
2883 paul vixie edginess nmh-workers 2871 paul vixie edginess nmh-workers
2884 .] 2872 .]
2885 2873