Logical markup.

Wrap general Message class description in a {classdesc} instead of nothing at
all.
This commit is contained in:
Fred Drake 1998-03-14 06:17:43 +00:00
parent 0f51fff57e
commit cdea8a3c60
2 changed files with 108 additions and 102 deletions

View File

@ -2,20 +2,19 @@
\label{module-rfc822} \label{module-rfc822}
\stmodindex{rfc822} \stmodindex{rfc822}
\setindexsubitem{(in module rfc822)}
This module defines a class, \code{Message}, which represents a This module defines a class, \class{Message}, which represents a
collection of ``email headers'' as defined by the Internet standard collection of ``email headers'' as defined by the Internet standard
\rfc{822}. It is used in various contexts, usually to read such \rfc{822}. It is used in various contexts, usually to read such
headers from a file. headers from a file.
Note that there's a separate module to read \UNIX{}, MH, and MMDF Note that there's a separate module to read \UNIX{}, MH, and MMDF
style mailbox files: \code{mailbox}. style mailbox files: \module{mailbox}\refstmodindex{mailbox}.
\refstmodindex{mailbox}
A \code{Message} instance is instantiated with an open file object as \begin{classdesc}{Message}{file\optional{, seekable}}
parameter. The optional \code{seekable} parameter indicates if the A \class{Message} instance is instantiated with an open file object as
file object is seekable; the default value is 1 for true. parameter. The optional \var{seekable} parameter indicates if the
file object is seekable; the default value is \code{1} for true.
Instantiation reads headers from the file up to a blank line and Instantiation reads headers from the file up to a blank line and
stores them in the instance; after instantiation, the file is stores them in the instance; after instantiation, the file is
positioned directly after the blank line that terminates the headers. positioned directly after the blank line that terminates the headers.
@ -25,44 +24,46 @@ by a single linefeed; a terminating CR-LF is replaced by a single
linefeed before the line is stored. linefeed before the line is stored.
All header matching is done independent of upper or lower case; All header matching is done independent of upper or lower case;
e.g. \code{m['From']}, \code{m['from']} and \code{m['FROM']} all yield e.g. \code{\var{m}['From']}, \code{\var{m}['from']} and
the same result. \code{\var{m}['FROM']} all yield the same result.
\end{classdesc}
\begin{funcdesc}{parsedate}{date} \begin{funcdesc}{parsedate}{date}
Attempts to parse a date according to the rules in \rfc{822}. however, Attempts to parse a date according to the rules in \rfc{822}.
some mailers don't follow that format as specified, so however, some mailers don't follow that format as specified, so
\code{parsedate()} tries to guess correctly in such cases. \function{parsedate()} tries to guess correctly in such cases.
\var{date} is a string containing an \rfc{822} date, such as \var{date} is a string containing an \rfc{822} date, such as
\code{"Mon, 20 Nov 1995 19:12:08 -0500"}. If it succeeds in parsing \code{'Mon, 20 Nov 1995 19:12:08 -0500'}. If it succeeds in parsing
the date, \code{parsedate()} returns a 9-tuple that can be passed the date, \function{parsedate()} returns a 9-tuple that can be passed
directly to \code{time.mktime()}; otherwise \code{None} will be directly to \function{time.mktime()}; otherwise \code{None} will be
returned. returned.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{parsedate_tz}{date} \begin{funcdesc}{parsedate_tz}{date}
Performs the same function as \code{parsedate()}, but returns either Performs the same function as \function{parsedate()}, but returns
\code{None} or a 10-tuple; the first 9 elements make up a tuple that either \code{None} or a 10-tuple; the first 9 elements make up a tuple
can be passed directly to \code{time.mktime()}, and the tenth is the that can be passed directly to \function{time.mktime()}, and the tenth
offset of the date's timezone from UTC (which is the official term is the offset of the date's timezone from UTC (which is the official
for Greenwich Mean Time). (Note that the sign of the timezone offset term for Greenwich Mean Time). (Note that the sign of the timezone
is the opposite of the sign of the \code{time.timezone} variable for offset is the opposite of the sign of the \code{time.timezone}
the same timezone; the latter variable follows the \POSIX{} standard variable for the same timezone; the latter variable follows the
while this module follows \rfc{822}.) If the input string has no \POSIX{} standard while this module follows \rfc{822}.) If the input
timezone, the last element of the tuple returned is \code{None}. string has no timezone, the last element of the tuple returned is
\code{None}.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{mktime_tz}{tuple} \begin{funcdesc}{mktime_tz}{tuple}
Turn a 10-tuple as returned by \code{parsedate_tz()} into a UTC timestamp. Turn a 10-tuple as returned by \function{parsedate_tz()} into a UTC
It the timezone item in the tuple is \code{None}, assume local time. timestamp. It the timezone item in the tuple is \code{None}, assume
Minor deficiency: this first interprets the first 8 elements as a local time. Minor deficiency: this first interprets the first 8
local time and then compensates for the timezone difference; elements as a local time and then compensates for the timezone
this may yield a slight error around daylight savings time difference; this may yield a slight error around daylight savings time
switch dates. Not enough to worry about for common use. switch dates. Not enough to worry about for common use.
\end{funcdesc} \end{funcdesc}
\subsection{Message Objects} \subsection{Message Objects}
A \code{Message} instance has the following methods: A \class{Message} instance has the following methods:
\begin{funcdesc}{rewindbody}{} \begin{funcdesc}{rewindbody}{}
Seek to the start of the message body. This only works if the file Seek to the start of the message body. This only works if the file
@ -92,16 +93,17 @@ no header matching \var{name}.
\begin{funcdesc}{getheader}{name} \begin{funcdesc}{getheader}{name}
Like \code{getrawheader(\var{name})}, but strip leading and trailing Like \code{getrawheader(\var{name})}, but strip leading and trailing
whitespace (but not internal whitespace). whitespace. Internal whitespace is not stripped.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{getaddr}{name} \begin{funcdesc}{getaddr}{name}
Return a pair (full name, email address) parsed from the string Return a pair \code{(\var{full name}, \var{email address})} parsed
returned by \code{getheader(\var{name})}. If no header matching from the string returned by \code{getheader(\var{name})}. If no
\var{name} exists, return \code{None, None}; otherwise both the full header matching \var{name} exists, return \code{(None, None)};
name and the address are (possibly empty )strings. otherwise both the full name and the address are (possibly empty)
strings.
Example: If \code{m}'s first \code{From} header contains the string\\ Example: If \var{m}'s first \code{From} header contains the string
\code{'jack@cwi.nl (Jack Jansen)'}, then \code{'jack@cwi.nl (Jack Jansen)'}, then
\code{m.getaddr('From')} will yield the pair \code{m.getaddr('From')} will yield the pair
\code{('Jack Jansen', 'jack@cwi.nl')}. \code{('Jack Jansen', 'jack@cwi.nl')}.
@ -113,17 +115,17 @@ exact same result.
\begin{funcdesc}{getaddrlist}{name} \begin{funcdesc}{getaddrlist}{name}
This is similar to \code{getaddr(\var{list})}, but parses a header This is similar to \code{getaddr(\var{list})}, but parses a header
containing a list of email addresses (e.g. a \code{To} header) and containing a list of email addresses (e.g. a \code{To} header) and
returns a list of (full name, email address) pairs (even if there was returns a list of \code{(\var{full name}, \var{email address})} pairs
only one address in the header). If there is no header matching (even if there was only one address in the header). If there is no
\var{name}, return an empty list. header matching \var{name}, return an empty list.
XXX The current version of this function is not really correct. It XXX The current version of this function is not really correct. It
yields bogus results if a full name contains a comma. yields bogus results if a full name contains a comma.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{getdate}{name} \begin{funcdesc}{getdate}{name}
Retrieve a header using \code{getheader} and parse it into a 9-tuple Retrieve a header using \method{getheader()} and parse it into a 9-tuple
compatible with \code{time.mktime()}. If there is no header matching compatible with \function{time.mktime()}. If there is no header matching
\var{name}, or it is unparsable, return \code{None}. \var{name}, or it is unparsable, return \code{None}.
Date parsing appears to be a black art, and not all mailers adhere to Date parsing appears to be a black art, and not all mailers adhere to
@ -133,21 +135,22 @@ function may occasionally yield an incorrect result.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{getdate_tz}{name} \begin{funcdesc}{getdate_tz}{name}
Retrieve a header using \code{getheader} and parse it into a 10-tuple; Retrieve a header using \method{getheader()} and parse it into a
the first 9 elements will make a tuple compatible with 10-tuple; the first 9 elements will make a tuple compatible with
\code{time.mktime()}, and the 10th is a number giving the offset of \function{time.mktime()}, and the 10th is a number giving the offset
the date's timezone from UTC. Similarly to \code{getdate()}, if of the date's timezone from UTC. Similarly to \method{getdate()}, if
there is no header matching \var{name}, or it is unparsable, return there is no header matching \var{name}, or it is unparsable, return
\code{None}. \code{None}.
\end{funcdesc} \end{funcdesc}
\code{Message} instances also support a read-only mapping interface. \class{Message} instances also support a read-only mapping interface.
In particular: \code{m[name]} is the same as \code{m.getheader(name)}; In particular: \code{\var{m}[name]} is the same as
and \code{len(m)}, \code{m.has_key(name)}, \code{m.keys()}, \code{\var{m}.getheader(name)}; and \code{len(\var{m})},
\code{m.values()} and \code{m.items()} act as expected (and \code{\var{m}.has_key(name)}, \code{\var{m}.keys()},
consistently). \code{\var{m}.values()} and \code{\var{m}.items()} act as expected
(and consistently).
Finally, \code{Message} instances have two public instance variables: Finally, \class{Message} instances have two public instance variables:
\begin{datadesc}{headers} \begin{datadesc}{headers}
A list containing the entire set of header lines, in the order in A list containing the entire set of header lines, in the order in

View File

@ -2,20 +2,19 @@
\label{module-rfc822} \label{module-rfc822}
\stmodindex{rfc822} \stmodindex{rfc822}
\setindexsubitem{(in module rfc822)}
This module defines a class, \code{Message}, which represents a This module defines a class, \class{Message}, which represents a
collection of ``email headers'' as defined by the Internet standard collection of ``email headers'' as defined by the Internet standard
\rfc{822}. It is used in various contexts, usually to read such \rfc{822}. It is used in various contexts, usually to read such
headers from a file. headers from a file.
Note that there's a separate module to read \UNIX{}, MH, and MMDF Note that there's a separate module to read \UNIX{}, MH, and MMDF
style mailbox files: \code{mailbox}. style mailbox files: \module{mailbox}\refstmodindex{mailbox}.
\refstmodindex{mailbox}
A \code{Message} instance is instantiated with an open file object as \begin{classdesc}{Message}{file\optional{, seekable}}
parameter. The optional \code{seekable} parameter indicates if the A \class{Message} instance is instantiated with an open file object as
file object is seekable; the default value is 1 for true. parameter. The optional \var{seekable} parameter indicates if the
file object is seekable; the default value is \code{1} for true.
Instantiation reads headers from the file up to a blank line and Instantiation reads headers from the file up to a blank line and
stores them in the instance; after instantiation, the file is stores them in the instance; after instantiation, the file is
positioned directly after the blank line that terminates the headers. positioned directly after the blank line that terminates the headers.
@ -25,44 +24,46 @@ by a single linefeed; a terminating CR-LF is replaced by a single
linefeed before the line is stored. linefeed before the line is stored.
All header matching is done independent of upper or lower case; All header matching is done independent of upper or lower case;
e.g. \code{m['From']}, \code{m['from']} and \code{m['FROM']} all yield e.g. \code{\var{m}['From']}, \code{\var{m}['from']} and
the same result. \code{\var{m}['FROM']} all yield the same result.
\end{classdesc}
\begin{funcdesc}{parsedate}{date} \begin{funcdesc}{parsedate}{date}
Attempts to parse a date according to the rules in \rfc{822}. however, Attempts to parse a date according to the rules in \rfc{822}.
some mailers don't follow that format as specified, so however, some mailers don't follow that format as specified, so
\code{parsedate()} tries to guess correctly in such cases. \function{parsedate()} tries to guess correctly in such cases.
\var{date} is a string containing an \rfc{822} date, such as \var{date} is a string containing an \rfc{822} date, such as
\code{"Mon, 20 Nov 1995 19:12:08 -0500"}. If it succeeds in parsing \code{'Mon, 20 Nov 1995 19:12:08 -0500'}. If it succeeds in parsing
the date, \code{parsedate()} returns a 9-tuple that can be passed the date, \function{parsedate()} returns a 9-tuple that can be passed
directly to \code{time.mktime()}; otherwise \code{None} will be directly to \function{time.mktime()}; otherwise \code{None} will be
returned. returned.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{parsedate_tz}{date} \begin{funcdesc}{parsedate_tz}{date}
Performs the same function as \code{parsedate()}, but returns either Performs the same function as \function{parsedate()}, but returns
\code{None} or a 10-tuple; the first 9 elements make up a tuple that either \code{None} or a 10-tuple; the first 9 elements make up a tuple
can be passed directly to \code{time.mktime()}, and the tenth is the that can be passed directly to \function{time.mktime()}, and the tenth
offset of the date's timezone from UTC (which is the official term is the offset of the date's timezone from UTC (which is the official
for Greenwich Mean Time). (Note that the sign of the timezone offset term for Greenwich Mean Time). (Note that the sign of the timezone
is the opposite of the sign of the \code{time.timezone} variable for offset is the opposite of the sign of the \code{time.timezone}
the same timezone; the latter variable follows the \POSIX{} standard variable for the same timezone; the latter variable follows the
while this module follows \rfc{822}.) If the input string has no \POSIX{} standard while this module follows \rfc{822}.) If the input
timezone, the last element of the tuple returned is \code{None}. string has no timezone, the last element of the tuple returned is
\code{None}.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{mktime_tz}{tuple} \begin{funcdesc}{mktime_tz}{tuple}
Turn a 10-tuple as returned by \code{parsedate_tz()} into a UTC timestamp. Turn a 10-tuple as returned by \function{parsedate_tz()} into a UTC
It the timezone item in the tuple is \code{None}, assume local time. timestamp. It the timezone item in the tuple is \code{None}, assume
Minor deficiency: this first interprets the first 8 elements as a local time. Minor deficiency: this first interprets the first 8
local time and then compensates for the timezone difference; elements as a local time and then compensates for the timezone
this may yield a slight error around daylight savings time difference; this may yield a slight error around daylight savings time
switch dates. Not enough to worry about for common use. switch dates. Not enough to worry about for common use.
\end{funcdesc} \end{funcdesc}
\subsection{Message Objects} \subsection{Message Objects}
A \code{Message} instance has the following methods: A \class{Message} instance has the following methods:
\begin{funcdesc}{rewindbody}{} \begin{funcdesc}{rewindbody}{}
Seek to the start of the message body. This only works if the file Seek to the start of the message body. This only works if the file
@ -92,16 +93,17 @@ no header matching \var{name}.
\begin{funcdesc}{getheader}{name} \begin{funcdesc}{getheader}{name}
Like \code{getrawheader(\var{name})}, but strip leading and trailing Like \code{getrawheader(\var{name})}, but strip leading and trailing
whitespace (but not internal whitespace). whitespace. Internal whitespace is not stripped.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{getaddr}{name} \begin{funcdesc}{getaddr}{name}
Return a pair (full name, email address) parsed from the string Return a pair \code{(\var{full name}, \var{email address})} parsed
returned by \code{getheader(\var{name})}. If no header matching from the string returned by \code{getheader(\var{name})}. If no
\var{name} exists, return \code{None, None}; otherwise both the full header matching \var{name} exists, return \code{(None, None)};
name and the address are (possibly empty )strings. otherwise both the full name and the address are (possibly empty)
strings.
Example: If \code{m}'s first \code{From} header contains the string\\ Example: If \var{m}'s first \code{From} header contains the string
\code{'jack@cwi.nl (Jack Jansen)'}, then \code{'jack@cwi.nl (Jack Jansen)'}, then
\code{m.getaddr('From')} will yield the pair \code{m.getaddr('From')} will yield the pair
\code{('Jack Jansen', 'jack@cwi.nl')}. \code{('Jack Jansen', 'jack@cwi.nl')}.
@ -113,17 +115,17 @@ exact same result.
\begin{funcdesc}{getaddrlist}{name} \begin{funcdesc}{getaddrlist}{name}
This is similar to \code{getaddr(\var{list})}, but parses a header This is similar to \code{getaddr(\var{list})}, but parses a header
containing a list of email addresses (e.g. a \code{To} header) and containing a list of email addresses (e.g. a \code{To} header) and
returns a list of (full name, email address) pairs (even if there was returns a list of \code{(\var{full name}, \var{email address})} pairs
only one address in the header). If there is no header matching (even if there was only one address in the header). If there is no
\var{name}, return an empty list. header matching \var{name}, return an empty list.
XXX The current version of this function is not really correct. It XXX The current version of this function is not really correct. It
yields bogus results if a full name contains a comma. yields bogus results if a full name contains a comma.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{getdate}{name} \begin{funcdesc}{getdate}{name}
Retrieve a header using \code{getheader} and parse it into a 9-tuple Retrieve a header using \method{getheader()} and parse it into a 9-tuple
compatible with \code{time.mktime()}. If there is no header matching compatible with \function{time.mktime()}. If there is no header matching
\var{name}, or it is unparsable, return \code{None}. \var{name}, or it is unparsable, return \code{None}.
Date parsing appears to be a black art, and not all mailers adhere to Date parsing appears to be a black art, and not all mailers adhere to
@ -133,21 +135,22 @@ function may occasionally yield an incorrect result.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{getdate_tz}{name} \begin{funcdesc}{getdate_tz}{name}
Retrieve a header using \code{getheader} and parse it into a 10-tuple; Retrieve a header using \method{getheader()} and parse it into a
the first 9 elements will make a tuple compatible with 10-tuple; the first 9 elements will make a tuple compatible with
\code{time.mktime()}, and the 10th is a number giving the offset of \function{time.mktime()}, and the 10th is a number giving the offset
the date's timezone from UTC. Similarly to \code{getdate()}, if of the date's timezone from UTC. Similarly to \method{getdate()}, if
there is no header matching \var{name}, or it is unparsable, return there is no header matching \var{name}, or it is unparsable, return
\code{None}. \code{None}.
\end{funcdesc} \end{funcdesc}
\code{Message} instances also support a read-only mapping interface. \class{Message} instances also support a read-only mapping interface.
In particular: \code{m[name]} is the same as \code{m.getheader(name)}; In particular: \code{\var{m}[name]} is the same as
and \code{len(m)}, \code{m.has_key(name)}, \code{m.keys()}, \code{\var{m}.getheader(name)}; and \code{len(\var{m})},
\code{m.values()} and \code{m.items()} act as expected (and \code{\var{m}.has_key(name)}, \code{\var{m}.keys()},
consistently). \code{\var{m}.values()} and \code{\var{m}.items()} act as expected
(and consistently).
Finally, \code{Message} instances have two public instance variables: Finally, \class{Message} instances have two public instance variables:
\begin{datadesc}{headers} \begin{datadesc}{headers}
A list containing the entire set of header lines, in the order in A list containing the entire set of header lines, in the order in