\section{Standard Module \sectcode{nntplib}}
\label{module-nntplib}
\stmodindex{nntplib}
\indexii{NNTP}{protocol}

\setindexsubitem{(in module nntplib)}

This module defines the class \code{NNTP} which implements the client
side of the NNTP protocol.  It can be used to implement a news reader
or poster, or automated news processors.  For more information on NNTP
(Network News Transfer Protocol), see Internet \rfc{977}.

Here are two small examples of how it can be used.  To list some
statistics about a newsgroup and print the subjects of the last 10
articles:

\begin{verbatim}
>>> s = NNTP('news.cwi.nl')
>>> resp, count, first, last, name = s.group('comp.lang.python')
>>> print 'Group', name, 'has', count, 'articles, range', first, 'to', last
Group comp.lang.python has 59 articles, range 3742 to 3803
>>> resp, subs = s.xhdr('subject', first + '-' + last)
>>> for id, sub in subs[-10:]: print id, sub
... 
3792 Re: Removing elements from a list while iterating...
3793 Re: Who likes Info files?
3794 Emacs and doc strings
3795 a few questions about the Mac implementation
3796 Re: executable python scripts
3797 Re: executable python scripts
3798 Re: a few questions about the Mac implementation 
3799 Re: PROPOSAL: A Generic Python Object Interface for Python C Modules
3802 Re: executable python scripts 
3803 Re: \POSIX{} wait and SIGCHLD
>>> s.quit()
'205 news.cwi.nl closing connection.  Goodbye.'
>>> 
\end{verbatim}

To post an article from a file (this assumes that the article has
valid headers):

\begin{verbatim}
>>> s = NNTP('news.cwi.nl')
>>> f = open('/tmp/article')
>>> s.post(f)
'240 Article posted successfully.'
>>> s.quit()
'205 news.cwi.nl closing connection.  Goodbye.'
>>> 
\end{verbatim}
%
The module itself defines the following items:

\begin{funcdesc}{NNTP}{host\optional{, port}}
Return a new instance of the \code{NNTP} class, representing a
connection to the NNTP server running on host \var{host}, listening at
port \var{port}.  The default \var{port} is 119.
\end{funcdesc}

\begin{excdesc}{error_reply}
Exception raised when an unexpected reply is received from the server.
\end{excdesc}

\begin{excdesc}{error_temp}
Exception raised when an error code in the range 400--499 is received.
\end{excdesc}

\begin{excdesc}{error_perm}
Exception raised when an error code in the range 500--599 is received.
\end{excdesc}

\begin{excdesc}{error_proto}
Exception raised when a reply is received from the server that does
not begin with a digit in the range 1--5.
\end{excdesc}

\subsection{NNTP Objects}

NNTP instances have the following methods.  The \var{response} that is
returned as the first item in the return tuple of almost all methods
is the server's response: a string beginning with a three-digit code.
If the server's response indicates an error, the method raises one of
the above exceptions.

\setindexsubitem{(NNTP object method)}

\begin{funcdesc}{getwelcome}{}
Return the welcome message sent by the server in reply to the initial
connection.  (This message sometimes contains disclaimers or help
information that may be relevant to the user.)
\end{funcdesc}

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

\begin{funcdesc}{newgroups}{date, time}
Send a \samp{NEWGROUPS} command.  The \var{date} argument should be a
string of the form \code{"\var{yy}\var{mm}\var{dd}"} indicating the
date, and \var{time} should be a string of the form
\code{"\var{hh}\var{mm}\var{ss}"} indicating the time.  Return a pair
\code{(\var{response}, \var{groups})} where \var{groups} is a list of
group names that are new since the given date and time.
\end{funcdesc}

\begin{funcdesc}{newnews}{group, date, time}
Send a \samp{NEWNEWS} command.  Here, \var{group} is a group name or
\code{"*"}, and \var{date} and \var{time} have the same meaning as for
\code{newgroups()}.  Return a pair \code{(\var{response},
\var{articles})} where \var{articles} is a list of article ids.
\end{funcdesc}

\begin{funcdesc}{list}{}
Send a \samp{LIST} command.  Return a pair \code{(\var{response},
\var{list})} where \var{list} is a list of tuples.  Each tuple has the
form \code{(\var{group}, \var{last}, \var{first}, \var{flag})}, where
\var{group} is a group name, \var{last} and \var{first} are the last
and first article numbers (as strings), and \var{flag} is \code{'y'}
if posting is allowed, \code{'n'} if not, and \code{'m'} if the
newsgroup is moderated.  (Note the ordering: \var{last}, \var{first}.)
\end{funcdesc}

\begin{funcdesc}{group}{name}
Send a \samp{GROUP} command, where \var{name} is the group name.
Return a tuple \code{(\var{response}, \var{count}, \var{first},
\var{last}, \var{name})} where \var{count} is the (estimated) number
of articles in the group, \var{first} is the first article number in
the group, \var{last} is the last article number in the group, and
\var{name} is the group name.  The numbers are returned as strings.
\end{funcdesc}

\begin{funcdesc}{help}{}
Send a \samp{HELP} command.  Return a pair \code{(\var{response},
\var{list})} where \var{list} is a list of help strings.
\end{funcdesc}

\begin{funcdesc}{stat}{id}
Send a \samp{STAT} command, where \var{id} is the message id (enclosed
in \samp{<} and \samp{>}) or an article number (as a string).
Return a triple \code{(\var{response}, \var{number}, \var{id})} where
\var{number} is the article number (as a string) and \var{id} is the
article id  (enclosed in \samp{<} and \samp{>}).
\end{funcdesc}

\begin{funcdesc}{next}{}
Send a \samp{NEXT} command.  Return as for \code{stat()}.
\end{funcdesc}

\begin{funcdesc}{last}{}
Send a \samp{LAST} command.  Return as for \code{stat()}.
\end{funcdesc}

\begin{funcdesc}{head}{id}
Send a \samp{HEAD} command, where \var{id} has the same meaning as for
\code{stat()}.  Return a pair \code{(\var{response}, \var{list})}
where \var{list} is a list of the article's headers (an uninterpreted
list of lines, without trailing newlines).
\end{funcdesc}

\begin{funcdesc}{body}{id}
Send a \samp{BODY} command, where \var{id} has the same meaning as for
\code{stat()}.  Return a pair \code{(\var{response}, \var{list})}
where \var{list} is a list of the article's body text (an
uninterpreted list of lines, without trailing newlines).
\end{funcdesc}

\begin{funcdesc}{article}{id}
Send a \samp{ARTICLE} command, where \var{id} has the same meaning as
for \code{stat()}.  Return a pair \code{(\var{response}, \var{list})}
where \var{list} is a list of the article's header and body text (an
uninterpreted list of lines, without trailing newlines).
\end{funcdesc}

\begin{funcdesc}{slave}{}
Send a \samp{SLAVE} command.  Return the server's \var{response}.
\end{funcdesc}

\begin{funcdesc}{xhdr}{header, string}
Send an \samp{XHDR} command.  This command is not defined in the RFC
but is a common extension.  The \var{header} argument is a header
keyword, e.g. \code{"subject"}.  The \var{string} argument should have
the form \code{"\var{first}-\var{last}"} where \var{first} and
\var{last} are the first and last article numbers to search.  Return a
pair \code{(\var{response}, \var{list})}, where \var{list} is a list of
pairs \code{(\var{id}, \var{text})}, where \var{id} is an article id
(as a string) and \var{text} is the text of the requested header for
that article.
\end{funcdesc}

\begin{funcdesc}{post}{file}
Post an article using the \samp{POST} command.  The \var{file}
argument is an open file object which is read until EOF using its
\code{readline()} method.  It should be a well-formed news article,
including the required headers.  The \code{post()} method
automatically escapes lines beginning with \samp{.}.
\end{funcdesc}

\begin{funcdesc}{ihave}{id, file}
Send an \samp{IHAVE} command.  If the response is not an error, treat
\var{file} exactly as for the \code{post()} method.
\end{funcdesc}

\begin{funcdesc}{date}{}
Return a triple \code{(\var{response}, \var{date}, \var{time})},
containing the current date and time in a form suitable for the
\code{newnews} and \code{newgroups} methods.
This is an optional NNTP extension, and may not be supported by all
servers.
\end{funcdesc}

\begin{funcdesc}{xgtitle}{name}
Process an XGTITLE command, returning a pair \code{(\var{response},
\var{list})}, where \var{list} is a list of tuples containing
\code{(\var{name}, \var{title})}.
% XXX huh?  Should that be name, description?
This is an optional NNTP extension, and may not be supported by all
servers.
\end{funcdesc}

\begin{funcdesc}{xover}{start, end}
Return a pair \code{(\var{resp}, \var{list})}.  \var{list} is a list
of tuples, one for each article in the range delimited by the \var{start}
and \var{end} article numbers.  Each tuple is of the form
\code{(}\var{article number}\code{,} \var{subject}\code{,}
\var{poster}\code{,} \var{date}\code{,} \var{id}\code{,}
\var{references}\code{,} \var{size}\code{,} \var{lines}\code{)}.
This is an optional NNTP extension, and may not be supported by all
servers.
\end{funcdesc}

\begin{funcdesc}{xpath}{id}
Return a pair \code{(\var{resp}, \var{path})}, where \var{path} is the
directory path to the article with message ID \var{id}.  This is an
optional NNTP extension, and may not be supported by all servers.
\end{funcdesc}

\begin{funcdesc}{quit}{}
Send a \samp{QUIT} command and close the connection.  Once this method
has been called, no other methods of the NNTP object should be called.
\end{funcdesc}
