comparison man/emacs-mime.texi @ 82953:fd8097053f04

* Makefile.in, makefile.w32-in: Added PGG and Sieve files. * emacs-mime.texi, gnus-faq.texi, gnus.texi, message.texi: Import from the v5_10 branch of the Gnus repository. Change setfilename.
author Reiner Steib <Reiner.Steib@gmx.de>
date Mon, 02 Aug 2004 13:38:50 +0000
parents 695cf19ef79e
children e88e622cd27a
comparison
equal deleted inserted replaced
82952:b6e48fab7ff3 82953:fd8097053f04
1 \input texinfo @c -*-mode: texinfo; coding: latin-1 -*- 1 \input texinfo
2 2
3 @setfilename ../info/emacs-mime 3 @setfilename ../info/emacs-mime
4 @settitle Emacs MIME Manual 4 @settitle Emacs MIME Manual
5 @synindex fn cp 5 @synindex fn cp
6 @synindex vr cp 6 @synindex vr cp
7 @synindex pg cp 7 @synindex pg cp
8
9 @copying
10 This file documents the Emacs MIME interface functionality.
11
12 Copyright (C) 1998, 1999, 2000, 2002 Free Software Foundation, Inc.
13
14 @quotation
15 Permission is granted to copy, distribute and/or modify this document
16 under the terms of the GNU Free Documentation License, Version 1.1 or
17 any later version published by the Free Software Foundation; with no
18 Invariant Sections, with the Front-Cover texts being ``A GNU
19 Manual,'' and with the Back-Cover Texts as in (a) below. A copy of the
20 license is included in the section entitled ``GNU Free Documentation
21 License'' in the Emacs manual.
22
23 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
24 this GNU Manual, like GNU software. Copies published by the Free
25 Software Foundation raise funds for GNU development.''
26
27 This document is part of a collection distributed under the GNU Free
28 Documentation License. If you want to distribute this document
29 separately from the collection, you can do so by adding a copy of the
30 license to the document, as described in section 6 of the license.
31 @end quotation
32 @end copying
33
34 @dircategory Emacs 8 @dircategory Emacs
35 @direntry 9 @direntry
36 * MIME: (emacs-mime). Emacs MIME de/composition library. 10 * Emacs MIME: (emacs-mime). The MIME de/composition library.
37 @end direntry 11 @end direntry
38 @iftex 12 @iftex
39 @finalout 13 @finalout
40 @end iftex 14 @end iftex
41 @setchapternewpage odd 15 @setchapternewpage odd
42 16
17 @ifnottex
18
19 This file documents the Emacs MIME interface functionality.
20
21 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003
22 Free Software Foundation, Inc.
23
24 Permission is granted to copy, distribute and/or modify this document
25 under the terms of the GNU Free Documentation License, Version 1.1 or
26 any later version published by the Free Software Foundation; with no
27 Invariant Sections, with the Front-Cover texts being ``A GNU
28 Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
29 license is included in the section entitled ``GNU Free Documentation
30 License'' in the Emacs manual.
31
32 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
33 this GNU Manual, like GNU software. Copies published by the Free
34 Software Foundation raise funds for GNU development.''
35
36 This document is part of a collection distributed under the GNU Free
37 Documentation License. If you want to distribute this document
38 separately from the collection, you can do so by adding a copy of the
39 license to the document, as described in section 6 of the license.
40 @end ifnottex
41
42 @tex
43
43 @titlepage 44 @titlepage
44 @title Emacs MIME Manual 45 @title Emacs MIME Manual
45 46
46 @author by Lars Magne Ingebrigtsen 47 @author by Lars Magne Ingebrigtsen
47 @page 48 @page
49
48 @vskip 0pt plus 1filll 50 @vskip 0pt plus 1filll
49 @insertcopying 51 Copyright @copyright{} 1998, 1999, 2000, 2001, 2002, 2003 Free Software
52 Foundation, Inc.
53
54 Permission is granted to copy, distribute and/or modify this document
55 under the terms of the GNU Free Documentation License, Version 1.1 or
56 any later version published by the Free Software Foundation; with the
57 Invariant Sections being none, with the Front-Cover texts being ``A GNU
58 Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
59 license is included in the section entitled ``GNU Free Documentation
60 License'' in the Emacs manual.
61
62 (a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
63 this GNU Manual, like GNU software. Copies published by the Free
64 Software Foundation raise funds for GNU development.''
65
66 This document is part of a collection distributed under the GNU Free
67 Documentation License. If you want to distribute this document
68 separately from the collection, you can do so by adding a copy of the
69 license to the document, as described in section 6 of the license.
50 @end titlepage 70 @end titlepage
51 71 @page
72
73 @end tex
52 74
53 @node Top 75 @node Top
54 @top Emacs MIME 76 @top Emacs MIME
55 77
56 This manual documents the libraries used to compose and display 78 This manual documents the libraries used to compose and display
57 @sc{mime} messages. 79 @acronym{MIME} messages.
58 80
59 This is not a manual meant for users; it's a manual directed at people 81 This manual is directed at users who want to modify the behaviour of
60 who want to write functions and commands that manipulate @sc{mime} 82 the @acronym{MIME} encoding/decoding process or want a more detailed
61 elements. 83 picture of how the Emacs @acronym{MIME} library works, and people who want
62 84 to write functions and commands that manipulate @acronym{MIME} elements.
63 @sc{mime} is short for @dfn{Multipurpose Internet Mail Extensions}. 85
86 @acronym{MIME} is short for @dfn{Multipurpose Internet Mail Extensions}.
64 This standard is documented in a number of RFCs; mainly RFC2045 (Format 87 This standard is documented in a number of RFCs; mainly RFC2045 (Format
65 of Internet Message Bodies), RFC2046 (Media Types), RFC2047 (Message 88 of Internet Message Bodies), RFC2046 (Media Types), RFC2047 (Message
66 Header Extensions for Non-ASCII Text), RFC2048 (Registration 89 Header Extensions for Non-@acronym{ASCII} Text), RFC2048 (Registration
67 Procedures), RFC2049 (Conformance Criteria and Examples). It is highly 90 Procedures), RFC2049 (Conformance Criteria and Examples). It is highly
68 recommended that anyone who intends writing @sc{mime}-compliant software 91 recommended that anyone who intends writing @acronym{MIME}-compliant software
69 read at least RFC2045 and RFC2047. 92 read at least RFC2045 and RFC2047.
70 93
71 @menu 94 @menu
95 * Decoding and Viewing:: A framework for decoding and viewing.
96 * Composing:: @acronym{MML}; a language for describing @acronym{MIME} parts.
72 * Interface Functions:: An abstraction over the basic functions. 97 * Interface Functions:: An abstraction over the basic functions.
73 * Basic Functions:: Utility and basic parsing functions. 98 * Basic Functions:: Utility and basic parsing functions.
74 * Decoding and Viewing:: A framework for decoding and viewing.
75 * Composing:: MML; a language for describing MIME parts.
76 * Standards:: A summary of RFCs and working documents used. 99 * Standards:: A summary of RFCs and working documents used.
77 * Index:: Function and variable index. 100 * Index:: Function and variable index.
78 @end menu 101 @end menu
79 102
80 103
81 @node Interface Functions
82 @chapter Interface Functions
83 @cindex interface functions
84 @cindex mail-parse
85
86 The @code{mail-parse} library is an abstraction over the actual
87 low-level libraries that are described in the next chapter.
88
89 Standards change, and so programs have to change to fit in the new
90 mold. For instance, RFC2045 describes a syntax for the
91 @code{Content-Type} header that only allows @sc{ascii} characters in the
92 parameter list. RFC2231 expands on RFC2045 syntax to provide a scheme
93 for continuation headers and non-@sc{ascii} characters.
94
95 The traditional way to deal with this is just to update the library
96 functions to parse the new syntax. However, this is sometimes the wrong
97 thing to do. In some instances it may be vital to be able to understand
98 both the old syntax as well as the new syntax, and if there is only one
99 library, one must choose between the old version of the library and the
100 new version of the library.
101
102 The Emacs MIME library takes a different tack. It defines a series of
103 low-level libraries (@file{rfc2047.el}, @file{rfc2231.el} and so on)
104 that parses strictly according to the corresponding standard. However,
105 normal programs would not use the functions provided by these libraries
106 directly, but instead use the functions provided by the
107 @code{mail-parse} library. The functions in this library are just
108 aliases to the corresponding functions in the latest low-level
109 libraries. Using this scheme, programs get a consistent interface they
110 can use, and library developers are free to create write code that
111 handles new standards.
112
113 The following functions are defined by this library:
114
115 @defun mail-header-parse-content-type string
116 Parse @var{string}, a @code{Content-Type} header, and return a
117 content-type list in the following format:
118
119 @lisp
120 ("type/subtype"
121 (attribute1 . value1)
122 (attribute2 . value2)
123 @dots{})
124 @end lisp
125
126 Here's an example:
127
128 @example
129 (mail-header-parse-content-type
130 "image/gif; name=\"b980912.gif\"")
131 @result{} ("image/gif" (name . "b980912.gif"))
132 @end example
133 @end defun
134
135 @defun mail-header-parse-content-disposition string
136 Parse @var{string}, a @code{Content-Disposition} header, and return a
137 content-type list in the format above.
138 @end defun
139
140 @defun mail-content-type-get ct attribute
141 @findex mail-content-type-get
142 Returns the value of the given @var{attribute} from the content-type
143 list @var{ct}.
144
145 @example
146 (mail-content-type-get
147 '("image/gif" (name . "b980912.gif")) 'name)
148 @result{} "b980912.gif"
149 @end example
150 @end defun
151
152 @defun mail-header-encode-parameter param value
153 Takes a parameter string @samp{@var{param}=@var{value}} and returns an
154 encoded version of it. This is used for parameters in headers like
155 @samp{Content-Type} and @samp{Content-Disposition}.
156 @end defun
157
158 @defun mail-header-remove-comments string
159 Return a comment-free version of @var{string}.
160
161 @example
162 (mail-header-remove-comments
163 "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
164 @result{} "Gnus/5.070027 "
165 @end example
166 @end defun
167
168 @defun mail-header-remove-whitespace string
169 Remove linear white space from @var{string}. Space inside quoted
170 strings and comments is preserved.
171
172 @example
173 (mail-header-remove-whitespace
174 "image/gif; name=\"Name with spaces\"")
175 @result{} "image/gif;name=\"Name with spaces\""
176 @end example
177 @end defun
178
179 @defun mail-header-get-comment string
180 Return the last comment in @var{string}.
181
182 @example
183 (mail-header-get-comment
184 "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
185 @result{} "Finnish Landrace"
186 @end example
187 @end defun
188
189
190 @defun mail-header-parse-address string
191 Parse an address string @var{string} and return a list containing the
192 mailbox and the plaintext name.
193
194 @example
195 (mail-header-parse-address
196 "Hrvoje Niksic <hniksic@@srce.hr>")
197 @result{} ("hniksic@@srce.hr" . "Hrvoje Niksic")
198 @end example
199 @end defun
200
201 @defun mail-header-parse-addresses string
202 Parse @var{string} as a list of addresses and return a list of elements
203 like the one described above.
204
205 @example
206 (mail-header-parse-addresses
207 "Hrvoje Niksic <hniksic@@srce.hr>, Steinar Bang <sb@@metis.no>")
208 @result{} (("hniksic@@srce.hr" . "Hrvoje Niksic")
209 ("sb@@metis.no" . "Steinar Bang"))
210 @end example
211 @end defun
212
213 @defun mail-header-parse-date string
214 Parse a date @var{string} and return an Emacs time structure.
215 @end defun
216
217 @defun mail-narrow-to-head
218 Narrow the buffer to the header section of the buffer. Point is placed
219 at the beginning of the narrowed buffer.
220 @end defun
221
222 @defun mail-header-narrow-to-field
223 Narrow the buffer to the header under point.
224 @end defun
225
226 @defun mail-encode-encoded-word-region start end
227 Encode the non-@sc{ascii} words in the region @var{start}to @var{end}. For
228 instance, @samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}.
229 @end defun
230
231 @defun mail-encode-encoded-word-buffer
232 Encode the non-@sc{ascii} words in the current buffer. This function is
233 meant to be called with the buffer narrowed to the headers of a message.
234 @end defun
235
236 @defun mail-encode-encoded-word-string string
237 Encode the words that need encoding in @var{string}, and return the
238 result.
239
240 @example
241 (mail-encode-encoded-word-string
242 "This is naïve, baby")
243 @result{} "This is =?iso-8859-1?q?na=EFve,?= baby"
244 @end example
245 @end defun
246
247 @defun mail-decode-encoded-word-region start end
248 Decode the encoded words in the region @var{start}to @var{end}.
249 @end defun
250
251 @defun mail-decode-encoded-word-string string
252 Decode the encoded words in @var{string} and return the result.
253
254 @example
255 (mail-decode-encoded-word-string
256 "This is =?iso-8859-1?q?na=EFve,?= baby")
257 @result{} "This is naïve, baby"
258 @end example
259 @end defun
260
261 Currently, @code{mail-parse} is an abstraction over @code{ietf-drums},
262 @code{rfc2047}, @code{rfc2045} and @code{rfc2231}. These are documented
263 in the subsequent sections.
264
265
266
267 @node Basic Functions
268 @chapter Basic Functions
269
270 This chapter describes the basic, ground-level functions for parsing and
271 handling. Covered here is parsing @code{From} lines, removing comments
272 from header lines, decoding encoded words, parsing date headers and so
273 on. High-level functionality is dealt with in the next chapter
274 (@pxref{Decoding and Viewing}).
275
276 @menu
277 * rfc2045:: Encoding @code{Content-Type} headers.
278 * rfc2231:: Parsing @code{Content-Type} headers.
279 * ietf-drums:: Handling mail headers defined by RFC822bis.
280 * rfc2047:: En/decoding encoded words in headers.
281 * time-date:: Functions for parsing dates and manipulating time.
282 * qp:: Quoted-Printable en/decoding.
283 * base64:: Base64 en/decoding.
284 * binhex:: Binhex decoding.
285 * uudecode:: Uuencode decoding.
286 * rfc1843:: Decoding HZ-encoded text.
287 * mailcap:: How parts are displayed is specified by mailcap files
288 @end menu
289
290
291 @node rfc2045
292 @section rfc2045
293
294 RFC2045 is the ``main'' @sc{mime} document, and as such, one would
295 imagine that there would be a lot to implement. But there isn't, since
296 most of the implementation details are delegated to the subsequent
297 RFCs.
298
299 So @file{rfc2045.el} has only a single function:
300
301 @defun rfc2045-encode-string parameter value
302 @findex rfc2045-encode-string
303 Takes a @var{parameter} and a @var{value} and returns a
304 @samp{@var{param}=@var{value}} string. @var{value} will be quoted if
305 there are non-safe characters in it.
306 @end defun
307
308
309 @node rfc2231
310 @section rfc2231
311
312 RFC2231 defines a syntax for the @samp{Content-Type} and
313 @samp{Content-Disposition} headers. Its snappy name is @dfn{MIME
314 Parameter Value and Encoded Word Extensions: Character Sets, Languages,
315 and Continuations}.
316
317 In short, these headers look something like this:
318
319 @example
320 Content-Type: application/x-stuff;
321 title*0*=us-ascii'en'This%20is%20even%20more%20;
322 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
323 title*2="isn't it!"
324 @end example
325
326 They usually aren't this bad, though.
327
328 The following functions are defined by this library:
329
330 @defun rfc2231-parse-string string
331 Parse a @samp{Content-Type} header @var{string} and return a list
332 describing its elements.
333
334 @example
335 (rfc2231-parse-string
336 "application/x-stuff;
337 title*0*=us-ascii'en'This%20is%20even%20more%20;
338 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
339 title*2=\"isn't it!\"")
340 @result{} ("application/x-stuff"
341 (title . "This is even more ***fun*** isn't it!"))
342 @end example
343 @end defun
344
345 @defun rfc2231-get-value ct attribute
346 Takes a list @var{ct} of the format above and returns the value of the
347 specified @var{attribute}.
348 @end defun
349
350 @defun rfc2231-encode-string parameter value
351 Encode the string @samp{@var{parameter}=@var{value}} for inclusion in
352 headers likes @samp{Content-Type} and @samp{Content-Disposition}.
353 @end defun
354
355 @node ietf-drums
356 @section ietf-drums
357
358 @dfn{drums} is an IETF working group that is working on the replacement
359 for RFC822.
360
361 The functions provided by this library include:
362
363 @defun ietf-drums-remove-comments string
364 Remove the comments from @var{string} and return the result.
365 @end defun
366
367 @defun ietf-drums-remove-whitespace string
368 Remove linear white space from @var{string} and return the result.
369 Spaces inside quoted strings and comments are left untouched.
370 @end defun
371
372 @defun ietf-drums-get-comment string
373 Return the last most comment from @var{string}.
374 @end defun
375
376 @defun ietf-drums-parse-address string
377 Parse an address @var{string} and return a list of the mailbox and the
378 plain text name.
379 @end defun
380
381 @defun ietf-drums-parse-addresses string
382 Parse @var{string}, containing any number of comma-separated addresses,
383 and return a list of mailbox/plain text pairs.
384 @end defun
385
386 @defun ietf-drums-parse-date string
387 Parse the date @var{string} and return an Emacs time structure.
388 @end defun
389
390 @defun ietf-drums-narrow-to-header
391 Narrow the buffer to the header section of the current buffer.
392 @end defun
393
394
395 @node rfc2047
396 @section rfc2047
397
398 RFC2047 (Message Header Extensions for Non-ASCII Text) specifies how
399 non-@sc{ascii} text in headers are to be encoded. This is actually rather
400 complicated, so a number of variables are necessary to tweak what this
401 library does.
402
403 The following variables are tweakable:
404
405 @defvar rfc2047-default-charset
406 Characters in this charset should not be decoded by this library.
407 This defaults to @samp{iso-8859-1}.
408 @end defvar
409
410 @defvar rfc2047-header-encoding-list
411 This is an alist of header / encoding-type pairs. Its main purpose is
412 to prevent encoding of certain headers.
413 @end defvar
414
415 The keys can either be header regexps, or @code{t}.
416
417 The values can be either @code{nil}, in which case the header(s) in
418 question won't be encoded, or @code{mime}, which means that they will be
419 encoded.
420
421 @defvar rfc2047-charset-encoding-alist
422 RFC2047 specifies two forms of encoding---@code{Q} (a
423 Quoted-Printable-like encoding) and @code{B} (base64). This alist
424 specifies which charset should use which encoding.
425 @end defvar
426
427 @defvar rfc2047-encoding-function-alist
428 This is an alist of encoding / function pairs. The encodings are
429 @code{Q}, @code{B} and @code{nil}.
430 @end defvar
431
432 @defvar rfc2047-q-encoding-alist
433 The @code{Q} encoding isn't quite the same for all headers. Some
434 headers allow a narrower range of characters, and that is what this
435 variable is for. It's an alist of header regexps and allowable character
436 ranges.
437 @end defvar
438
439 @defvar rfc2047-encoded-word-regexp
440 When decoding words, this library looks for matches to this regexp.
441 @end defvar
442
443 Those were the variables, and these are the functions:
444
445 @defun rfc2047-narrow-to-field
446 Narrow the buffer to the header on the current line.
447 @end defun
448
449 @defun rfc2047-encode-message-header
450 Should be called narrowed to the header of a message. Encodes according
451 to @code{rfc2047-header-encoding-alist}.
452 @end defun
453
454 @defun rfc2047-encode-region start end
455 Encodes all encodable words in the region @var{start} to @var{end}.
456 @end defun
457
458 @defun rfc2047-encode-string string
459 Encode @var{string} and return the result.
460 @end defun
461
462 @defun rfc2047-decode-region start end
463 Decode the encoded words in the region @var{start} to @var{end}.
464 @end defun
465
466 @defun rfc2047-decode-string string
467 Decode @var{string} and return the result.
468 @end defun
469
470
471
472 @node time-date
473 @section time-date
474
475 While not really a part of the @sc{mime} library, it is convenient to
476 document this library here. It deals with parsing @samp{Date} headers
477 and manipulating time. (Not by using tesseracts, though, I'm sorry to
478 say.)
479
480 These functions convert between five formats: a date string, an Emacs
481 time structure, a decoded time list, a number of seconds, and a day number.
482
483 The functions have quite self-explanatory names, so the following just
484 gives an overview of which functions are available.
485
486 @findex parse-time-string
487 @findex date-to-time
488 @findex time-to-seconds
489 @findex seconds-to-time
490 @findex time-to-day
491 @findex days-to-time
492 @findex time-since
493 @findex time-less-p
494 @findex subtract-time
495 @findex days-between
496 @findex date-leap-year-p
497 @findex time-to-day-in-year
498 @example
499 (parse-time-string "Sat Sep 12 12:21:54 1998 +0200")
500 @result{} (54 21 12 12 9 1998 6 nil 7200)
501
502 (date-to-time "Sat Sep 12 12:21:54 1998 +0200")
503 @result{} (13818 19266)
504
505 (time-to-seconds '(13818 19266))
506 @result{} 905595714.0
507
508 (seconds-to-time 905595714.0)
509 @result{} (13818 19266 0)
510
511 (time-to-day '(13818 19266))
512 @result{} 729644
513
514 (days-to-time 729644)
515 @result{} (961933 65536)
516
517 (time-since '(13818 19266))
518 @result{} (0 430)
519
520 (time-less-p '(13818 19266) '(13818 19145))
521 @result{} nil
522
523 (subtract-time '(13818 19266) '(13818 19145))
524 @result{} (0 121)
525
526 (days-between "Sat Sep 12 12:21:54 1998 +0200"
527 "Sat Sep 07 12:21:54 1998 +0200")
528 @result{} 5
529
530 (date-leap-year-p 2000)
531 @result{} t
532
533 (time-to-day-in-year '(13818 19266))
534 @result{} 255
535 @end example
536
537 @findex safe-date-to-time
538 And finally, we have @code{safe-date-to-time}, which does the same as
539 @code{date-to-time}, but returns a zero time if the date is
540 syntactically malformed.
541
542
543
544 @node qp
545 @section qp
546
547 This library deals with decoding and encoding Quoted-Printable text.
548
549 Very briefly explained, QP encoding means translating all 8-bit
550 characters (and lots of control characters) into things that look like
551 @samp{=EF}; that is, an equal sign followed by the byte encoded as a hex
552 string. It is defined in RFC 2045.
553
554 The following functions are defined by the library:
555
556 @deffn Command quoted-printable-decode-region @var{from} @var{to} &optional @var{coding-system}
557 QP-decode all the encoded text in the region. If @var{coding-system}
558 is non-nil, decode bytes into characters with that coding-system. It
559 is probably better not to use @var{coding-system}; instead decode into
560 a unibyte buffer, decode that appropriately and then interpret it as
561 multibyte.
562 @end deffn
563
564 @defun quoted-printable-decode-string @var{string} &optional @var{coding-system}
565 Return a QP-encoded copy of @var{string}. If @var{coding-system} is
566 non-nil, decode bytes into characters with that coding-system.
567 @end defun
568
569 @deffn Command quoted-printable-encode-region @var{from} @var{to} &optional @var{fold} @var{class}
570 QP-encode all the region. If @var{fold} is non-@var{nil}, fold lines
571 at 76 characters, as required by the RFC. If @var{class} is
572 non-@code{nil}, translate the characters not matched by that regexp
573 class, which should be in the form expected by
574 @var{skip-chars-forward} and should probably not contain literal
575 eight-bit characters. Specifying @var{class} makes sense to do extra
576 encoding in header fields.
577
578 If variable @var{mm-use-ultra-safe-encoding} is defined and
579 non-@code{nil}, fold lines unconditionally and encode @samp{From } and
580 @samp{-} at the start of lines..
581 @end deffn
582
583 @defun quoted-printable-encode-string string
584 Return a QP-encoded copy of @var{string}.
585 @end defun
586
587 @node base64
588 @section base64
589 @cindex base64
590
591 Base64 is an encoding that encodes three bytes into four characters,
592 thereby increasing the size by about 33%. The alphabet used for
593 encoding is very resistant to mangling during transit. @xref{Base
594 64,,Base 64 Encoding, elisp, The Emacs Lisp Reference Manual}.
595
596 @node binhex
597 @section binhex
598 @cindex binhex
599 @cindex Apple
600 @cindex Macintosh
601
602 Binhex is an encoding that originated in Macintosh environments.
603 The following function is supplied to deal with these:
604
605 @defun binhex-decode-region start end &optional header-only
606 Decode the encoded text in the region @var{start} to @var{end}. If
607 @var{header-only} is non-@code{nil}, only decode the @samp{binhex}
608 header and return the file name.
609 @end defun
610
611
612 @node uudecode
613 @section uudecode
614 @cindex uuencode
615 @cindex uudecode
616
617 Uuencoding is probably still the most popular encoding of binaries
618 used on Usenet, although Base64 rules the mail world.
619
620 The following function is supplied by this package:
621
622 @defun uudecode-decode-region start end &optional file-name
623 Decode the text in the region @var{start} to @var{end}. If
624 @var{file-name} is non-@code{nil}, save the result to @var{file-name}.
625 @end defun
626
627
628 @node rfc1843
629 @section rfc1843
630 @cindex rfc1843
631 @cindex HZ
632 @cindex Chinese
633
634 RFC1843 deals with mixing Chinese and @sc{ascii} characters in messages. In
635 essence, RFC1843 switches between @sc{ascii} and Chinese by doing this:
636
637 @example
638 This sentence is in ASCII.
639 The next sentence is in GB.~@{<:Ky2;S@{#,NpJ)l6HK!#~@}Bye.
640 @end example
641
642 Simple enough, and widely used in China.
643
644 The following functions are available to handle this encoding:
645
646 @defun rfc1843-decode-region start end
647 Decode HZ-encoded text in the region @var{start} to @var{end}.
648 @end defun
649
650 @defun rfc1843-decode-string string
651 Decode the HZ-encoded @var{string} and return the result.
652 @end defun
653
654
655 @node mailcap
656 @section mailcap
657
658 As specified by RFC 1524, @sc{mime}-aware message handlers parse
659 @dfn{mailcap} files from a default list, which can be overridden by the
660 @code{MAILCAP} environment variable. These describe how elements are
661 supposed to be displayed. Here's an example file:
662
663 @example
664 image/*; gimp -8 %s
665 audio/wav; wavplayer %s
666 @end example
667
668 This says that all image files should be displayed with @command{gimp},
669 and that WAVE audio files should be played by @code{wavplayer}.
670
671 The @code{mailcap} library parses such files, and provides functions for
672 matching types.
673
674 @defvar mailcap-mime-data
675 This variable is an alist of alists containing backup viewing rules for
676 @sc{mime} types. These are overridden by rules for a type found in
677 mailcap files. The outer alist is keyed on the major content-type and
678 the inner alists are keyed on the minor content-type (which can be a
679 regular expression).
680
681 @c Fixme: document this properly!
682 For example:
683 @example
684 (("application"
685 ("octet-stream"
686 (viewer . mailcap-save-binary-file)
687 (non-viewer . t)
688 (type . "application/octet-stream"))
689 ("plain"
690 (viewer . view-mode)
691 (test fboundp 'view-mode)
692 (type . "text/plain")))
693 @end example
694 @end defvar
695
696 @defopt mailcap-default-mime-data
697 This variable is the default value of @code{mailcap-mime-data}. It
698 exists to allow setting the value using Custom. It is merged with
699 values from mailcap files by @code{mailcap-parse-mailcaps}.
700 @end defopt
701
702 Although it is not specified by the RFC, @sc{mime} tools normally use a
703 common means of associating file extensions with defualt @sc{mime} types
704 in the absence of other information about the type of a file. The
705 information is found in per-user files @file{~/.mime.types} and system
706 @file{mime.types} files found in quasi-standard places. Here is an
707 example:
708
709 @example
710 application/x-dvi dvi
711 audio/mpeg mpga mpega mp2 mp3
712 image/jpeg jpeg jpg jpe
713 @end example
714
715
716 @defvar mailcap-mime-extensions
717 This variable is an alist @sc{mime} types keyed by file extensions.
718 This is overridden by entries found in @file{mime.types} files.
719 @end defvar
720
721 @defopt mailcap-default-mime-extensions
722 This variable is the default value of @code{mailcap-mime-extensions}.
723 It exists to allow setting the value using Custom. It is merged with
724 values from mailcap files by @code{mailcap-parse-mimetypes}.
725 @end defopt
726
727 Interface functions:
728
729 @defun mailcap-parse-mailcaps &optional path force
730 Parse all the mailcap files specified in a path string @var{path} and
731 merge them with the values from @code{mailcap-mime-data}. Components of
732 @var{path} are separated by the @code{path-separator} character
733 appropriate for the system. If @var{force} is non-@code{nil}, the files
734 are re-parsed even if they have been parsed already. If @var{path} is
735 omitted, use the value of environment variable @code{MAILCAPS} if it is
736 set; otherwise (on GNU and Unix) use the path defined in RFC 1524, plus
737 @file{/usr/local/etc/mailcap}.
738 @end defun
739
740 @defun mailcap-parse-mimetypes &optional path force
741 Parse all the mimetypes specified in a path string @var{path}
742 and merge them with the values from @code{mailcap-mime-extensions}.
743 Components of @var{path} are separated by the @code{path-separator}
744 character appropriate for the system. If @var{path} is omitted, use the
745 value of environment variable @code{MIMETYPES} if set; otherwise use a
746 default path consistent with that used by @code{mailcap-parse-mailcaps}.
747 If @var{force} is non-@code{nil}, the files are re-parsed even if they
748 have been parsed already.
749 @end defun
750
751 @defun mailcap-mime-info string &optional request
752 Gets the viewer command for content-type @var{string}. @code{nil} is
753 returned if none is found. Expects @var{string} to be a complete
754 content-type header line.
755
756 If @var{request} is non-@code{nil} it specifies what information to
757 return. If it is nil or the empty string, the viewer (second field of
758 the mailcap entry) will be returned. If it is a string, then the
759 mailcap field corresponding to that string will be returned
760 (@samp{print}, @samp{description}, whatever). If it is a number, all
761 the information for this viewer is returned. If it is @code{all}, then
762 all possible viewers for this type is returned.
763 @end defun
764
765 @defun mailcap-mime-types
766 This function returns a list of all the defined media types.
767 @end defun
768
769 @defun mailcap-extension-to-mime extension
770 This function returns the content type defined for a file with the given
771 @var{extension}.
772 @end defun
773
774
775 @node Decoding and Viewing 104 @node Decoding and Viewing
776 @chapter Decoding and Viewing 105 @chapter Decoding and Viewing
777 106
778 This chapter deals with decoding and viewing @sc{mime} messages on a 107 This chapter deals with decoding and viewing @acronym{MIME} messages on a
779 higher level. 108 higher level.
780 109
781 The main idea is to first analyze a @sc{mime} article, and then allow 110 The main idea is to first analyze a @acronym{MIME} article, and then allow
782 other programs to do things based on the list of @dfn{handles} that are 111 other programs to do things based on the list of @dfn{handles} that are
783 returned as a result of this analysis. 112 returned as a result of this analysis.
784 113
785 @menu 114 @menu
786 * Dissection:: Analyzing a @sc{mime} message. 115 * Dissection:: Analyzing a @acronym{MIME} message.
787 * Handles:: Handle manipulations. 116 * Non-MIME:: Analyzing a non-@acronym{MIME} message.
788 * Display:: Displaying handles. 117 * Handles:: Handle manipulations.
789 * Customization:: Variables that affect display. 118 * Display:: Displaying handles.
790 * New Viewers:: How to write your own viewers. 119 * Display Customization:: Variables that affect display.
120 * Files and Directories:: Saving and naming attachments.
121 * New Viewers:: How to write your own viewers.
791 @end menu 122 @end menu
792 123
793 124
794 @node Dissection 125 @node Dissection
795 @section Dissection 126 @section Dissection
796 127
797 The @code{mm-dissect-buffer} is the function responsible for dissecting 128 The @code{mm-dissect-buffer} is the function responsible for dissecting
798 a @sc{mime} article. If given a multipart message, it will recursively 129 a @acronym{MIME} article. If given a multipart message, it will recursively
799 descend the message, following the structure, and return a tree of 130 descend the message, following the structure, and return a tree of
800 @sc{mime} handles that describes the structure of the message. 131 @acronym{MIME} handles that describes the structure of the message.
801 132
133 @node Non-MIME
134 @section Non-MIME
135 @vindex mm-uu-configure-list
136
137 Gnus also understands some non-@acronym{MIME} attachments, such as
138 postscript, uuencode, binhex, yenc, shar, forward, gnatsweb, pgp,
139 diff. Each of these features can be disabled by add an item into
140 @code{mm-uu-configure-list}. For example,
141
142 @lisp
143 (require 'mm-uu)
144 (add-to-list 'mm-uu-configure-list '(pgp-signed . disabled))
145 @end lisp
146
147 @table @code
148 @item postscript
149 @findex postscript
150 Postscript file.
151
152 @item uu
153 @findex uu
154 Uuencoded file.
155
156 @item binhex
157 @findex binhex
158 Binhex encoded file.
159
160 @item yenc
161 @findex yenc
162 Yenc encoded file.
163
164 @item shar
165 @findex shar
166 Shar archive file.
167
168 @item forward
169 @findex forward
170 Non-@acronym{MIME} forwarded message.
171
172 @item gnatsweb
173 @findex gnatsweb
174 Gnatsweb attachment.
175
176 @item pgp-signed
177 @findex pgp-signed
178 @acronym{PGP} signed clear text.
179
180 @item pgp-encrypted
181 @findex pgp-encrypted
182 @acronym{PGP} encrypted clear text.
183
184 @item pgp-key
185 @findex pgp-key
186 @acronym{PGP} public keys.
187
188 @item emacs-sources
189 @findex emacs-sources
190 @vindex mm-uu-emacs-sources-regexp
191 Emacs source code. This item works only in the groups matching
192 @code{mm-uu-emacs-sources-regexp}.
193
194 @item diff
195 @vindex diff
196 @vindex mm-uu-diff-groups-regexp
197 Patches. This is intended for groups where diffs of committed files
198 are automatically sent to. It only works in groups matching
199 @code{mm-uu-diff-groups-regexp}.
200
201 @end table
802 202
803 @node Handles 203 @node Handles
804 @section Handles 204 @section Handles
805 205
806 A @sc{mime} handle is a list that fully describes a @sc{mime} component. 206 A @acronym{MIME} handle is a list that fully describes a @acronym{MIME}
807 207 component.
808 The following macros can be used to access elements from the 208
809 @var{handle} argument: 209 The following macros can be used to access elements in a handle:
810 210
811 @defmac mm-handle-buffer handle 211 @table @code
812 Return the buffer that holds the contents of the undecoded @sc{mime} 212 @item mm-handle-buffer
213 @findex mm-handle-buffer
214 Return the buffer that holds the contents of the undecoded @acronym{MIME}
813 part. 215 part.
814 @end defmac 216
815 217 @item mm-handle-type
816 @defmac mm-handle-type handle 218 @findex mm-handle-type
817 Return the parsed @samp{Content-Type} of the part. 219 Return the parsed @code{Content-Type} of the part.
818 @end defmac 220
819 221 @item mm-handle-encoding
820 @defmac mm-handle-encoding handle 222 @findex mm-handle-encoding
821 Return the @samp{Content-Transfer-Encoding} of the part. 223 Return the @code{Content-Transfer-Encoding} of the part.
822 @end defmac 224
823 225 @item mm-handle-undisplayer
824 @defmac mm-handle-undisplayer handle 226 @findex mm-handle-undisplayer
825 Return the function that can be used to remove the displayed part (if it 227 Return the object that can be used to remove the displayed part (if it
826 has been displayed). 228 has been displayed).
827 @end defmac 229
828 230 @item mm-handle-set-undisplayer
829 @defmac mm-handle-set-undisplayer handle function 231 @findex mm-handle-set-undisplayer
830 Set the undisplayer function for the part to function. 232 Set the undisplayer object.
831 @end defmac 233
832 234 @item mm-handle-disposition
833 @defmac mm-handle-disposition 235 @findex mm-handle-disposition
834 Return the parsed @samp{Content-Disposition} of the part. 236 Return the parsed @code{Content-Disposition} of the part.
835 @end defmac 237
836 238 @item mm-handle-disposition
837 @defmac mm-handle-disposition 239 @findex mm-handle-disposition
838 Return the description of the part. 240 Return the description of the part.
839 @end defmac 241
840 242 @item mm-get-content-id
841 @defmac mm-get-content-id id 243 Returns the handle(s) referred to by @code{Content-ID}.
842 Returns the handle(s) referred to by @var{id}, the @samp{Content-ID} of 244
843 the part. 245 @end table
844 @end defmac
845 246
846 247
847 @node Display 248 @node Display
848 @section Display 249 @section Display
849 250
850 Functions for displaying, removing and saving. In the descriptions 251 Functions for displaying, removing and saving.
851 below, `the part' means the @sc{mime} part represented by the 252
852 @var{handle} argument. 253 @table @code
853 254 @item mm-display-part
854 @defun mm-display-part handle &optional no-default 255 @findex mm-display-part
855 Display the part. Return @code{nil} if the part is removed, 256 Display the part.
856 @code{inline} if it is displayed inline or @code{external} if it is 257
857 displayed externally. If @var{no-default} is non-@code{nil}, the part 258 @item mm-remove-part
858 is not displayed unless the @sc{mime} type of @var{handle} is defined to 259 @findex mm-remove-part
859 be displayed inline or there is an display method defined for it; i.e.@: 260 Remove the part (if it has been displayed).
860 no default external method will be used. 261
861 @end defun 262 @item mm-inlinable-p
862 263 @findex mm-inlinable-p
863 @defun mm-remove-part handle 264 Say whether a @acronym{MIME} type can be displayed inline.
864 Remove the part if it has been displayed. 265
865 @end defun 266 @item mm-automatic-display-p
866 267 @findex mm-automatic-display-p
867 @defun mm-inlinable-p handle 268 Say whether a @acronym{MIME} type should be displayed automatically.
868 Return non-@code{nil} if the part can be displayed inline. 269
869 @end defun 270 @item mm-destroy-part
870 271 @findex mm-destroy-part
871 @defun mm-automatic-display-p handle 272 Free all resources occupied by a part.
872 Return non-@code{nil} if the user has requested automatic display of the 273
873 @sc{mime} type of the part. 274 @item mm-save-part
874 @end defun 275 @findex mm-save-part
875 276 Offer to save the part in a file.
876 @defun mm-destroy-part handle 277
877 Free all the resources used by the part. 278 @item mm-pipe-part
878 @end defun 279 @findex mm-pipe-part
879 280 Offer to pipe the part to some process.
880 @defun mm-save-part handle 281
881 Save the part to a file. The user is prompted for a file name to use. 282 @item mm-interactively-view-part
882 @end defun 283 @findex mm-interactively-view-part
883 284 Prompt for a mailcap method to use to view the part.
884 @defun mm-pipe-part handle 285
885 Pipe the part through a shell command. The user is prompted for the 286 @end table
886 command to use. 287
887 @end defun 288
888 289 @node Display Customization
889 @defun mm-interactively-view-part handle 290 @section Display Customization
890 Prompt for a mailcap method to use to view the part and display it 291
891 externally using that method. 292 @table @code
892 @end defun 293
893 294 @item mm-inline-media-tests
894 295 @vindex mm-inline-media-tests
895 @node Customization 296 This is an alist where the key is a @acronym{MIME} type, the second element
896 @section Customization
897
898 The display of @sc{mime} types may be customized with the following
899 options.
900
901 @defopt mm-inline-media-tests
902 This is an alist where the key is a @sc{mime} type, the second element
903 is a function to display the part @dfn{inline} (i.e., inside Emacs), and 297 is a function to display the part @dfn{inline} (i.e., inside Emacs), and
904 the third element is a form to be @code{eval}ed to say whether the part 298 the third element is a form to be @code{eval}ed to say whether the part
905 can be displayed inline. 299 can be displayed inline.
906 300
907 This variable specifies whether a part @emph{can} be displayed inline, 301 This variable specifies whether a part @emph{can} be displayed inline,
908 and, if so, how to do it. It does not say whether parts are 302 and, if so, how to do it. It does not say whether parts are
909 @emph{actually} displayed inline. 303 @emph{actually} displayed inline.
910 @end defopt 304
911 305 @item mm-inlined-types
912 @defopt mm-inlined-types 306 @vindex mm-inlined-types
913 This, on the other hand, says what types are to be displayed inline, if 307 This, on the other hand, says what types are to be displayed inline, if
914 they satisfy the conditions set by the variable above. It's a list of 308 they satisfy the conditions set by the variable above. It's a list of
915 @sc{mime} media types. 309 @acronym{MIME} media types.
916 @end defopt 310
917 311 @item mm-automatic-display
918 @defopt mm-automatic-display 312 @vindex mm-automatic-display
919 This is a list of types that are to be displayed ``automatically'', but 313 This is a list of types that are to be displayed ``automatically'', but
920 only if the above variable allows it. That is, only inlinable parts can 314 only if the above variable allows it. That is, only inlinable parts can
921 be displayed automatically. 315 be displayed automatically.
922 @end defopt 316
923 317 @item mm-automatic-external-display
924 @defopt mm-attachment-override-types 318 @vindex mm-automatic-external-display
925 Some @sc{mime} agents create parts that have a content-disposition of 319 This is a list of types that will be displayed automatically in an
320 external viewer.
321
322 @item mm-keep-viewer-alive-types
323 @vindex mm-keep-viewer-alive-types
324 This is a list of media types for which the external viewer will not
325 be killed when selecting a different article.
326
327 @item mm-attachment-override-types
328 @vindex mm-attachment-override-types
329 Some @acronym{MIME} agents create parts that have a content-disposition of
926 @samp{attachment}. This variable allows overriding that disposition and 330 @samp{attachment}. This variable allows overriding that disposition and
927 displaying the part inline. (Note that the disposition is only 331 displaying the part inline. (Note that the disposition is only
928 overridden if we are able to, and want to, display the part inline.) 332 overridden if we are able to, and want to, display the part inline.)
929 @end defopt 333
930 334 @item mm-discouraged-alternatives
931 @defopt mm-discouraged-alternatives 335 @vindex mm-discouraged-alternatives
932 List of @sc{mime} types that are discouraged when viewing 336 List of @acronym{MIME} types that are discouraged when viewing
933 @samp{multipart/alternative}. Viewing agents are supposed to view the 337 @samp{multipart/alternative}. Viewing agents are supposed to view the
934 last possible part of a message, as that is supposed to be the richest. 338 last possible part of a message, as that is supposed to be the richest.
935 However, users may prefer other types instead, and this list says what 339 However, users may prefer other types instead, and this list says what
936 types are most unwanted. If, for instance, @samp{text/html} parts are 340 types are most unwanted. If, for instance, @samp{text/html} parts are
937 very unwanted, and @samp{text/richtech} parts are somewhat unwanted, 341 very unwanted, and @samp{text/richtext} parts are somewhat unwanted,
938 then the value of this variable should be set to: 342 you could say something like:
939 343
940 @lisp 344 @lisp
941 ("text/html" "text/richtext") 345 (setq mm-discouraged-alternatives
346 '("text/html" "text/richtext")
347 mm-automatic-display
348 (remove "text/html" mm-automatic-display))
942 @end lisp 349 @end lisp
943 @end defopt 350
944 351 @item mm-inline-large-images
945 @defopt mm-inline-large-images-p 352 @vindex mm-inline-large-images
946 When displaying inline images that are larger than the window, XEmacs 353 When displaying inline images that are larger than the window, XEmacs
947 does not enable scrolling, which means that you cannot see the whole 354 does not enable scrolling, which means that you cannot see the whole
948 image. To prevent this, the library tries to determine the image size 355 image. To prevent this, the library tries to determine the image size
949 before displaying it inline, and if it doesn't fit the window, the 356 before displaying it inline, and if it doesn't fit the window, the
950 library will display it externally (e.g. with @samp{ImageMagick} or 357 library will display it externally (e.g. with @samp{ImageMagick} or
951 @samp{xv}). Setting this variable to @code{t} disables this check and 358 @samp{xv}). Setting this variable to @code{t} disables this check and
952 makes the library display all inline images as inline, regardless of 359 makes the library display all inline images as inline, regardless of
953 their size. 360 their size.
954 @end defopt 361
955 362 @item mm-inline-override-types
956 @defopt mm-inline-override-p 363 @vindex mm-inline-override-types
957 @code{mm-inlined-types} may include regular expressions, for example to 364 @code{mm-inlined-types} may include regular expressions, for example to
958 specify that all @samp{text/.*} parts be displayed inline. If a user 365 specify that all @samp{text/.*} parts be displayed inline. If a user
959 prefers to have a type that matches such a regular expression be treated 366 prefers to have a type that matches such a regular expression be treated
960 as an attachment, that can be accomplished by setting this variable to a 367 as an attachment, that can be accomplished by setting this variable to a
961 list containing that type. For example assuming @code{mm-inlined-types} 368 list containing that type. For example assuming @code{mm-inlined-types}
962 includes @samp{text/.*}, then including @samp{text/html} in this 369 includes @samp{text/.*}, then including @samp{text/html} in this
963 variable will cause @samp{text/html} parts to be treated as attachments. 370 variable will cause @samp{text/html} parts to be treated as attachments.
964 @end defopt 371
965 372 @item mm-text-html-renderer
373 @vindex mm-text-html-renderer
374 This selects the function used to render @acronym{HTML}. The predefined
375 renderers are selected by the symbols @code{w3},
376 @code{w3m}@footnote{See @uref{http://emacs-w3m.namazu.org/} for more
377 information about emacs-w3m}, @code{links}, @code{lynx},
378 @code{w3m-standalone} or @code{html2text}. If @code{nil} use an
379 external viewer. You can also specify a function, which will be
380 called with a @acronym{MIME} handle as the argument.
381
382 @item mm-inline-text-html-with-images
383 @vindex mm-inline-text-html-with-images
384 Some @acronym{HTML} mails might have the trick of spammers using
385 @samp{<img>} tags. It is likely to be intended to verify whether you
386 have read the mail. You can prevent your personal informations from
387 leaking by setting this option to @code{nil} (which is the default).
388 It is currently ignored by Emacs/w3. For emacs-w3m, you may use the
389 command @kbd{t} on the image anchor to show an image even if it is
390 @code{nil}.@footnote{The command @kbd{T} will load all images. If you
391 have set the option @code{w3m-key-binding} to @code{info}, use @kbd{i}
392 or @kbd{I} instead.}
393
394 @item mm-w3m-safe-url-regexp
395 @vindex mm-w3m-safe-url-regexp
396 A regular expression that matches safe URL names, i.e. URLs that are
397 unlikely to leak personal information when rendering @acronym{HTML}
398 email (the default value is @samp{\\`cid:}). If @code{nil} consider
399 all URLs safe.
400
401 @item mm-inline-text-html-with-w3m-keymap
402 @vindex mm-inline-text-html-with-w3m-keymap
403 You can use emacs-w3m command keys in the inlined text/html part by
404 setting this option to non-@code{nil}. The default value is @code{t}.
405
406 @item mm-external-terminal-program
407 @vindex mm-external-terminal-program
408 The program used to start an external terminal.
409
410 @item mm-enable-external
411 @vindex mm-enable-external
412 Indicate whether external MIME handlers should be used.
413
414 If @code{t}, all defined external MIME handlers are used. If
415 @code{nil}, files are saved to disk (@code{mailcap-save-binary-file}).
416 If it is the symbol @code{ask}, you are prompted before the external
417 @acronym{MIME} handler is invoked.
418
419 When you launch an attachment through mailcap (@pxref{mailcap}) an
420 attempt is made to use a safe viewer with the safest options--this isn't
421 the case if you save it to disk and launch it in a different way
422 (command line or double-clicking). Anyhow, if you want to be sure not
423 to launch any external programs, set this variable to @code{nil} or
424 @code{ask}.
425
426 @end table
427
428 @node Files and Directories
429 @section Files and Directories
430
431 @table @code
432
433 @item mm-default-directory
434 @vindex mm-default-directory
435 The default directory for saving attachments. If @code{nil} use
436 @code{default-directory}.
437
438 @item mm-tmp-directory
439 @vindex mm-tmp-directory
440 Directory for storing temporary files.
441
442 @item mm-file-name-rewrite-functions
443 @vindex mm-file-name-rewrite-functions
444 A list of functions used for rewriting file names of @acronym{MIME}
445 parts. Each function is applied successively to the file name.
446 Ready-made functions include
447
448 @table @code
449 @item mm-file-name-delete-control
450 @findex mm-file-name-delete-control
451 Delete all control characters.
452
453 @item mm-file-name-delete-gotchas
454 @findex mm-file-name-delete-gotchas
455 Delete characters that could have unintended consequences when used
456 with flawed shell scripts, i.e. @samp{|}, @samp{>} and @samp{<}; and
457 @samp{-}, @samp{.} as the first character.
458
459 @item mm-file-name-delete-whitespace
460 @findex mm-file-name-delete-whitespace
461 Remove all whitespace.
462
463 @item mm-file-name-trim-whitespace
464 @findex mm-file-name-trim-whitespace
465 Remove leading and trailing whitespace.
466
467 @item mm-file-name-collapse-whitespace
468 @findex mm-file-name-collapse-whitespace
469 Collapse multiple whitespace characters.
470
471 @item mm-file-name-replace-whitespace
472 @findex mm-file-name-replace-whitespace
473 @vindex mm-file-name-replace-whitespace
474 Replace whitespace with underscores. Set the variable
475 @code{mm-file-name-replace-whitespace} to any other string if you do
476 not like underscores.
477 @end table
478
479 The standard Emacs functions @code{capitalize}, @code{downcase},
480 @code{upcase} and @code{upcase-initials} might also prove useful.
481
482 @item mm-path-name-rewrite-functions
483 @vindex mm-path-name-rewrite-functions
484 List of functions used for rewriting the full file names of @acronym{MIME}
485 parts. This is used when viewing parts externally, and is meant for
486 transforming the absolute name so that non-compliant programs can find
487 the file where it's saved.
488
489 @end table
966 490
967 @node New Viewers 491 @node New Viewers
968 @section New Viewers 492 @section New Viewers
969 493
970 Here's an example viewer for displaying @samp{text/enriched} inline: 494 Here's an example viewer for displaying @code{text/enriched} inline:
971 495
972 @lisp 496 @lisp
973 (defun mm-display-enriched-inline (handle) 497 (defun mm-display-enriched-inline (handle)
974 (let (text) 498 (let (text)
975 (with-temp-buffer 499 (with-temp-buffer
978 (enriched-decode (point-min) (point-max)) 502 (enriched-decode (point-min) (point-max))
979 (setq text (buffer-string)))) 503 (setq text (buffer-string))))
980 (mm-insert-inline handle text))) 504 (mm-insert-inline handle text)))
981 @end lisp 505 @end lisp
982 506
983 We see that the function takes a @sc{mime} handle as its parameter. It 507 We see that the function takes a @acronym{MIME} handle as its parameter. It
984 then goes to a temporary buffer, inserts the text of the part, does some 508 then goes to a temporary buffer, inserts the text of the part, does some
985 work on the text, stores the result, goes back to the buffer it was 509 work on the text, stores the result, goes back to the buffer it was
986 called from and inserts the result. 510 called from and inserts the result.
987 511
988 The two important helper functions here are @code{mm-insert-part} and 512 The two important helper functions here are @code{mm-insert-part} and
989 @code{mm-insert-inline}. The first function inserts the text of the 513 @code{mm-insert-inline}. The first function inserts the text of the
990 handle in the current buffer. It handles charset and/or content 514 handle in the current buffer. It handles charset and/or content
991 transfer decoding. The second function just inserts whatever text you 515 transfer decoding. The second function just inserts whatever text you
992 tell it to insert, but it also sets things up so that the text can be 516 tell it to insert, but it also sets things up so that the text can be
993 ``undisplayed' in a convenient manner. 517 ``undisplayed'' in a convenient manner.
994 518
995 519
996 @node Composing 520 @node Composing
997 @chapter Composing 521 @chapter Composing
998 @cindex Composing 522 @cindex Composing
999 @cindex MIME Composing 523 @cindex MIME Composing
1000 @cindex MML 524 @cindex MML
1001 @cindex MIME Meta Language 525 @cindex MIME Meta Language
1002 526
1003 Creating a @sc{mime} message is boring and non-trivial. Therefore, a 527 Creating a @acronym{MIME} message is boring and non-trivial. Therefore,
1004 library called @code{mml} has been defined that parses a language called 528 a library called @code{mml} has been defined that parses a language
1005 MML (@sc{mime} Meta Language) and generates @sc{mime} messages. 529 called @acronym{MML} (@acronym{MIME} Meta Language) and generates
530 @acronym{MIME} messages.
1006 531
1007 @findex mml-generate-mime 532 @findex mml-generate-mime
1008 The main interface function is @code{mml-generate-mime}. It will 533 The main interface function is @code{mml-generate-mime}. It will
1009 examine the contents of the current (narrowed-to) buffer and return a 534 examine the contents of the current (narrowed-to) buffer and return a
1010 string containing the @sc{mime} message. 535 string containing the @acronym{MIME} message.
1011 536
1012 @menu 537 @menu
1013 * Simple MML Example:: An example MML document. 538 * Simple MML Example:: An example @acronym{MML} document.
1014 * MML Definition:: All valid MML elements. 539 * MML Definition:: All valid @acronym{MML} elements.
1015 * Advanced MML Example:: Another example MML document. 540 * Advanced MML Example:: Another example @acronym{MML} document.
1016 * Charset Translation:: How charsets are mapped from Mule to MIME. 541 * Encoding Customization:: Variables that affect encoding.
1017 * Conversion:: Going from @sc{mime} to MML and vice versa. 542 * Charset Translation:: How charsets are mapped from @sc{mule} to @acronym{MIME}.
543 * Conversion:: Going from @acronym{MIME} to @acronym{MML} and vice versa.
544 * Flowed text:: Soft and hard newlines.
1018 @end menu 545 @end menu
1019 546
1020 547
1021 @node Simple MML Example 548 @node Simple MML Example
1022 @section Simple MML Example 549 @section Simple MML Example
1053 580
1054 581
1055 @node MML Definition 582 @node MML Definition
1056 @section MML Definition 583 @section MML Definition
1057 584
1058 The MML language is very simple. It looks a bit like an SGML 585 The @acronym{MML} language is very simple. It looks a bit like an SGML
1059 application, but it's not. 586 application, but it's not.
1060 587
1061 The main concept of MML is the @dfn{part}. Each part can be of a 588 The main concept of @acronym{MML} is the @dfn{part}. Each part can be of a
1062 different type or use a different charset. The way to delineate a part 589 different type or use a different charset. The way to delineate a part
1063 is with a @samp{<#part ...>} tag. Multipart parts can be introduced 590 is with a @samp{<#part ...>} tag. Multipart parts can be introduced
1064 with the @samp{<#multipart ...>} tag. Parts are ended by the 591 with the @samp{<#multipart ...>} tag. Parts are ended by the
1065 @samp{<#/part>} or @samp{<#/multipart>} tags. Parts started with the 592 @samp{<#/part>} or @samp{<#/multipart>} tags. Parts started with the
1066 @samp{<#part ...>} tags are also closed by the next open tag. 593 @samp{<#part ...>} tags are also closed by the next open tag.
1071 Each tag can contain zero or more parameters on the form 598 Each tag can contain zero or more parameters on the form
1072 @samp{parameter=value}. The values may be enclosed in quotation marks, 599 @samp{parameter=value}. The values may be enclosed in quotation marks,
1073 but that's not necessary unless the value contains white space. So 600 but that's not necessary unless the value contains white space. So
1074 @samp{filename=/home/user/#hello$^yes} is perfectly valid. 601 @samp{filename=/home/user/#hello$^yes} is perfectly valid.
1075 602
1076 The following parameters have meaning in MML; parameters that have no 603 The following parameters have meaning in @acronym{MML}; parameters that have no
1077 meaning are ignored. The MML parameter names are the same as the 604 meaning are ignored. The @acronym{MML} parameter names are the same as the
1078 @sc{mime} parameter names; the things in the parentheses say which 605 @acronym{MIME} parameter names; the things in the parentheses say which
1079 header it will be used in. 606 header it will be used in.
1080 607
1081 @table @samp 608 @table @samp
1082 @item type 609 @item type
1083 The @sc{mime} type of the part (@samp{Content-Type}). 610 The @acronym{MIME} type of the part (@code{Content-Type}).
1084 611
1085 @item filename 612 @item filename
1086 Use the contents of the file in the body of the part 613 Use the contents of the file in the body of the part
1087 (@samp{Content-Disposition}). 614 (@code{Content-Disposition}).
1088 615
1089 @item charset 616 @item charset
1090 The contents of the body of the part are to be encoded in the character 617 The contents of the body of the part are to be encoded in the character
1091 set specified (@samp{Content-Type}). 618 set specified (@code{Content-Type}). @xref{Charset Translation}.
1092 619
1093 @item name 620 @item name
1094 Might be used to suggest a file name if the part is to be saved 621 Might be used to suggest a file name if the part is to be saved
1095 to a file (@samp{Content-Type}). 622 to a file (@code{Content-Type}).
1096 623
1097 @item disposition 624 @item disposition
1098 Valid values are @samp{inline} and @samp{attachment} 625 Valid values are @samp{inline} and @samp{attachment}
1099 (@samp{Content-Disposition}). 626 (@code{Content-Disposition}).
1100 627
1101 @item encoding 628 @item encoding
1102 Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and 629 Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and
1103 @samp{base64} (@samp{Content-Transfer-Encoding}). 630 @samp{base64} (@code{Content-Transfer-Encoding}). @xref{Charset
631 Translation}.
1104 632
1105 @item description 633 @item description
1106 A description of the part (@samp{Content-Description}). 634 A description of the part (@code{Content-Description}).
1107 635
1108 @item creation-date 636 @item creation-date
1109 RFC822 date when the part was created (@samp{Content-Disposition}). 637 RFC822 date when the part was created (@code{Content-Disposition}).
1110 638
1111 @item modification-date 639 @item modification-date
1112 RFC822 date when the part was modified (@samp{Content-Disposition}). 640 RFC822 date when the part was modified (@code{Content-Disposition}).
1113 641
1114 @item read-date 642 @item read-date
1115 RFC822 date when the part was read (@samp{Content-Disposition}). 643 RFC822 date when the part was read (@code{Content-Disposition}).
644
645 @item recipients
646 Who to encrypt/sign the part to. This field is used to override any
647 auto-detection based on the To/CC headers.
648
649 @item sender
650 Identity used to sign the part. This field is used to override the
651 default key used.
1116 652
1117 @item size 653 @item size
1118 The size (in octets) of the part (@samp{Content-Disposition}). 654 The size (in octets) of the part (@code{Content-Disposition}).
1119 655
656 @item sign
657 What technology to sign this @acronym{MML} part with (@code{smime}, @code{pgp}
658 or @code{pgpmime})
659
660 @item encrypt
661 What technology to encrypt this @acronym{MML} part with (@code{smime},
662 @code{pgp} or @code{pgpmime})
663
664 @end table
665
666 Parameters for @samp{text/plain}:
667
668 @table @samp
669 @item format
670 Formatting parameter for the text, valid values include @samp{fixed}
671 (the default) and @samp{flowed}. Normally you do not specify this
672 manually, since it requires the textual body to be formatted in a
673 special way described in RFC 2646. @xref{Flowed text}.
1120 @end table 674 @end table
1121 675
1122 Parameters for @samp{application/octet-stream}: 676 Parameters for @samp{application/octet-stream}:
1123 677
1124 @table @samp 678 @table @samp
1125 @item type 679 @item type
1126 Type of the part; informal---meant for human readers 680 Type of the part; informal---meant for human readers
1127 (@samp{Content-Type}). 681 (@code{Content-Type}).
1128 @end table 682 @end table
1129 683
1130 Parameters for @samp{message/external-body}: 684 Parameters for @samp{message/external-body}:
1131 685
1132 @table @samp 686 @table @samp
1133 @item access-type 687 @item access-type
1134 A word indicating the supported access mechanism by which the file may 688 A word indicating the supported access mechanism by which the file may
1135 be obtained. Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp}, 689 be obtained. Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp},
1136 @samp{localfile}, and @samp{mailserver}. (@samp{Content-Type}.) 690 @samp{localfile}, and @samp{mailserver}. (@code{Content-Type}.)
1137 691
1138 @item expiration 692 @item expiration
1139 The RFC822 date after which the file may no longer be fetched. 693 The RFC822 date after which the file may no longer be fetched.
1140 (@samp{Content-Type}.) 694 (@code{Content-Type}.)
1141 695
1142 @item size 696 @item size
1143 The size (in octets) of the file. (@samp{Content-Type}.) 697 The size (in octets) of the file. (@code{Content-Type}.)
1144 698
1145 @item permission 699 @item permission
1146 Valid values are @samp{read} and @samp{read-write} 700 Valid values are @samp{read} and @samp{read-write}
1147 (@samp{Content-Type}). 701 (@code{Content-Type}).
702
703 @end table
704
705 Parameters for @samp{sign=smime}:
706
707 @table @samp
708
709 @item keyfile
710 File containing key and certificate for signer.
711
712 @end table
713
714 Parameters for @samp{encrypt=smime}:
715
716 @table @samp
717
718 @item certfile
719 File containing certificate for recipient.
1148 720
1149 @end table 721 @end table
1150 722
1151 723
1152 @node Advanced MML Example 724 @node Advanced MML Example
1167 <#part disposition=attachment> 739 <#part disposition=attachment>
1168 This plain text part is an attachment. 740 This plain text part is an attachment.
1169 <#/multipart> 741 <#/multipart>
1170 @end example 742 @end example
1171 743
1172 And this is the resulting @sc{mime} message: 744 And this is the resulting @acronym{MIME} message:
1173 745
1174 @example 746 @example
1175 Content-Type: multipart/mixed; boundary="=-=-=" 747 Content-Type: multipart/mixed; boundary="=-=-="
1176 748
1177 749
1233 This plain text part is an attachment. 805 This plain text part is an attachment.
1234 806
1235 --=-=-=-- 807 --=-=-=--
1236 @end example 808 @end example
1237 809
810 @node Encoding Customization
811 @section Encoding Customization
812
813 @table @code
814
815 @item mm-body-charset-encoding-alist
816 @vindex mm-body-charset-encoding-alist
817 Mapping from @acronym{MIME} charset to encoding to use. This variable is
818 usually used except, e.g., when other requirements force a specific
819 encoding (digitally signed messages require 7bit encodings). The
820 default is
821
822 @lisp
823 ((iso-2022-jp . 7bit)
824 (iso-2022-jp-2 . 7bit)
825 (utf-16 . base64)
826 (utf-16be . base64)
827 (utf-16le . base64))
828 @end lisp
829
830 As an example, if you do not want to have ISO-8859-1 characters
831 quoted-printable encoded, you may add @code{(iso-8859-1 . 8bit)} to
832 this variable. You can override this setting on a per-message basis
833 by using the @code{encoding} @acronym{MML} tag (@pxref{MML Definition}).
834
835 @item mm-coding-system-priorities
836 @vindex mm-coding-system-priorities
837 Prioritize coding systems to use for outgoing messages. The default
838 is @code{nil}, which means to use the defaults in Emacs. It is a list of
839 coding system symbols (aliases of coding systems does not work, use
840 @kbd{M-x describe-coding-system} to make sure you are not specifying
841 an alias in this variable). For example, if you have configured Emacs
842 to prefer UTF-8, but wish that outgoing messages should be sent in
843 ISO-8859-1 if possible, you can set this variable to
844 @code{(iso-latin-1)}. You can override this setting on a per-message
845 basis by using the @code{charset} @acronym{MML} tag (@pxref{MML Definition}).
846
847 @item mm-content-transfer-encoding-defaults
848 @vindex mm-content-transfer-encoding-defaults
849 Mapping from @acronym{MIME} types to encoding to use. This variable is usually
850 used except, e.g., when other requirements force a safer encoding
851 (digitally signed messages require 7bit encoding). Besides the normal
852 @acronym{MIME} encodings, @code{qp-or-base64} may be used to indicate that for
853 each case the most efficient of quoted-printable and base64 should be
854 used. You can override this setting on a per-message basis by using
855 the @code{encoding} @acronym{MML} tag (@pxref{MML Definition}).
856
857 @item mm-use-ultra-safe-encoding
858 @vindex mm-use-ultra-safe-encoding
859 When this is non-@code{nil}, it means that textual parts are encoded as
860 quoted-printable if they contain lines longer than 76 characters or
861 starting with "From " in the body. Non-7bit encodings (8bit, binary)
862 are generally disallowed. This reduce the probability that a non-8bit
863 clean MTA or MDA changes the message. This should never be set
864 directly, but bound by other functions when necessary (e.g., when
865 encoding messages that are to be digitally signed).
866
867 @end table
868
1238 @node Charset Translation 869 @node Charset Translation
1239 @section Charset Translation 870 @section Charset Translation
1240 @cindex charsets 871 @cindex charsets
1241 872
1242 During translation from MML to @sc{mime}, for each @sc{mime} part which 873 During translation from @acronym{MML} to @acronym{MIME}, for each
1243 has been composed inside Emacs, an appropriate @sc{mime} charset has to 874 @acronym{MIME} part which has been composed inside Emacs, an appropriate
1244 be chosen. 875 charset has to be chosen.
1245 876
1246 @vindex mail-parse-charset 877 @vindex mail-parse-charset
1247 @cindex unibyte Emacs 878 If you are running a non-@sc{mule} Emacs, this process is simple: If the
1248 If you are running a non-Mule XEmacs, or Emacs in unibyte 879 part contains any non-@acronym{ASCII} (8-bit) characters, the @acronym{MIME} charset
1249 mode@footnote{Deprecated!}, this process is simple: if the part
1250 contains any non-@sc{ascii} (8-bit) characters, the @sc{mime} charset
1251 given by @code{mail-parse-charset} (a symbol) is used. (Never set this 880 given by @code{mail-parse-charset} (a symbol) is used. (Never set this
1252 variable directly, though. If you want to change the default charset, 881 variable directly, though. If you want to change the default charset,
1253 please consult the documentation of the package which you use to process 882 please consult the documentation of the package which you use to process
1254 @sc{mime} messages. @xref{Various Message Variables, , Various Message 883 @acronym{MIME} messages.
1255 Variables, message, Message Manual}, for example.) If there are only 884 @xref{Various Message Variables, , Various Message Variables, message,
1256 @sc{ascii} characters, the @sc{mime} charset @samp{US-ASCII} is used, of 885 Message Manual}, for example.)
1257 course. 886 If there are only @acronym{ASCII} characters, the @acronym{MIME} charset US-ASCII is
1258 887 used, of course.
1259 @cindex multibyte Emacs 888
1260 @cindex @code{mime-charset} property 889 @cindex MULE
1261 In a normal (multibyte) Emacs session, a list of coding systems is 890 @cindex UTF-8
1262 derived that can encode the message part's content and correspond to 891 @cindex Unicode
1263 MIME charsets (according to their @code{mime-charset} property). This
1264 list is according to the normal priority rules and the highest priority
1265 one is chosen to encode the part. If no such coding system can encode
1266 the part's contents, they are split into several parts such that each
1267 can be encoded with an appropriate coding system/@sc{mime}
1268 charset.@footnote{The part can only be split at line boundaries,
1269 though---if more than one @sc{mime} charset is required to encode a
1270 single line, it is not possible to encode the part.} Note that this
1271 procedure works with any correctly-defined coding systems, not just
1272 built-in ones. Given a suitably-defined UTF-8 coding system---one
1273 capable of encoding the Emacs charsets you use---it is not normally
1274 necessary to split a part by charset.
1275
1276 @vindex mm-mime-mule-charset-alist 892 @vindex mm-mime-mule-charset-alist
1277 @cindex XEmacs/Mule 893 Things are slightly more complicated when running Emacs with @sc{mule}
1278 It isn't possible to do this properly in XEmacs/Mule. Instead, a list 894 support. In this case, a list of the @sc{mule} charsets used in the
1279 of the Mule charsets used in the part is obtained, and the 895 part is obtained, and the @sc{mule} charsets are translated to @acronym{MIME}
1280 corresponding @sc{mime} charsets are determined by lookup in 896 charsets by consulting the variable @code{mm-mime-mule-charset-alist}.
1281 @code{mm-mime-mule-charset-alist}. If the list elements all 897 If this results in a single @acronym{MIME} charset, this is used to encode
1282 correspond to a single @sc{mime} charset, that is used to encode the 898 the part. But if the resulting list of @acronym{MIME} charsets contains more
1283 part. Otherwise, the part is split as above. 899 than one element, two things can happen: If it is possible to encode the
900 part via UTF-8, this charset is used. (For this, Emacs must support
901 the @code{utf-8} coding system, and the part must consist entirely of
902 characters which have Unicode counterparts.) If UTF-8 is not available
903 for some reason, the part is split into several ones, so that each one
904 can be encoded with a single @acronym{MIME} charset. The part can only be
905 split at line boundaries, though---if more than one @acronym{MIME} charset is
906 required to encode a single line, it is not possible to encode the part.
907
908 When running Emacs with @sc{mule} support, the preferences for which
909 coding system to use is inherited from Emacs itself. This means that
910 if Emacs is set up to prefer UTF-8, it will be used when encoding
911 messages. You can modify this by altering the
912 @code{mm-coding-system-priorities} variable though (@pxref{Encoding
913 Customization}).
914
915 The charset to be used can be overridden by setting the @code{charset}
916 @acronym{MML} tag (@pxref{MML Definition}) when composing the message.
917
918 The encoding of characters (quoted-printable, 8bit etc) is orthogonal
919 to the discussion here, and is controlled by the variables
920 @code{mm-body-charset-encoding-alist} and
921 @code{mm-content-transfer-encoding-defaults} (@pxref{Encoding
922 Customization}).
1284 923
1285 @node Conversion 924 @node Conversion
1286 @section Conversion 925 @section Conversion
1287 926
1288 @findex mime-to-mml 927 @findex mime-to-mml
1289 A (multipart) @sc{mime} message can be converted to MML with the 928 A (multipart) @acronym{MIME} message can be converted to @acronym{MML}
1290 @code{mime-to-mml} function. It works on the message in the current 929 with the @code{mime-to-mml} function. It works on the message in the
1291 buffer, and substitutes MML markup for @sc{mime} boundaries. 930 current buffer, and substitutes @acronym{MML} markup for @acronym{MIME}
1292 Non-textual parts do not have their contents in the buffer, but instead 931 boundaries. Non-textual parts do not have their contents in the buffer,
1293 have the contents in separate buffers that are referred to from the MML 932 but instead have the contents in separate buffers that are referred to
1294 tags. 933 from the @acronym{MML} tags.
1295 934
1296 @findex mml-to-mime 935 @findex mml-to-mime
1297 An MML message can be converted back to @sc{mime} by the 936 An @acronym{MML} message can be converted back to @acronym{MIME} by the
1298 @code{mml-to-mime} function. 937 @code{mml-to-mime} function.
1299 938
1300 These functions are in certain senses ``lossy''---you will not get back 939 These functions are in certain senses ``lossy''---you will not get back
1301 an identical message if you run @sc{mime-to-mml} and then 940 an identical message if you run @code{mime-to-mml} and then
1302 @sc{mml-to-mime}. Not only will trivial things like the order of the 941 @code{mml-to-mime}. Not only will trivial things like the order of the
1303 headers differ, but the contents of the headers may also be different. 942 headers differ, but the contents of the headers may also be different.
1304 For instance, the original message may use base64 encoding on text, 943 For instance, the original message may use base64 encoding on text,
1305 while @sc{mml-to-mime} may decide to use quoted-printable encoding, and 944 while @code{mml-to-mime} may decide to use quoted-printable encoding, and
1306 so on. 945 so on.
1307 946
1308 In essence, however, these two functions should be the inverse of each 947 In essence, however, these two functions should be the inverse of each
1309 other. The resulting contents of the message should remain equivalent, 948 other. The resulting contents of the message should remain equivalent,
1310 if not identical. 949 if not identical.
1311 950
1312 951
952 @node Flowed text
953 @section Flowed text
954 @cindex format=flowed
955
956 The Emacs @acronym{MIME} library will respect the @code{use-hard-newlines}
957 variable (@pxref{Hard and Soft Newlines, ,Hard and Soft Newlines,
958 emacs, Emacs Manual}) when encoding a message, and the
959 ``format=flowed'' Content-Type parameter when decoding a message.
960
961 On encoding text, regardless of @code{use-hard-newlines}, lines
962 terminated by soft newline characters are filled together and wrapped
963 after the column decided by @code{fill-flowed-encode-column}.
964 Quotation marks (matching @samp{^>* ?}) are respected. The variable
965 controls how the text will look in a client that does not support
966 flowed text, the default is to wrap after 66 characters. If hard
967 newline characters are not present in the buffer, no flow encoding
968 occurs.
969
970 On decoding flowed text, lines with soft newline characters are filled
971 together and wrapped after the column decided by
972 @code{fill-flowed-display-column}. The default is to wrap after
973 @code{fill-column}.
974
975
976
977
978 @node Interface Functions
979 @chapter Interface Functions
980 @cindex interface functions
981 @cindex mail-parse
982
983 The @code{mail-parse} library is an abstraction over the actual
984 low-level libraries that are described in the next chapter.
985
986 Standards change, and so programs have to change to fit in the new
987 mold. For instance, RFC2045 describes a syntax for the
988 @code{Content-Type} header that only allows @acronym{ASCII} characters in the
989 parameter list. RFC2231 expands on RFC2045 syntax to provide a scheme
990 for continuation headers and non-@acronym{ASCII} characters.
991
992 The traditional way to deal with this is just to update the library
993 functions to parse the new syntax. However, this is sometimes the wrong
994 thing to do. In some instances it may be vital to be able to understand
995 both the old syntax as well as the new syntax, and if there is only one
996 library, one must choose between the old version of the library and the
997 new version of the library.
998
999 The Emacs @acronym{MIME} library takes a different tack. It defines a
1000 series of low-level libraries (@file{rfc2047.el}, @file{rfc2231.el}
1001 and so on) that parses strictly according to the corresponding
1002 standard. However, normal programs would not use the functions
1003 provided by these libraries directly, but instead use the functions
1004 provided by the @code{mail-parse} library. The functions in this
1005 library are just aliases to the corresponding functions in the latest
1006 low-level libraries. Using this scheme, programs get a consistent
1007 interface they can use, and library developers are free to create
1008 write code that handles new standards.
1009
1010 The following functions are defined by this library:
1011
1012 @table @code
1013 @item mail-header-parse-content-type
1014 @findex mail-header-parse-content-type
1015 Parse a @code{Content-Type} header and return a list on the following
1016 format:
1017
1018 @lisp
1019 ("type/subtype"
1020 (attribute1 . value1)
1021 (attribute2 . value2)
1022 ...)
1023 @end lisp
1024
1025 Here's an example:
1026
1027 @example
1028 (mail-header-parse-content-type
1029 "image/gif; name=\"b980912.gif\"")
1030 @result{} ("image/gif" (name . "b980912.gif"))
1031 @end example
1032
1033 @item mail-header-parse-content-disposition
1034 @findex mail-header-parse-content-disposition
1035 Parse a @code{Content-Disposition} header and return a list on the same
1036 format as the function above.
1037
1038 @item mail-content-type-get
1039 @findex mail-content-type-get
1040 Takes two parameters---a list on the format above, and an attribute.
1041 Returns the value of the attribute.
1042
1043 @example
1044 (mail-content-type-get
1045 '("image/gif" (name . "b980912.gif")) 'name)
1046 @result{} "b980912.gif"
1047 @end example
1048
1049 @item mail-header-encode-parameter
1050 @findex mail-header-encode-parameter
1051 Takes a parameter string and returns an encoded version of the string.
1052 This is used for parameters in headers like @code{Content-Type} and
1053 @code{Content-Disposition}.
1054
1055 @item mail-header-remove-comments
1056 @findex mail-header-remove-comments
1057 Return a comment-free version of a header.
1058
1059 @example
1060 (mail-header-remove-comments
1061 "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
1062 @result{} "Gnus/5.070027 "
1063 @end example
1064
1065 @item mail-header-remove-whitespace
1066 @findex mail-header-remove-whitespace
1067 Remove linear white space from a header. Space inside quoted strings
1068 and comments is preserved.
1069
1070 @example
1071 (mail-header-remove-whitespace
1072 "image/gif; name=\"Name with spaces\"")
1073 @result{} "image/gif;name=\"Name with spaces\""
1074 @end example
1075
1076 @item mail-header-get-comment
1077 @findex mail-header-get-comment
1078 Return the last comment in a header.
1079
1080 @example
1081 (mail-header-get-comment
1082 "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
1083 @result{} "Finnish Landrace"
1084 @end example
1085
1086 @item mail-header-parse-address
1087 @findex mail-header-parse-address
1088 Parse an address and return a list containing the mailbox and the
1089 plaintext name.
1090
1091 @example
1092 (mail-header-parse-address
1093 "Hrvoje Niksic <hniksic@@srce.hr>")
1094 @result{} ("hniksic@@srce.hr" . "Hrvoje Niksic")
1095 @end example
1096
1097 @item mail-header-parse-addresses
1098 @findex mail-header-parse-addresses
1099 Parse a string with list of addresses and return a list of elements like
1100 the one described above.
1101
1102 @example
1103 (mail-header-parse-addresses
1104 "Hrvoje Niksic <hniksic@@srce.hr>, Steinar Bang <sb@@metis.no>")
1105 @result{} (("hniksic@@srce.hr" . "Hrvoje Niksic")
1106 ("sb@@metis.no" . "Steinar Bang"))
1107 @end example
1108
1109 @item mail-header-parse-date
1110 @findex mail-header-parse-date
1111 Parse a date string and return an Emacs time structure.
1112
1113 @item mail-narrow-to-head
1114 @findex mail-narrow-to-head
1115 Narrow the buffer to the header section of the buffer. Point is placed
1116 at the beginning of the narrowed buffer.
1117
1118 @item mail-header-narrow-to-field
1119 @findex mail-header-narrow-to-field
1120 Narrow the buffer to the header under point. Understands continuation
1121 headers.
1122
1123 @item mail-header-fold-field
1124 @findex mail-header-fold-field
1125 Fold the header under point.
1126
1127 @item mail-header-unfold-field
1128 @findex mail-header-unfold-field
1129 Unfold the header under point.
1130
1131 @item mail-header-field-value
1132 @findex mail-header-field-value
1133 Return the value of the field under point.
1134
1135 @item mail-encode-encoded-word-region
1136 @findex mail-encode-encoded-word-region
1137 Encode the non-@acronym{ASCII} words in the region. For instance,
1138 @samp{Naïve} is encoded as @samp{=?iso-8859-1?q?Na=EFve?=}.
1139
1140 @item mail-encode-encoded-word-buffer
1141 @findex mail-encode-encoded-word-buffer
1142 Encode the non-@acronym{ASCII} words in the current buffer. This function is
1143 meant to be called narrowed to the headers of a message.
1144
1145 @item mail-encode-encoded-word-string
1146 @findex mail-encode-encoded-word-string
1147 Encode the words that need encoding in a string, and return the result.
1148
1149 @example
1150 (mail-encode-encoded-word-string
1151 "This is naïve, baby")
1152 @result{} "This is =?iso-8859-1?q?na=EFve,?= baby"
1153 @end example
1154
1155 @item mail-decode-encoded-word-region
1156 @findex mail-decode-encoded-word-region
1157 Decode the encoded words in the region.
1158
1159 @item mail-decode-encoded-word-string
1160 @findex mail-decode-encoded-word-string
1161 Decode the encoded words in the string and return the result.
1162
1163 @example
1164 (mail-decode-encoded-word-string
1165 "This is =?iso-8859-1?q?na=EFve,?= baby")
1166 @result{} "This is naïve, baby"
1167 @end example
1168
1169 @end table
1170
1171 Currently, @code{mail-parse} is an abstraction over @code{ietf-drums},
1172 @code{rfc2047}, @code{rfc2045} and @code{rfc2231}. These are documented
1173 in the subsequent sections.
1174
1175
1176
1177 @node Basic Functions
1178 @chapter Basic Functions
1179
1180 This chapter describes the basic, ground-level functions for parsing and
1181 handling. Covered here is parsing @code{From} lines, removing comments
1182 from header lines, decoding encoded words, parsing date headers and so
1183 on. High-level functionality is dealt with in the next chapter
1184 (@pxref{Decoding and Viewing}).
1185
1186 @menu
1187 * rfc2045:: Encoding @code{Content-Type} headers.
1188 * rfc2231:: Parsing @code{Content-Type} headers.
1189 * ietf-drums:: Handling mail headers defined by RFC822bis.
1190 * rfc2047:: En/decoding encoded words in headers.
1191 * time-date:: Functions for parsing dates and manipulating time.
1192 * qp:: Quoted-Printable en/decoding.
1193 * base64:: Base64 en/decoding.
1194 * binhex:: Binhex decoding.
1195 * uudecode:: Uuencode decoding.
1196 * yenc:: Yenc decoding.
1197 * rfc1843:: Decoding HZ-encoded text.
1198 * mailcap:: How parts are displayed is specified by the @file{.mailcap} file
1199 @end menu
1200
1201
1202 @node rfc2045
1203 @section rfc2045
1204
1205 RFC2045 is the ``main'' @acronym{MIME} document, and as such, one would
1206 imagine that there would be a lot to implement. But there isn't, since
1207 most of the implementation details are delegated to the subsequent
1208 RFCs.
1209
1210 So @file{rfc2045.el} has only a single function:
1211
1212 @table @code
1213 @item rfc2045-encode-string
1214 @findex rfc2045-encode-string
1215 Takes a parameter and a value and returns a @samp{PARAM=VALUE} string.
1216 @var{value} will be quoted if there are non-safe characters in it.
1217 @end table
1218
1219
1220 @node rfc2231
1221 @section rfc2231
1222
1223 RFC2231 defines a syntax for the @code{Content-Type} and
1224 @code{Content-Disposition} headers. Its snappy name is @dfn{MIME
1225 Parameter Value and Encoded Word Extensions: Character Sets, Languages,
1226 and Continuations}.
1227
1228 In short, these headers look something like this:
1229
1230 @example
1231 Content-Type: application/x-stuff;
1232 title*0*=us-ascii'en'This%20is%20even%20more%20;
1233 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
1234 title*2="isn't it!"
1235 @end example
1236
1237 They usually aren't this bad, though.
1238
1239 The following functions are defined by this library:
1240
1241 @table @code
1242 @item rfc2231-parse-string
1243 @findex rfc2231-parse-string
1244 Parse a @code{Content-Type} header and return a list describing its
1245 elements.
1246
1247 @example
1248 (rfc2231-parse-string
1249 "application/x-stuff;
1250 title*0*=us-ascii'en'This%20is%20even%20more%20;
1251 title*1*=%2A%2A%2Afun%2A%2A%2A%20;
1252 title*2=\"isn't it!\"")
1253 @result{} ("application/x-stuff"
1254 (title . "This is even more ***fun*** isn't it!"))
1255 @end example
1256
1257 @item rfc2231-get-value
1258 @findex rfc2231-get-value
1259 Takes one of the lists on the format above and returns
1260 the value of the specified attribute.
1261
1262 @item rfc2231-encode-string
1263 @findex rfc2231-encode-string
1264 Encode a parameter in headers likes @code{Content-Type} and
1265 @code{Content-Disposition}.
1266
1267 @end table
1268
1269
1270 @node ietf-drums
1271 @section ietf-drums
1272
1273 @dfn{drums} is an IETF working group that is working on the replacement
1274 for RFC822.
1275
1276 The functions provided by this library include:
1277
1278 @table @code
1279 @item ietf-drums-remove-comments
1280 @findex ietf-drums-remove-comments
1281 Remove the comments from the argument and return the results.
1282
1283 @item ietf-drums-remove-whitespace
1284 @findex ietf-drums-remove-whitespace
1285 Remove linear white space from the string and return the results.
1286 Spaces inside quoted strings and comments are left untouched.
1287
1288 @item ietf-drums-get-comment
1289 @findex ietf-drums-get-comment
1290 Return the last most comment from the string.
1291
1292 @item ietf-drums-parse-address
1293 @findex ietf-drums-parse-address
1294 Parse an address string and return a list that contains the mailbox and
1295 the plain text name.
1296
1297 @item ietf-drums-parse-addresses
1298 @findex ietf-drums-parse-addresses
1299 Parse a string that contains any number of comma-separated addresses and
1300 return a list that contains mailbox/plain text pairs.
1301
1302 @item ietf-drums-parse-date
1303 @findex ietf-drums-parse-date
1304 Parse a date string and return an Emacs time structure.
1305
1306 @item ietf-drums-narrow-to-header
1307 @findex ietf-drums-narrow-to-header
1308 Narrow the buffer to the header section of the current buffer.
1309
1310 @end table
1311
1312
1313 @node rfc2047
1314 @section rfc2047
1315
1316 RFC2047 (Message Header Extensions for Non-@acronym{ASCII} Text) specifies how
1317 non-@acronym{ASCII} text in headers are to be encoded. This is actually rather
1318 complicated, so a number of variables are necessary to tweak what this
1319 library does.
1320
1321 The following variables are tweakable:
1322
1323 @table @code
1324 @item rfc2047-default-charset
1325 @vindex rfc2047-default-charset
1326 Characters in this charset should not be decoded by this library.
1327 This defaults to @code{iso-8859-1}.
1328
1329 @item rfc2047-header-encoding-alist
1330 @vindex rfc2047-header-encoding-alist
1331 This is an alist of header / encoding-type pairs. Its main purpose is
1332 to prevent encoding of certain headers.
1333
1334 The keys can either be header regexps, or @code{t}.
1335
1336 The values can be either @code{nil}, in which case the header(s) in
1337 question won't be encoded, or @code{mime}, which means that they will be
1338 encoded.
1339
1340 @item rfc2047-charset-encoding-alist
1341 @vindex rfc2047-charset-encoding-alist
1342 RFC2047 specifies two forms of encoding---@code{Q} (a
1343 Quoted-Printable-like encoding) and @code{B} (base64). This alist
1344 specifies which charset should use which encoding.
1345
1346 @item rfc2047-encoding-function-alist
1347 @vindex rfc2047-encoding-function-alist
1348 This is an alist of encoding / function pairs. The encodings are
1349 @code{Q}, @code{B} and @code{nil}.
1350
1351 @item rfc2047-q-encoding-alist
1352 @vindex rfc2047-q-encoding-alist
1353 The @code{Q} encoding isn't quite the same for all headers. Some
1354 headers allow a narrower range of characters, and that is what this
1355 variable is for. It's an alist of header regexps / allowable character
1356 ranges.
1357
1358 @item rfc2047-encoded-word-regexp
1359 @vindex rfc2047-encoded-word-regexp
1360 When decoding words, this library looks for matches to this regexp.
1361
1362 @end table
1363
1364 Those were the variables, and these are this functions:
1365
1366 @table @code
1367 @item rfc2047-narrow-to-field
1368 @findex rfc2047-narrow-to-field
1369 Narrow the buffer to the header on the current line.
1370
1371 @item rfc2047-encode-message-header
1372 @findex rfc2047-encode-message-header
1373 Should be called narrowed to the header of a message. Encodes according
1374 to @code{rfc2047-header-encoding-alist}.
1375
1376 @item rfc2047-encode-region
1377 @findex rfc2047-encode-region
1378 Encodes all encodable words in the region specified.
1379
1380 @item rfc2047-encode-string
1381 @findex rfc2047-encode-string
1382 Encode a string and return the results.
1383
1384 @item rfc2047-decode-region
1385 @findex rfc2047-decode-region
1386 Decode the encoded words in the region.
1387
1388 @item rfc2047-decode-string
1389 @findex rfc2047-decode-string
1390 Decode a string and return the results.
1391
1392 @end table
1393
1394
1395 @node time-date
1396 @section time-date
1397
1398 While not really a part of the @acronym{MIME} library, it is convenient to
1399 document this library here. It deals with parsing @code{Date} headers
1400 and manipulating time. (Not by using tesseracts, though, I'm sorry to
1401 say.)
1402
1403 These functions convert between five formats: A date string, an Emacs
1404 time structure, a decoded time list, a second number, and a day number.
1405
1406 Here's a bunch of time/date/second/day examples:
1407
1408 @example
1409 (parse-time-string "Sat Sep 12 12:21:54 1998 +0200")
1410 @result{} (54 21 12 12 9 1998 6 nil 7200)
1411
1412 (date-to-time "Sat Sep 12 12:21:54 1998 +0200")
1413 @result{} (13818 19266)
1414
1415 (time-to-seconds '(13818 19266))
1416 @result{} 905595714.0
1417
1418 (seconds-to-time 905595714.0)
1419 @result{} (13818 19266 0)
1420
1421 (time-to-days '(13818 19266))
1422 @result{} 729644
1423
1424 (days-to-time 729644)
1425 @result{} (961933 65536)
1426
1427 (time-since '(13818 19266))
1428 @result{} (0 430)
1429
1430 (time-less-p '(13818 19266) '(13818 19145))
1431 @result{} nil
1432
1433 (subtract-time '(13818 19266) '(13818 19145))
1434 @result{} (0 121)
1435
1436 (days-between "Sat Sep 12 12:21:54 1998 +0200"
1437 "Sat Sep 07 12:21:54 1998 +0200")
1438 @result{} 5
1439
1440 (date-leap-year-p 2000)
1441 @result{} t
1442
1443 (time-to-day-in-year '(13818 19266))
1444 @result{} 255
1445
1446 (time-to-number-of-days
1447 (time-since
1448 (date-to-time "Mon, 01 Jan 2001 02:22:26 GMT")))
1449 @result{} 4.146122685185185
1450 @end example
1451
1452 And finally, we have @code{safe-date-to-time}, which does the same as
1453 @code{date-to-time}, but returns a zero time if the date is
1454 syntactically malformed.
1455
1456 The five data representations used are the following:
1457
1458 @table @var
1459 @item date
1460 An RFC822 (or similar) date string. For instance: @code{"Sat Sep 12
1461 12:21:54 1998 +0200"}.
1462
1463 @item time
1464 An internal Emacs time. For instance: @code{(13818 26466)}.
1465
1466 @item seconds
1467 A floating point representation of the internal Emacs time. For
1468 instance: @code{905595714.0}.
1469
1470 @item days
1471 An integer number representing the number of days since 00000101. For
1472 instance: @code{729644}.
1473
1474 @item decoded time
1475 A list of decoded time. For instance: @code{(54 21 12 12 9 1998 6 t
1476 7200)}.
1477 @end table
1478
1479 All the examples above represent the same moment.
1480
1481 These are the functions available:
1482
1483 @table @code
1484 @item date-to-time
1485 Take a date and return a time.
1486
1487 @item time-to-seconds
1488 Take a time and return seconds.
1489
1490 @item seconds-to-time
1491 Take seconds and return a time.
1492
1493 @item time-to-days
1494 Take a time and return days.
1495
1496 @item days-to-time
1497 Take days and return a time.
1498
1499 @item date-to-day
1500 Take a date and return days.
1501
1502 @item time-to-number-of-days
1503 Take a time and return the number of days that represents.
1504
1505 @item safe-date-to-time
1506 Take a date and return a time. If the date is not syntactically valid,
1507 return a ``zero'' date.
1508
1509 @item time-less-p
1510 Take two times and say whether the first time is less (i. e., earlier)
1511 than the second time.
1512
1513 @item time-since
1514 Take a time and return a time saying how long it was since that time.
1515
1516 @item subtract-time
1517 Take two times and subtract the second from the first. I. e., return
1518 the time between the two times.
1519
1520 @item days-between
1521 Take two days and return the number of days between those two days.
1522
1523 @item date-leap-year-p
1524 Take a year number and say whether it's a leap year.
1525
1526 @item time-to-day-in-year
1527 Take a time and return the day number within the year that the time is
1528 in.
1529
1530 @end table
1531
1532
1533 @node qp
1534 @section qp
1535
1536 This library deals with decoding and encoding Quoted-Printable text.
1537
1538 Very briefly explained, qp encoding means translating all 8-bit
1539 characters (and lots of control characters) into things that look like
1540 @samp{=EF}; that is, an equal sign followed by the byte encoded as a hex
1541 string.
1542
1543 The following functions are defined by the library:
1544
1545 @table @code
1546 @item quoted-printable-decode-region
1547 @findex quoted-printable-decode-region
1548 QP-decode all the encoded text in the specified region.
1549
1550 @item quoted-printable-decode-string
1551 @findex quoted-printable-decode-string
1552 Decode the QP-encoded text in a string and return the results.
1553
1554 @item quoted-printable-encode-region
1555 @findex quoted-printable-encode-region
1556 QP-encode all the encodable characters in the specified region. The third
1557 optional parameter @var{fold} specifies whether to fold long lines.
1558 (Long here means 72.)
1559
1560 @item quoted-printable-encode-string
1561 @findex quoted-printable-encode-string
1562 QP-encode all the encodable characters in a string and return the
1563 results.
1564
1565 @end table
1566
1567
1568 @node base64
1569 @section base64
1570 @cindex base64
1571
1572 Base64 is an encoding that encodes three bytes into four characters,
1573 thereby increasing the size by about 33%. The alphabet used for
1574 encoding is very resistant to mangling during transit.
1575
1576 The following functions are defined by this library:
1577
1578 @table @code
1579 @item base64-encode-region
1580 @findex base64-encode-region
1581 base64 encode the selected region. Return the length of the encoded
1582 text. Optional third argument @var{no-line-break} means do not break
1583 long lines into shorter lines.
1584
1585 @item base64-encode-string
1586 @findex base64-encode-string
1587 base64 encode a string and return the result.
1588
1589 @item base64-decode-region
1590 @findex base64-decode-region
1591 base64 decode the selected region. Return the length of the decoded
1592 text. If the region can't be decoded, return @code{nil} and don't
1593 modify the buffer.
1594
1595 @item base64-decode-string
1596 @findex base64-decode-string
1597 base64 decode a string and return the result. If the string can't be
1598 decoded, @code{nil} is returned.
1599
1600 @end table
1601
1602
1603 @node binhex
1604 @section binhex
1605 @cindex binhex
1606 @cindex Apple
1607 @cindex Macintosh
1608
1609 @code{binhex} is an encoding that originated in Macintosh environments.
1610 The following function is supplied to deal with these:
1611
1612 @table @code
1613 @item binhex-decode-region
1614 @findex binhex-decode-region
1615 Decode the encoded text in the region. If given a third parameter, only
1616 decode the @code{binhex} header and return the filename.
1617
1618 @end table
1619
1620 @node uudecode
1621 @section uudecode
1622 @cindex uuencode
1623 @cindex uudecode
1624
1625 @code{uuencode} is probably still the most popular encoding of binaries
1626 used on Usenet, although @code{base64} rules the mail world.
1627
1628 The following function is supplied by this package:
1629
1630 @table @code
1631 @item uudecode-decode-region
1632 @findex uudecode-decode-region
1633 Decode the text in the region.
1634 @end table
1635
1636
1637 @node yenc
1638 @section yenc
1639 @cindex yenc
1640
1641 @code{yenc} is used for encoding binaries on Usenet. The following
1642 function is supplied by this package:
1643
1644 @table @code
1645 @item yenc-decode-region
1646 @findex yenc-decode-region
1647 Decode the encoded text in the region.
1648
1649 @end table
1650
1651
1652 @node rfc1843
1653 @section rfc1843
1654 @cindex rfc1843
1655 @cindex HZ
1656 @cindex Chinese
1657
1658 RFC1843 deals with mixing Chinese and @acronym{ASCII} characters in messages. In
1659 essence, RFC1843 switches between @acronym{ASCII} and Chinese by doing this:
1660
1661 @example
1662 This sentence is in @acronym{ASCII}.
1663 The next sentence is in GB.~@{<:Ky2;S@{#,NpJ)l6HK!#~@}Bye.
1664 @end example
1665
1666 Simple enough, and widely used in China.
1667
1668 The following functions are available to handle this encoding:
1669
1670 @table @code
1671 @item rfc1843-decode-region
1672 Decode HZ-encoded text in the region.
1673
1674 @item rfc1843-decode-string
1675 Decode a HZ-encoded string and return the result.
1676
1677 @end table
1678
1679
1680 @node mailcap
1681 @section mailcap
1682
1683 The @file{~/.mailcap} file is parsed by most @acronym{MIME}-aware message
1684 handlers and describes how elements are supposed to be displayed.
1685 Here's an example file:
1686
1687 @example
1688 image/*; gimp -8 %s
1689 audio/wav; wavplayer %s
1690 application/msword; catdoc %s ; copiousoutput ; nametemplate=%s.doc
1691 @end example
1692
1693 This says that all image files should be displayed with @code{gimp},
1694 that WAVE audio files should be played by @code{wavplayer}, and that
1695 MS-WORD files should be inlined by @code{catdoc}.
1696
1697 The @code{mailcap} library parses this file, and provides functions for
1698 matching types.
1699
1700 @table @code
1701 @item mailcap-mime-data
1702 @vindex mailcap-mime-data
1703 This variable is an alist of alists containing backup viewing rules.
1704
1705 @end table
1706
1707 Interface functions:
1708
1709 @table @code
1710 @item mailcap-parse-mailcaps
1711 @findex mailcap-parse-mailcaps
1712 Parse the @file{~/.mailcap} file.
1713
1714 @item mailcap-mime-info
1715 Takes a @acronym{MIME} type as its argument and returns the matching viewer.
1716
1717 @end table
1718
1719
1720
1721
1313 @node Standards 1722 @node Standards
1314 @chapter Standards 1723 @chapter Standards
1315 1724
1316 The Emacs @sc{mime} library implements handling of various elements 1725 The Emacs @acronym{MIME} library implements handling of various elements
1317 according to a (somewhat) large number of RFCs, drafts and standards 1726 according to a (somewhat) large number of RFCs, drafts and standards
1318 documents. This chapter lists the relevant ones. They can all be 1727 documents. This chapter lists the relevant ones. They can all be
1319 fetched from @samp{http://quimby.gnus.org/notes/}. 1728 fetched from @uref{http://quimby.gnus.org/notes/}.
1320 1729
1321 @table @dfn 1730 @table @dfn
1322 @item RFC822 1731 @item RFC822
1323 @itemx STD11 1732 @itemx STD11
1324 Standard for the Format of ARPA Internet Text Messages. 1733 Standard for the Format of ARPA Internet Text Messages.
1325 1734
1326 @item RFC1036 1735 @item RFC1036
1327 Standard for Interchange of USENET Messages 1736 Standard for Interchange of USENET Messages
1328 1737
1329 @item RFC1524
1330 A User Agent Configuration Mechanism For Multimedia Mail Format
1331 Information
1332
1333 @item RFC2045 1738 @item RFC2045
1334 Format of Internet Message Bodies 1739 Format of Internet Message Bodies
1335 1740
1336 @item RFC2046 1741 @item RFC2046
1337 Media Types 1742 Media Types
1338 1743
1339 @item RFC2047 1744 @item RFC2047
1340 Message Header Extensions for Non-ASCII Text 1745 Message Header Extensions for Non-@acronym{ASCII} Text
1341 1746
1342 @item RFC2048 1747 @item RFC2048
1343 Registration Procedures 1748 Registration Procedures
1344 1749
1345 @item RFC2049 1750 @item RFC2049
1346 Conformance Criteria and Examples 1751 Conformance Criteria and Examples
1347 1752
1348 @item RFC2231 1753 @item RFC2231
1349 MIME Parameter Value and Encoded Word Extensions: Character Sets, 1754 @acronym{MIME} Parameter Value and Encoded Word Extensions: Character Sets,
1350 Languages, and Continuations 1755 Languages, and Continuations
1351 1756
1352 @item RFC1843 1757 @item RFC1843
1353 HZ - A Data Format for Exchanging Files of Arbitrarily Mixed Chinese and 1758 HZ - A Data Format for Exchanging Files of Arbitrarily Mixed Chinese and
1354 ASCII characters 1759 @acronym{ASCII} characters
1355 1760
1356 @item draft-ietf-drums-msg-fmt-05.txt 1761 @item draft-ietf-drums-msg-fmt-05.txt
1357 Draft for the successor of RFC822 1762 Draft for the successor of RFC822
1358 1763
1359 @item RFC2112 1764 @item RFC2112
1360 The MIME Multipart/Related Content-type 1765 The @acronym{MIME} Multipart/Related Content-type
1361 1766
1362 @item RFC1892 1767 @item RFC1892
1363 The Multipart/Report Content Type for the Reporting of Mail System 1768 The Multipart/Report Content Type for the Reporting of Mail System
1364 Administrative Messages 1769 Administrative Messages
1365 1770
1366 @item RFC2183 1771 @item RFC2183
1367 Communicating Presentation Information in Internet Messages: The 1772 Communicating Presentation Information in Internet Messages: The
1368 Content-Disposition Header Field 1773 Content-Disposition Header Field
1369 1774
1775 @item RFC2646
1776 Documentation of the text/plain format parameter for flowed text.
1777
1370 @end table 1778 @end table
1371 1779
1372 1780
1373 @node Index 1781 @node Index
1374 @chapter Index 1782 @chapter Index
1375 @printindex cp 1783 @printindex cp
1376 @printindex fn
1377 1784
1378 @summarycontents 1785 @summarycontents
1379 @contents 1786 @contents
1380 @bye 1787 @bye
1381 1788
1789
1790 @c Local Variables:
1791 @c mode: texinfo
1792 @c coding: iso-8859-1
1382 @c End: 1793 @c End:
1383 1794
1384 @ignore 1795 @ignore
1385 arch-tag: c7ef2fd0-a91c-4e10-aa52-c1a2b11b1a8d 1796 arch-tag: c7ef2fd0-a91c-4e10-aa52-c1a2b11b1a8d
1386 @end ignore 1797 @end ignore