363 lines
17 KiB
HTML
363 lines
17 KiB
HTML
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
|
||
|
"http://www.w3.org/TR/REC-html40/loose.dtd">
|
||
|
<html>
|
||
|
<head>
|
||
|
<title>makemime - MIME utility</title>
|
||
|
<!-- $Id$ -->
|
||
|
<!-- SECTION 1 -->
|
||
|
<meta http-equiv="Content-Type" content="text/html">
|
||
|
</head>
|
||
|
|
||
|
<body text="#000000" bgcolor="#FFFFFF" link="#0000EE" vlink="#551A8B"
|
||
|
alink="#FF0000">
|
||
|
<h1>makemime - MIME utility</h1>
|
||
|
|
||
|
<h2>SYNOPSIS</h2>
|
||
|
<code>makemime [options]</code>
|
||
|
|
||
|
<p><code>makemime @<i>file</i></code></p>
|
||
|
|
||
|
<h2>DESCRIPTION</h2>
|
||
|
|
||
|
<p>The <i>makemime</i> tool creates MIME-encoded messages of arbitrary
|
||
|
complexity. <i>makemime</i> reads one or more individual files, encodes them
|
||
|
appropriately, adds basic MIME headers, and adds additional headers specified
|
||
|
via command line options. The result is saved to another file or standard
|
||
|
output. Complex MIME-encoded messages are created by using options that direct
|
||
|
<i>makemime</i> to run additional instances of itself, as child processes. The
|
||
|
child processes create individual parts of a complex MIME message, then the
|
||
|
parent <i>makemime</i> process combines them together.</p>
|
||
|
|
||
|
<p>In simple cases, options for <i>makemime</i> are specified directly on the
|
||
|
command line. @<i>file</i> specifies that options will be read from a file.
|
||
|
"@&n" reads options from a pipe on file descriptor #n. "@-" is a shortcut for
|
||
|
"@&0", which reads options from standard input.</p>
|
||
|
|
||
|
<p>When options are read from a file or a pipe, each option must be on a line
|
||
|
by itself. If an option requires an argument, the argument must follow on the
|
||
|
next line.</p>
|
||
|
|
||
|
<p>For readability, leading whitespace on each line is deleted when options
|
||
|
are read from a file or a pipe. Empty lines are also ignored, as well as lines
|
||
|
that begin with the '#' character.</p>
|
||
|
|
||
|
<p>Options and their arguments may contain characters that are special
|
||
|
characters to the shell, such as '(' and ')'. These characters must be
|
||
|
backslashed when specified on the command line, to avoid their special meaning
|
||
|
to the shell. These characters MUST NOT be backslashed when options are read
|
||
|
from a file or a pipe. Similarly, the contents of most headers nearly always
|
||
|
include spaces. Therefore they must be quoted when specified on the command
|
||
|
line. Header contents MUST NOT be quoted when options come from a file or a
|
||
|
pipe.</p>
|
||
|
|
||
|
<p><i>makemime</i> reads the contents to be encoded into a MIME message from
|
||
|
other files. Those files can also be pipes. It is possible to supply both the
|
||
|
options and a file from the same pipe, by terminating the list of option with
|
||
|
a line containing the single character "-". The remainder of the pipe will be
|
||
|
available to be used as an input file (which must be explicitly specified via
|
||
|
some other option). Of course, only one input file can come from a single
|
||
|
pipe.</p>
|
||
|
|
||
|
<h3>MIME overview</h3>
|
||
|
|
||
|
<p>A MIME message consists of one or several MIME sections. MIME headers
|
||
|
specify how multiple MIME sections are to be interpreted as a whole (whether
|
||
|
they are attached together, or whether they are alternative representations of
|
||
|
the same object, or something even more esoteric). This manual page gives a
|
||
|
very brief, terse, overview of basic MIME concepts. The description is biased
|
||
|
towards describing the functionality of the <i>makemime</i> utility. The
|
||
|
complete description of MIME encoding is found in RFCs 2045 through 2048,
|
||
|
where a formal definition is found.</p>
|
||
|
|
||
|
<p>Each file in a MIME message is encoded as a single MIME section. A MIME
|
||
|
section consists of at least one header line, "Content-Type". The
|
||
|
"Content-Type" headers gives the type of the data contained in the file. Other
|
||
|
header lines may also be present. Their relative order does not matter. MIME
|
||
|
headers are followed by a blank line, then the contents of the file, encoded
|
||
|
appropriately. All MIME sections generated by <i>makemime</i> will always
|
||
|
contain another header, "Content-Transfer-Encoding". This header gives the
|
||
|
encoding method used for the file.</p>
|
||
|
|
||
|
<p>The encoding method defaults to "7bit" if this header is absent. 7bit
|
||
|
encoding is only suitable for plain text messages in the US-ASCII character
|
||
|
set. The "8bit" encoding method is used by plain text messages in other
|
||
|
character sets which contain high-bit characters, with their 8th bit set. An
|
||
|
alternative to 8bit encoding is "quoted-printable". The "base64" encoding
|
||
|
method is used for files containing binary data.</p>
|
||
|
|
||
|
<p>MIME sections that contain text messages have their "Content-Type" header
|
||
|
set to "text/plain"; or "text/html" for HTML messages. There are also several
|
||
|
other, rare, content types that can be used. MIME sections that contain other
|
||
|
kinds of data will use some other, appropriate Content-Type header, such as
|
||
|
"image/gif", or "audio/x-wav".</p>
|
||
|
|
||
|
<p>MIME sections that contain textual content may use the base64 encoding
|
||
|
method, they are not required to use 7bit, 8bit, or quoted-printable.
|
||
|
"text/pdf" sections, that contain PDF files, typically consist of binary data,
|
||
|
and must use base64 encoding. Consequently, MIME sections that typically
|
||
|
contain binary data, such as image/gif and audio/x-wav, are free to use other
|
||
|
encoding methods besides base64, as long as all the data can be represented by
|
||
|
printable characters (but, in practice, that never happens).</p>
|
||
|
|
||
|
<p>MIME sections may also contain other, optional, headers such as
|
||
|
"Content-Disposition", "Content-ID", and "Content-Name". Consult the
|
||
|
appropriate RFCs for the specific usage of these headers. These headers can be
|
||
|
added by <i>makemime</i> by using the -a option, as described below. These
|
||
|
headers play no part in creating the overall structure of a MIME-encoded
|
||
|
message, and <i>makemime</i> does not care much about these headers. It simply
|
||
|
includes them, and their content, upon request.</p>
|
||
|
|
||
|
<p>Multiple files are encoded into a single message by initially creating a
|
||
|
MIME section for each file, and then creating a single MIME section that
|
||
|
contains other MIME sections. A "multipart/mixed" MIME section contains a
|
||
|
collection of MIME sections that represent different objects, attached
|
||
|
together. A "multipart/alternative" MIME section contains a collection of MIME
|
||
|
sections which are alternative representations of the same object, such as an
|
||
|
HTML and a plain text version of the same message. Other "multipart" MIME
|
||
|
sections also exist, and their usage is defined by their respective RFCs.</p>
|
||
|
|
||
|
<h3>Creating a single MIME section</h3>
|
||
|
<pre> makemime -c "type" [-e "encoding"] [-o file] \
|
||
|
[-a "header: value"] [-a "header: value"] file</pre>
|
||
|
|
||
|
<p>The -c option reads <i>file</i>, encodes it appropriately, adds a
|
||
|
"Content-Type" and "Content-Transfer-Encoding" MIME headers, then writes the
|
||
|
result to standard output. <i>type</i> can be any valid MIME type, except for
|
||
|
multipart. <i>file</i> can be "-", which specifies standard input. <i>file</i>
|
||
|
can be "&n" to read the file from file descriptor #n.</p>
|
||
|
|
||
|
<p>The optional <i>encoding</i> argument should be specified. It's more
|
||
|
efficient to do so. <i>encoding</i> must be one of the following: 7bit, 8bit,
|
||
|
quoted-printable, or base64.</p>
|
||
|
|
||
|
<p>If <i>encoding</i> is not specified, <i>makemime</i> reads the <i>file</i>
|
||
|
twice - once to select the best encoding method, and the second time to encode
|
||
|
it. If <i>file</i> is a pipe <i>makemime</i> will be forced to create a
|
||
|
temporary file, which is less efficient if the <i>file</i> is large. However
|
||
|
letting <i>makemime</i> pick the encoding is probably more convenient if files
|
||
|
are relatively small.</p>
|
||
|
|
||
|
<p>By default the encoded MIME section is written to standard output. The -o
|
||
|
option writes the MIME section to a <i>file</i>. <i>file</i> can be "&n",
|
||
|
which writes the MIME section to a pipe on file descriptor #n.</p>
|
||
|
|
||
|
<p><i>makemime</i> does not generate any other headers. Particularly, the
|
||
|
"Mime-Version" header (and others) is required to send a MIME message via
|
||
|
E-mail. Additional headers are specified by the -a option, which may be used
|
||
|
multiple times to insert multiple headers. <i>makemime</i> doesn't do anything
|
||
|
with them except to insert the headers into the generated MIME section.</p>
|
||
|
|
||
|
<p>Note that "Mime-Version" is only required for the top level MIME section.
|
||
|
This header is not required for individual MIME sections that are later
|
||
|
combined into a multipart MIME collection.</p>
|
||
|
|
||
|
<p>Note that the -c option is required to be listed first, the remaining
|
||
|
options must follow the -c option.</p>
|
||
|
|
||
|
<h3>Creating a multipart MIME collection</h3>
|
||
|
<pre> makemime -m "type" [-e "encoding"] [-o file] \
|
||
|
[-a "header: value"] [-a "header: value"] file</pre>
|
||
|
|
||
|
<p>The -m option is identical in usage to the -c option, except for three
|
||
|
differences.</p>
|
||
|
|
||
|
<p><i>type</i> must be either "multipart/mixed", "multipart/alternative", or
|
||
|
some other MIME multipart content type. Additionally, "encoding" can only be
|
||
|
"7bit" or "8bit", and will default to "8bit" if not specified. Finally,
|
||
|
<i>file</i> must be a MIME-encoded section, NOT a regular file. Usually
|
||
|
<i>file</i> is also created by <i>makemime</i> (it can also be a pipe, like
|
||
|
the -c option), but it can be created via any other means.</p>
|
||
|
|
||
|
<p>The -m option creates an initial multipart MIME collection, that contains
|
||
|
only one MIME section, taken from <i>file</i>. The collection is written to
|
||
|
standard output, or the pipe or the file specified by the -o option. The -j
|
||
|
option is used to add additional MIME sections to this collection.</p>
|
||
|
|
||
|
<h3>Creating a multipart MIME section</h3>
|
||
|
<pre> makemime -j file1 [-o file] file2</pre>
|
||
|
|
||
|
<p>This option appends a MIME section to an existing MIME collection.
|
||
|
<i>file1</i> contains a MIME collection that's been created by the -m option.
|
||
|
<i>file2</i> must contain a MIME section that's been created by the -c option.
|
||
|
The MIME section in <i>file2</i> is appended after the last MIME section in
|
||
|
<i>file1</i>. The result is written to standard output or the file specified
|
||
|
by the -o option.</p>
|
||
|
|
||
|
<p><i>file1</i> and/or <i>file2</i> can be "&n", which reads the corresponding
|
||
|
file from a pipe on the indicated file descriptor. The -o option, as always,
|
||
|
can also specify a file descriptor.</p>
|
||
|
|
||
|
<p><i>file1</i> and <i>file2</i> should ideally be created by <i>makemime</i>
|
||
|
as well. It's also possible to use files created by other software, but with
|
||
|
some degree of care. <i>makemime</i> is not intended to be a MIME parser, but
|
||
|
a MIME generator. However some amount of MIME parsing is necessary to append a
|
||
|
MIME section to an existing MIME collection. <i>makemime</i>'s parsing does a
|
||
|
sufficient job to append a new section to a MIME collection, as long as the
|
||
|
MIME headers in the MIME collections are straightforward. Very convoluted MIME
|
||
|
headers may confuse <i>makemime</i>, and it may not be able to handle
|
||
|
them.</p>
|
||
|
|
||
|
<h3>Recursive MIME collections</h3>
|
||
|
|
||
|
<p>MIME collection may contain other MIME collections as well as MIME
|
||
|
sections. The -m and the -j option may use a multipart MIME collection in
|
||
|
place of a MIME section automatically, simply because a multipart MIME
|
||
|
collection is just a special type of a MIME section. The following example
|
||
|
encodes a text message that can be alternatively represented as HTML or plain
|
||
|
text, with some additional attachments:</p>
|
||
|
|
||
|
<p>1. Create a MIME collection containing a text/plain and a text/html MIME
|
||
|
section.</p>
|
||
|
|
||
|
<p>2. Create a MIME collection consisting of the MIME section generated in
|
||
|
step one, plus additional MIME sections containing other attachments.</p>
|
||
|
|
||
|
<p>For example:</p>
|
||
|
<pre> # Take two files containing the text and the html version of a message, and
|
||
|
# add MIME headers to them.
|
||
|
|
||
|
makemime -c "text/plain; charset=iso-8859-1" -o tmp1.txt msg.txt
|
||
|
makemime -c "text/html; charset=iso-8859-1" -o tmp1.html msg.html
|
||
|
|
||
|
# Combine the result into a multipart/alternative collection
|
||
|
|
||
|
makemime -m "multipart/alternative" -a "Content-Disposition: inline" \
|
||
|
-o tmp.ma1 tmp1.txt
|
||
|
makemime -j tmp.ma1 -o tmp.ma2 tmp1.html
|
||
|
|
||
|
# Add MIME headers to an image attachment.
|
||
|
|
||
|
makemime -c "image/gif" -a "Content-Disposition: attachment" \
|
||
|
-o tmp2.gif attachment.gif
|
||
|
|
||
|
# Create the final multipart/mixed collection
|
||
|
|
||
|
makemime -m "multipart/mixed" -a "Mime-Version: 1.0" \
|
||
|
-o tmp.mm1 tmp.ma2
|
||
|
makemime -j tmp.mm1 -o output.msg tmp2.gif</pre>
|
||
|
|
||
|
<p><i>output.msg</i> now contains the complete MIME collection. Just add the
|
||
|
subject, from, and to headers (can also be done by additional -a options, of
|
||
|
course), and send it on its way.</p>
|
||
|
|
||
|
<h3>Building complex MIME encodings</h3>
|
||
|
|
||
|
<p>There are several different ways to build complete MIME encodings from
|
||
|
multiple MIME sections. One way is to use temporary files to create MIME
|
||
|
sections, then combine them together into a single MIME collection. A slightly
|
||
|
more complicated approach involves setting up pipes between multiple makemime
|
||
|
processes, in order to avoid using temporary files.</p>
|
||
|
|
||
|
<p>This can be done manually, by hand. It is also possible to have
|
||
|
<i>makemime</i> do this automatically. <i>makemime</i> will set up these pipes
|
||
|
and run multiple instances of itself to create a single MIME collection, with
|
||
|
multiple attachments of arbitrary complexity.</p>
|
||
|
|
||
|
<p>Any file that's read by the -c, -m, and -j options (-o specifies a file to
|
||
|
create, and doesn't count) may be replaced by a single argument containing a
|
||
|
left parenthesis, additional options, then a single argument containing a
|
||
|
right parenthesis. A single invocation of <i>makemime</i> can only use one -c,
|
||
|
-m, or -j option. However, another -c, -m, or -j option may be specified
|
||
|
inside the left and the right parenthesis, and its output is used in place of
|
||
|
the file it replaced. In the previous example the third and the fourth
|
||
|
invocation of <i>makemime</i> can be replaced with the following command:</p>
|
||
|
<pre> makemime -j \( \
|
||
|
-m "multipart/alternative" \
|
||
|
-a "Content-Disposition: inline" tmp1.txt \
|
||
|
\) -o tmp.ma2 \
|
||
|
tmp1.html</pre>
|
||
|
|
||
|
<p>Note that the parenthesis must be backslashed, to avoid their special
|
||
|
meaning to the shell. An equivalent argument file would have the following
|
||
|
contents:</p>
|
||
|
<pre> -j
|
||
|
(
|
||
|
-m
|
||
|
multipart/alternative
|
||
|
-a
|
||
|
Content-Disposition: inline
|
||
|
tmp1.txt
|
||
|
)
|
||
|
-o
|
||
|
tmp.ma2
|
||
|
tmp1.html</pre>
|
||
|
|
||
|
<p>These constructs can be arbitrarily nested, and are limited by the amount
|
||
|
of available memory and resources. The entire sequence in the previous
|
||
|
section is equivalent to the following command:</p>
|
||
|
<pre> makemime -j \
|
||
|
\( \
|
||
|
-m "multipart/mixed" \
|
||
|
-a "Mime-Version: 1.0" \
|
||
|
\( \
|
||
|
-j \
|
||
|
\( \
|
||
|
-m "multipart/alternative" \
|
||
|
-a "Content-Disposition: inline" \
|
||
|
\( \
|
||
|
-c "text/plain; charset=iso-8859-1" \
|
||
|
msg.txt \
|
||
|
\) \
|
||
|
\) \
|
||
|
\( \
|
||
|
-c "text/html; charset=iso-8859-1" \
|
||
|
msg.html \
|
||
|
\) \
|
||
|
\) \
|
||
|
\) \
|
||
|
-o output.msg \
|
||
|
\( \
|
||
|
-c "image/gif" \
|
||
|
-a "Content-Disposition: attachment" \
|
||
|
attachment.gif \
|
||
|
\)</pre>
|
||
|
|
||
|
<p>An equivalent argument file would be:</p>
|
||
|
<pre> -j
|
||
|
(
|
||
|
-m
|
||
|
multipart/mixed
|
||
|
-a
|
||
|
Mime-Version: 1.0
|
||
|
(
|
||
|
-j
|
||
|
(
|
||
|
-m
|
||
|
multipart/alternative
|
||
|
-a
|
||
|
Content-Disposition: inline
|
||
|
(
|
||
|
-c
|
||
|
text/plain; charset=iso-8859-1
|
||
|
msg.txt
|
||
|
)
|
||
|
)
|
||
|
(
|
||
|
-c
|
||
|
text/html; charset=iso-8859-1
|
||
|
msg.html
|
||
|
)
|
||
|
)
|
||
|
)
|
||
|
-o
|
||
|
output.msg
|
||
|
(
|
||
|
-c
|
||
|
image/gif
|
||
|
-a
|
||
|
Content-Disposition: attachment
|
||
|
attachment.gif
|
||
|
)</pre>
|
||
|
|
||
|
<h2>SEE ALSO</h2>
|
||
|
<a href="maildrop.html">maildrop(1)</a>, <a
|
||
|
href="maildropfilter.html">maildropfilter(1)</a>, <a
|
||
|
href="reformail.html">reformail(1)</a>, <a
|
||
|
href="reformime.html">reformime(1)</a>, egrep(1), grep(1), <a
|
||
|
href="courier.html">courier(8)</a>, sendmail(8), <a
|
||
|
href="http://www.rfc-editor.org/rfc/rfc2045.txt">RFC 2045</a>, <a
|
||
|
href="http://www.rfc-editor.org/rfc/rfc2046.txt">RFC 2046</a>, <a
|
||
|
href="http://www.rfc-editor.org/rfc/rfc2047.txt">RFC 2047</a>, <a
|
||
|
href="http://www.rfc-editor.org/rfc/rfc2048.txt">RFC 2048</a>.</body>
|
||
|
</html>
|