mirror of
https://github.com/python/cpython.git
synced 2024-12-15 04:44:47 +08:00
463 lines
17 KiB
TeX
463 lines
17 KiB
TeX
\section{\module{imaplib} ---
|
|
IMAP4 protocol client}
|
|
|
|
\declaremodule{standard}{imaplib}
|
|
\modulesynopsis{IMAP4 protocol client (requires sockets).}
|
|
\moduleauthor{Piers Lauder}{piers@communitysolutions.com.au}
|
|
\sectionauthor{Piers Lauder}{piers@communitysolutions.com.au}
|
|
|
|
% Based on HTML documentation by Piers Lauder <piers@communitysolutions.com.au>;
|
|
% converted by Fred L. Drake, Jr. <fdrake@acm.org>.
|
|
% Revised by ESR, January 2000.
|
|
% Changes for IMAP4_SSL by Tino Lange <Tino.Lange@isg.de>, March 2002
|
|
% Changes for IMAP4_stream by Piers Lauder <piers@communitysolutions.com.au>, November 2002
|
|
|
|
\indexii{IMAP4}{protocol}
|
|
\indexii{IMAP4_SSL}{protocol}
|
|
\indexii{IMAP4_stream}{protocol}
|
|
|
|
This module defines three classes, \class{IMAP4}, \class{IMAP4_SSL} and \class{IMAP4_stream}, which encapsulate a
|
|
connection to an IMAP4 server and implement a large subset of the
|
|
IMAP4rev1 client protocol as defined in \rfc{2060}. It is backward
|
|
compatible with IMAP4 (\rfc{1730}) servers, but note that the
|
|
\samp{STATUS} command is not supported in IMAP4.
|
|
|
|
Three classes are provided by the \module{imaplib} module, \class{IMAP4} is the base class:
|
|
|
|
\begin{classdesc}{IMAP4}{\optional{host\optional{, port}}}
|
|
This class implements the actual IMAP4 protocol. The connection is
|
|
created and protocol version (IMAP4 or IMAP4rev1) is determined when
|
|
the instance is initialized.
|
|
If \var{host} is not specified, \code{''} (the local host) is used.
|
|
If \var{port} is omitted, the standard IMAP4 port (143) is used.
|
|
\end{classdesc}
|
|
|
|
Three exceptions are defined as attributes of the \class{IMAP4} class:
|
|
|
|
\begin{excdesc}{IMAP4.error}
|
|
Exception raised on any errors. The reason for the exception is
|
|
passed to the constructor as a string.
|
|
\end{excdesc}
|
|
|
|
\begin{excdesc}{IMAP4.abort}
|
|
IMAP4 server errors cause this exception to be raised. This is a
|
|
sub-class of \exception{IMAP4.error}. Note that closing the instance
|
|
and instantiating a new one will usually allow recovery from this
|
|
exception.
|
|
\end{excdesc}
|
|
|
|
\begin{excdesc}{IMAP4.readonly}
|
|
This exception is raised when a writable mailbox has its status changed by the server. This is a
|
|
sub-class of \exception{IMAP4.error}. Some other client now has write permission,
|
|
and the mailbox will need to be re-opened to re-obtain write permission.
|
|
\end{excdesc}
|
|
|
|
There's also a subclass for secure connections:
|
|
|
|
\begin{classdesc}{IMAP4_SSL}{\optional{host\optional{, port\optional{, keyfile\optional{, certfile}}}}}
|
|
This is a subclass derived from \class{IMAP4} that connects over an SSL encrypted socket
|
|
(to use this class you need a socket module that was compiled with SSL support).
|
|
If \var{host} is not specified, \code{''} (the local host) is used.
|
|
If \var{port} is omitted, the standard IMAP4-over-SSL port (993) is used.
|
|
\var{keyfile} and \var{certfile} are also optional - they can contain a PEM formatted
|
|
private key and certificate chain file for the SSL connection.
|
|
\end{classdesc}
|
|
|
|
The second subclass allows for connections created by a child process:
|
|
|
|
\begin{classdesc}{IMAP4_stream}{command}
|
|
This is a subclass derived from \class{IMAP4} that connects
|
|
to the \code{stdin/stdout} file descriptors created by passing \var{command} to \code{os.popen2()}.
|
|
\versionadded{2.3}
|
|
\end{classdesc}
|
|
|
|
The following utility functions are defined:
|
|
|
|
\begin{funcdesc}{Internaldate2tuple}{datestr}
|
|
Converts an IMAP4 INTERNALDATE string to Coordinated Universal
|
|
Time. Returns a \refmodule{time} module tuple.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{Int2AP}{num}
|
|
Converts an integer into a string representation using characters
|
|
from the set [\code{A} .. \code{P}].
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{ParseFlags}{flagstr}
|
|
Converts an IMAP4 \samp{FLAGS} response to a tuple of individual
|
|
flags.
|
|
\end{funcdesc}
|
|
|
|
\begin{funcdesc}{Time2Internaldate}{date_time}
|
|
Converts a \refmodule{time} module tuple to an IMAP4
|
|
\samp{INTERNALDATE} representation. Returns a string in the form:
|
|
\code{"DD-Mmm-YYYY HH:MM:SS +HHMM"} (including double-quotes).
|
|
\end{funcdesc}
|
|
|
|
|
|
Note that IMAP4 message numbers change as the mailbox changes; in
|
|
particular, after an \samp{EXPUNGE} command performs deletions the
|
|
remaining messages are renumbered. So it is highly advisable to use
|
|
UIDs instead, with the UID command.
|
|
|
|
At the end of the module, there is a test section that contains a more
|
|
extensive example of usage.
|
|
|
|
\begin{seealso}
|
|
\seetext{Documents describing the protocol, and sources and binaries
|
|
for servers implementing it, can all be found at the
|
|
University of Washington's \emph{IMAP Information Center}
|
|
(\url{http://www.cac.washington.edu/imap/}).}
|
|
\end{seealso}
|
|
|
|
|
|
\subsection{IMAP4 Objects \label{imap4-objects}}
|
|
|
|
All IMAP4rev1 commands are represented by methods of the same name,
|
|
either upper-case or lower-case.
|
|
|
|
All arguments to commands are converted to strings, except for
|
|
\samp{AUTHENTICATE}, and the last argument to \samp{APPEND} which is
|
|
passed as an IMAP4 literal. If necessary (the string contains IMAP4
|
|
protocol-sensitive characters and isn't enclosed with either
|
|
parentheses or double quotes) each string is quoted. However, the
|
|
\var{password} argument to the \samp{LOGIN} command is always quoted.
|
|
If you want to avoid having an argument string quoted
|
|
(eg: the \var{flags} argument to \samp{STORE}) then enclose the string in
|
|
parentheses (eg: \code{r'(\e Deleted)'}).
|
|
|
|
Each command returns a tuple: \code{(\var{type}, [\var{data},
|
|
...])} where \var{type} is usually \code{'OK'} or \code{'NO'},
|
|
and \var{data} is either the text from the command response, or
|
|
mandated results from the command. Each \var{data}
|
|
is either a string, or a tuple. If a tuple, then the first part
|
|
is the header of the response, and the second part contains
|
|
the data (ie: 'literal' value).
|
|
|
|
An \class{IMAP4} instance has the following methods:
|
|
|
|
|
|
\begin{methoddesc}{append}{mailbox, flags, date_time, message}
|
|
Append \var{message} to named mailbox.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{authenticate}{mechanism, authobject}
|
|
Authenticate command --- requires response processing.
|
|
|
|
\var{mechanism} specifies which authentication mechanism is to
|
|
be used - it should appear in the instance variable \code{capabilities} in the
|
|
form \code{AUTH=mechanism}.
|
|
|
|
\var{authobject} must be a callable object:
|
|
|
|
\begin{verbatim}
|
|
data = authobject(response)
|
|
\end{verbatim}
|
|
|
|
It will be called to process server continuation responses.
|
|
It should return \code{data} that will be encoded and sent to server.
|
|
It should return \code{None} if the client abort response \samp{*} should
|
|
be sent instead.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{check}{}
|
|
Checkpoint mailbox on server.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{close}{}
|
|
Close currently selected mailbox. Deleted messages are removed from
|
|
writable mailbox. This is the recommended command before
|
|
\samp{LOGOUT}.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{copy}{message_set, new_mailbox}
|
|
Copy \var{message_set} messages onto end of \var{new_mailbox}.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{create}{mailbox}
|
|
Create new mailbox named \var{mailbox}.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{delete}{mailbox}
|
|
Delete old mailbox named \var{mailbox}.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{deleteacl}{mailbox, who}
|
|
Delete the ACLs (remove any rights) set for who on mailbox.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{expunge}{}
|
|
Permanently remove deleted items from selected mailbox. Generates an
|
|
\samp{EXPUNGE} response for each deleted message. Returned data
|
|
contains a list of \samp{EXPUNGE} message numbers in order
|
|
received.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{fetch}{message_set, message_parts}
|
|
Fetch (parts of) messages. \var{message_parts} should be
|
|
a string of message part names enclosed within parentheses,
|
|
eg: \samp{"(UID BODY[TEXT])"}. Returned data are tuples
|
|
of message part envelope and data.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{getacl}{mailbox}
|
|
Get the \samp{ACL}s for \var{mailbox}.
|
|
The method is non-standard, but is supported by the \samp{Cyrus} server.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{getquota}{root}
|
|
Get the \samp{quota} \var{root}'s resource usage and limits.
|
|
This method is part of the IMAP4 QUOTA extension defined in rfc2087.
|
|
\versionadded{2.3}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{getquotaroot}{mailbox}
|
|
Get the list of \samp{quota} \samp{roots} for the named \var{mailbox}.
|
|
This method is part of the IMAP4 QUOTA extension defined in rfc2087.
|
|
\versionadded{2.3}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{list}{\optional{directory\optional{, pattern}}}
|
|
List mailbox names in \var{directory} matching
|
|
\var{pattern}. \var{directory} defaults to the top-level mail
|
|
folder, and \var{pattern} defaults to match anything. Returned data
|
|
contains a list of \samp{LIST} responses.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{login}{user, password}
|
|
Identify the client using a plaintext password.
|
|
The \var{password} will be quoted.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{login_cram_md5}{user, password}
|
|
Force use of \samp{CRAM-MD5} authentication when identifying the client to protect the password.
|
|
Will only work if the server \samp{CAPABILITY} response includes the phrase \samp{AUTH=CRAM-MD5}.
|
|
\versionadded{2.3}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{logout}{}
|
|
Shutdown connection to server. Returns server \samp{BYE} response.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{lsub}{\optional{directory\optional{, pattern}}}
|
|
List subscribed mailbox names in directory matching pattern.
|
|
\var{directory} defaults to the top level directory and
|
|
\var{pattern} defaults to match any mailbox.
|
|
Returned data are tuples of message part envelope and data.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddes}{myrights}{mailbox}
|
|
Show my ACLs for a mailbox (i.e. the rights that I have on mailbox).
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{namespace}{}
|
|
Returns IMAP namespaces as defined in RFC2342.
|
|
\versionadded{2.3}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{noop}{}
|
|
Send \samp{NOOP} to server.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{open}{host, port}
|
|
Opens socket to \var{port} at \var{host}.
|
|
The connection objects established by this method
|
|
will be used in the \code{read}, \code{readline}, \code{send}, and \code{shutdown} methods.
|
|
You may override this method.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{partial}{message_num, message_part, start, length}
|
|
Fetch truncated part of a message.
|
|
Returned data is a tuple of message part envelope and data.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{proxyauth}{user}
|
|
Assume authentication as \var{user}.
|
|
Allows an authorised administrator to proxy into any user's mailbox.
|
|
\versionadded{2.3}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{read}{size}
|
|
Reads \var{size} bytes from the remote server.
|
|
You may override this method.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{readline}{}
|
|
Reads one line from the remote server.
|
|
You may override this method.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{recent}{}
|
|
Prompt server for an update. Returned data is \code{None} if no new
|
|
messages, else value of \samp{RECENT} response.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{rename}{oldmailbox, newmailbox}
|
|
Rename mailbox named \var{oldmailbox} to \var{newmailbox}.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{response}{code}
|
|
Return data for response \var{code} if received, or
|
|
\code{None}. Returns the given code, instead of the usual type.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{search}{charset, criterion\optional{, ...}}
|
|
Search mailbox for matching messages. Returned data contains a space
|
|
separated list of matching message numbers. \var{charset} may be
|
|
\code{None}, in which case no \samp{CHARSET} will be specified in the
|
|
request to the server. The IMAP protocol requires that at least one
|
|
criterion be specified; an exception will be raised when the server
|
|
returns an error.
|
|
|
|
Example:
|
|
|
|
\begin{verbatim}
|
|
# M is a connected IMAP4 instance...
|
|
msgnums = M.search(None, 'FROM', '"LDJ"')
|
|
|
|
# or:
|
|
msgnums = M.search(None, '(FROM "LDJ")')
|
|
\end{verbatim}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{select}{\optional{mailbox\optional{, readonly}}}
|
|
Select a mailbox. Returned data is the count of messages in
|
|
\var{mailbox} (\samp{EXISTS} response). The default \var{mailbox}
|
|
is \code{'INBOX'}. If the \var{readonly} flag is set, modifications
|
|
to the mailbox are not allowed.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{send}{data}
|
|
Sends \code{data} to the remote server.
|
|
You may override this method.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{setacl}{mailbox, who, what}
|
|
Set an \samp{ACL} for \var{mailbox}.
|
|
The method is non-standard, but is supported by the \samp{Cyrus} server.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{setquota}{root, limits}
|
|
Set the \samp{quota} \var{root}'s resource \var{limits}.
|
|
This method is part of the IMAP4 QUOTA extension defined in rfc2087.
|
|
\versionadded{2.3}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{shutdown}{}
|
|
Close connection established in \code{open}.
|
|
You may override this method.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{socket}{}
|
|
Returns socket instance used to connect to server.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{sort}{sort_criteria, charset, search_criterion\optional{, ...}}
|
|
The \code{sort} command is a variant of \code{search} with sorting semantics for
|
|
the results. Returned data contains a space
|
|
separated list of matching message numbers.
|
|
|
|
Sort has two arguments before the \var{search_criterion}
|
|
argument(s); a parenthesized list of \var{sort_criteria}, and the searching \var{charset}.
|
|
Note that unlike \code{search}, the searching \var{charset} argument is mandatory.
|
|
There is also a \code{uid sort} command which corresponds to \code{sort} the way
|
|
that \code{uid search} corresponds to \code{search}.
|
|
The \code{sort} command first searches the mailbox for messages that
|
|
match the given searching criteria using the charset argument for
|
|
the interpretation of strings in the searching criteria. It then
|
|
returns the numbers of matching messages.
|
|
|
|
This is an \samp{IMAP4rev1} extension command.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{status}{mailbox, names}
|
|
Request named status conditions for \var{mailbox}.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{store}{message_set, command, flag_list}
|
|
Alters flag dispositions for messages in mailbox.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{subscribe}{mailbox}
|
|
Subscribe to new mailbox.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{thread}{threading_algorithm, charset, search_criterion\optional{, ...}}
|
|
The \code{thread} command is a variant of \code{search} with threading semantics for
|
|
the results. Returned data contains a space
|
|
separated list of thread members.
|
|
|
|
Thread members consist of zero or more messages numbers, delimited by spaces,
|
|
indicating successive parent and child.
|
|
|
|
Thread has two arguments before the \var{search_criterion}
|
|
argument(s); a \var{threading_algorithm}, and the searching \var{charset}.
|
|
Note that unlike \code{search}, the searching \var{charset} argument is mandatory.
|
|
There is also a \code{uid thread} command which corresponds to \code{thread} the way
|
|
that \code{uid search} corresponds to \code{search}.
|
|
The \code{thread} command first searches the mailbox for messages that
|
|
match the given searching criteria using the charset argument for
|
|
the interpretation of strings in the searching criteria. It thren
|
|
returns the matching messages threaded according to the specified
|
|
threading algorithm.
|
|
|
|
This is an \samp{IMAP4rev1} extension command. \versionadded{2.4}
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{uid}{command, arg\optional{, ...}}
|
|
Execute command args with messages identified by UID, rather than
|
|
message number. Returns response appropriate to command. At least
|
|
one argument must be supplied; if none are provided, the server will
|
|
return an error and an exception will be raised.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{unsubscribe}{mailbox}
|
|
Unsubscribe from old mailbox.
|
|
\end{methoddesc}
|
|
|
|
\begin{methoddesc}{xatom}{name\optional{, arg\optional{, ...}}}
|
|
Allow simple extension commands notified by server in
|
|
\samp{CAPABILITY} response.
|
|
\end{methoddesc}
|
|
|
|
|
|
Instances of \class{IMAP4_SSL} have just one additional method:
|
|
|
|
\begin{methoddesc}{ssl}{}
|
|
Returns SSLObject instance used for the secure connection with the server.
|
|
\end{methoddesc}
|
|
|
|
|
|
The following attributes are defined on instances of \class{IMAP4}:
|
|
|
|
|
|
\begin{memberdesc}{PROTOCOL_VERSION}
|
|
The most recent supported protocol in the
|
|
\samp{CAPABILITY} response from the server.
|
|
\end{memberdesc}
|
|
|
|
\begin{memberdesc}{debug}
|
|
Integer value to control debugging output. The initialize value is
|
|
taken from the module variable \code{Debug}. Values greater than
|
|
three trace each command.
|
|
\end{memberdesc}
|
|
|
|
|
|
\subsection{IMAP4 Example \label{imap4-example}}
|
|
|
|
Here is a minimal example (without error checking) that opens a
|
|
mailbox and retrieves and prints all messages:
|
|
|
|
\begin{verbatim}
|
|
import getpass, imaplib
|
|
|
|
M = imaplib.IMAP4()
|
|
M.login(getpass.getuser(), getpass.getpass())
|
|
M.select()
|
|
typ, data = M.search(None, 'ALL')
|
|
for num in data[0].split():
|
|
typ, data = M.fetch(num, '(RFC822)')
|
|
print 'Message %s\n%s\n' % (num, data[0][1])
|
|
M.logout()
|
|
\end{verbatim}
|