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

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


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'} 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 \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{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}
