\section{\module{mimetools} ---
         Tools for parsing MIME messages}

\declaremodule{standard}{mimetools}
\modulesynopsis{Tools for parsing MIME-style message bodies.}

\deprecated{2.3}{The \refmodule{email} package should be used in
                 preference to the \module{mimetools} module.  This
                 module is present only to maintain backward
                 compatibility.}

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

It defines the following items:

\begin{classdesc}{Message}{fp\optional{, seekable}}
Return a new instance of the \class{Message} class.  This is a
subclass of the \class{rfc822.Message} class, with some additional
methods (see below).  The \var{seekable} argument has the same meaning
as for \class{rfc822.Message}.
\end{classdesc}

\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'}, \code{'uuencode'},
\code{'x-uuencode'}, \code{'uue'}, \code{'x-uue'}, \code{'7bit'}, and 
\code{'8bit'}.  Decoding messages encoded in \code{'7bit'} or \code{'8bit'}
has no effect.  The input is simply copied to the output.
\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 \method{decode()}.
\end{funcdesc}

\begin{funcdesc}{copyliteral}{input, output}
Read lines from open file \var{input} until \EOF{} 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}


\begin{seealso}
  \seemodule{email}{Comprehensive email handling package; supercedes
                    the \module{mimetools} module.}
  \seemodule{rfc822}{Provides the base class for
                     \class{mimetools.Message}.}
  \seemodule{multifile}{Support for reading files which contain
                        distinct parts, such as MIME data.}
  \seeurl{http://www.cs.uu.nl/wais/html/na-dir/mail/mime-faq/.html}{
          The MIME Frequently Asked Questions document.  For an
          overview of MIME, see the answer to question 1.1 in Part 1
          of this document.}
\end{seealso}


\subsection{Additional Methods of Message Objects
            \label{mimetools-message-objects}}

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

\begin{methoddesc}{getplist}{}
Return the parameter list of the \mailheader{Content-Type} header.
This is a list of 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
\method{getplist()} will return the Python list \code{['spam=1',
'spam=2', 'Spam']}.
\end{methoddesc}

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

\begin{methoddesc}{getencoding}{}
Return the encoding specified in the
\mailheader{Content-Transfer-Encoding} message header.  If no such
header exists, return \code{'7bit'}.  The encoding is converted to
lower case.
\end{methoddesc}

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

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

\begin{methoddesc}{getsubtype}{}
Return the subtype as specified in the \mailheader{Content-Type}
header.  If no such header exists, return \code{'plain'}.  The subtype
is converted to lower case.
\end{methoddesc}
