mirror of https://github.com/python/cpython
178 lines
7.4 KiB
TeX
178 lines
7.4 KiB
TeX
\declaremodule{standard}{email.Header}
|
|
\modulesynopsis{Representing non-ASCII headers}
|
|
|
|
\rfc{2822} is the base standard that describes the format of email
|
|
messages. It derives from the older \rfc{822} standard which came
|
|
into widespread use at a time when most email was composed of \ASCII{}
|
|
characters only. \rfc{2822} is a specification written assuming email
|
|
contains only 7-bit \ASCII{} characters.
|
|
|
|
Of course, as email has been deployed worldwide, it has become
|
|
internationalized, such that language specific character sets can now
|
|
be used in email messages. The base standard still requires email
|
|
messages to be transfered using only 7-bit \ASCII{} characters, so a
|
|
slew of RFCs have been written describing how to encode email
|
|
containing non-\ASCII{} characters into \rfc{2822}-compliant format.
|
|
These RFCs include \rfc{2045}, \rfc{2046}, \rfc{2047}, and \rfc{2231}.
|
|
The \module{email} package supports these standards in its
|
|
\module{email.Header} and \module{email.Charset} modules.
|
|
|
|
If you want to include non-\ASCII{} characters in your email headers,
|
|
say in the \mailheader{Subject} or \mailheader{To} fields, you should
|
|
use the \class{Header} class and assign the field in the
|
|
\class{Message} object to an instance of \class{Header} instead of
|
|
using a string for the header value. For example:
|
|
|
|
\begin{verbatim}
|
|
>>> from email.Message import Message
|
|
>>> from email.Header import Header
|
|
>>> msg = Message()
|
|
>>> h = Header('p\xf6stal', 'iso-8859-1')
|
|
>>> msg['Subject'] = h
|
|
>>> print msg.as_string()
|
|
Subject: =?iso-8859-1?q?p=F6stal?=
|
|
|
|
|
|
\end{verbatim}
|
|
|
|
Notice here how we wanted the \mailheader{Subject} field to contain a
|
|
non-\ASCII{} character? We did this by creating a \class{Header}
|
|
instance and passing in the character set that the byte string was
|
|
encoded in. When the subsequent \class{Message} instance was
|
|
flattened, the \mailheader{Subject} field was properly \rfc{2047}
|
|
encoded. MIME-aware mail readers would show this header using the
|
|
embedded ISO-8859-1 character.
|
|
|
|
\versionadded{2.2.2}
|
|
|
|
Here is the \class{Header} class description:
|
|
|
|
\begin{classdesc}{Header}{\optional{s\optional{, charset\optional{,
|
|
maxlinelen\optional{, header_name\optional{, continuation_ws\optional{,
|
|
errors}}}}}}}
|
|
Create a MIME-compliant header that can contain strings in different
|
|
character sets.
|
|
|
|
Optional \var{s} is the initial header value. If \code{None} (the
|
|
default), the initial header value is not set. You can later append
|
|
to the header with \method{append()} method calls. \var{s} may be a
|
|
byte string or a Unicode string, but see the \method{append()}
|
|
documentation for semantics.
|
|
|
|
Optional \var{charset} serves two purposes: it has the same meaning as
|
|
the \var{charset} argument to the \method{append()} method. It also
|
|
sets the default character set for all subsequent \method{append()}
|
|
calls that omit the \var{charset} argument. If \var{charset} is not
|
|
provided in the constructor (the default), the \code{us-ascii}
|
|
character set is used both as \var{s}'s initial charset and as the
|
|
default for subsequent \method{append()} calls.
|
|
|
|
The maximum line length can be specified explicit via
|
|
\var{maxlinelen}. For splitting the first line to a shorter value (to
|
|
account for the field header which isn't included in \var{s},
|
|
e.g. \mailheader{Subject}) pass in the name of the field in
|
|
\var{header_name}. The default \var{maxlinelen} is 76, and the
|
|
default value for \var{header_name} is \code{None}, meaning it is not
|
|
taken into account for the first line of a long, split header.
|
|
|
|
Optional \var{continuation_ws} must be \rfc{2822}-compliant folding
|
|
whitespace, and is usually either a space or a hard tab character.
|
|
This character will be prepended to continuation lines.
|
|
\end{classdesc}
|
|
|
|
Optional \var{errors} is passed straight through to the
|
|
\method{append()} method.
|
|
|
|
\begin{methoddesc}[Header]{append}{s\optional{, charset\optional{, errors}}}
|
|
Append the string \var{s} to the MIME header.
|
|
|
|
Optional \var{charset}, if given, should be a \class{Charset} instance
|
|
(see \refmodule{email.Charset}) or the name of a character set, which
|
|
will be converted to a \class{Charset} instance. A value of
|
|
\code{None} (the default) means that the \var{charset} given in the
|
|
constructor is used.
|
|
|
|
\var{s} may be a byte string or a Unicode string. If it is a byte
|
|
string (i.e. \code{isinstance(s, str)} is true), then
|
|
\var{charset} is the encoding of that byte string, and a
|
|
\exception{UnicodeError} will be raised if the string cannot be
|
|
decoded with that character set.
|
|
|
|
If \var{s} is a Unicode string, then \var{charset} is a hint
|
|
specifying the character set of the characters in the string. In this
|
|
case, when producing an \rfc{2822}-compliant header using \rfc{2047}
|
|
rules, the Unicode string will be encoded using the following charsets
|
|
in order: \code{us-ascii}, the \var{charset} hint, \code{utf-8}. The
|
|
first character set to not provoke a \exception{UnicodeError} is used.
|
|
|
|
Optional \var{errors} is passed through to any \function{unicode()} or
|
|
\function{ustr.encode()} call, and defaults to ``strict''.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}[Header]{encode}{\optional{splitchars}}
|
|
Encode a message header into an RFC-compliant format, possibly
|
|
wrapping long lines and encapsulating non-\ASCII{} parts in base64 or
|
|
quoted-printable encodings. Optional \var{splitchars} is a string
|
|
containing characters to split long ASCII lines on, in rough support
|
|
of \rfc{2822}'s \emph{highest level syntactic breaks}. This doesn't
|
|
affect \rfc{2047} encoded lines.
|
|
\end{methoddesc}
|
|
|
|
The \class{Header} class also provides a number of methods to support
|
|
standard operators and built-in functions.
|
|
|
|
\begin{methoddesc}[Header]{__str__}{}
|
|
A synonym for \method{Header.encode()}. Useful for
|
|
\code{str(aHeader)}.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}[Header]{__unicode__}{}
|
|
A helper for the built-in \function{unicode()} function. Returns the
|
|
header as a Unicode string.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}[Header]{__eq__}{other}
|
|
This method allows you to compare two \class{Header} instances for equality.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}[Header]{__ne__}{other}
|
|
This method allows you to compare two \class{Header} instances for inequality.
|
|
\end{methoddesc}
|
|
|
|
The \module{email.Header} module also provides the following
|
|
convenient functions.
|
|
|
|
\begin{funcdesc}{decode_header}{header}
|
|
Decode a message header value without converting the character set.
|
|
The header value is in \var{header}.
|
|
|
|
This function returns a list of \code{(decoded_string, charset)} pairs
|
|
containing each of the decoded parts of the header. \var{charset} is
|
|
\code{None} for non-encoded parts of the header, otherwise a lower
|
|
case string containing the name of the character set specified in the
|
|
encoded string.
|
|
|
|
Here's an example:
|
|
|
|
\begin{verbatim}
|
|
>>> from email.Header import decode_header
|
|
>>> decode_header('=?iso-8859-1?q?p=F6stal?=')
|
|
[('p\\xf6stal', 'iso-8859-1')]
|
|
\end{verbatim}
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{make_header}{decoded_seq\optional{, maxlinelen\optional{,
|
|
header_name\optional{, continuation_ws}}}}
|
|
Create a \class{Header} instance from a sequence of pairs as returned
|
|
by \function{decode_header()}.
|
|
|
|
\function{decode_header()} takes a header value string and returns a
|
|
sequence of pairs of the format \code{(decoded_string, charset)} where
|
|
\var{charset} is the name of the character set.
|
|
|
|
This function takes one of those sequence of pairs and returns a
|
|
\class{Header} instance. Optional \var{maxlinelen},
|
|
\var{header_name}, and \var{continuation_ws} are as in the
|
|
\class{Header} constructor.
|
|
\end{funcdesc}
|