+ Quite a bit of effort has been made to make Mutt-ng the premier text-mode
+ MIME MUA. Every effort has been made to provide the functionality that the
+ discerning MIME user requires, and the conformance to the standards
+ wherever possible. When configuring Mutt-ng for MIME, there are two extra
+ types of configuration files which Mutt-ng uses. One is the mime.types
+ file, which contains the mapping of file extensions to IANA MIME types.
+ The other is the mailcap file, which specifies the external commands to
+ use for handling specific MIME types.
+
+1. Using MIME in Mutt
+
+ There are three areas/menus in Mutt-ng which deal with MIME, they are the
+ pager (while viewing a message), the attachment menu and the compose menu.
+
+ 1.1. Viewing MIME messages in the pager
+
+ When you select a message from the index and view it in the pager, Mutt
+ decodes the message to a text representation. Mutt-ng internally supports
+ a number of MIME types, including text/plain, text/enriched,
+ message/rfc822, and message/news. In addition, the export controlled
+ version of Mutt-ng recognizes a variety of PGP MIME types, including
+ PGP/MIME and application/pgp.
+
+ Mutt-ng will denote attachments with a couple lines describing them. These
+ lines are of the form:
+
+ [-- Attachment #1: Description --]
+ [-- Type: text/plain, Encoding: 7bit, Size: 10000 --]
+
+ Where the Description is the description or filename given for the
+ attachment, and the Encoding is one of
+ 7bit/8bit/quoted-printable/base64/binary.
+
+ If Mutt-ng cannot deal with a MIME type, it will display a message like:
+
+ [-- image/gif is unsupported (use 'v' to view this part) --]
+
+ 1.2. The Attachment Menu
+
+ The default binding for view-attachments is `v', which displays the
+ attachment menu for a message. The attachment menu displays a list of the
+ attachments in a message. From the attachment menu, you can save, print,
+ pipe, delete, and view attachments. You can apply these operations to a
+ group of attachments at once, by tagging the attachments and by using the
+ ``tag-prefix'' operator. You can also reply to the current message from
+ this menu, and only the current attachment (or the attachments tagged)
+ will be quoted in your reply. You can view attachments as text, or view
+ them using the mailcap viewer definition.
+
+ Finally, you can apply the usual message-related functions (like
+ resend-message, and the reply and forward functions) to attachments of
+ type message/rfc822.
+
+ See the help on the attachment menu for more information.
+
+ 1.3. The Compose Menu
+
+ The compose menu is the menu you see before you send a message. It allows
+ you to edit the recipient list, the subject, and other aspects of your
+ message. It also contains a list of the attachments of your message,
+ including the main body. From this menu, you can print, copy, filter,
+ pipe, edit, compose, review, and rename an attachment or a list of tagged
+ attachments. You can also modifying the attachment information, notably
+ the type, encoding and description.
+
+ Attachments appear as follows:
+
+ - 1 [text/plain, 7bit, 1K] /tmp/mutt-euler-8082-0 <no description>
+ 2 [applica/x-gunzip, base64, 422K] ~/src/mutt-0.85.tar.gz <no description>
+
+ The '-' denotes that Mutt-ng will delete the file after sending (or
+ postponing, or canceling) the message. It can be toggled with the
+ toggle-unlink command (default: u). The next field is the MIME
+ content-type, and can be changed with the edit-type command (default: ^T).
+ The next field is the encoding for the attachment, which allows a binary
+ message to be encoded for transmission on 7bit links. It can be changed
+ with the edit-encoding command (default: ^E). The next field is the size
+ of the attachment, rounded to kilobytes or megabytes. The next field is
+ the filename, which can be changed with the rename-file command (default:
+ R). The final field is the description of the attachment, and can be
+ changed with the edit-description command (default: d).
+
+2. MIME Type configuration with mime.types
+
+ When you add an attachment to your mail message, Mutt-ng searches your
+ personal mime.types file at ${HOME}/.mime.types, and then the system
+ mime.types file at /usr/local/share/mutt/mime.types or /etc/mime.types
+
+ The mime.types file consist of lines containing a MIME type and a space
+ separated list of extensions. For example:
+
+ application/postscript ps eps
+ application/pgp pgp
+ audio/x-aiff aif aifc aiff
+
+ A sample mime.types file comes with the Mutt-ng distribution, and should
+ contain most of the MIME types you are likely to use.
+
+ If Mutt-ng can not determine the mime type by the extension of the file
+ you attach, it will look at the file. If the file is free of binary
+ information, Mutt-ng will assume that the file is plain text, and mark it
+ as text/plain. If the file contains binary information, then Mutt-ng will
+ mark it as application/octet-stream. You can change the MIME type that
+ Mutt-ng assigns to an attachment by using the edit-type command from the
+ compose menu (default: ^T). The MIME type is actually a major mime type
+ followed by the sub-type, separated by a '/'. 6 major types: application,
+ text, image, video, audio, and model have been approved after various
+ internet discussions. Mutt-ng recognises all of these if the appropriate
+ entry is found in the mime.types file. It also recognises other major mime
+ types, such as the chemical type that is widely used in the molecular
+ modelling community to pass molecular data in various forms to various
+ molecular viewers. Non-recognised mime types should only be used if the
+ recipient of the message is likely to be expecting such attachments.
+
+3. MIME Viewer configuration with mailcap
+
+ Mutt-ng supports RFC 1524 MIME Configuration, in particular the Unix
+ specific format specified in Appendix A of RFC 1524. This file format is
+ commonly referred to as the mailcap format. Many MIME compliant programs
+ utilize the mailcap format, allowing you to specify handling for all MIME
+ types in one place for all programs. Programs known to use this format
+ include Netscape, XMosaic, lynx and metamail.
+
+ In order to handle various MIME types that Mutt-ng can not handle
+ internally, Mutt-ng parses a series of external configuration files to
+ find an external handler. The default search string for these files is a
+ colon delimited list set to
+
+ ${HOME}/.mailcap:/usr/local/share/mutt/mailcap:/etc/mailcap:/etc/mailcap:/usr/etc/mailcap:/usr/local/etc/mailcap
+
+ where $HOME is your home directory.
+
+ In particular, the metamail distribution will install a mailcap file,
+ usually as /usr/local/etc/mailcap, which contains some baseline entries.
+
+ 3.1. The Basics of the mailcap file
+
+ A mailcap file consists of a series of lines which are comments, blank, or
+ definitions.
+
+ A comment line consists of a # character followed by anything you want.
+
+ A blank line is blank.
+
+ A definition line consists of a content type, a view command, and any
+ number of optional fields. Each field of a definition line is divided by a
+ semicolon ';' character.
+
+ The content type is specified in the MIME standard type/subtype method.
+ For example, text/plain, text/html, image/gif, etc. In addition, the
+ mailcap format includes two formats for wildcards, one using the special
+ '*' subtype, the other is the implicit wild, where you only include the
+ major type. For example, image/*, or video, will match all image types and
+ video types, respectively.
+
+ The view command is a Unix command for viewing the type specified. There
+ are two different types of commands supported. The default is to send the
+ body of the MIME message to the command on stdin. You can change this
+ behavior by using %s as a parameter to your view command. This will cause
+ Mutt-ng to save the body of the MIME message to a temporary file, and then
+ call the view command with the %s replaced by the name of the temporary
+ file. In both cases, Mutt-ng will turn over the terminal to the view
+ program until the program quits, at which time Mutt will remove the
+ temporary file if it exists.
+
+ So, in the simplest form, you can send a text/plain message to the
+ external pager more on stdin:
+
+ text/plain; more
+
+ Or, you could send the message as a file:
+
+ text/plain; more %s
+
+ Perhaps you would like to use lynx to interactively view a text/html
+ message:
+
+ text/html; lynx %s
+
+ In this case, lynx does not support viewing a file from stdin, so you must
+ use the %s syntax. Note: Some older versions of lynx contain a bug where
+ they will check the mailcap file for a viewer for text/html. They will
+ find the line which calls lynx, and run it. This causes lynx to
+ continuously spawn itself to view the object.
+
+ On the other hand, maybe you don't want to use lynx interactively, you
+ just want to have it convert the text/html to text/plain, then you can
+ use:
+
+ text/html; lynx -dump %s | more
+
+ Perhaps you wish to use lynx to view text/html files, and a pager on all
+ other text formats, then you would use the following:
+
+ text/html; lynx %s
+ text/*; more
+
+ This is the simplest form of a mailcap file.
+
+ 3.2. Secure use of mailcap
+
+ The interpretation of shell meta-characters embedded in MIME parameters
+ can lead to security problems in general. Mutt-ng tries to quote
+ parameters in expansion of %s syntaxes properly, and avoids risky
+ characters by substituting them, see the mailcap-sanitize variable.
+
+ Although mutt's procedures to invoke programs with mailcap seem to be
+ safe, there are other applications parsing mailcap, maybe taking less care
+ of it. Therefore you should pay attention to the following rules:
+
+ Keep the %-expandos away from shell quoting. Don't quote them with single
+ or double quotes. Mutt-ng does this for you, the right way, as should any
+ other program which interprets mailcap. Don't put them into backtick
+ expansions. Be highly careful with eval statements, and avoid them if
+ possible at all. Trying to fix broken behaviour with quotes introduces new
+ leaks - there is no alternative to correct quoting in the first place.
+
+ If you have to use the %-expandos' values in context where you need
+ quoting or backtick expansions, put that value into a shell variable and
+ reference the shell variable where necessary, as in the following example
+ (using $charset inside the backtick expansion is safe, since it is not
+ itself subject to any further expansion):
+
+ text/test-mailcap-bug; cat %s; copiousoutput; test=charset=%{charset} \
+ && test "`echo $charset | tr '[A-Z]' '[a-z]'`" != iso-8859-1
+
+ 3.3. Advanced mailcap Usage
+
+ 3.3.1. Optional Fields
+
+ In addition to the required content-type and view command fields, you can
+ add semi-colon ';' separated fields to set flags and other options.
+ Mutt-ng recognizes the following optional fields:
+
+ copiousoutput
+
+ This flag tells Mutt-ng that the command passes possibly large
+ amounts of text on stdout. This causes Mutt-ng to invoke a pager
+ (either the internal pager or the external pager defined by the
+ pager variable) on the output of the view command. Without this
+ flag, Mutt-ng assumes that the command is interactive. One could
+ use this to replace the pipe to more in the lynx -dump example in
+ the Basic section:
+
+ text/html; lynx -dump %s ; copiousoutput
+
+ This will cause lynx to format the text/html output as text/plain
+ and Mutt-ng will use your standard pager to display the results.
+
+ needsterminal
+
+ Mutt-ng uses this flag when viewing attachments with auto-view, in
+ order to decide whether it should honor the setting of the
+ wait-key variable or not. When an attachment is viewed using an
+ interactive program, and the corresponding mailcap entry has a
+ needsterminal flag, Mutt-ng will use wait-key and the exit status
+ of the program to decide if it will ask you to press a key after
+ the external program has exited. In all other situations it will
+ not prompt you for a key.
+
+ compose=<command>
+
+ This flag specifies the command to use to create a new attachment
+ of a specific MIME type. Mutt-ng supports this from the compose
+ menu.
+
+ composetyped=<command>
+
+ This flag specifies the command to use to create a new attachment
+ of a specific MIME type. This command differs from the compose
+ command in that mutt will expect standard MIME headers on the
+ data. This can be used to specify parameters, filename,
+ description, etc. for a new attachment. Mutt-ng supports this from
+ the compose menu.
+
+ print=<command>
+
+ This flag specifies the command to use to print a specific MIME
+ type. Mutt-ng supports this from the attachment and compose menus.
+
+ edit=<command>
+
+ This flag specifies the command to use to edit a specific MIME
+ type. Mutt-ng supports this from the compose menu, and also uses
+ it to compose new attachments. Mutt-ng will default to the defined
+ editor for text attachments.
+
+ nametemplate=<template>
+
+ This field specifies the format for the file denoted by %s in the
+ command fields. Certain programs will require a certain file
+ extension, for instance, to correctly view a file. For instance,
+ lynx will only interpret a file as text/html if the file ends in
+ .html. So, you would specify lynx as a text/html viewer with a
+ line in the mailcap file like:
+
+ text/html; lynx %s; nametemplate=%s.html
+
+ test=<command>
+
+ This field specifies a command to run to test whether this mailcap
+ entry should be used. The command is defined with the command
+ expansion rules defined in the next section. If the command
+ returns 0, then the test passed, and Mutt-ng uses this entry. If
+ the command returns non-zero, then the test failed, and Mutt-ng
+ continues searching for the right entry. Note: the content-type
+ must match before Mutt-ng performs the test. For example:
+
+ text/html; netscape -remote 'openURL(%s)' ; test=RunningX
+ text/html; lynx %s
+
+ In this example, Mutt-ng will run the program RunningX which will
+ return 0 if the X Window manager is running, and non-zero if it
+ isn't. If RunningX returns 0, then Mutt-ng will call netscape to
+ display the text/html object. If RunningX doesn't return 0, then
+ Mutt-ng will go on to the next entry and use lynx to display the
+ text/html object.
+
+ 3.3.2. Search Order
+
+ When searching for an entry in the mailcap file, Mutt-ng will search for
+ the most useful entry for its purpose. For instance, if you are attempting
+ to print an image/gif, and you have the following entries in your mailcap
+ file, Mutt-ng will search for an entry with the print command:
+
+ image/*; xv %s
+ image/gif; ; print= anytopnm %s | pnmtops | lpr; \
+ nametemplate=%s.gif
+
+ Mutt-ng will skip the image/* entry and use the image/gif entry with the
+ print command.
+
+ In addition, you can use this with auto-view to denote two commands for
+ viewing an attachment, one to be viewed automatically, the other to be
+ viewed interactively from the attachment menu. In addition, you can then
+ use the test feature to determine which viewer to use interactively
+ depending on your environment.
+
+ text/html; netscape -remote 'openURL(%s)' ; test=RunningX
+ text/html; lynx %s; nametemplate=%s.html
+ text/html; lynx -dump %s; nametemplate=%s.html; copiousoutput
+
+ For auto-view, Mutt-ng will choose the third entry because of the
+ copiousoutput tag. For interactive viewing, Mutt will run the program
+ RunningX to determine if it should use the first entry. If the program
+ returns non-zero, Mutt-ng will use the second entry for interactive
+ viewing.
+
+ 3.3.3. Command Expansion
+
+ The various commands defined in the mailcap files are passed to the
+ /bin/sh shell using the system() function. Before the command is passed to
+ /bin/sh -c, it is parsed to expand various special parameters with
+ information from Mutt-ng. The keywords Mutt-ng expands are:
+
+ %s
+
+ As seen in the basic mailcap section, this variable is expanded to
+ a filename specified by the calling program. This file contains
+ the body of the message to view/print/edit or where the composing
+ program should place the results of composition. In addition, the
+ use of this keyword causes Mutt-ng to not pass the body of the
+ message to the view/print/edit program on stdin.
+
+ %t
+
+ Mutt-ng will expand %t to the text representation of the content
+ type of the message in the same form as the first parameter of the
+ mailcap definition line, ie text/html or image/gif.
+
+ %{<parameter>}
+
+ Mutt-ng will expand this to the value of the specified parameter
+ from the Content-Type: line of the mail message. For instance, if
+ Your mail message contains:
+
+ Content-Type: text/plain; charset=iso-8859-1
+
+ then Mutt-ng will expand %{charset} to iso-8859-1. The default
+ metamail mailcap file uses this feature to test the charset to
+ spawn an xterm using the right charset to view the message.
+
+ \%
+
+ This will be replaced by a %
+
+ Mutt-ng does not currently support the %F and %n keywords specified in RFC
+ 1524. The main purpose of these parameters is for multipart messages,
+ which is handled internally by Mutt-ng.
+
+ 3.4. Example mailcap files
+
+ This mailcap file is fairly simple and standard:
+
+ >
+ # I'm always running X :)
+ video/*; xanim %s > /dev/null
+ image/*; xv %s > /dev/null
+
+ # I'm always running netscape (if my computer had more memory, maybe)
+ text/html; netscape -remote 'openURL(%s)'
+
+ This mailcap file shows quite a number of examples:
+
+ # Use xanim to view all videos Xanim produces a header on startup,
+ # send that to /dev/null so I don't see it
+ video/*; xanim %s > /dev/null
+
+ # Send html to a running netscape by remote
+ text/html; netscape -remote 'openURL(%s)'; test=RunningNetscape
+
+ # If I'm not running netscape but I am running X, start netscape on the
+ # object
+ text/html; netscape %s; test=RunningX
+
+ # Else use lynx to view it as text
+ text/html; lynx %s
+
+ # This version would convert the text/html to text/plain
+ text/html; lynx -dump %s; copiousoutput