Mercurial > docs > master
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 |