mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 05:01:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			345 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
			
		
		
	
	
			345 lines
		
	
	
	
		
			12 KiB
		
	
	
	
		
			TeX
		
	
	
	
	
	
| \section{\module{imaplib} ---
 | |
|          IMAP4 protocol client}
 | |
| 
 | |
| \declaremodule{standard}{imaplib}
 | |
| \modulesynopsis{IMAP4 protocol client (requires sockets).}
 | |
| \moduleauthor{Piers Lauder}{piers@staff.cs.usyd.edu.au}
 | |
| \sectionauthor{Piers Lauder}{piers@staff.cs.usyd.edu.au}
 | |
| 
 | |
| % Based on HTML documentation by Piers Lauder <piers@staff.cs.usyd.edu.au>;
 | |
| % converted by Fred L. Drake, Jr. <fdrake@acm.org>.
 | |
| % Revised by ESR, January 2000.
 | |
| 
 | |
| \indexii{IMAP4}{protocol}
 | |
| 
 | |
| This module defines a class, \class{IMAP4}, which encapsulates a
 | |
| connection to an IMAP4 server and implements 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.
 | |
| 
 | |
| A single class is provided by the \module{imaplib} module:
 | |
| 
 | |
| \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}
 | |
| 
 | |
| Two 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}
 | |
| 
 | |
| 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.
 | |
| 
 | |
| An \class{IMAP4} instance has the following methods:
 | |
| 
 | |
| 
 | |
| \begin{methoddesc}{append}{mailbox, flags, date_time, message}
 | |
|   Append message to named mailbox. 
 | |
| \end{methoddesc}
 | |
| 
 | |
| \begin{methoddesc}{authenticate}{func}
 | |
|   Authenticate command --- requires response processing. This is
 | |
|   currently unimplemented, and raises an exception. 
 | |
| \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}{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}{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}{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{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}, 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}{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, criterium\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
 | |
|   criterium 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}{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}{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_criterium\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_criterium}
 | |
|   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}{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}
 | |
| 
 | |
| 
 | |
| 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}
 | 
