Move here from ../../man
[bpt/emacs.git] / doc / misc / emacs-mime.texi
CommitLineData
4009494e
GM
1\input texinfo
2
3@setfilename ../info/emacs-mime
4@settitle Emacs MIME Manual
5@synindex fn cp
6@synindex vr cp
7@synindex pg cp
8
9@copying
10This file documents the Emacs MIME interface functionality.
11
12Copyright @copyright{} 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
132006, 2007 Free Software Foundation, Inc.
14
15@quotation
16Permission is granted to copy, distribute and/or modify this document
17under the terms of the GNU Free Documentation License, Version 1.2 or
18any later version published by the Free Software Foundation; with no
19Invariant Sections, with the Front-Cover texts being ``A GNU
20Manual'', and with the Back-Cover Texts as in (a) below. A copy of the
21license is included in the section entitled ``GNU Free Documentation
22License'' in the Emacs manual.
23
24(a) The FSF's Back-Cover Text is: ``You have freedom to copy and modify
25this GNU Manual, like GNU software. Copies published by the Free
26Software Foundation raise funds for GNU development.''
27
28This document is part of a collection distributed under the GNU Free
29Documentation License. If you want to distribute this document
30separately from the collection, you can do so by adding a copy of the
31license to the document, as described in section 6 of the license.
32@end quotation
33@end copying
34
35@c Node ``Interface Functions'' uses Latin-1 characters
36@documentencoding ISO-8859-1
37
38@dircategory Emacs
39@direntry
40* Emacs MIME: (emacs-mime). Emacs MIME de/composition library.
41@end direntry
42@iftex
43@finalout
44@end iftex
45@setchapternewpage odd
46
47@titlepage
48@title Emacs MIME Manual
49
50@author by Lars Magne Ingebrigtsen
51@page
52@vskip 0pt plus 1filll
53@insertcopying
54@end titlepage
55
56@node Top
57@top Emacs MIME
58
59This manual documents the libraries used to compose and display
60@acronym{MIME} messages.
61
62This manual is directed at users who want to modify the behavior of
63the @acronym{MIME} encoding/decoding process or want a more detailed
64picture of how the Emacs @acronym{MIME} library works, and people who want
65to write functions and commands that manipulate @acronym{MIME} elements.
66
67@acronym{MIME} is short for @dfn{Multipurpose Internet Mail Extensions}.
68This standard is documented in a number of RFCs; mainly RFC2045 (Format
69of Internet Message Bodies), RFC2046 (Media Types), RFC2047 (Message
70Header Extensions for Non-@acronym{ASCII} Text), RFC2048 (Registration
71Procedures), RFC2049 (Conformance Criteria and Examples). It is highly
72recommended that anyone who intends writing @acronym{MIME}-compliant software
73read at least RFC2045 and RFC2047.
74
75@menu
76* Decoding and Viewing:: A framework for decoding and viewing.
77* Composing:: @acronym{MML}; a language for describing @acronym{MIME} parts.
78* Interface Functions:: An abstraction over the basic functions.
79* Basic Functions:: Utility and basic parsing functions.
80* Standards:: A summary of RFCs and working documents used.
81* GNU Free Documentation License:: The license for this documentation.
82* Index:: Function and variable index.
83@end menu
84
85
86@node Decoding and Viewing
87@chapter Decoding and Viewing
88
89This chapter deals with decoding and viewing @acronym{MIME} messages on a
90higher level.
91
92The main idea is to first analyze a @acronym{MIME} article, and then allow
93other programs to do things based on the list of @dfn{handles} that are
94returned as a result of this analysis.
95
96@menu
97* Dissection:: Analyzing a @acronym{MIME} message.
98* Non-MIME:: Analyzing a non-@acronym{MIME} message.
99* Handles:: Handle manipulations.
100* Display:: Displaying handles.
101* Display Customization:: Variables that affect display.
102* Files and Directories:: Saving and naming attachments.
103* New Viewers:: How to write your own viewers.
104@end menu
105
106
107@node Dissection
108@section Dissection
109
110The @code{mm-dissect-buffer} is the function responsible for dissecting
111a @acronym{MIME} article. If given a multipart message, it will recursively
112descend the message, following the structure, and return a tree of
113@acronym{MIME} handles that describes the structure of the message.
114
115@node Non-MIME
116@section Non-MIME
117@vindex mm-uu-configure-list
118
119Gnus also understands some non-@acronym{MIME} attachments, such as
120postscript, uuencode, binhex, yenc, shar, forward, gnatsweb, pgp,
121diff. Each of these features can be disabled by add an item into
122@code{mm-uu-configure-list}. For example,
123
124@lisp
125(require 'mm-uu)
126(add-to-list 'mm-uu-configure-list '(pgp-signed . disabled))
127@end lisp
128
129@table @code
130@item postscript
131@findex postscript
132PostScript file.
133
134@item uu
135@findex uu
136Uuencoded file.
137
138@item binhex
139@findex binhex
140Binhex encoded file.
141
142@item yenc
143@findex yenc
144Yenc encoded file.
145
146@item shar
147@findex shar
148Shar archive file.
149
150@item forward
151@findex forward
152Non-@acronym{MIME} forwarded message.
153
154@item gnatsweb
155@findex gnatsweb
156Gnatsweb attachment.
157
158@item pgp-signed
159@findex pgp-signed
160@acronym{PGP} signed clear text.
161
162@item pgp-encrypted
163@findex pgp-encrypted
164@acronym{PGP} encrypted clear text.
165
166@item pgp-key
167@findex pgp-key
168@acronym{PGP} public keys.
169
170@item emacs-sources
171@findex emacs-sources
172@vindex mm-uu-emacs-sources-regexp
173Emacs source code. This item works only in the groups matching
174@code{mm-uu-emacs-sources-regexp}.
175
176@item diff
177@vindex diff
178@vindex mm-uu-diff-groups-regexp
179Patches. This is intended for groups where diffs of committed files
180are automatically sent to. It only works in groups matching
181@code{mm-uu-diff-groups-regexp}.
182
183@end table
184
185@node Handles
186@section Handles
187
188A @acronym{MIME} handle is a list that fully describes a @acronym{MIME}
189component.
190
191The following macros can be used to access elements in a handle:
192
193@table @code
194@item mm-handle-buffer
195@findex mm-handle-buffer
196Return the buffer that holds the contents of the undecoded @acronym{MIME}
197part.
198
199@item mm-handle-type
200@findex mm-handle-type
201Return the parsed @code{Content-Type} of the part.
202
203@item mm-handle-encoding
204@findex mm-handle-encoding
205Return the @code{Content-Transfer-Encoding} of the part.
206
207@item mm-handle-undisplayer
208@findex mm-handle-undisplayer
209Return the object that can be used to remove the displayed part (if it
210has been displayed).
211
212@item mm-handle-set-undisplayer
213@findex mm-handle-set-undisplayer
214Set the undisplayer object.
215
216@item mm-handle-disposition
217@findex mm-handle-disposition
218Return the parsed @code{Content-Disposition} of the part.
219
220@item mm-get-content-id
221Returns the handle(s) referred to by @code{Content-ID}.
222
223@end table
224
225
226@node Display
227@section Display
228
229Functions for displaying, removing and saving.
230
231@table @code
232@item mm-display-part
233@findex mm-display-part
234Display the part.
235
236@item mm-remove-part
237@findex mm-remove-part
238Remove the part (if it has been displayed).
239
240@item mm-inlinable-p
241@findex mm-inlinable-p
242Say whether a @acronym{MIME} type can be displayed inline.
243
244@item mm-automatic-display-p
245@findex mm-automatic-display-p
246Say whether a @acronym{MIME} type should be displayed automatically.
247
248@item mm-destroy-part
249@findex mm-destroy-part
250Free all resources occupied by a part.
251
252@item mm-save-part
253@findex mm-save-part
254Offer to save the part in a file.
255
256@item mm-pipe-part
257@findex mm-pipe-part
258Offer to pipe the part to some process.
259
260@item mm-interactively-view-part
261@findex mm-interactively-view-part
262Prompt for a mailcap method to use to view the part.
263
264@end table
265
266
267@node Display Customization
268@section Display Customization
269
270@table @code
271
272@item mm-inline-media-tests
273@vindex mm-inline-media-tests
274This is an alist where the key is a @acronym{MIME} type, the second element
275is a function to display the part @dfn{inline} (i.e., inside Emacs), and
276the third element is a form to be @code{eval}ed to say whether the part
277can be displayed inline.
278
279This variable specifies whether a part @emph{can} be displayed inline,
280and, if so, how to do it. It does not say whether parts are
281@emph{actually} displayed inline.
282
283@item mm-inlined-types
284@vindex mm-inlined-types
285This, on the other hand, says what types are to be displayed inline, if
286they satisfy the conditions set by the variable above. It's a list of
287@acronym{MIME} media types.
288
289@item mm-automatic-display
290@vindex mm-automatic-display
291This is a list of types that are to be displayed ``automatically'', but
292only if the above variable allows it. That is, only inlinable parts can
293be displayed automatically.
294
295@item mm-automatic-external-display
296@vindex mm-automatic-external-display
297This is a list of types that will be displayed automatically in an
298external viewer.
299
300@item mm-keep-viewer-alive-types
301@vindex mm-keep-viewer-alive-types
302This is a list of media types for which the external viewer will not
303be killed when selecting a different article.
304
305@item mm-attachment-override-types
306@vindex mm-attachment-override-types
307Some @acronym{MIME} agents create parts that have a content-disposition of
308@samp{attachment}. This variable allows overriding that disposition and
309displaying the part inline. (Note that the disposition is only
310overridden if we are able to, and want to, display the part inline.)
311
312@item mm-discouraged-alternatives
313@vindex mm-discouraged-alternatives
314List of @acronym{MIME} types that are discouraged when viewing
315@samp{multipart/alternative}. Viewing agents are supposed to view the
316last possible part of a message, as that is supposed to be the richest.
317However, users may prefer other types instead, and this list says what
318types are most unwanted. If, for instance, @samp{text/html} parts are
319very unwanted, and @samp{text/richtext} parts are somewhat unwanted,
320you could say something like:
321
322@lisp
323(setq mm-discouraged-alternatives
324 '("text/html" "text/richtext")
325 mm-automatic-display
326 (remove "text/html" mm-automatic-display))
327@end lisp
328
329Adding @code{"image/.*"} might also be useful. Spammers use images as
330the preferred part of @samp{multipart/alternative} messages, so you might
331not notice there are other parts. See also
332@code{gnus-buttonized-mime-types}, @ref{MIME Commands, ,MIME Commands,
333gnus, Gnus Manual}. After adding @code{"multipart/alternative"} to
334@code{gnus-buttonized-mime-types} you can choose manually which
335alternative you'd like to view. For example, you can set those
336variables like:
337
338@lisp
339(setq gnus-buttonized-mime-types
340 '("multipart/alternative" "multipart/signed")
341 mm-discouraged-alternatives
342 '("text/html" "image/.*"))
343@end lisp
344
345In this case, Gnus will display radio buttons for such a kind of spam
346message as follows:
347
348@example
3491. (*) multipart/alternative ( ) image/gif
350
3512. (*) text/plain ( ) text/html
352@end example
353
354@item mm-inline-large-images
355@vindex mm-inline-large-images
356When displaying inline images that are larger than the window, Emacs
357does not enable scrolling, which means that you cannot see the whole
358image. To prevent this, the library tries to determine the image size
359before displaying it inline, and if it doesn't fit the window, the
360library will display it externally (e.g. with @samp{ImageMagick} or
361@samp{xv}). Setting this variable to @code{t} disables this check and
362makes the library display all inline images as inline, regardless of
363their size.
364
365@item mm-inline-override-types
366@vindex mm-inline-override-types
367@code{mm-inlined-types} may include regular expressions, for example to
368specify that all @samp{text/.*} parts be displayed inline. If a user
369prefers to have a type that matches such a regular expression be treated
370as an attachment, that can be accomplished by setting this variable to a
371list containing that type. For example assuming @code{mm-inlined-types}
372includes @samp{text/.*}, then including @samp{text/html} in this
373variable will cause @samp{text/html} parts to be treated as attachments.
374
375@item mm-text-html-renderer
376@vindex mm-text-html-renderer
377This selects the function used to render @acronym{HTML}. The predefined
378renderers are selected by the symbols @code{w3},
379@code{w3m}@footnote{See @uref{http://emacs-w3m.namazu.org/} for more
380information about emacs-w3m}, @code{links}, @code{lynx},
381@code{w3m-standalone} or @code{html2text}. If @code{nil} use an
382external viewer. You can also specify a function, which will be
383called with a @acronym{MIME} handle as the argument.
384
385@item mm-inline-text-html-with-images
386@vindex mm-inline-text-html-with-images
387Some @acronym{HTML} mails might have the trick of spammers using
388@samp{<img>} tags. It is likely to be intended to verify whether you
389have read the mail. You can prevent your personal informations from
390leaking by setting this option to @code{nil} (which is the default).
391It is currently ignored by Emacs/w3. For emacs-w3m, you may use the
392command @kbd{t} on the image anchor to show an image even if it is
393@code{nil}.@footnote{The command @kbd{T} will load all images. If you
394have set the option @code{w3m-key-binding} to @code{info}, use @kbd{i}
395or @kbd{I} instead.}
396
397@item mm-w3m-safe-url-regexp
398@vindex mm-w3m-safe-url-regexp
399A regular expression that matches safe URL names, i.e. URLs that are
400unlikely to leak personal information when rendering @acronym{HTML}
401email (the default value is @samp{\\`cid:}). If @code{nil} consider
402all URLs safe.
403
404@item mm-inline-text-html-with-w3m-keymap
405@vindex mm-inline-text-html-with-w3m-keymap
406You can use emacs-w3m command keys in the inlined text/html part by
407setting this option to non-@code{nil}. The default value is @code{t}.
408
409@item mm-external-terminal-program
410@vindex mm-external-terminal-program
411The program used to start an external terminal.
412
413@item mm-enable-external
414@vindex mm-enable-external
415Indicate whether external @acronym{MIME} handlers should be used.
416
417If @code{t}, all defined external @acronym{MIME} handlers are used. If
418@code{nil}, files are saved to disk (@code{mailcap-save-binary-file}).
419If it is the symbol @code{ask}, you are prompted before the external
420@acronym{MIME} handler is invoked.
421
422When you launch an attachment through mailcap (@pxref{mailcap}) an
423attempt is made to use a safe viewer with the safest options---this isn't
424the case if you save it to disk and launch it in a different way
425(command line or double-clicking). Anyhow, if you want to be sure not
426to launch any external programs, set this variable to @code{nil} or
427@code{ask}.
428
429@end table
430
431@node Files and Directories
432@section Files and Directories
433
434@table @code
435
436@item mm-default-directory
437@vindex mm-default-directory
438The default directory for saving attachments. If @code{nil} use
439@code{default-directory}.
440
441@item mm-tmp-directory
442@vindex mm-tmp-directory
443Directory for storing temporary files.
444
445@item mm-file-name-rewrite-functions
446@vindex mm-file-name-rewrite-functions
447A list of functions used for rewriting file names of @acronym{MIME}
448parts. Each function is applied successively to the file name.
449Ready-made functions include
450
451@table @code
452@item mm-file-name-delete-control
453@findex mm-file-name-delete-control
454Delete all control characters.
455
456@item mm-file-name-delete-gotchas
457@findex mm-file-name-delete-gotchas
458Delete characters that could have unintended consequences when used
459with flawed shell scripts, i.e. @samp{|}, @samp{>} and @samp{<}; and
460@samp{-}, @samp{.} as the first character.
461
462@item mm-file-name-delete-whitespace
463@findex mm-file-name-delete-whitespace
464Remove all whitespace.
465
466@item mm-file-name-trim-whitespace
467@findex mm-file-name-trim-whitespace
468Remove leading and trailing whitespace.
469
470@item mm-file-name-collapse-whitespace
471@findex mm-file-name-collapse-whitespace
472Collapse multiple whitespace characters.
473
474@item mm-file-name-replace-whitespace
475@findex mm-file-name-replace-whitespace
476@vindex mm-file-name-replace-whitespace
477Replace whitespace with underscores. Set the variable
478@code{mm-file-name-replace-whitespace} to any other string if you do
479not like underscores.
480@end table
481
482The standard Emacs functions @code{capitalize}, @code{downcase},
483@code{upcase} and @code{upcase-initials} might also prove useful.
484
485@item mm-path-name-rewrite-functions
486@vindex mm-path-name-rewrite-functions
487List of functions used for rewriting the full file names of @acronym{MIME}
488parts. This is used when viewing parts externally, and is meant for
489transforming the absolute name so that non-compliant programs can find
490the file where it's saved.
491
492@end table
493
494@node New Viewers
495@section New Viewers
496
497Here's an example viewer for displaying @code{text/enriched} inline:
498
499@lisp
500(defun mm-display-enriched-inline (handle)
501 (let (text)
502 (with-temp-buffer
503 (mm-insert-part handle)
504 (save-window-excursion
505 (enriched-decode (point-min) (point-max))
506 (setq text (buffer-string))))
507 (mm-insert-inline handle text)))
508@end lisp
509
510We see that the function takes a @acronym{MIME} handle as its parameter. It
511then goes to a temporary buffer, inserts the text of the part, does some
512work on the text, stores the result, goes back to the buffer it was
513called from and inserts the result.
514
515The two important helper functions here are @code{mm-insert-part} and
516@code{mm-insert-inline}. The first function inserts the text of the
517handle in the current buffer. It handles charset and/or content
518transfer decoding. The second function just inserts whatever text you
519tell it to insert, but it also sets things up so that the text can be
520``undisplayed'' in a convenient manner.
521
522
523@node Composing
524@chapter Composing
525@cindex Composing
526@cindex MIME Composing
527@cindex MML
528@cindex MIME Meta Language
529
530Creating a @acronym{MIME} message is boring and non-trivial. Therefore,
531a library called @code{mml} has been defined that parses a language
532called @acronym{MML} (@acronym{MIME} Meta Language) and generates
533@acronym{MIME} messages.
534
535@findex mml-generate-mime
536The main interface function is @code{mml-generate-mime}. It will
537examine the contents of the current (narrowed-to) buffer and return a
538string containing the @acronym{MIME} message.
539
540@menu
541* Simple MML Example:: An example @acronym{MML} document.
542* MML Definition:: All valid @acronym{MML} elements.
543* Advanced MML Example:: Another example @acronym{MML} document.
544* Encoding Customization:: Variables that affect encoding.
545* Charset Translation:: How charsets are mapped from @sc{mule} to @acronym{MIME}.
546* Conversion:: Going from @acronym{MIME} to @acronym{MML} and vice versa.
547* Flowed text:: Soft and hard newlines.
548@end menu
549
550
551@node Simple MML Example
552@section Simple MML Example
553
554Here's a simple @samp{multipart/alternative}:
555
556@example
557<#multipart type=alternative>
558This is a plain text part.
559<#part type=text/enriched>
560<center>This is a centered enriched part</center>
561<#/multipart>
562@end example
563
564After running this through @code{mml-generate-mime}, we get this:
565
566@example
567Content-Type: multipart/alternative; boundary="=-=-="
568
569
570--=-=-=
571
572
573This is a plain text part.
574
575--=-=-=
576Content-Type: text/enriched
577
578
579<center>This is a centered enriched part</center>
580
581--=-=-=--
582@end example
583
584
585@node MML Definition
586@section MML Definition
587
588The @acronym{MML} language is very simple. It looks a bit like an SGML
589application, but it's not.
590
591The main concept of @acronym{MML} is the @dfn{part}. Each part can be of a
592different type or use a different charset. The way to delineate a part
593is with a @samp{<#part ...>} tag. Multipart parts can be introduced
594with the @samp{<#multipart ...>} tag. Parts are ended by the
595@samp{<#/part>} or @samp{<#/multipart>} tags. Parts started with the
596@samp{<#part ...>} tags are also closed by the next open tag.
597
598There's also the @samp{<#external ...>} tag. These introduce
599@samp{external/message-body} parts.
600
601Each tag can contain zero or more parameters on the form
602@samp{parameter=value}. The values may be enclosed in quotation marks,
603but that's not necessary unless the value contains white space. So
604@samp{filename=/home/user/#hello$^yes} is perfectly valid.
605
606The following parameters have meaning in @acronym{MML}; parameters that have no
607meaning are ignored. The @acronym{MML} parameter names are the same as the
608@acronym{MIME} parameter names; the things in the parentheses say which
609header it will be used in.
610
611@table @samp
612@item type
613The @acronym{MIME} type of the part (@code{Content-Type}).
614
615@item filename
616Use the contents of the file in the body of the part
617(@code{Content-Disposition}).
618
619@item charset
620The contents of the body of the part are to be encoded in the character
621set specified (@code{Content-Type}). @xref{Charset Translation}.
622
623@item name
624Might be used to suggest a file name if the part is to be saved
625to a file (@code{Content-Type}).
626
627@item disposition
628Valid values are @samp{inline} and @samp{attachment}
629(@code{Content-Disposition}).
630
631@item encoding
632Valid values are @samp{7bit}, @samp{8bit}, @samp{quoted-printable} and
633@samp{base64} (@code{Content-Transfer-Encoding}). @xref{Charset
634Translation}.
635
636@item description
637A description of the part (@code{Content-Description}).
638
639@item creation-date
640RFC822 date when the part was created (@code{Content-Disposition}).
641
642@item modification-date
643RFC822 date when the part was modified (@code{Content-Disposition}).
644
645@item read-date
646RFC822 date when the part was read (@code{Content-Disposition}).
647
648@item recipients
649Who to encrypt/sign the part to. This field is used to override any
650auto-detection based on the To/CC headers.
651
652@item sender
653Identity used to sign the part. This field is used to override the
654default key used.
655
656@item size
657The size (in octets) of the part (@code{Content-Disposition}).
658
659@item sign
660What technology to sign this @acronym{MML} part with (@code{smime}, @code{pgp}
661or @code{pgpmime})
662
663@item encrypt
664What technology to encrypt this @acronym{MML} part with (@code{smime},
665@code{pgp} or @code{pgpmime})
666
667@end table
668
669Parameters for @samp{text/plain}:
670
671@table @samp
672@item format
673Formatting parameter for the text, valid values include @samp{fixed}
674(the default) and @samp{flowed}. Normally you do not specify this
675manually, since it requires the textual body to be formatted in a
676special way described in RFC 2646. @xref{Flowed text}.
677@end table
678
679Parameters for @samp{application/octet-stream}:
680
681@table @samp
682@item type
683Type of the part; informal---meant for human readers
684(@code{Content-Type}).
685@end table
686
687Parameters for @samp{message/external-body}:
688
689@table @samp
690@item access-type
691A word indicating the supported access mechanism by which the file may
692be obtained. Values include @samp{ftp}, @samp{anon-ftp}, @samp{tftp},
693@samp{localfile}, and @samp{mailserver}. (@code{Content-Type}.)
694
695@item expiration
696The RFC822 date after which the file may no longer be fetched.
697(@code{Content-Type}.)
698
699@item size
700The size (in octets) of the file. (@code{Content-Type}.)
701
702@item permission
703Valid values are @samp{read} and @samp{read-write}
704(@code{Content-Type}).
705
706@end table
707
708Parameters for @samp{sign=smime}:
709
710@table @samp
711
712@item keyfile
713File containing key and certificate for signer.
714
715@end table
716
717Parameters for @samp{encrypt=smime}:
718
719@table @samp
720
721@item certfile
722File containing certificate for recipient.
723
724@end table
725
726
727@node Advanced MML Example
728@section Advanced MML Example
729
730Here's a complex multipart message. It's a @samp{multipart/mixed} that
731contains many parts, one of which is a @samp{multipart/alternative}.
732
733@example
734<#multipart type=mixed>
735<#part type=image/jpeg filename=~/rms.jpg disposition=inline>
736<#multipart type=alternative>
737This is a plain text part.
738<#part type=text/enriched name=enriched.txt>
739<center>This is a centered enriched part</center>
740<#/multipart>
741This is a new plain text part.
742<#part disposition=attachment>
743This plain text part is an attachment.
744<#/multipart>
745@end example
746
747And this is the resulting @acronym{MIME} message:
748
749@example
750Content-Type: multipart/mixed; boundary="=-=-="
751
752
753--=-=-=
754
755
756
757--=-=-=
758Content-Type: image/jpeg;
759 filename="~/rms.jpg"
760Content-Disposition: inline;
761 filename="~/rms.jpg"
762Content-Transfer-Encoding: base64
763
764/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRof
765Hh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAwADABAREA/8QAHwAA
766AQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQR
767BRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RF
768RkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ip
769qrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEB
770AAA/AO/rifFHjldNuGsrDa0qcSSHkA+gHrXKw+LtWLrMb+RgTyhbr+HSug07xNqV9fQtZrNI
771AyiaE/NuBPOOOP0rvRNE880KOC8TbXXGCv1FPqjrF4LDR7u5L7SkTFT/ALWOP1xXgTuXfc7E
772sx6nua6rwp4IvvEM8chCxWxOdzn7wz6V9AaB4S07w9p5itow0rDLSY5Pt9K43xO66P4xs71m
7732QXiGCbA4yOVJ9+1aYORkdK434lyNH4ahCnG66VT9Nj15JFbPdX0MS43M4VQf5/yr2vSpLnw
7745ZW8dlCZ8KFXjOPX0/mK6rSPEGt3Angu44fNEReHYNvIH3TzXDeKNO8RX+kSX2ouZkicTIOc
775L+g7E810ulFjpVtv3bwgB3HJyK5L4quY/C9sVxk3ij/xx6850u7t1mtp/wDlpEw3An3Jr3Dw
77634gsbWza4nBlhC5LDsaW6+IFgupQyCF3iHH7gA7c9R9ay7zx6t7aX9jHC4smhfBkGCvHGfrm
777tLQ7hbnRrV1GPkAP1x1/Hr+Ncr8Vzjwrbf8AX6v/AKA9eQRyYlQk8Yx9K6XTNbkgia2ciSIn
7787p5Ga9Atte0LTLKO6it4i7dVRFJDcZ4PvXN+JvEMF9bILVGXJLSZ4zkjivRPDaeX4b08HOTC
779pOffmua+KkbS+GLVUGT9tT/0B68eeIpIFYjB70+OOVXyoOM9+M1eaWeCLzHPyHGO/NVWvJJm
780jQ8KGH1NfQWhXSXmh2c8eArRLwO3HSv/2Q==
781
782--=-=-=
783Content-Type: multipart/alternative; boundary="==-=-="
784
785
786--==-=-=
787
788
789This is a plain text part.
790
791--==-=-=
792Content-Type: text/enriched;
793 name="enriched.txt"
794
795
796<center>This is a centered enriched part</center>
797
798--==-=-=--
799
800--=-=-=
801
802This is a new plain text part.
803
804--=-=-=
805Content-Disposition: attachment
806
807
808This plain text part is an attachment.
809
810--=-=-=--
811@end example
812
813@node Encoding Customization
814@section Encoding Customization
815
816@table @code
817
818@item mm-body-charset-encoding-alist
819@vindex mm-body-charset-encoding-alist
820Mapping from @acronym{MIME} charset to encoding to use. This variable is
821usually used except, e.g., when other requirements force a specific
822encoding (digitally signed messages require 7bit encodings). The
823default is
824
825@lisp
826((iso-2022-jp . 7bit)
827 (iso-2022-jp-2 . 7bit)
828 (utf-16 . base64)
829 (utf-16be . base64)
830 (utf-16le . base64))
831@end lisp
832
833As an example, if you do not want to have ISO-8859-1 characters
834quoted-printable encoded, you may add @code{(iso-8859-1 . 8bit)} to
835this variable. You can override this setting on a per-message basis
836by using the @code{encoding} @acronym{MML} tag (@pxref{MML Definition}).
837
838@item mm-coding-system-priorities
839@vindex mm-coding-system-priorities
840Prioritize coding systems to use for outgoing messages. The default
841is @code{nil}, which means to use the defaults in Emacs, but is
842@code{(iso-8859-1 iso-2022-jp iso-2022-jp-2 shift_jis utf-8)} when
843running Emacs in the Japanese language environment. It is a list of
844coding system symbols (aliases of coding systems are also allowed, use
845@kbd{M-x describe-coding-system} to make sure you are specifying correct
846coding system names). For example, if you have configured Emacs
847to prefer UTF-8, but wish that outgoing messages should be sent in
848ISO-8859-1 if possible, you can set this variable to
849@code{(iso-8859-1)}. You can override this setting on a per-message
850basis by using the @code{charset} @acronym{MML} tag (@pxref{MML Definition}).
851
852@item mm-content-transfer-encoding-defaults
853@vindex mm-content-transfer-encoding-defaults
854Mapping from @acronym{MIME} types to encoding to use. This variable is usually
855used except, e.g., when other requirements force a safer encoding
856(digitally signed messages require 7bit encoding). Besides the normal
857@acronym{MIME} encodings, @code{qp-or-base64} may be used to indicate that for
858each case the most efficient of quoted-printable and base64 should be
859used.
860
861@code{qp-or-base64} has another effect. It will fold long lines so that
862MIME parts may not be broken by MTA. So do @code{quoted-printable} and
863@code{base64}.
864
865Note that it affects body encoding only when a part is a raw forwarded
866message (which will be made by @code{gnus-summary-mail-forward} with the
867arg 2 for example) or is neither the @samp{text/*} type nor the
868@samp{message/*} type. Even though in those cases, you can override
869this setting on a per-message basis by using the @code{encoding}
870@acronym{MML} tag (@pxref{MML Definition}).
871
872@item mm-use-ultra-safe-encoding
873@vindex mm-use-ultra-safe-encoding
874When this is non-@code{nil}, it means that textual parts are encoded as
875quoted-printable if they contain lines longer than 76 characters or
876starting with "From " in the body. Non-7bit encodings (8bit, binary)
877are generally disallowed. This reduce the probability that a non-8bit
878clean MTA or MDA changes the message. This should never be set
879directly, but bound by other functions when necessary (e.g., when
880encoding messages that are to be digitally signed).
881
882@end table
883
884@node Charset Translation
885@section Charset Translation
886@cindex charsets
887
888During translation from @acronym{MML} to @acronym{MIME}, for each
889@acronym{MIME} part which has been composed inside Emacs, an appropriate
890charset has to be chosen.
891
892@vindex mail-parse-charset
893If you are running a non-@sc{mule} Emacs, this process is simple: If the
894part contains any non-@acronym{ASCII} (8-bit) characters, the @acronym{MIME} charset
895given by @code{mail-parse-charset} (a symbol) is used. (Never set this
896variable directly, though. If you want to change the default charset,
897please consult the documentation of the package which you use to process
898@acronym{MIME} messages.
899@xref{Various Message Variables, , Various Message Variables, message,
900 Message Manual}, for example.)
901If there are only @acronym{ASCII} characters, the @acronym{MIME} charset US-ASCII is
902used, of course.
903
904@cindex MULE
905@cindex UTF-8
906@cindex Unicode
907@vindex mm-mime-mule-charset-alist
908Things are slightly more complicated when running Emacs with @sc{mule}
909support. In this case, a list of the @sc{mule} charsets used in the
910part is obtained, and the @sc{mule} charsets are translated to
911@acronym{MIME} charsets by consulting the table provided by Emacs itself
912or the variable @code{mm-mime-mule-charset-alist} for XEmacs.
913If this results in a single @acronym{MIME} charset, this is used to encode
914the part. But if the resulting list of @acronym{MIME} charsets contains more
915than one element, two things can happen: If it is possible to encode the
916part via UTF-8, this charset is used. (For this, Emacs must support
917the @code{utf-8} coding system, and the part must consist entirely of
918characters which have Unicode counterparts.) If UTF-8 is not available
919for some reason, the part is split into several ones, so that each one
920can be encoded with a single @acronym{MIME} charset. The part can only be
921split at line boundaries, though---if more than one @acronym{MIME} charset is
922required to encode a single line, it is not possible to encode the part.
923
924When running Emacs with @sc{mule} support, the preferences for which
925coding system to use is inherited from Emacs itself. This means that
926if Emacs is set up to prefer UTF-8, it will be used when encoding
927messages. You can modify this by altering the
928@code{mm-coding-system-priorities} variable though (@pxref{Encoding
929Customization}).
930
931The charset to be used can be overridden by setting the @code{charset}
932@acronym{MML} tag (@pxref{MML Definition}) when composing the message.
933
934The encoding of characters (quoted-printable, 8bit etc) is orthogonal
935to the discussion here, and is controlled by the variables
936@code{mm-body-charset-encoding-alist} and
937@code{mm-content-transfer-encoding-defaults} (@pxref{Encoding
938Customization}).
939
940@node Conversion
941@section Conversion
942
943@findex mime-to-mml
944A (multipart) @acronym{MIME} message can be converted to @acronym{MML}
945with the @code{mime-to-mml} function. It works on the message in the
946current buffer, and substitutes @acronym{MML} markup for @acronym{MIME}
947boundaries. Non-textual parts do not have their contents in the buffer,
948but instead have the contents in separate buffers that are referred to
949from the @acronym{MML} tags.
950
951@findex mml-to-mime
952An @acronym{MML} message can be converted back to @acronym{MIME} by the
953@code{mml-to-mime} function.
954
955These functions are in certain senses ``lossy''---you will not get back
956an identical message if you run @code{mime-to-mml} and then
957@code{mml-to-mime}. Not only will trivial things like the order of the
958headers differ, but the contents of the headers may also be different.
959For instance, the original message may use base64 encoding on text,
960while @code{mml-to-mime} may decide to use quoted-printable encoding, and
961so on.
962
963In essence, however, these two functions should be the inverse of each
964other. The resulting contents of the message should remain equivalent,
965if not identical.
966
967
968@node Flowed text
969@section Flowed text
970@cindex format=flowed
971
972The Emacs @acronym{MIME} library will respect the @code{use-hard-newlines}
973variable (@pxref{Hard and Soft Newlines, ,Hard and Soft Newlines,
974emacs, Emacs Manual}) when encoding a message, and the
975``format=flowed'' Content-Type parameter when decoding a message.
976
977On encoding text, regardless of @code{use-hard-newlines}, lines
978terminated by soft newline characters are filled together and wrapped
979after the column decided by @code{fill-flowed-encode-column}.
980Quotation marks (matching @samp{^>* ?}) are respected. The variable
981controls how the text will look in a client that does not support
982flowed text, the default is to wrap after 66 characters. If hard
983newline characters are not present in the buffer, no flow encoding
984occurs.
985
986On decoding flowed text, lines with soft newline characters are filled
987together and wrapped after the column decided by
988@code{fill-flowed-display-column}. The default is to wrap after
989@code{fill-column}.
990
991@table @code
992@item mm-fill-flowed
993@vindex mm-fill-flowed
994If non-@code{nil} a format=flowed article will be displayed flowed.
995@end table
996
997
998@node Interface Functions
999@chapter Interface Functions
1000@cindex interface functions
1001@cindex mail-parse
1002
1003The @code{mail-parse} library is an abstraction over the actual
1004low-level libraries that are described in the next chapter.
1005
1006Standards change, and so programs have to change to fit in the new
1007mold. For instance, RFC2045 describes a syntax for the
1008@code{Content-Type} header that only allows @acronym{ASCII} characters in the
1009parameter list. RFC2231 expands on RFC2045 syntax to provide a scheme
1010for continuation headers and non-@acronym{ASCII} characters.
1011
1012The traditional way to deal with this is just to update the library
1013functions to parse the new syntax. However, this is sometimes the wrong
1014thing to do. In some instances it may be vital to be able to understand
1015both the old syntax as well as the new syntax, and if there is only one
1016library, one must choose between the old version of the library and the
1017new version of the library.
1018
1019The Emacs @acronym{MIME} library takes a different tack. It defines a
1020series of low-level libraries (@file{rfc2047.el}, @file{rfc2231.el}
1021and so on) that parses strictly according to the corresponding
1022standard. However, normal programs would not use the functions
1023provided by these libraries directly, but instead use the functions
1024provided by the @code{mail-parse} library. The functions in this
1025library are just aliases to the corresponding functions in the latest
1026low-level libraries. Using this scheme, programs get a consistent
1027interface they can use, and library developers are free to create
1028write code that handles new standards.
1029
1030The following functions are defined by this library:
1031
1032@table @code
1033@item mail-header-parse-content-type
1034@findex mail-header-parse-content-type
1035Parse a @code{Content-Type} header and return a list on the following
1036format:
1037
1038@lisp
1039("type/subtype"
1040 (attribute1 . value1)
1041 (attribute2 . value2)
1042 ...)
1043@end lisp
1044
1045Here's an example:
1046
1047@example
1048(mail-header-parse-content-type
1049 "image/gif; name=\"b980912.gif\"")
1050@result{} ("image/gif" (name . "b980912.gif"))
1051@end example
1052
1053@item mail-header-parse-content-disposition
1054@findex mail-header-parse-content-disposition
1055Parse a @code{Content-Disposition} header and return a list on the same
1056format as the function above.
1057
1058@item mail-content-type-get
1059@findex mail-content-type-get
1060Takes two parameters---a list on the format above, and an attribute.
1061Returns the value of the attribute.
1062
1063@example
1064(mail-content-type-get
1065 '("image/gif" (name . "b980912.gif")) 'name)
1066@result{} "b980912.gif"
1067@end example
1068
1069@item mail-header-encode-parameter
1070@findex mail-header-encode-parameter
1071Takes a parameter string and returns an encoded version of the string.
1072This is used for parameters in headers like @code{Content-Type} and
1073@code{Content-Disposition}.
1074
1075@item mail-header-remove-comments
1076@findex mail-header-remove-comments
1077Return a comment-free version of a header.
1078
1079@example
1080(mail-header-remove-comments
1081 "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
1082@result{} "Gnus/5.070027 "
1083@end example
1084
1085@item mail-header-remove-whitespace
1086@findex mail-header-remove-whitespace
1087Remove linear white space from a header. Space inside quoted strings
1088and comments is preserved.
1089
1090@example
1091(mail-header-remove-whitespace
1092 "image/gif; name=\"Name with spaces\"")
1093@result{} "image/gif;name=\"Name with spaces\""
1094@end example
1095
1096@item mail-header-get-comment
1097@findex mail-header-get-comment
1098Return the last comment in a header.
1099
1100@example
1101(mail-header-get-comment
1102 "Gnus/5.070027 (Pterodactyl Gnus v0.27) (Finnish Landrace)")
1103@result{} "Finnish Landrace"
1104@end example
1105
1106@item mail-header-parse-address
1107@findex mail-header-parse-address
1108Parse an address and return a list containing the mailbox and the
1109plaintext name.
1110
1111@example
1112(mail-header-parse-address
1113 "Hrvoje Niksic <hniksic@@srce.hr>")
1114@result{} ("hniksic@@srce.hr" . "Hrvoje Niksic")
1115@end example
1116
1117@item mail-header-parse-addresses
1118@findex mail-header-parse-addresses
1119Parse a string with list of addresses and return a list of elements like
1120the one described above.
1121
1122@example
1123(mail-header-parse-addresses
1124 "Hrvoje Niksic <hniksic@@srce.hr>, Steinar Bang <sb@@metis.no>")
1125@result{} (("hniksic@@srce.hr" . "Hrvoje Niksic")
1126 ("sb@@metis.no" . "Steinar Bang"))
1127@end example
1128
1129@item mail-header-parse-date
1130@findex mail-header-parse-date
1131Parse a date string and return an Emacs time structure.
1132
1133@item mail-narrow-to-head
1134@findex mail-narrow-to-head
1135Narrow the buffer to the header section of the buffer. Point is placed
1136at the beginning of the narrowed buffer.
1137
1138@item mail-header-narrow-to-field
1139@findex mail-header-narrow-to-field
1140Narrow the buffer to the header under point. Understands continuation
1141headers.
1142
1143@item mail-header-fold-field
1144@findex mail-header-fold-field
1145Fold the header under point.
1146
1147@item mail-header-unfold-field
1148@findex mail-header-unfold-field
1149Unfold the header under point.
1150
1151@item mail-header-field-value
1152@findex mail-header-field-value
1153Return the value of the field under point.
1154
1155@item mail-encode-encoded-word-region
1156@findex mail-encode-encoded-word-region
1157Encode the non-@acronym{ASCII} words in the region. For instance,
1158