\section{\module{poplib} ---
         POP3 protocol client}

\declaremodule{standard}{poplib}
\modulesynopsis{POP3 protocol client (requires sockets).}

%By Andrew T. Csillag
%Even though I put it into LaTeX, I cannot really claim that I wrote
%it since I just stole most of it from the poplib.py source code and
%the imaplib ``chapter''.
%Revised by ESR, January 2000

\indexii{POP3}{protocol}

This module defines a class, \class{POP3}, which encapsulates a
connection to an POP3 server and implements the protocol as defined in
\rfc{1725}.  The \class{POP3} class supports both the minimal and
optional command sets.

Note that POP3, though widely supported, is obsolescent.  The
implementation quality of POP3 servers varies widely, and too many are
quite poor. If your mailserver supports IMAP, you would be better off
using the \code{\refmodule{imaplib}.\class{IMAP4}} class, as IMAP
servers tend to be better implemented.

A single class is provided by the \module{poplib} module:

\begin{classdesc}{POP3}{host\optional{, port}}
This class implements the actual POP3 protocol.  The connection is
created when the instance is initialized.
If \var{port} is omitted, the standard POP3 port (110) is used.
\end{classdesc}

One exception is defined as an attribute of the \module{poplib} module:

\begin{excdesc}{error_proto}
Exception raised on any errors.  The reason for the exception is
passed to the constructor as a string.
\end{excdesc}

\begin{seealso}
  \seemodule{imaplib}{The standard Python IMAP module.}
  \seetitle[http://www.tuxedo.org/\~{}esr/fetchmail/fetchmail-FAQ.html]
        {Frequently Asked Questions About Fetchmail}
        {The FAQ for the \program{fetchmail} POP/IMAP client collects
         information on POP3 server variations and RFC noncompliance
         that may be useful if you need to write an application based
         on the POP protocol.}
\end{seealso}


\subsection{POP3 Objects \label{pop3-objects}}

All POP3 commands are represented by methods of the same name,
in lower-case; most return the response text sent by the server.

An \class{POP3} instance has the following methods:


\begin{methoddesc}{set_debuglevel}{level}
Set the instance's debugging level.  This controls the amount of
debugging output printed.  The default, \code{0}, produces no
debugging output.  A value of \code{1} produces a moderate amount of
debugging output, generally a single line per request.  A value of
\code{2} or higher produces the maximum amount of debugging output,
logging each line sent and received on the control connection.
\end{methoddesc}

\begin{methoddesc}{getwelcome}{}
Returns the greeting string sent by the POP3 server.
\end{methoddesc}

\begin{methoddesc}{user}{username}
Send user command, response should indicate that a password is required.
\end{methoddesc}

\begin{methoddesc}{pass_}{password}
Send password, response includes message count and mailbox size.
Note: the mailbox on the server is locked until \method{quit()} is
called.
\end{methoddesc}

\begin{methoddesc}{apop}{user, secret}
Use the more secure APOP authentication to log into the POP3 server.
\end{methoddesc}

\begin{methoddesc}{rpop}{user}
Use RPOP authentication (similar to UNIX r-commands) to log into POP3 server.
\end{methoddesc}

\begin{methoddesc}{stat}{}
Get mailbox status.  The result is a tuple of 2 integers:
\code{(\var{message count}, \var{mailbox size})}.
\end{methoddesc}

\begin{methoddesc}{list}{\optional{which}}
Request message list, result is in the form
\code{(\var{response}, ['mesg_num octets', ...])}.  If \var{which} is
set, it is the message to list.
\end{methoddesc}

\begin{methoddesc}{retr}{which}
Retrieve whole message number \var{which}, and set its seen flag.
Result is in form  \code{(\var{response}, ['line', ...], \var{octets})}.
\end{methoddesc}

\begin{methoddesc}{dele}{which}
Flag message number \var{which} for deletion.  On most servers
deletions are not actually performed until QUIT (the major exception is
Eudora QPOP, which deliberately violates the RFCs by doing pending
deletes on any disconnect).
\end{methoddesc}

\begin{methoddesc}{rset}{}
Remove any deletion marks for the mailbox.
\end{methoddesc}

\begin{methoddesc}{noop}{}
Do nothing.  Might be used as a keep-alive.
\end{methoddesc}

\begin{methoddesc}{quit}{}
Signoff:  commit changes, unlock mailbox, drop connection.
\end{methoddesc}

\begin{methoddesc}{top}{which, howmuch}
Retrieves the message header plus \var{howmuch} lines of the message
after the header of message number \var{which}. Result is in form
\code{(\var{response}, ['line', ...], \var{octets})}.

The POP3 TOP command this method uses, unlike the RETR command,
doesn't set the message's seen flag; unfortunately, TOP is poorly
specified in the RFCs and is frequently broken in off-brand servers.
Test this method by hand against the POP3 servers you will use before
trusting it.
\end{methoddesc}

\begin{methoddesc}{uidl}{\optional{which}}
Return message digest (unique id) list.
If \var{which} is specified, result contains the unique id for that
message in the form \code{'\var{response}\ \var{mesgnum}\ \var{uid}},
otherwise result is list \code{(\var{response}, ['mesgnum uid', ...],
\var{octets})}.
\end{methoddesc}


\subsection{POP3 Example \label{pop3-example}}

Here is a minimal example (without error checking) that opens a
mailbox and retrieves and prints all messages:

\begin{verbatim}
import getpass, poplib

M = poplib.POP3('localhost')
M.user(getpass.getuser())
M.pass_(getpass.getpass())
numMessages = len(M.list()[1])
for i in range(numMessages):
    for j in M.retr(i+1)[1]:
        print j
\end{verbatim}

At the end of the module, there is a test section that contains a more
extensive example of usage.
