\declaremodule{standard}{email.Message}
\modulesynopsis{The base class representing email messages.}

The central class in the \module{email} package is the
\class{Message} class; it is the base class for the \module{email}
object model.  \class{Message} provides the core functionality for
setting and querying header fields, and for accessing message bodies.

Conceptually, a \class{Message} object consists of \emph{headers} and
\emph{payloads}.  Headers are \rfc{2822} style field names and
values where the field name and value are separated by a colon.  The
colon is not part of either the field name or the field value.

Headers are stored and returned in case-preserving form but are
matched case-insensitively.  There may also be a single
\emph{Unix-From} header, also known as the envelope header or the
\code{From_} header.  The payload is either a string in the case of
simple message objects, a list of \class{Message} objects for
multipart MIME documents, or a single \class{Message} instance for
\mimetype{message/rfc822} type objects.

\class{Message} objects provide a mapping style interface for
accessing the message headers, and an explicit interface for accessing
both the headers and the payload.  It provides convenience methods for
generating a flat text representation of the message object tree, for
accessing commonly used header parameters, and for recursively walking
over the object tree.

Here are the methods of the \class{Message} class:

\begin{classdesc}{Message}{}
The constructor takes no arguments.
\end{classdesc}

\begin{methoddesc}[Message]{as_string}{\optional{unixfrom}}
Return the entire formatted message as a string.  Optional
\var{unixfrom}, when true, specifies to include the \emph{Unix-From}
envelope header; it defaults to 0.
\end{methoddesc}

\begin{methoddesc}[Message]{__str__()}{}
Equivalent to \method{aMessage.as_string(unixfrom=1)}.
\end{methoddesc}

\begin{methoddesc}[Message]{is_multipart}{}
Return 1 if the message's payload is a list of sub-\class{Message}
objects, otherwise return 0.  When \method{is_multipart()} returns 0,
the payload should either be a string object, or a single
\class{Message} instance.
\end{methoddesc}

\begin{methoddesc}[Message]{set_unixfrom}{unixfrom}
Set the \emph{Unix-From} (a.k.a envelope header or \code{From_}
header) to \var{unixfrom}, which should be a string.
\end{methoddesc}

\begin{methoddesc}[Message]{get_unixfrom}{}
Return the \emph{Unix-From} header.  Defaults to \code{None} if the
\emph{Unix-From} header was never set.
\end{methoddesc}

\begin{methoddesc}[Message]{add_payload}{payload}
Add \var{payload} to the message object's existing payload.  If, prior
to calling this method, the object's payload was \code{None}
(i.e. never before set), then after this method is called, the payload
will be the argument \var{payload}.

If the object's payload was already a list
(i.e. \method{is_multipart()} returns 1), then \var{payload} is
appended to the end of the existing payload list.

For any other type of existing payload, \method{add_payload()} will
transform the new payload into a list consisting of the old payload
and \var{payload}, but only if the document is already a MIME
multipart document.  This condition is satisfied if the message's
\mailheader{Content-Type} header's main type is either
\mimetype{multipart}, or there is no \mailheader{Content-Type}
header.  In any other situation,
\exception{MultipartConversionError} is raised.
\end{methoddesc}

\begin{methoddesc}[Message]{attach}{payload}
Synonymous with \method{add_payload()}.
\end{methoddesc}

\begin{methoddesc}[Message]{get_payload}{\optional{i\optional{, decode}}}
Return the current payload, which will be a list of \class{Message}
objects when \method{is_multipart()} returns 1, or a scalar (either a
string or a single \class{Message} instance) when
\method{is_multipart()} returns 0.

With optional \var{i}, \method{get_payload()} will return the
\var{i}-th element of the payload, counting from zero, if
\method{is_multipart()} returns 1.  An \exception{IndexError} will be raised
if \var{i} is less than 0 or greater than or equal to the number of
items in the payload.  If the payload is scalar
(i.e. \method{is_multipart()} returns 0) and \var{i} is given, a
\exception{TypeError} is raised.

Optional \var{decode} is a flag indicating whether the payload should be
decoded or not, according to the \mailheader{Content-Transfer-Encoding} header.
When true and the message is not a multipart, the payload will be
decoded if this header's value is \samp{quoted-printable} or
\samp{base64}.  If some other encoding is used, or
\mailheader{Content-Transfer-Encoding} header is
missing, the payload is returned as-is (undecoded).  If the message is
a multipart and the \var{decode} flag is true, then \code{None} is
returned.
\end{methoddesc}

\begin{methoddesc}[Message]{set_payload}{payload}
Set the entire message object's payload to \var{payload}.  It is the
client's responsibility to ensure the payload invariants.
\end{methoddesc}

The following methods implement a mapping-like interface for accessing
the message object's \rfc{2822} headers.  Note that there are some
semantic differences between these methods and a normal mapping
(i.e. dictionary) interface.  For example, in a dictionary there are
no duplicate keys, but here there may be duplicate message headers.  Also,
in dictionaries there is no guaranteed order to the keys returned by
\method{keys()}, but in a \class{Message} object, there is an explicit
order.  These semantic differences are intentional and are biased
toward maximal convenience.

Note that in all cases, any optional \emph{Unix-From} header the message
may have is not included in the mapping interface.

\begin{methoddesc}[Message]{__len__}{}
Return the total number of headers, including duplicates.
\end{methoddesc}

\begin{methoddesc}[Message]{__contains__}{name}
Return true if the message object has a field named \var{name}.
Matching is done case-insensitively and \var{name} should not include the
trailing colon.  Used for the \code{in} operator,
e.g.:

\begin{verbatim}
if 'message-id' in myMessage:
    print 'Message-ID:', myMessage['message-id']
\end{verbatim}
\end{methoddesc}

\begin{methoddesc}[Message]{__getitem__}{name}
Return the value of the named header field.  \var{name} should not
include the colon field separator.  If the header is missing,
\code{None} is returned; a \exception{KeyError} is never raised.

Note that if the named field appears more than once in the message's
headers, exactly which of those field values will be returned is
undefined.  Use the \method{get_all()} method to get the values of all
the extant named headers.
\end{methoddesc}

\begin{methoddesc}[Message]{__setitem__}{name, val}
Add a header to the message with field name \var{name} and value
\var{val}.  The field is appended to the end of the message's existing
fields.

Note that this does \emph{not} overwrite or delete any existing header
with the same name.  If you want to ensure that the new header is the
only one present in the message with field name
\var{name}, first use \method{__delitem__()} to delete all named
fields, e.g.:

\begin{verbatim}
del msg['subject']
msg['subject'] = 'Python roolz!'
\end{verbatim}
\end{methoddesc}

\begin{methoddesc}[Message]{__delitem__}{name}
Delete all occurrences of the field with name \var{name} from the
message's headers.  No exception is raised if the named field isn't
present in the headers.
\end{methoddesc}

\begin{methoddesc}[Message]{has_key}{name}
Return 1 if the message contains a header field named \var{name},
otherwise return 0.
\end{methoddesc}

\begin{methoddesc}[Message]{keys}{}
Return a list of all the message's header field names.  These keys
will be sorted in the order in which they were added to the message
via \method{__setitem__()}, and may contain duplicates.  Any fields
deleted and then subsequently re-added are always appended to the end
of the header list.
\end{methoddesc}

\begin{methoddesc}[Message]{values}{}
Return a list of all the message's field values.  These will be sorted
in the order in which they were added to the message via
\method{__setitem__()}, and may contain duplicates.  Any fields
deleted and then subsequently re-added are always appended to the end
of the header list.
\end{methoddesc}

\begin{methoddesc}[Message]{items}{}
Return a list of 2-tuples containing all the message's field headers and
values.  These will be sorted in the order in which they were added to
the message via \method{__setitem__()}, and may contain duplicates.
Any fields deleted and then subsequently re-added are always appended
to the end of the header list.
\end{methoddesc}

\begin{methoddesc}[Message]{get}{name\optional{, failobj}}
Return the value of the named header field.  This is identical to
\method{__getitem__()} except that optional \var{failobj} is returned
if the named header is missing (defaults to \code{None}).
\end{methoddesc}

Here are some additional useful methods:

\begin{methoddesc}[Message]{get_all}{name\optional{, failobj}}
Return a list of all the values for the field named \var{name}.  These
will be sorted in the order in which they were added to the message
via \method{__setitem__()}.  Any fields
deleted and then subsequently re-added are always appended to the end
of the list.

If there are no such named headers in the message, \var{failobj} is
returned (defaults to \code{None}).
\end{methoddesc}

\begin{methoddesc}[Message]{add_header}{_name, _value, **_params}
Extended header setting.  This method is similar to
\method{__setitem__()} except that additional header parameters can be
provided as keyword arguments.  \var{_name} is the header to set and
\var{_value} is the \emph{primary} value for the header.

For each item in the keyword argument dictionary \var{_params}, the
key is taken as the parameter name, with underscores converted to
dashes (since dashes are illegal in Python identifiers).  Normally,
the parameter will be added as \code{key="value"} unless the value is
\code{None}, in which case only the key will be added.

Here's an example:

\begin{verbatim}
msg.add_header('Content-Disposition', 'attachment', filename='bud.gif')
\end{verbatim}

This will add a header that looks like

\begin{verbatim}
Content-Disposition: attachment; filename="bud.gif"
\end{verbatim}
\end{methoddesc}

\begin{methoddesc}[Message]{get_type}{\optional{failobj}}
Return the message's content type, as a string of the form
\mimetype{maintype/subtype} as taken from the
\mailheader{Content-Type} header.
The returned string is coerced to lowercase.

If there is no \mailheader{Content-Type} header in the message,
\var{failobj} is returned (defaults to \code{None}).
\end{methoddesc}

\begin{methoddesc}[Message]{get_main_type}{\optional{failobj}}
Return the message's \emph{main} content type.  This essentially returns the
\var{maintype} part of the string returned by \method{get_type()}, with the
same semantics for \var{failobj}.
\end{methoddesc}

\begin{methoddesc}[Message]{get_subtype}{\optional{failobj}}
Return the message's sub-content type.  This essentially returns the
\var{subtype} part of the string returned by \method{get_type()}, with the
same semantics for \var{failobj}.
\end{methoddesc}

\begin{methoddesc}[Message]{get_params}{\optional{failobj\optional{, header}}}
Return the message's \mailheader{Content-Type} parameters, as a list.  The
elements of the returned list are 2-tuples of key/value pairs, as
split on the \character{=} sign.  The left hand side of the
\character{=} is the key, while the right hand side is the value.  If
there is no \character{=} sign in the parameter the value is the empty
string.  The value is always unquoted with \method{Utils.unquote()}.

Optional \var{failobj} is the object to return if there is no
\mailheader{Content-Type} header.  Optional \var{header} is the header to
search instead of \mailheader{Content-Type}.
\end{methoddesc}

\begin{methoddesc}[Message]{get_param}{param\optional{,
    failobj\optional{, header}}}
Return the value of the \mailheader{Content-Type} header's parameter
\var{param} as a string.  If the message has no \mailheader{Content-Type}
header or if there is no such parameter, then \var{failobj} is
returned (defaults to \code{None}).

Optional \var{header} if given, specifies the message header to use
instead of \mailheader{Content-Type}.
\end{methoddesc}

\begin{methoddesc}[Message]{get_charsets}{\optional{failobj}}
Return a list containing the character set names in the message.  If
the message is a \mimetype{multipart}, then the list will contain one
element for each subpart in the payload, otherwise, it will be a list
of length 1.

Each item in the list will be a string which is the value of the
\code{charset} parameter in the \mailheader{Content-Type} header for the
represented subpart.  However, if the subpart has no
\mailheader{Content-Type} header, no \code{charset} parameter, or is not of
the \mimetype{text} main MIME type, then that item in the returned list
will be \var{failobj}.
\end{methoddesc}

\begin{methoddesc}[Message]{get_filename}{\optional{failobj}}
Return the value of the \code{filename} parameter of the
\mailheader{Content-Disposition} header of the message, or \var{failobj} if
either the header is missing, or has no \code{filename} parameter.
The returned string will always be unquoted as per
\method{Utils.unquote()}.
\end{methoddesc}

\begin{methoddesc}[Message]{get_boundary}{\optional{failobj}}
Return the value of the \code{boundary} parameter of the
\mailheader{Content-Type} header of the message, or \var{failobj} if either
the header is missing, or has no \code{boundary} parameter.  The
returned string will always be unquoted as per
\method{Utils.unquote()}.
\end{methoddesc}

\begin{methoddesc}[Message]{set_boundary}{boundary}
Set the \code{boundary} parameter of the \mailheader{Content-Type} header
to \var{boundary}.  \method{set_boundary()} will always quote
\var{boundary} so you should not quote it yourself.  A
\exception{HeaderParseError} is raised if the message object has no
\mailheader{Content-Type} header.

Note that using this method is subtly different than deleting the old
\mailheader{Content-Type} header and adding a new one with the new boundary
via \method{add_header()}, because \method{set_boundary()} preserves the
order of the \mailheader{Content-Type} header in the list of headers.
However, it does \emph{not} preserve any continuation lines which may
have been present in the original \mailheader{Content-Type} header.
\end{methoddesc}

\begin{methoddesc}[Message]{walk}{}
The \method{walk()} method is an all-purpose generator which can be
used to iterate over all the parts and subparts of a message object
tree, in depth-first traversal order.  You will typically use
\method{walk()} as the iterator in a \code{for ... in} loop; each
iteration returns the next subpart.

Here's an example that prints the MIME type of every part of a message
object tree:

\begin{verbatim}
>>> for part in msg.walk():
>>>     print part.get_type('text/plain')
multipart/report
text/plain
message/delivery-status
text/plain
text/plain
message/rfc822
\end{verbatim}
\end{methoddesc}

\class{Message} objects can also optionally contain two instance
attributes, which can be used when generating the plain text of a MIME
message.

\begin{datadesc}{preamble}
The format of a MIME document allows for some text between the blank
line following the headers, and the first multipart boundary string.
Normally, this text is never visible in a MIME-aware mail reader
because it falls outside the standard MIME armor.  However, when
viewing the raw text of the message, or when viewing the message in a
non-MIME aware reader, this text can become visible.

The \var{preamble} attribute contains this leading extra-armor text
for MIME documents.  When the \class{Parser} discovers some text after
the headers but before the first boundary string, it assigns this text
to the message's \var{preamble} attribute.  When the \class{Generator}
is writing out the plain text representation of a MIME message, and it
finds the message has a \var{preamble} attribute, it will write this
text in the area between the headers and the first boundary.

Note that if the message object has no preamble, the
\var{preamble} attribute will be \code{None}.
\end{datadesc}

\begin{datadesc}{epilogue}
The \var{epilogue} attribute acts the same way as the \var{preamble}
attribute, except that it contains text that appears between the last
boundary and the end of the message.

One note: when generating the flat text for a \mimetype{multipart}
message that has no \var{epilogue} (using the standard
\class{Generator} class), no newline is added after the closing
boundary line.  If the message object has an \var{epilogue} and its
value does not start with a newline, a newline is printed after the
closing boundary.  This seems a little clumsy, but it makes the most
practical sense.  The upshot is that if you want to ensure that a
newline get printed after your closing \mimetype{multipart} boundary,
set the \var{epilogue} to the empty string.
\end{datadesc}
