\section{Standard Module \sectcode{mimetools}}
\label{module-mimetools}
\stmodindex{mimetools}

\renewcommand{\indexsubitem}{(in module mimetools)}

This module defines a subclass of the class \code{rfc822.Message} and
a number of utility functions that are useful for the manipulation for
MIME style multipart or encoded message.

It defines the following items:

\begin{funcdesc}{Message}{fp}
Return a new instance of the \code{mimetools.Message} class.  This is
a subclass of the \code{rfc822.Message} class, with some additional
methods (see below).
\end{funcdesc}

\begin{funcdesc}{choose_boundary}{}
Return a unique string that has a high likelihood of being usable as a
part boundary.  The string has the form
\code{"\var{hostipaddr}.\var{uid}.\var{pid}.\var{timestamp}.\var{random}"}.
\end{funcdesc}

\begin{funcdesc}{decode}{input\, output\, encoding}
Read data encoded using the allowed MIME \var{encoding} from open file
object \var{input} and write the decoded data to open file object
\var{output}.  Valid values for \var{encoding} include
\code{"base64"}, \code{"quoted-printable"} and \code{"uuencode"}.
\end{funcdesc}

\begin{funcdesc}{encode}{input\, output\, encoding}
Read data from open file object \var{input} and write it encoded using
the allowed MIME \var{encoding} to open file object \var{output}.
Valid values for \var{encoding} are the same as for \code{decode()}.
\end{funcdesc}

\begin{funcdesc}{copyliteral}{input\, output}
Read lines until EOF from open file \var{input} and write them to open
file \var{output}.
\end{funcdesc}

\begin{funcdesc}{copybinary}{input\, output}
Read blocks until EOF from open file \var{input} and write them to open
file \var{output}.  The block size is currently fixed at 8192.
\end{funcdesc}


\subsection{Additional Methods of Message objects}
\nodename{mimetools.Message Methods}

The \code{mimetools.Message} class defines the following methods in
addition to the \code{rfc822.Message} class:

\renewcommand{\indexsubitem}{(mimetool.Message method)}

\begin{funcdesc}{getplist}{}
Return the parameter list of the \code{Content-type} header.  This is
a list if strings.  For parameters of the form
\samp{\var{key}=\var{value}}, \var{key} is converted to lower case but
\var{value} is not.  For example, if the message contains the header
\samp{Content-type: text/html; spam=1; Spam=2; Spam} then
\code{getplist()} will return the Python list \code{['spam=1',
'spam=2', 'Spam']}.
\end{funcdesc}

\begin{funcdesc}{getparam}{name}
Return the \var{value} of the first parameter (as returned by
\code{getplist()} of the form \samp{\var{name}=\var{value}} for the
given \var{name}.  If \var{value} is surrounded by quotes of the form
\var{<...>} or \var{"..."}, these are removed.
\end{funcdesc}

\begin{funcdesc}{getencoding}{}
Return the encoding specified in the \samp{Content-transfer-encoding}
message header.  If no such header exists, return \code{"7bit"}.  The
encoding is converted to lower case.
\end{funcdesc}

\begin{funcdesc}{gettype}{}
Return the message type (of the form \samp{\var{type}/\var{subtype}})
as specified in the \samp{Content-type} header.  If no such header
exists, return \code{"text/plain"}.  The type is converted to lower
case.
\end{funcdesc}

\begin{funcdesc}{getmaintype}{}
Return the main type as specified in the \samp{Content-type} header.
If no such header exists, return \code{"text"}.  The main type is
converted to lower case.
\end{funcdesc}

\begin{funcdesc}{getsubtype}{}
Return the subtype as specified in the \samp{Content-type} header.  If
no such header exists, return \code{"plain"}.  The subtype is
converted to lower case.
\end{funcdesc}
