3 Rename S-nail to S-mailx in v15.0, change things i have messed with
4 a single, massively backward incompatible change.
6 In general the code is in a pretty bad shape due to the signal handling.
7 I should have sat back in 2012/13 and consider what i am doing.
8 My fault. If i would, we would have a blocked signal mask anywhere in
9 this software except in a few cases where it is necessary and/or
10 possible to deal with signals, and possibly we would not even have to
11 consider to switch the entire codebase to (the much superior, and the
12 only sane approach) SysV signal handling, without SA_RESTART.
14 But a few things are already pretty good, except for normal iterations
15 and a review once we have a better signal handling, and can be taken
18 - We should have generic ENOMEM conditions, now that we have $!.
19 I.e., test overflow (e.g., nam-a-grp.c, whether an alias _can_ be
20 created / extended), like n_ENOMEM_CHECK(INTTYPE, SIZE1, SIZE2, NIL
21 or message), which returns m_bool (now bool_t).
22 Callers need to be aware of NIL returns and pass through errors,
25 - We need a "void" box that can be jumped to, i.e., a state in which no box
28 -- When a MBOX mailbox is removed while it is opened then changing the
29 folder is not possible. This is an inherent problem of the Berkeley
30 Mail codebase, and we need to have a fully functional intermediate
31 VOID box mechanism plus an object-based mailbox implementation to
34 -- Also, when the folder was modified concurrently we should bail, or,
35 in an interactive session, prompt the user what to do.
37 - IDNA decoding. Needs a complete design change.
38 (Unless wants to brute force decode anything before display, of course.)
40 - Line editing should gain possibility of context sensitive tab completion.
41 -- Offer a(n optional, and on/off switchable) Damerau-Levenshtein
42 mode for command completion;
44 - Maybe there should be an additional ZOMBIE directive that is served in
45 equal spirit to DEAD, but that could be a valid MBOX... ?
46 What i want is a *real* resend, best if possible from command line.
47 Meaning, also the possibility to postpone a message. In general.
49 - Having a newsreader would be a really cool thing. (RFC 977 and 2980)
51 - printhead()/hprf(): support %n newline format (%t tab?).
52 Make it possible to use the *datefield* algorithm for plain From_ derived
53 dates (needs a From_ parser, i.e., strptime()-alike).
54 Once we have that, rename *datefield-markout-older* to
55 *date-markout-older* ??
56 Note that NetBSD's mail(1) has some other nice things.
57 Note also that our code is quite unflexible.
59 - headerpick: add resend-retain/ignore! (Ralph Corderoy, Norman Shapiro)
60 (Delivered-To thread on nmh. Will be hard to do because of
63 - -r should be the Sender:, which should automatically propagate to
64 From: if possible and/or necessary. It should be possible to suppress
65 -r stuff from From: and Sender:, but fallback to special -r arg as
71 - Improve name extraction rules. And field parsing. There
72 are structured and unstructured fields. There are quoted pairs and
73 comments etc. Rewrite the entire parsing mechanism to comply to RFC
74 5322, and try to merge all those many subparsers around in the codebase,
75 and accordingly. So much duplicated work ...
76 Name parsing improved a bit for v13 and v14.9, but it's still broken.
77 yankword(), *extract(), etc.: RFC 5322 says that comments in address
78 fields SHOULD NOT be used (mutt(1) maps them to full name-addr forms if
79 approbiate, even if that actually changes content!!?), and that full
80 name-addr SHOULD be used.
82 - After I/O layer rework we should optionally be able to read RSS
83 (Atom?) feeds -- Expat should be available almost everywhere and
84 should be able to parse that?
85 Atom is harder because it may support html+.
86 I mean, yeah, it's stupid, but we could fill in header fields with
87 dummies and still use S-nail to look into the separated feeds as if
88 they were mail messages; anyway i would like to save me from using too
89 many tools -- three seems reasonable.
91 - `sync'hronize commando -- robin@stjerndorff.org (Robin Stjerndorff):
92 Wondering how to update back to my Maildir, moving new read mails
93 in ~/Maildir from new to cur, without exiting the application.
94 Automation available? [And simply re-`[Ff]i' involves a lot of
97 -- Provide sync'ing options -- Jacob Gelbman <gelbman@gmail.com>:
98 If I open two instances of mailx, I then delete a message and then
99 quit in one. Then in the other one I read a message and quit, mailx
100 saves the status of the read message and the fact that a message was
101 deleted, even though it was opened before the other instance deleted
102 it. How is it doing that? [Of course he was using Maildir]
104 - Add TODO notes for those RFCs:
105 RFC 977 -> 3977 - Network News Transfer Protocol
106 RFC 1036 - Standard for USENET Messages
107 RFC 1939 - Post Office Protocol v3
108 RFC 2017 - URL External-Body Access-Type
109 RFC 2183 - The Content-Disposition Header
110 RFC 2369 - The Use of URLs as Meta-Syntax for Core Mail List Commands
111 and their Transport through Message Header Fields
112 (RFC 6068 - The 'mailto' URL scheme)
113 RFC 2384,1738 - I.e., Much better URL support
114 RFC 2387 - multipart/related -- yet handled like /alternative
115 RFC 2392 - Content-ID and Message-ID Uniform Resource Locators
116 RFC 2405 - The format of MIME message bodies.
117 RFC 2406 - Common multimedia types.
118 RFC 2407 - Encoding of non-ASCII text in message headers.
119 RFC 2449 - POP3 Extensions (including SASL)
120 RFC 2595 - TLS for POP3 (among others)
121 RFC 2980 - Common NNTP Extensions
122 RFC 3156 - MIME Security with OpenPGP
123 RFC 3207 - SMTP over TLS
125 Simple Mail Transfer Protocol (SMTP) Service Extension for Delivery
126 Status Notifications (DSNs),
127 An Extensible Message Format for Delivery Status Notifications
128 RFC 3676 - Updates to the text/plain MIME type and extensions for flowed
129 text (format=flowed). (Martin Neitzel)
130 rfc4315.txt Internet Message Access Protocol (IMAP) - UIDPLUS extension
131 RFC 4422, 4505 - Simple Authentication and Security layer (SASL)
133 RFC 4551 IMAP Extension for Conditional STORE
134 RFC 4880 - OpenPGP Message Format
135 RFC 4954 - SMTP Authentication
136 rfc4959.txt IMAP Extension for Simple Authentication and Security
137 Layer (SASL) Initial Client Response
138 rfc4978.txt The IMAP COMPRESS Extension
139 rfc5161.txt The IMAP ENABLE Extension
140 rfc5198.txt Unicode Format for Network Interchange
141 RFC 5246 - Transport Layer Security (TLS)
142 RFC 5321 - Simple Mail Transfer Protocol.
143 RFC 5322 - The basic format of email messages.
144 RFC 5598 - Internet Mail Architecture
145 RFC 5751 - Secure/Multipurpose Internet Mail Extensions (S/MIME)
146 TODO NOTE that our S/MIME support is extremely weak regarding
147 TODO understanding, we should not rely on OpenSSL but instead
148 TODO handle it ourselfs; the RFC says:
149 S/MIME is used to secure MIME entities. A MIME entity can be a sub-
150 part, sub-parts of a message, or the whole message with all its sub-
151 parts. A MIME entity that is the whole message includes only the
152 MIME message headers and MIME body, and does not include the RFC-822
153 header. Note that S/MIME can also be used to secure MIME entities
154 used in applications other than Internet mail. If protection of the
155 RFC-822 header is required, the use of the message/rfc822 media type
156 is explained later in this section.
157 RFC 6125 - Representation and Verification of Domain-Based Application
158 Service Identity within Internet Public Key Infrastructure Using
159 X.509 (PKIX) Certificates in the Context of Transport Layer Security
161 RFC 6152 - SMTP Service Extension for 8-bit MIME Transport
162 RFC 6409 - Message Submission for Mail
163 rfc6530.txt Overview and Framework for Internationalized Email
164 rfc6531.txt SMTP Extension for Internationalized Email
165 rfc6532.txt Internationalized Email Headers
166 rfc6854.txt Update to Internet Message Format to Allow Group Syntax in
167 the "From:" and "Sender:" Header Fields
168 rfc6855.txt IMAP Support for UTF-8
169 rfc6856.txt Post Office Protocol Version 3 (POP3) Support for UTF-8
170 rfc6857.txt Post-Delivery Message Downgrading for Internationalized
172 rfc6858.txt Simplified POP and IMAP Downgrading for Internationalized Email
173 RFC 7162 IMAP CONDSTORE & QRESYNC
174 RFC 8058 Signaling One-Click Functionality for List Email Headers
175 RFC 8460 on SMTP TLS Reporting
176 RFC 8461 on SMTP MTA Strict Transport Security (MTA-STS)
177 RFC 8474 IMAP Extension for Object Identifiers
178 RFC 8484 on DNS Queries over HTTPS (DoH)
179 RFC 8550 Secure/Multipurpose Internet Mail Extensions (S/MIME)
180 Version 4.0 Certificate Handling
181 RFC 8551 Secure/Multipurpose Internet Mail Extensions (S/MIME) Version
182 4.0 Message Specification
183 RFC 8601 Message Header Field for Indicating Message Authentication Status
184 RFC 8616 Email Authentication for Internationalized Mail
185 RFC 8621 The JSON Meta Application Protocol (JMAP) for Mail
186 RFC 8689 SMTP Require TLS Option
188 draft-ietf-uta-email-tls-certs-01.txt
189 SMTP security via opportunistic DANE TLS draft-ietf-dane-smtp-with-dane-15
190 draft-melnikov-smime-header-signing
191 Considerations for protecting Email header with S/MIME
193 Read https://tools.ietf.org/html/draft-ietf-uta-tls-bcp-07.
194 Can we implement OCSP (see RFC 6066; -> RFC 6960)????
196 - This is how the codebase has to be reworked in respect to signals and
199 1. We introduce some environment/carrier structs: struct eval_ctx,
200 struct cmd_ctx, (struct send_ctx). All of these form lists.
201 eval_ctx gets a new instance every time evaluate() is entered; for
202 the interactive mode, commands() instantiates an outermost eval_ctx
203 that "cannot be left".
205 cmd_ctx knows about the eval_ctx in which it is was created; it is
206 created for each command that has an entry in cmd_tab and is passed
207 as the new argument of these kind of functions.
208 (send_ctx is the carrier for the MIME and send layer rewrite.)
209 They can decide whether an entry shall enter the history list
210 etc. by themselves, context-based, for example.
212 2. If i say `p 3 2 1' then i mean `3 2 1' not `1 2 3'.
213 However, sometimes it is ok to have the order created by iterating
214 the way we do now. This should thus be a cmd-specific flag.
216 3. [cmd_tab handling] The argument parser becomes more intelligent: it
217 should be able to perform argument checks of subcommands, e.g.,
218 should learn about subcommands, and their very own argument types
221 X. Offer a central "`[un]onevent' EVENT MACRO [conditions]" register.
222 Change all hooks to use that one, optimize the case where a single
223 macro is registered for a single event but with different
226 E.g., "on_interactive_mode_enter" could then be hooked to call
227 `bind' and set `colour's, for example. In conjunction with 2.
228 above those commands could simply be (silent, successful) no-ops
229 before we reach that state (and again after
230 on_interactive_mode_leave is processed).
232 8. The line buffer used in evaluate() that is passed through to
233 commands (thus: in cmd_ctx, then) needs to become `const'.
234 (I tried to do so in the past, but some commands write into it,
235 thus i stopped and iirc even added some changes on my own which
236 take favour of reusing that buffer.)
237 + Macro execution then no longer needs to clone the macro content
238 lines before executing then.
240 10. We MUST switch the entire codebase to use SysV signal handling, don't
241 do the BSDish SA_RESTART, which is why we still suffer the way we
242 do and need jumps. I can't dig BSD signal handling, and never ever
243 did so myself until i got here.
245 20. The attachment charset selection loop can then be rewritten to
246 check whether an ^C occurred and treat that as end-of-loop
247 condition. In v14.6.3 this was introduced, but it should act
248 differently depending on whether the interrupt occurred during
249 character set selection or attachment filename input.
250 Also in respect whether the interrupt is "propagated" or not.
251 It's ugly, and documented accordingly.
253 31. Flag updates of individual messages must find their way through to
255 32. Use deque (on partial views).
256 34. We need a new abstraction: `vie[ws]'. I.e, viewset, viewclear,
257 view(show|look)? We will have (possibly readonly) boxes, a summary
258 cache file, which is created when a mailbox is read in, and all
259 that crap that we currently have (setptr(), setmsize(), etc.!) must
260 vanish. Instead there is another, in-memory abstraction, the view.
261 Some views are built-in and are somehow selectable (the "all" view,
262 for example, and the "new" view).
263 It is possible to make a view persistent by giving it a name, e.g.,
264 'viewset NAME MSG-SPEC' -- 'viewset allnew :n' (and 'viewset XY `'
265 or something must be capable to tag the last a.k.a current).
266 Switching to a named view would thus look over the entire current
267 view (!) for all messages that comply to the message-spec of the
268 view, then create a sorted/threaded display of that subset and
269 create a new anonymous "result" view. It must be possible to
270 specify that a view is to be applied to the entire mailbox instead
271 of the current view, via a simple easy understandable syntax.
274 We won't extend macros that much because it would require much too
275 much logic for no purpose, instead we'll (hopefully) add some
276 scriptable abstraction, with an optional built-in Lua binding.
278 50. Support SASL. (I do not like it.)
280 80. The MIME rewrite: mime_parser <-> mime "DOM" analyzer <->
281 selectively create filter chains per part and do XY.
283 This also affects sending, and it will allow us to dig MIME
284 (multipart) mail for -t/-m _correctly_. Also in sofar as we can
285 hook a content-decoder before diving into the MIME structure, and
286 with a DOM, we can re-encode such things properly as we (re)send
287 such mails. All this is wrong at the time of this writing!
288 We still need to special treat things like, e.g., RFC 2046, 5.2.1.
289 But on top of we-can, as opposed to the opposite.
291 (Brezn Stangl, brezn DOT stangl AT yandex DOT com; Martin T)
293 99. Now i'm dreaming some more: with the new object-based approach
294 multiple mailboxes could be in an open state. And it should be
295 possible to do so for the user (`file' and `folder' are required to
296 quit the current mailbox [first -- this not yet]), which is why we
297 either need new trigger characters or new commands.
298 The absolute sensation would be joinable operations over multiple
299 open mailboxes, e.g., views over multiple such!
301 200. Split program: when entering interactive mode, the main machine
302 should fork and the UI should run in the forked one, taking the
303 terminal (have done setsid, TIOCSTTY, tcsetpgrp, dance).
304 - Communication via sendmsg()/recvmsg(), it was in BSD as soon as
305 1982 says CSRG (date and time created 82/12/04 16:22:24 by
306 mckusick); ok, a bit different by then, but on 1990-04-04 at
307 latest in today's form (Mike Karels: [.]define cmsghdr structure
308 for ancillary data, with new format; move access rights into
309 ancillary data; add MSG_WAITALL).
310 - Maybe furtherly diversify: network (with loop), main machine
311 (with loop), credential helper, i do not know.
312 Provide security sandboxing if possible, i.e., capsicum,
313 pledge/unveil, prctl/seccomp.
315 - The thread sort doesn't get
324 The current sort fails to recognize that F and the thread starting at
325 B are related, which results in a mess.
326 Tests: 41.bad-thread, 58.bad-thread ..
328 -- Being able to sort the outermost level of threads was a suggestion
329 of Rudolf Sykora, especially being able to sort the outermost level
330 according to the date of the newest message in a thread.
332 - NOTE: we do not really support IPv6 sofar in that we are not prepared to
333 deal with IPv6 addresses (as in '[ADDR]:PORT'). Pimp url_parse().
336 - I had a connection collapse during a POP3 download, and neither was
337 there a chance to get access to the 22 yet downloaded mails (after
338 five minutes of waiting followed by CNTRL-C), nor did the layer
339 recognize this very well (got myriads of `POP3 connection already
340 closed.' messages, btw., the thirty-something messages which were not
341 yet downloaded caused (after CNTRL-C) this: ETC. ETC.
343 - I got an email in base64 that obviously used CRNL line endings, and once
344 i've replied the CR where quoted as *control* characters.
345 Get rid of those (kwcrtest.mbox; may be hard to do everywhere for some
346 time, due to how we deal with I/O and Send layer etc).
348 - edit.c doesn't do NEED_BODY (but IMAP won't work anyway).
351 . s-nail </dev/null should work interactively when STDERR_FILENO is
352 a terminal! (Built-in editor; how do editline and readline work?
353 should this be documented? POSIX says for sh(1) (APPLICATION USAGE):
354 'sh 2>FILE' is not interactive, even though it accepts terminal input.)
356 .. We should be much smarter regarding when we allow a PAGER etc. to be
357 used, which is supposed to be a possibly useful thing in
358 $ s-nail -Scrt=0 >LOG 2>&1
360 . Just like the RFC 3676 link above, it would be nice if it would be
361 somehow possible to recognize links in a document; i don't know yet
362 how this could be achieved without losing formatting information (i
363 mean, we could enable this and inject terminal colour sequences, but
364 one should be able to say 'follow link x', starting an action
365 handler, and the 'x' must come from somwhere - simply injecting
366 '[NUMBER]' references distorts visual). Anyway, it's just a filter
367 that recognized the usual <SCHEME:/> stuff, and of course we can
368 simply have a buffer which records all such occurrences, so that
369 user can say '? xy NUMBER', but without the context it soon gets
372 . Remove all occurrences of mbtowc() with mbrtowc(); temporarily add (some)
373 global mbstate_t objects until the send / MIME layer rewrite is done and
374 has the carrier. Use flip states and add aux funs with only update the
375 state+toggle on success -- CURRENTLY MBTOWC FAILURES ARE PRACTICALLY NOT
377 P.S.: the standards do not allow that well at all.
378 Since we work so much with *ttycharset* we would need
379 a setlocale_from_charset(), but which does not exist (except
380 implicitly for UTF-8 locales). But we need char classification!
381 This task up to S-CText.
383 . which_protocol(), *newmail* mechanism, displayname, mailname: all of
384 this <rude>SHIT</rude> must vanish and be replaced by a URL, and
385 a nice "VFS" mailbox object that carries all necessary state so that
386 one can work with it.
388 If not mentioned somewhere else: struct message should be splitted
389 into a tree of objects, with a base class that has as few fields as
390 possible; the global *message should be a deque, only accessible via
391 iterator; it should store pointers to (the actually used subtype of)
392 message structures instead; i.e., for maildir boxes the path is yet
393 allocated separately, then it could be part of the message object,
395 It should track the number of contained parts, so that the
396 "fits-onto-the-screen" tests are more useful than today.
398 . Given how many temporary files we use, it would make sense to
399 support a reusable single temporary file, as in singletmp_take() and
400 singletmp_release(), where singletmp_release() would close and thus
401 drop the file if it excesses a specific (configurable) size, and the
402 mainloop tick would close it (after X (configurable) unused ticks))
403 otherwise. I guess this would improve performance for searching
406 . Searching body/text yet includes headers from attachments and
407 attachment data. This is shit. :)
409 . The "nifty" unregister_file()->_compress() mechanism that even
410 shovels '-Sfolder=imaps://user1@localhost -Srecord="+Sent Items"'
411 *records* calls clearerr() on the descriptor before performing it's
412 action anyway. when we really make it even to the I/O rewrite, it
413 should be possible to dis-/allow such -- it doesn't make sense to
414 add something faulty to whatever was not faulty before!
416 . `dp' prints EOF at the end of a thread even if unread messages
419 . `resend' doesn't smime-sign.
421 . RFC 5751 describes a message multipart layout that also includes the
422 headers in the signature; it would be nice (for completeness sake)
423 to be able to support that. Note shutup@ietf.org.
425 . The capability to save a message under the name of a recipient is in
426 the standard etc., but i've never used it.
427 What would be cool, otoh, would be if there would be the possibility
428 to register a regular expression, and if just *any* recipient of
429 a message matches, store the message in the given folder instead.
430 I.e., if i send a message to s-nail-users@ then i most likely want
431 to get a copy to the corresponding box, regardless of whoever the
432 message was sent To: Cc: or Bcc: else..
434 . mutt list handling (`~') is very powerful
436 . We have some use of *at() functions, especially anything which
437 temporarily switches cwd.
439 . *newmail* is terrible. At some later time we need to do somethings
440 with timeouts etc. (for MBOX and Maildir it's not that bad, but for
441 anything over the network, yet the mentioned may come in over NFS).
442 Remove it until we have something better?
444 . The RFC 8098 *disposition-notification-send* mechanism is yet not
445 truly conforming (and works with *from*). Also, this is only the
446 sender side, there should be support for creating the MDN response.
447 (Maybe ternary option: off (default),
448 create-when-unread-flag-goes-away, ditto-but-also-strip-header)
450 .. Also, there is DSN as a SMTP extension, see the RFCs 3461, 346 (as
451 above) and 6522 (Wikipedia).
453 . The var_* series should return "const char*" not "char*".
454 This should already work today because otherwise we would get SEGV
456 .. While here: rename enum okeys to enum internal_variables, and the
457 ok_*() series to iv_(). And see below for env_*() series.
459 . fexpand() the 2nd: it should return structure because we need to
460 check for FEDIT_SYSBOX, which currently only checks whether the first
461 character of a file name is '%', not whether it is '%', '%:FILEPATH'
462 or '%VALIDUSER', because that is impossible to do!
464 . On the long run in-memory password storage should be zeroed after
465 use, possibly even encoded *during* use. After v15.
467 . We need a `spamcheck' command that is like `spamrate' but updates
468 the mail in-place, i.e., with the headers that the spam engine adds.
470 . __narrow_suffix() is wrong (for stateful encodings that we
471 don't support yet) and should inject a reset sequence if it shortens
474 . When a user edits a specific header, it should no longer be
475 modified. (Do not loose knowledge that collect() edited it.)
477 . The new internal ~/$ expansion mechanism should get support
478 for POSIX parameter expansions ${[:]-} and ${[:]+} (and ${[:]?}).
479 There is no real way to get the functionality otherwise...
481 . Make S/MIME an option separate of SSL/TLS, i.e., optional.
483 . With very long input Heirloom mailx(1) / S-nail(1) can produce
484 encoded-words (RFC 2047) with incomplete multibyte sequences (i.e.,
485 non self-contained encoded-words).
487 . Group addresses, especially the undisclosed recipients but also
488 "Bla": addresses; are missing.
490 . Per-folder (S/MIME) en- and decryption key (Tarqi Kazan): if a xy
491 variable is set (that points to a key) add a transparent en- and
492 decryption layer on top of any per-message operation (for boxes for
493 which the variable is set).
495 . For v15.0: remember private thread with Tarqi Kazan (2015-05) and
496 try to improve situation with *record*, so that only messages enter
497 it which have really been sent. If we support postponing and have
498 a multi-process layout and add an intermediate *record-queue* we
499 may be able to improve the situation.
501 . [Dd]ecrypt should transport decryption errors, not silently be like
502 copy and copy undecrypted content, because this is what it's for?
503 ..We need atomic operations with rollback support in order to make
504 this happen, but i think maybe file truncation (decryption always
505 appends?) is enough provided that files are locked?
506 WE NEED ATOMIC OPERATION SUPPORT for quite some operations.
507 Man, are we far from that.
509 . `pipe' is total shit regarding MIME. We need some defined and
510 documented method to configure which parts are displayed and/or how
511 they are visually separated.
513 . Exit status handling is sick.
515 . *mime-allow-text-controls* is a no-brainer: instead we should
516 introduce something that allows us to switch and detect UTF-16 once
517 we run into the problematic situation, then start all over in an
518 Unicode mode? I.e.: continue to force the user to set such
519 a switch, but do it in a sensible fashion, because the UTF-16 data
520 stream may nonetheless contain control characters??
523 . smime_verify(): only dump the multipart that is signed into the file for
524 verification purposes. DOCUMENT that only the FIRST such part is verified.
525 Ditto, we don't decrypt but on toplevel. Sic.
527 . convert iconv so that it always "places the reset sequence" i.e.
528 finalizes the string properly. we don't do this at all right now!
530 . -:, *mimetypes-load-control*, ?, should honour the given load order; as
531 appropriate, add a "b" for built-in!
532 It happened to me that i searched for at least 30 minutes for a bug
533 that resulted in text/plain not text/x-diff only to find out that this
534 was because of ArchLinux's /etc/mime.types!
536 . getapproval() should support a TRUM1 return, meaning "cancel",
537 to be understood as appropriate.
539 . `mbox' _can_ be made usable anywhere with yet another PS_MBOX global
540 bypass! ditto touch,save,Save
542 . when doing Lreply we may ask for Reply-To:, but strip out the address
543 actively even if user said yes to the question. That should not
544 happen? It somehow matches the documentation however. unsure.
546 . if -t is used and the file includes Mail-Followup-To:, then we should
547 NOT add to it, OR we need to offer a way to get there!
549 . `mimetype': more type markers: i want to be able to send
550 application/mbox as text if it is 7bit clean; ditto application/x-sh.
551 Ditto xml etc. And: if highbits, try conversion, but fall back to
552 base64 instead of failing to send the message.
553 ?ui=t,wire=7bit,8bit-or-base64
557 In fact the message selection should be an object with lifetime.
558 Like this we can not only provide "type SPEC" in match order, but also
559 support for example colour or the header summary with message spec
562 colour 256 sum-header ft=reverse @BLABLA :n
564 (Keep "older" and "dot" forever, even though that is "." and a colon
565 modifier that we yet do not have.)