The email package documentation, currently organized the way I think
Fred prefers. I'm not sure I like this organization, so it may change.
This commit is contained in:
parent
26991a7f77
commit
5e634638e6
|
@ -0,0 +1,358 @@
|
|||
% Copyright (C) 2001 Python Software Foundation
|
||||
% Author: barry@zope.com (Barry Warsaw)
|
||||
|
||||
\section{\module{email} --
|
||||
An email and MIME handling package}
|
||||
|
||||
\declaremodule{standard}{email}
|
||||
\modulesynopsis{Package supporting the parsing, manipulating, and
|
||||
generating email messages, including MIME documents.}
|
||||
\moduleauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
The \module{email} package is a library for managing email messages,
|
||||
including MIME and other \rfc{2822}-based message documents. It
|
||||
subsumes most of the functionality in several older standard modules
|
||||
such as \module{rfc822}, \module{mimetools}, \module{multifile}, and
|
||||
other non-standard packages such as \module{mimecntl}.
|
||||
|
||||
The primary distinguishing feature of the \module{email} package is
|
||||
that it splits the parsing and generating of email messages from the
|
||||
internal \emph{object model} representation of email. Applications
|
||||
using the \module{email} package deal primarily with objects; you can
|
||||
add sub-objects to messages, remove sub-objects from messages,
|
||||
completely re-arrange the contents, etc. There is a separate parser
|
||||
and a separate generator which handles the transformation from flat
|
||||
text to the object module, and then back to flat text again. There
|
||||
are also handy subclasses for some common MIME object types, and a few
|
||||
miscellaneous utilities that help with such common tasks as extracting
|
||||
and parsing message field values, creating RFC-compliant dates, etc.
|
||||
|
||||
The following sections describe the functionality of the
|
||||
\module{email} package. The ordering follows a progression that
|
||||
should be common in applications: an email message is read as flat
|
||||
text from a file or other source, the text is parsed to produce an
|
||||
object model representation of the email message, this model is
|
||||
manipulated, and finally the model is rendered back into
|
||||
flat text.
|
||||
|
||||
It is perfectly feasible to create the object model out of whole cloth
|
||||
-- i.e. completely from scratch. From there, a similar progression can
|
||||
be taken as above.
|
||||
|
||||
Also included are detailed specifications of all the classes and
|
||||
modules that the \module{email} package provides, the exception
|
||||
classes you might encounter while using the \module{email} package,
|
||||
some auxiliary utilities, and a few examples. For users of the older
|
||||
\module{mimelib} package, from which the \module{email} package is
|
||||
descendent, a section on differences and porting is provided.
|
||||
|
||||
\subsection{Representing an email message}
|
||||
|
||||
The primary object in the \module{email} package is the
|
||||
\class{Message} class, provided in the \refmodule{email.Message}
|
||||
module. \class{Message} is the base class for the \module{email}
|
||||
object model. It 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 name 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
|
||||
\code{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.
|
||||
|
||||
\subsection{Parsing email messages}
|
||||
Message object trees can be created in one of two ways: they can be
|
||||
created from whole cloth by instantiating \class{Message} objects and
|
||||
stringing them together via \method{add_payload()} and
|
||||
\method{set_payload()} calls, or they can be created by parsing a flat text
|
||||
representation of the email message.
|
||||
|
||||
The \module{email} package provides a standard parser that understands
|
||||
most email document structures, including MIME documents. You can
|
||||
pass the parser a string or a file object, and the parser will return
|
||||
to you the root \class{Message} instance of the object tree. For
|
||||
simple, non-MIME messages the payload of this root object will likely
|
||||
be a string (e.g. containing the text of the message). For MIME
|
||||
messages, the root object will return 1 from its
|
||||
\method{is_multipart()} method, and the subparts can be accessed via
|
||||
the \method{get_payload()} and \method{walk()} methods.
|
||||
|
||||
Note that the parser can be extended in limited ways, and of course
|
||||
you can implement your own parser completely from scratch. There is
|
||||
no magical connection between the \module{email} package's bundled
|
||||
parser and the
|
||||
\class{Message} class, so your custom parser can create message object
|
||||
trees in any way it find necessary. The \module{email} package's
|
||||
parser is described in detail in the \refmodule{email.Parser} module
|
||||
documentation.
|
||||
|
||||
\subsection{Generating MIME documents}
|
||||
One of the most common tasks is to generate the flat text of the email
|
||||
message represented by a message object tree. You will need to do
|
||||
this if you want to send your message via the \refmodule{smtplib}
|
||||
module or the \refmodule{nntplib} module, or print the message on the
|
||||
console. Taking a message object tree and producing a flat text
|
||||
document is the job of the \refmodule{email.Generator} module.
|
||||
|
||||
Again, as with the \refmodule{email.Parser} module, you aren't limited
|
||||
to the functionality of the bundled generator; you could write one
|
||||
from scratch yourself. However the bundled generator knows how to
|
||||
generate most email in a standards-compliant way, should handle MIME
|
||||
and non-MIME email messages just fine, and is designed so that the
|
||||
transformation from flat text, to an object tree via the
|
||||
\class{Parser} class,
|
||||
and back to flat text, be idempotent (the input is identical to the
|
||||
output).
|
||||
|
||||
\subsection{Creating email and MIME objects from scratch}
|
||||
|
||||
Ordinarily, you get a message object tree by passing some text to a
|
||||
parser, which parses the text and returns the root of the message
|
||||
object tree. However you can also build a complete object tree from
|
||||
scratch, or even individual \class{Message} objects by hand. In fact,
|
||||
you can also take an existing tree and add new \class{Message}
|
||||
objects, move them around, etc. This makes a very convenient
|
||||
interface for slicing-and-dicing MIME messages.
|
||||
|
||||
You can create a new object tree by creating \class{Message}
|
||||
instances, adding payloads and all the appropriate headers manually.
|
||||
For MIME messages though, the \module{email} package provides some
|
||||
convenient classes to make things easier. Each of these classes
|
||||
should be imported from a module with the same name as the class, from
|
||||
within the \module{email} package. E.g.:
|
||||
|
||||
\begin{verbatim}
|
||||
import email.MIMEImage.MIMEImage
|
||||
\end{verbatim}
|
||||
|
||||
or
|
||||
|
||||
\begin{verbatim}
|
||||
from email.MIMEText import MIMEText
|
||||
\end{verbatim}
|
||||
|
||||
Here are the classes:
|
||||
|
||||
\begin{classdesc}{MIMEBase}{_maintype, _subtype, **_params}
|
||||
This is the base class for all the MIME-specific subclasses of
|
||||
\class{Message}. Ordinarily you won't create instances specifically
|
||||
of \class{MIMEBase}, although you could. \class{MIMEBase} is provided
|
||||
primarily as a convenient base class for more specific MIME-aware
|
||||
subclasses.
|
||||
|
||||
\var{_maintype} is the \code{Content-Type:} major type (e.g. \code{text} or
|
||||
\code{image}), and \var{_subtype} is the \code{Content-Type:} minor type
|
||||
(e.g. \code{plain} or \code{gif}). \var{_params} is a parameter
|
||||
key/value dictionary and is passed directly to
|
||||
\method{Message.add_header()}.
|
||||
|
||||
The \class{MIMEBase} class always adds a \code{Content-Type:} header
|
||||
(based on \var{_maintype}, \var{_subtype}, and \var{_params}), and a
|
||||
\code{MIME-Version:} header (always set to \code{1.0}).
|
||||
\end{classdesc}
|
||||
|
||||
\begin{classdesc}{MIMEImage}{_imagedata\optional{, _subtype\optional{,
|
||||
_encoder\optional{, **_params}}}}
|
||||
|
||||
A subclass of \class{MIMEBase}, the \class{MIMEImage} class is used to
|
||||
create MIME message objects of major type \code{image}.
|
||||
\var{_imagedata} is a string containing the raw image data. If this
|
||||
data can be decoded by the standard Python module \refmodule{imghdr},
|
||||
then the subtype will be automatically included in the
|
||||
\code{Content-Type:} header. Otherwise you can explicitly specify the
|
||||
image subtype via the \var{_subtype} parameter. If the minor type could
|
||||
not be guessed and \var{_subtype} was not given, then \code{TypeError}
|
||||
is raised.
|
||||
|
||||
Optional \var{_encoder} is a callable (i.e. function) which will
|
||||
perform the actual encoding of the image data for transport. This
|
||||
callable takes one argument, which is the \class{MIMEImage} instance.
|
||||
It should use \method{get_payload()} and \method{set_payload()} to
|
||||
change the payload to encoded form. It should also add any
|
||||
\code{Content-Transfer-Encoding:} or other headers to the message
|
||||
object as necessary. The default encoding is \emph{Base64}. See the
|
||||
\refmodule{email.Encoders} module for a list of the built-in encoders.
|
||||
|
||||
\var{_params} are passed straight through to the \class{MIMEBase}
|
||||
constructor.
|
||||
\end{classdesc}
|
||||
|
||||
\begin{classdesc}{MIMEText}{_text\optional{, _subtype\optional{,
|
||||
_charset\optional{, _encoder}}}}
|
||||
A subclass of \class{MIMEBase}, the \class{MIMEText} class is used to
|
||||
create MIME objects of major type \code{text}. \var{_text} is the string
|
||||
for the payload. \var{_subtype} is the minor type and defaults to
|
||||
\code{plain}. \var{_charset} is the character set of the text and is
|
||||
passed as a parameter to the \class{MIMEBase} constructor; it defaults
|
||||
to \code{us-ascii}. No guessing or encoding is performed on the text
|
||||
data, but a newline is appended to \var{_text} if it doesn't already
|
||||
end with a newline.
|
||||
|
||||
The \var{_encoding} argument is as with the \class{MIMEImage} class
|
||||
constructor, except that the default encoding for \class{MIMEText}
|
||||
objects is one that doesn't actually modify the payload, but does set
|
||||
the \code{Content-Transfer-Encoding:} header to \code{7bit} or
|
||||
\code{8bit} as appropriate.
|
||||
\end{classdesc}
|
||||
|
||||
\begin{classdesc}{MIMEMessage}{_msg\optional{, _subtype}}
|
||||
A subclass of \class{MIMEBase}, the \class{MIMEMessage} class is used to
|
||||
create MIME objects of main type \code{message}. \var{_msg} is used as
|
||||
the payload, and must be an instance of class \class{Message} (or a
|
||||
subclass thereof), otherwise a \exception{TypeError} is raised.
|
||||
|
||||
Optional \var{_subtype} sets the subtype of the message; it defaults
|
||||
to \code{rfc822}.
|
||||
\end{classdesc}
|
||||
|
||||
\subsection{Encoders, Exceptions, Utilities, and Iterators}
|
||||
|
||||
The \module{email} package provides various encoders for safe
|
||||
transport of binary payloads in \class{MIMEImage} and \class{MIMEText}
|
||||
instances. See the \refmodule{email.Encoders} module for more
|
||||
details.
|
||||
|
||||
All of the class exceptions that the \module{email} package can raise
|
||||
are available in the \refmodule{email.Errors} module.
|
||||
|
||||
Some miscellaneous utility functions are available in the
|
||||
\refmodule{email.Utils} module.
|
||||
|
||||
Iterating over a message object tree is easy with the
|
||||
\method{Message.walk()} method; some additional helper iterators are
|
||||
available in the \refmodule{email.Iterators} module.
|
||||
|
||||
\subsection{Differences from \module{mimelib}}
|
||||
|
||||
The \module{email} package was originally prototyped as a separate
|
||||
library called \module{mimelib}. Changes have been made so that
|
||||
method names are more consistent, and some methods or modules have
|
||||
either been added or removed. The semantics of some of the methods
|
||||
have also changed. For the most part, any functionality available in
|
||||
\module{mimelib} is still available in the \module{email} package,
|
||||
albeit often in a different way.
|
||||
|
||||
Here is a brief description of the differences between the
|
||||
\module{mimelib} and the \module{email} packages, along with hints on
|
||||
how to port your applications.
|
||||
|
||||
Of course, the most visible difference between the two packages is
|
||||
that the package name has been changed to \module{email}. In
|
||||
addition, the top-level package has the following differences:
|
||||
|
||||
\begin{itemize}
|
||||
\item \function{messageFromString()} has been renamed to
|
||||
\function{message_from_string()}.
|
||||
\item \function{messageFromFile()} has been renamed to
|
||||
\function{message_from_file()}.
|
||||
\end{itemize}
|
||||
|
||||
The \class{Message} class has the following differences:
|
||||
|
||||
\begin{itemize}
|
||||
\item The method \method{asString()} was renamed to \method{as_string()}.
|
||||
\item The method \method{ismultipart()} was renamed to
|
||||
\method{is_multipart()}.
|
||||
\item The \method{get_payload()} method has grown a \var{decode}
|
||||
optional argument.
|
||||
\item The method \method{getall()} was renamed to \method{get_all()}.
|
||||
\item The method \method{addheader()} was renamed to \method{add_header()}.
|
||||
\item The method \method{gettype()} was renamed to \method{get_type()}.
|
||||
\item The method\method{getmaintype()} was renamed to
|
||||
\method{get_main_type()}.
|
||||
\item The method \method{getsubtype()} was renamed to
|
||||
\method{get_subtype()}.
|
||||
\item The method \method{getparams()} was renamed to
|
||||
\method{get_params()}.
|
||||
Also, whereas \method{getparams()} returned a list of strings,
|
||||
\method{get_params()} returns a list of 2-tuples, effectively
|
||||
the key/value pairs of the parameters, split on the \samp{=}
|
||||
sign.
|
||||
\item The method \method{getparam()} was renamed to \method{get_param()}.
|
||||
\item The method \method{getcharsets()} was renamed to
|
||||
\method{get_charsets()}.
|
||||
\item The method \method{getfilename()} was renamed to
|
||||
\method{get_filename()}.
|
||||
\item The method \method{getboundary()} was renamed to
|
||||
\method{get_boundary()}.
|
||||
\item The method \method{setboundary()} was renamed to
|
||||
\method{set_boundary()}.
|
||||
\item The method \method{getdecodedpayload()} was removed. To get
|
||||
similar functionality, pass the value 1 to the \var{decode} flag
|
||||
of the {get_payload()} method.
|
||||
\item The method \method{getpayloadastext()} was removed. Similar
|
||||
functionality
|
||||
is supported by the \class{DecodedGenerator} class in the
|
||||
\refmodule{email.Generator} module.
|
||||
\item The method \method{getbodyastext()} was removed. You can get
|
||||
similar functionality by creating an iterator with
|
||||
\function{typed_subpart_iterator()} in the
|
||||
\refmodule{email.Iterators} module.
|
||||
\end{itemize}
|
||||
|
||||
The \class{Parser} class has no differences in its public interface.
|
||||
It does have some additional smarts to recognize
|
||||
\code{message/delivery-status} type messages, which it represents as
|
||||
a \class{Message} instance containing separate \class{Message}
|
||||
subparts for each header block in the delivery status
|
||||
notification\footnote{Delivery Status Notifications (DSN) are defined
|
||||
in \rfc{1894}}.
|
||||
|
||||
The \class{Generator} class has no differences in its public
|
||||
interface. There is a new class in the \refmodule{email.Generator}
|
||||
module though, called \class{DecodedGenerator} which provides most of
|
||||
the functionality previously available in the
|
||||
\method{Message.getpayloadastext()} method.
|
||||
|
||||
The following modules and classes have been changed:
|
||||
|
||||
\begin{itemize}
|
||||
\item The \class{MIMEBase} class constructor arguments \var{_major}
|
||||
and \var{_minor} have changed to \var{_maintype} and
|
||||
\var{_subtype} respectively.
|
||||
\item The \code{Image} class/module has been renamed to
|
||||
\code{MIMEImage}. The \var{_minor} argument has been renamed to
|
||||
\var{_subtype}.
|
||||
\item The \code{Text} class/module has been renamed to
|
||||
\code{MIMEText}. The \var{_minor} argument has been renamed to
|
||||
\var{_subtype}.
|
||||
\item The \code{MessageRFC822} class/module has been renamed to
|
||||
\code{MIMEMessage}. Note that an earlier version of
|
||||
\module{mimelib} called this class/module \code{RFC822}, but
|
||||
that clashed with the Python standard library module
|
||||
\refmodule{rfc822} on some case-insensitive file systems.
|
||||
|
||||
Also, the \class{MIMEMessage} class now represents any kind of
|
||||
MIME message with main type \code{message}. It takes an
|
||||
optional argument \var{_subtype} which is used to set the MIME
|
||||
subtype. \var{_subtype} defaults to \code{rfc822}.
|
||||
\end{itemize}
|
||||
|
||||
\module{mimelib} provided some utility functions in its
|
||||
\module{address} and \module{date} modules. All of these functions
|
||||
have been moved to the \refmodule{email.Utils} module.
|
||||
|
||||
The \code{MsgReader} class/module has been removed. Its functionality
|
||||
is most closely supported in the \function{body_line_iterator()}
|
||||
function in the \refmodule{email.Iterators} module.
|
||||
|
||||
\subsection{Examples}
|
||||
|
||||
Coming soon...
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
\section{\module{email.Encoders} ---
|
||||
Email message payload encoders}
|
||||
|
||||
\declaremodule{standard}{email.Encoders}
|
||||
\modulesynopsis{Encoders for email message payloads.}
|
||||
\sectionauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
When creating \class{Message} objects from scratch, you often need to
|
||||
encode the payloads for transport through compliant mail servers.
|
||||
This is especially true for \code{image/*} and \code{text/*} type
|
||||
messages containing binary data.
|
||||
|
||||
The \module{email} package provides some convenient encodings in its
|
||||
\module{Encoders} module. These encoders are actually used by the
|
||||
\class{MIMEImage} and \class{MIMEText} class constructors to provide default
|
||||
encodings. All encoder functions take exactly one argument, the
|
||||
message object to encode. They usually extract the payload, encode
|
||||
it, and reset the payload to this newly encoded value. They should also
|
||||
set the \code{Content-Transfer-Encoding:} header as appropriate.
|
||||
|
||||
Here are the encoding functions provided:
|
||||
|
||||
\begin{funcdesc}{encode_quopri}{msg}
|
||||
Encodes the payload into \emph{Quoted-Printable} form and sets the
|
||||
\code{Content-Transfer-Encoding:} header to
|
||||
\code{quoted-printable}\footnote{Note that encoding with
|
||||
\method{encode_quopri()} also encodes all tabs and space characters in
|
||||
the data.}.
|
||||
This is a good encoding to use when most of your payload is normal
|
||||
printable data, but contains a few unprintable characters.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{encode_base64}{msg}
|
||||
Encodes the payload into \emph{Base64} form and sets the
|
||||
\code{Content-Transfer-Encoding:} header to
|
||||
\code{base64}. This is a good encoding to use when most of your payload
|
||||
is unprintable data since it is a more compact form than
|
||||
Quoted-Printable. The drawback of Base64 encoding is that it
|
||||
renders the text non-human readable.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{encode_7or8bit}{msg}
|
||||
This doesn't actually modify the message's payload, but it does set
|
||||
the \code{Content-Transfer-Encoding:} header to either \code{7bit} or
|
||||
\code{8bit} as appropriate, based on the payload data.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{encode_noop}{msg}
|
||||
This does nothing; it doesn't even set the
|
||||
\code{Content-Transfer-Encoding:} header.
|
||||
\end{funcdesc}
|
|
@ -0,0 +1,53 @@
|
|||
\section{\module{email.Errors} ---
|
||||
email package exception classes}
|
||||
|
||||
\declaremodule{standard}{email.Exceptions}
|
||||
\modulesynopsis{The exception classes used by the email package.}
|
||||
\sectionauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
The following exception classes are defined in the
|
||||
\module{email.Errors} module:
|
||||
|
||||
\begin{excclassdesc}{MessageError}{}
|
||||
This is the base class for all exceptions that the \module{email}
|
||||
package can raise. It is derived from the standard
|
||||
\exception{Exception} class and defines no additional methods.
|
||||
\end{excclassdesc}
|
||||
|
||||
\begin{excclassdesc}{MessageParseError}{}
|
||||
This is the base class for exceptions thrown by the \class{Parser}
|
||||
class. It is derived from \exception{MessageError}.
|
||||
\end{excclassdesc}
|
||||
|
||||
\begin{excclassdesc}{HeaderParseError}{}
|
||||
Raised under some error conditions when parsing the \rfc{2822} headers of
|
||||
a message, this class is derived from \exception{MessageParseError}.
|
||||
It can be raised from the \method{Parser.parse()} or
|
||||
\method{Parser.parsestr()} methods.
|
||||
|
||||
Situations where it can be raised include finding a \emph{Unix-From}
|
||||
header after the first \rfc{2822} header of the message, finding a
|
||||
continuation line before the first \rfc{2822} header is found, or finding
|
||||
a line in the headers which is neither a header or a continuation
|
||||
line.
|
||||
\end{excclassdesc}
|
||||
|
||||
\begin{excclassdesc}{BoundaryError}{}
|
||||
Raised under some error conditions when parsing the \rfc{2822} headers of
|
||||
a message, this class is derived from \exception{MessageParseError}.
|
||||
It can be raised from the \method{Parser.parse()} or
|
||||
\method{Parser.parsestr()} methods.
|
||||
|
||||
Situations where it can be raised include not being able to find the
|
||||
starting or terminating boundary in a \code{multipart/*} message.
|
||||
\end{excclassdesc}
|
||||
|
||||
\begin{excclassdesc}{MultipartConversionError}{}
|
||||
Raised when a payload is added to a \class{Message} object using
|
||||
\method{add_payload()}, but the payload is already a scalar and the
|
||||
message's \code{Content-Type:} main type is not either \code{multipart}
|
||||
or missing. \exception{MultipartConversionError} multiply inherits
|
||||
from \exception{MessageError} and the built-in \exception{TypeError}.
|
||||
\end{excclassdesc}
|
|
@ -0,0 +1,68 @@
|
|||
\section{\module{email.Generator} ---
|
||||
Generating flat text from an email message object tree}
|
||||
|
||||
\declaremodule{standard}{email.Generator}
|
||||
\modulesynopsis{Generate flat text email messages to from a message
|
||||
object tree.}
|
||||
\sectionauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
The \class{Generator} class is used to render a message object model
|
||||
into its flat text representation, including MIME encoding any
|
||||
sub-messages, generating the correct \rfc{2822} headers, etc. Here
|
||||
are the public methods of the \class{Generator} class.
|
||||
|
||||
\begin{classdesc}{Generator}{outfp\optional{, mangle_from_\optional{,
|
||||
maxheaderlen}}}
|
||||
The constructor for the \class{Generator} class takes a file-like
|
||||
object called \var{outfp} for an argument. \var{outfp} must support
|
||||
the \method{write()} method and be usable as the output file in a
|
||||
Python 2.0 extended print statement.
|
||||
|
||||
Optional \var{mangle_from_} is a flag that, when true, puts a ``>''
|
||||
character in front of any line in the body that starts exactly as
|
||||
\samp{From } (i.e. \code{From} followed by a space at the front of the
|
||||
line). This is the only guaranteed portable way to avoid having such
|
||||
lines be mistaken for \emph{Unix-From} headers (see
|
||||
\url{http://home.netscape.com/eng/mozilla/2.0/relnotes/demo/content-length.html}
|
||||
for details).
|
||||
|
||||
Optional \var{maxheaderlen} specifies the longest length for a
|
||||
non-continued header. When a header line is longer than
|
||||
\var{maxheaderlen} (in characters, with tabs expanded to 8 spaces),
|
||||
the header will be broken on semicolons and continued as per
|
||||
\rfc{2822}. If no semicolon is found, then the header is left alone.
|
||||
Set to zero to disable wrapping headers. Default is 78, as
|
||||
recommended (but not required) by \rfc{2822}.
|
||||
\end{classdesc}
|
||||
|
||||
The other public \class{Generator} methods are:
|
||||
|
||||
\begin{methoddesc}[Generator]{__call__}{msg\optional{, unixfrom}}
|
||||
Print the textual representation of the message object tree rooted at
|
||||
\var{msg} to the output file specified when the \class{Generator}
|
||||
instance was created. Sub-objects are visited depth-first and the
|
||||
resulting text will be properly MIME encoded.
|
||||
|
||||
Optional \var{unixfrom} is a flag that forces the printing of the
|
||||
\emph{Unix-From} (a.k.a. envelope header or \code{From_} header)
|
||||
delimiter before the first \rfc{2822} header of the root message
|
||||
object. If the root object has no \emph{Unix-From} header, a standard
|
||||
one is crafted. By default, this is set to 0 to inhibit the printing
|
||||
of the \emph{Unix-From} delimiter.
|
||||
|
||||
Note that for sub-objects, no \emph{Unix-From} header is ever printed.
|
||||
\end{methoddesc}
|
||||
|
||||
\begin{methoddesc}[Generator]{write}{s}
|
||||
Write the string \var{s} to the underlying file object,
|
||||
i.e. \var{outfp} passed to \class{Generator}'s constructor. This
|
||||
provides just enough file-like API for \class{Generator} instances to
|
||||
be used in extended print statements.
|
||||
\end{methoddesc}
|
||||
|
||||
As a convenience, see the methods \method{Message.as_string()} and
|
||||
\code{str(aMessage)}, a.k.a. \method{Message.__str__()}, which
|
||||
simplify the generation of a formatted string representation of a
|
||||
message object. For more detail, see \refmodule{email.Message}.
|
|
@ -0,0 +1,37 @@
|
|||
\section{\module{email.Iterators} ---
|
||||
Message object tree iterators}
|
||||
|
||||
\declaremodule{standard}{email.Iterators}
|
||||
\modulesynopsis{Iterate over a message object tree.}
|
||||
\sectionauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
Iterating over a message object tree is fairly easy with the
|
||||
\method{Message.walk()} method. The \module{email.Iterators} module
|
||||
provides some useful higher level iterations over message object
|
||||
trees.
|
||||
|
||||
\begin{funcdesc}{body_line_iterator}{msg}
|
||||
This iterates over all the payloads in all the subparts of \var{msg},
|
||||
returning the string payloads line-by-line. It skips over all the
|
||||
subpart headers, and it skips over any subpart with a payload that
|
||||
isn't a Python string. This is somewhat equivalent to reading the
|
||||
flat text representation of the message from a file using
|
||||
\method{readline()}, skipping over all the intervening headers.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{typed_subpart_iterator}{msg\optional{,
|
||||
maintype\optional{, subtype}}}
|
||||
This iterates over all the subparts of \var{msg}, returning only those
|
||||
subparts that match the MIME type specified by \var{maintype} and
|
||||
\var{subtype}.
|
||||
|
||||
Note that \var{subtype} is optional; if omitted, then subpart MIME
|
||||
type matching is done only with the main type. \var{maintype} is
|
||||
optional too; it defaults to \code{text}.
|
||||
|
||||
Thus, by default \function{typed_subpart_iterator()} returns each
|
||||
subpart that has a MIME type of \code{text/*}.
|
||||
\end{funcdesc}
|
||||
|
|
@ -0,0 +1,384 @@
|
|||
\section{\module{email.Message} ---
|
||||
The Message class}
|
||||
|
||||
\declaremodule{standard}{email.Message}
|
||||
\modulesynopsis{The base class representing email messages.}
|
||||
\sectionauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
The \module{Message} module provides a single class, the
|
||||
\class{Message} class. This class is the base class for the
|
||||
\module{email} package object model. It has a fairly extensive set of
|
||||
methods to get and set email headers and email payloads. For an
|
||||
introduction of the \module{email} package, please read the
|
||||
\refmodule{email} package overview.
|
||||
|
||||
\class{Message} instances can be created either directly, or
|
||||
indirectly by using a \refmodule{email.Parser}. \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{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
|
||||
\code{Content-Type:} header's main type is either \var{multipart}, or
|
||||
there is no \code{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 \code{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
|
||||
\code{TypeError} is raised.
|
||||
|
||||
Optional \var{decode} is a flag indicating whether the payload should be
|
||||
decoded or not, according to the \code{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
|
||||
\code{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}.
|
||||
Match 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 \code{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
|
||||
``maintype/subtype'' as taken from the \code{Content-Type:} header.
|
||||
The returned string is coerced to lowercase.
|
||||
|
||||
If there is no \code{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 \code{Content-Type:} parameters, as a list. The
|
||||
elements of the returned list are 2-tuples of key/value pairs, as
|
||||
split on the \samp{=} sign. The left hand side of the \samp{=} is the
|
||||
key, while the right hand side is the value. If there is no \samp{=}
|
||||
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
|
||||
\code{Content-Type:} header. Optional \var{header} is the header to
|
||||
search instead of \code{Content-Type:}.
|
||||
\end{methoddesc}
|
||||
|
||||
\begin{methoddesc}[Message]{get_param}{param\optional{,
|
||||
failobj\optional{, header}}}
|
||||
Return the value of the \code{Content-Type:} header's parameter
|
||||
\var{param} as a string. If the message has no \code{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 \code{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 \code{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 \code{Content-Type:} header for the
|
||||
represented subpart. However, if the subpart has no
|
||||
\code{Content-Type:} header, no \code{charset} parameter, or is not of
|
||||
the \code{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
|
||||
\code{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
|
||||
\code{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 \code{Content-Type:} header
|
||||
to \var{boundary}. \method{set_boundary()} will always quote
|
||||
\var{boundary} so you should not quote it yourself. A
|
||||
\code{HeaderParseError} is raised if the message object has no
|
||||
\code{Content-Type:} header.
|
||||
|
||||
Note that using this method is subtly different than deleting the old
|
||||
\code{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 \code{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 \code{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.
|
||||
\end{datadesc}
|
|
@ -0,0 +1,96 @@
|
|||
\section{\module{email.Parser} ---
|
||||
Parsing flat text email messages}
|
||||
|
||||
\declaremodule{standard}{email.Parser}
|
||||
\modulesynopsis{Parse flat text email messages to produce a message
|
||||
object tree.}
|
||||
\sectionauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
The \module{Parser} module provides a single class, the \class{Parser}
|
||||
class, which is used to take a message in flat text form and create
|
||||
the associated object model. The resulting object tree can then be
|
||||
manipulated using the \class{Message} class interface as described in
|
||||
\refmodule{email.Message}, and turned over
|
||||
to a generator (as described in \refmodule{emamil.Generator}) to
|
||||
return the textual representation of the message. It is intended that
|
||||
the \class{Parser} to \class{Generator} path be idempotent if the
|
||||
object model isn't modified in between.
|
||||
|
||||
\subsection{Parser class API}
|
||||
|
||||
\begin{classdesc}{Parser}{\optional{_class}}
|
||||
The constructor for the \class{Parser} class takes a single optional
|
||||
argument \var{_class}. This must be callable factory (i.e. a function
|
||||
or a class), and it is used whenever a sub-message object needs to be
|
||||
created. It defaults to \class{Message} (see
|
||||
\refmodule{email.Message}). \var{_class} will be called with zero
|
||||
arguments.
|
||||
\end{classdesc}
|
||||
|
||||
The other public \class{Parser} methods are:
|
||||
|
||||
\begin{methoddesc}[Parser]{parse}{fp}
|
||||
Read all the data from the file-like object \var{fp}, parse the
|
||||
resulting text, and return the root message object. \var{fp} must
|
||||
support both the \method{readline()} and the \method{read()} methods
|
||||
on file-like objects.
|
||||
|
||||
The text contained in \var{fp} must be formatted as a block of \rfc{2822}
|
||||
style headers and header continuation lines, optionally preceeded by a
|
||||
\emph{Unix-From} header. The header block is terminated either by the
|
||||
end of the data or by a blank line. Following the header block is the
|
||||
body of the message (which may contain MIME-encoded subparts).
|
||||
\end{methoddesc}
|
||||
|
||||
\begin{methoddesc}[Parser]{parsestr}{text}
|
||||
Similar to the \method{parse()} method, except it takes a string
|
||||
object instead of a file-like object. Calling this method on a string
|
||||
is exactly equivalent to wrapping \var{text} in a \class{StringIO}
|
||||
instance first and calling \method{parse()}.
|
||||
\end{methoddesc}
|
||||
|
||||
Since creating a message object tree from a string or a file object is
|
||||
such a common task, two functions are provided as a convenience. They
|
||||
are available in the top-level \module{email} package namespace.
|
||||
|
||||
\begin{funcdesc}{message_from_string}{s\optional{, _class}}
|
||||
Return a message object tree from a string. This is exactly
|
||||
equivalent to \code{Parser().parsestr(s)}. Optional \var{_class} is
|
||||
interpreted as with the \class{Parser} class constructor.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{message_from_file}{fp\optional{, _class}}
|
||||
Return a message object tree from an open file object. This is exactly
|
||||
equivalent to \code{Parser().parse(fp)}. Optional \var{_class} is
|
||||
interpreted as with the \class{Parser} class constructor.
|
||||
\end{funcdesc}
|
||||
|
||||
Here's an example of how you might use this at an interactive Python
|
||||
prompt:
|
||||
|
||||
\begin{verbatim}
|
||||
>>> import email
|
||||
>>> msg = email.message_from_string(myString)
|
||||
\end{verbatim}
|
||||
|
||||
\subsection{Additional notes}
|
||||
|
||||
Here are some notes on the parsing semantics:
|
||||
|
||||
\begin{itemize}
|
||||
\item Most non-\code{multipart} type messages are parsed as a single
|
||||
message object with a string payload. These objects will return
|
||||
0 for \method{is_multipart()}.
|
||||
\item One exception is for \code{message/delivery-status} type
|
||||
messages. Because such the body of such messages consist of
|
||||
blocks of headers, \class{Parser} will create a non-multipart
|
||||
object containing non-multipart subobjects for each header
|
||||
block.
|
||||
\item Another exception is for \code{message/*} types (i.e. more
|
||||
general than \code{message/delivery-status}. These are
|
||||
typically \code{message/rfc822} type messages, represented as a
|
||||
non-multipart object containing a singleton payload, another
|
||||
non-multipart \class{Message} instance.
|
||||
\end{itemize}
|
|
@ -0,0 +1,119 @@
|
|||
\section{\module{email.Utils} ---
|
||||
Miscellaneous email package utilities}
|
||||
|
||||
\declaremodule{standard}{email.Utils}
|
||||
\modulesynopsis{Miscellaneous email package utilities.}
|
||||
\sectionauthor{Barry A. Warsaw}{barry@zope.com}
|
||||
|
||||
\versionadded{2.2}
|
||||
|
||||
There are several useful utilities provided with the \module{email}
|
||||
package.
|
||||
|
||||
\begin{funcdesc}{quote}{str}
|
||||
Return a new string with backslashes in \var{str} replaced by two
|
||||
backslashes and double quotes replaced by backslash-double quote.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{unquote}{str}
|
||||
Return a new string which is an \emph{unquoted} version of \var{str}.
|
||||
If \var{str} ends and begins with double quotes, they are stripped
|
||||
off. Likewise if \var{str} ends and begins with angle brackets, they
|
||||
are stripped off.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{parseaddr}{address}
|
||||
Parse address -- which should be the value of some address-containing
|
||||
field such as \code{To:} or \code{Cc:} -- into its constituent
|
||||
``realname'' and ``email address'' parts. Returns a tuple of that
|
||||
information, unless the parse fails, in which case a 2-tuple of
|
||||
\code{(None, None)} is returned.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{dump_address_pair}{pair}
|
||||
The inverse of \method{parseaddr()}, this takes a 2-tuple of the form
|
||||
\code{(realname, email_address)} and returns the string value suitable
|
||||
for a \code{To:} or \code{Cc:} header. If the first element of
|
||||
\var{pair} is false, then the second element is returned unmodified.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{getaddresses}{fieldvalues}
|
||||
This method returns a list of 2-tuples of the form returned by
|
||||
\code{parseaddr()}. \var{fieldvalues} is a sequence of header field
|
||||
values as might be returned by \method{Message.getall()}. Here's a
|
||||
simple example that gets all the recipients of a message:
|
||||
|
||||
\begin{verbatim}
|
||||
from email.Utils import getaddresses
|
||||
|
||||
tos = msg.get_all('to')
|
||||
ccs = msg.get_all('cc')
|
||||
resent_tos = msg.get_all('resent-to')
|
||||
resent_ccs = msg.get_all('resent-cc')
|
||||
all_recipients = getaddresses(tos + ccs + resent_tos + resent_ccs)
|
||||
\end{verbatim}
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{decode}{s}
|
||||
This method decodes a string according to the rules in \rfc{2047}. It
|
||||
returns the decoded string as a Python unicode string.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{encode}{s\optional{, charset\optional{, encoding}}}
|
||||
This method encodes a string according to the rules in \rfc{2047}. It
|
||||
is not actually the inverse of \function{decode()} since it doesn't
|
||||
handle multiple character sets or multiple string parts needing
|
||||
encoding. In fact, the input string \var{s} must already be encoded
|
||||
in the \var{charset} character set (Python can't reliably guess what
|
||||
character set a string might be encoded in). The default
|
||||
\var{charset} is \samp{iso-8859-1}.
|
||||
|
||||
\var{encoding} must be either the letter \samp{q} for
|
||||
Quoted-Printable or \samp{b} for Base64 encoding. If
|
||||
neither, a \code{ValueError} is raised. Both the \var{charset} and
|
||||
the \var{encoding} strings are case-insensitive, and coerced to lower
|
||||
case in the returned string.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{parsedate}{date}
|
||||
Attempts to parse a date according to the rules in \rfc{2822}.
|
||||
however, some mailers don't follow that format as specified, so
|
||||
\function{parsedate()} tries to guess correctly in such cases.
|
||||
\var{date} is a string containing an \rfc{2822} date, such as
|
||||
\code{"Mon, 20 Nov 1995 19:12:08 -0500"}. If it succeeds in parsing
|
||||
the date, \function{parsedate()} returns a 9-tuple that can be passed
|
||||
directly to \function{time.mktime()}; otherwise \code{None} will be
|
||||
returned. Note that fields 6, 7, and 8 of the result tuple are not
|
||||
usable.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{parsedate_tz}{date}
|
||||
Performs the same function as \function{parsedate()}, but returns
|
||||
either \code{None} or a 10-tuple; the first 9 elements make up a tuple
|
||||
that can be passed directly to \function{time.mktime()}, and the tenth
|
||||
is the offset of the date's timezone from UTC (which is the official
|
||||
term for Greenwich Mean Time)\footnote{Note that the sign of the timezone
|
||||
offset is the opposite of the sign of the \code{time.timezone}
|
||||
variable for the same timezone; the latter variable follows the
|
||||
\POSIX{} standard while this module follows \rfc{2822}.}. If the input
|
||||
string has no timezone, the last element of the tuple returned is
|
||||
\code{None}. Note that fields 6, 7, and 8 of the result tuple are not
|
||||
usable.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{mktime_tz}{tuple}
|
||||
Turn a 10-tuple as returned by \function{parsedate_tz()} into a UTC
|
||||
timestamp. It the timezone item in the tuple is \code{None}, assume
|
||||
local time. Minor deficiency: \function{mktime_tz()} interprets the
|
||||
first 8 elements of \var{tuple} as a local time and then compensates
|
||||
for the timezone difference. This may yield a slight error around
|
||||
changes in daylight savings time, though not worth worring about for
|
||||
common use.
|
||||
\end{funcdesc}
|
||||
|
||||
\begin{funcdesc}{formatdate}{\optional{timeval}}
|
||||
Returns the time formatted as per Internet standards \rfc{2822}
|
||||
and updated by \rfc{1123}. If \var{timeval} is provided, then it
|
||||
should be a floating point time value as expected by
|
||||
\method{time.gmtime()}, otherwise the current time is used.
|
||||
\end{funcdesc}
|
Loading…
Reference in New Issue