17db96d56Sopenharmony_ci:mod:`nntplib` --- NNTP protocol client
27db96d56Sopenharmony_ci=======================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: nntplib
57db96d56Sopenharmony_ci   :synopsis: NNTP protocol client (requires sockets).
67db96d56Sopenharmony_ci   :deprecated:
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ci**Source code:** :source:`Lib/nntplib.py`
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci.. index::
117db96d56Sopenharmony_ci   pair: NNTP; protocol
127db96d56Sopenharmony_ci   single: Network News Transfer Protocol
137db96d56Sopenharmony_ci
147db96d56Sopenharmony_ci.. deprecated:: 3.11
157db96d56Sopenharmony_ci   The :mod:`nntplib` module is deprecated (see :pep:`594` for details).
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci--------------
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciThis module defines the class :class:`NNTP` which implements the client side of
207db96d56Sopenharmony_cithe Network News Transfer Protocol.  It can be used to implement a news reader
217db96d56Sopenharmony_cior poster, or automated news processors.  It is compatible with :rfc:`3977`
227db96d56Sopenharmony_cias well as the older :rfc:`977` and :rfc:`2980`.
237db96d56Sopenharmony_ci
247db96d56Sopenharmony_ci.. include:: ../includes/wasm-notavail.rst
257db96d56Sopenharmony_ci
267db96d56Sopenharmony_ciHere are two small examples of how it can be used.  To list some statistics
277db96d56Sopenharmony_ciabout a newsgroup and print the subjects of the last 10 articles::
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci   >>> s = nntplib.NNTP('news.gmane.io')
307db96d56Sopenharmony_ci   >>> resp, count, first, last, name = s.group('gmane.comp.python.committers')
317db96d56Sopenharmony_ci   >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last)
327db96d56Sopenharmony_ci   Group gmane.comp.python.committers has 1096 articles, range 1 to 1096
337db96d56Sopenharmony_ci   >>> resp, overviews = s.over((last - 9, last))
347db96d56Sopenharmony_ci   >>> for id, over in overviews:
357db96d56Sopenharmony_ci   ...     print(id, nntplib.decode_header(over['subject']))
367db96d56Sopenharmony_ci   ...
377db96d56Sopenharmony_ci   1087 Re: Commit privileges for Łukasz Langa
387db96d56Sopenharmony_ci   1088 Re: 3.2 alpha 2 freeze
397db96d56Sopenharmony_ci   1089 Re: 3.2 alpha 2 freeze
407db96d56Sopenharmony_ci   1090 Re: Commit privileges for Łukasz Langa
417db96d56Sopenharmony_ci   1091 Re: Commit privileges for Łukasz Langa
427db96d56Sopenharmony_ci   1092 Updated ssh key
437db96d56Sopenharmony_ci   1093 Re: Updated ssh key
447db96d56Sopenharmony_ci   1094 Re: Updated ssh key
457db96d56Sopenharmony_ci   1095 Hello fellow committers!
467db96d56Sopenharmony_ci   1096 Re: Hello fellow committers!
477db96d56Sopenharmony_ci   >>> s.quit()
487db96d56Sopenharmony_ci   '205 Bye!'
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ciTo post an article from a binary file (this assumes that the article has valid
517db96d56Sopenharmony_ciheaders, and that you have right to post on the particular newsgroup)::
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ci   >>> s = nntplib.NNTP('news.gmane.io')
547db96d56Sopenharmony_ci   >>> f = open('article.txt', 'rb')
557db96d56Sopenharmony_ci   >>> s.post(f)
567db96d56Sopenharmony_ci   '240 Article posted successfully.'
577db96d56Sopenharmony_ci   >>> s.quit()
587db96d56Sopenharmony_ci   '205 Bye!'
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ciThe module itself defines the following classes:
617db96d56Sopenharmony_ci
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci.. class:: NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False, [timeout])
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci   Return a new :class:`NNTP` object, representing a connection
667db96d56Sopenharmony_ci   to the NNTP server running on host *host*, listening at port *port*.
677db96d56Sopenharmony_ci   An optional *timeout* can be specified for the socket connection.
687db96d56Sopenharmony_ci   If the optional *user* and *password* are provided, or if suitable
697db96d56Sopenharmony_ci   credentials are present in :file:`/.netrc` and the optional flag *usenetrc*
707db96d56Sopenharmony_ci   is true, the ``AUTHINFO USER`` and ``AUTHINFO PASS`` commands are used
717db96d56Sopenharmony_ci   to identify and authenticate the user to the server.  If the optional
727db96d56Sopenharmony_ci   flag *readermode* is true, then a ``mode reader`` command is sent before
737db96d56Sopenharmony_ci   authentication is performed.  Reader mode is sometimes necessary if you are
747db96d56Sopenharmony_ci   connecting to an NNTP server on the local machine and intend to call
757db96d56Sopenharmony_ci   reader-specific commands, such as ``group``.  If you get unexpected
767db96d56Sopenharmony_ci   :exc:`NNTPPermanentError`\ s, you might need to set *readermode*.
777db96d56Sopenharmony_ci   The :class:`NNTP` class supports the :keyword:`with` statement to
787db96d56Sopenharmony_ci   unconditionally consume :exc:`OSError` exceptions and to close the NNTP
797db96d56Sopenharmony_ci   connection when done, e.g.:
807db96d56Sopenharmony_ci
817db96d56Sopenharmony_ci    >>> from nntplib import NNTP
827db96d56Sopenharmony_ci    >>> with NNTP('news.gmane.io') as n:
837db96d56Sopenharmony_ci    ...     n.group('gmane.comp.python.committers')
847db96d56Sopenharmony_ci    ... # doctest: +SKIP
857db96d56Sopenharmony_ci    ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
867db96d56Sopenharmony_ci    >>>
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci   .. audit-event:: nntplib.connect self,host,port nntplib.NNTP
897db96d56Sopenharmony_ci
907db96d56Sopenharmony_ci   .. audit-event:: nntplib.putline self,line nntplib.NNTP
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci      All commands will raise an :ref:`auditing event <auditing>`
937db96d56Sopenharmony_ci      ``nntplib.putline`` with arguments ``self`` and ``line``,
947db96d56Sopenharmony_ci      where ``line`` is the bytes about to be sent to the remote host.
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ci   .. versionchanged:: 3.2
977db96d56Sopenharmony_ci      *usenetrc* is now ``False`` by default.
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ci   .. versionchanged:: 3.3
1007db96d56Sopenharmony_ci      Support for the :keyword:`with` statement was added.
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci   .. versionchanged:: 3.9
1037db96d56Sopenharmony_ci      If the *timeout* parameter is set to be zero, it will raise a
1047db96d56Sopenharmony_ci      :class:`ValueError` to prevent the creation of a non-blocking socket.
1057db96d56Sopenharmony_ci
1067db96d56Sopenharmony_ci.. class:: NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False, [timeout])
1077db96d56Sopenharmony_ci
1087db96d56Sopenharmony_ci   Return a new :class:`NNTP_SSL` object, representing an encrypted
1097db96d56Sopenharmony_ci   connection to the NNTP server running on host *host*, listening at
1107db96d56Sopenharmony_ci   port *port*.  :class:`NNTP_SSL` objects have the same methods as
1117db96d56Sopenharmony_ci   :class:`NNTP` objects.  If *port* is omitted, port 563 (NNTPS) is used.
1127db96d56Sopenharmony_ci   *ssl_context* is also optional, and is a :class:`~ssl.SSLContext` object.
1137db96d56Sopenharmony_ci   Please read :ref:`ssl-security` for best practices.
1147db96d56Sopenharmony_ci   All other parameters behave the same as for :class:`NNTP`.
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci   Note that SSL-on-563 is discouraged per :rfc:`4642`, in favor of
1177db96d56Sopenharmony_ci   STARTTLS as described below.  However, some servers only support the
1187db96d56Sopenharmony_ci   former.
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci   .. audit-event:: nntplib.connect self,host,port nntplib.NNTP_SSL
1217db96d56Sopenharmony_ci
1227db96d56Sopenharmony_ci   .. audit-event:: nntplib.putline self,line nntplib.NNTP_SSL
1237db96d56Sopenharmony_ci
1247db96d56Sopenharmony_ci      All commands will raise an :ref:`auditing event <auditing>`
1257db96d56Sopenharmony_ci      ``nntplib.putline`` with arguments ``self`` and ``line``,
1267db96d56Sopenharmony_ci      where ``line`` is the bytes about to be sent to the remote host.
1277db96d56Sopenharmony_ci
1287db96d56Sopenharmony_ci   .. versionadded:: 3.2
1297db96d56Sopenharmony_ci
1307db96d56Sopenharmony_ci   .. versionchanged:: 3.4
1317db96d56Sopenharmony_ci      The class now supports hostname check with
1327db96d56Sopenharmony_ci      :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see
1337db96d56Sopenharmony_ci      :data:`ssl.HAS_SNI`).
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci   .. versionchanged:: 3.9
1367db96d56Sopenharmony_ci      If the *timeout* parameter is set to be zero, it will raise a
1377db96d56Sopenharmony_ci      :class:`ValueError` to prevent the creation of a non-blocking socket.
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ci.. exception:: NNTPError
1407db96d56Sopenharmony_ci
1417db96d56Sopenharmony_ci   Derived from the standard exception :exc:`Exception`, this is the base
1427db96d56Sopenharmony_ci   class for all exceptions raised by the :mod:`nntplib` module.  Instances
1437db96d56Sopenharmony_ci   of this class have the following attribute:
1447db96d56Sopenharmony_ci
1457db96d56Sopenharmony_ci   .. attribute:: response
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci      The response of the server if available, as a :class:`str` object.
1487db96d56Sopenharmony_ci
1497db96d56Sopenharmony_ci
1507db96d56Sopenharmony_ci.. exception:: NNTPReplyError
1517db96d56Sopenharmony_ci
1527db96d56Sopenharmony_ci   Exception raised when an unexpected reply is received from the server.
1537db96d56Sopenharmony_ci
1547db96d56Sopenharmony_ci
1557db96d56Sopenharmony_ci.. exception:: NNTPTemporaryError
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci   Exception raised when a response code in the range 400--499 is received.
1587db96d56Sopenharmony_ci
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci.. exception:: NNTPPermanentError
1617db96d56Sopenharmony_ci
1627db96d56Sopenharmony_ci   Exception raised when a response code in the range 500--599 is received.
1637db96d56Sopenharmony_ci
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci.. exception:: NNTPProtocolError
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci   Exception raised when a reply is received from the server that does not begin
1687db96d56Sopenharmony_ci   with a digit in the range 1--5.
1697db96d56Sopenharmony_ci
1707db96d56Sopenharmony_ci
1717db96d56Sopenharmony_ci.. exception:: NNTPDataError
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci   Exception raised when there is some error in the response data.
1747db96d56Sopenharmony_ci
1757db96d56Sopenharmony_ci
1767db96d56Sopenharmony_ci.. _nntp-objects:
1777db96d56Sopenharmony_ci
1787db96d56Sopenharmony_ciNNTP Objects
1797db96d56Sopenharmony_ci------------
1807db96d56Sopenharmony_ci
1817db96d56Sopenharmony_ciWhen connected, :class:`NNTP` and :class:`NNTP_SSL` objects support the
1827db96d56Sopenharmony_cifollowing methods and attributes.
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ciAttributes
1857db96d56Sopenharmony_ci^^^^^^^^^^
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci.. attribute:: NNTP.nntp_version
1887db96d56Sopenharmony_ci
1897db96d56Sopenharmony_ci   An integer representing the version of the NNTP protocol supported by the
1907db96d56Sopenharmony_ci   server.  In practice, this should be ``2`` for servers advertising
1917db96d56Sopenharmony_ci   :rfc:`3977` compliance and ``1`` for others.
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci   .. versionadded:: 3.2
1947db96d56Sopenharmony_ci
1957db96d56Sopenharmony_ci.. attribute:: NNTP.nntp_implementation
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci   A string describing the software name and version of the NNTP server,
1987db96d56Sopenharmony_ci   or :const:`None` if not advertised by the server.
1997db96d56Sopenharmony_ci
2007db96d56Sopenharmony_ci   .. versionadded:: 3.2
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ciMethods
2037db96d56Sopenharmony_ci^^^^^^^
2047db96d56Sopenharmony_ci
2057db96d56Sopenharmony_ciThe *response* that is returned as the first item in the return tuple of almost
2067db96d56Sopenharmony_ciall methods is the server's response: a string beginning with a three-digit
2077db96d56Sopenharmony_cicode.  If the server's response indicates an error, the method raises one of
2087db96d56Sopenharmony_cithe above exceptions.
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ciMany of the following methods take an optional keyword-only argument *file*.
2117db96d56Sopenharmony_ciWhen the *file* argument is supplied, it must be either a :term:`file object`
2127db96d56Sopenharmony_ciopened for binary writing, or the name of an on-disk file to be written to.
2137db96d56Sopenharmony_ciThe method will then write any data returned by the server (except for the
2147db96d56Sopenharmony_ciresponse line and the terminating dot) to the file; any list of lines,
2157db96d56Sopenharmony_cituples or objects that the method normally returns will be empty.
2167db96d56Sopenharmony_ci
2177db96d56Sopenharmony_ci.. versionchanged:: 3.2
2187db96d56Sopenharmony_ci   Many of the following methods have been reworked and fixed, which makes
2197db96d56Sopenharmony_ci   them incompatible with their 3.1 counterparts.
2207db96d56Sopenharmony_ci
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci.. method:: NNTP.quit()
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci   Send a ``QUIT`` command and close the connection.  Once this method has been
2257db96d56Sopenharmony_ci   called, no other methods of the NNTP object should be called.
2267db96d56Sopenharmony_ci
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci.. method:: NNTP.getwelcome()
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   Return the welcome message sent by the server in reply to the initial
2317db96d56Sopenharmony_ci   connection.  (This message sometimes contains disclaimers or help information
2327db96d56Sopenharmony_ci   that may be relevant to the user.)
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci
2357db96d56Sopenharmony_ci.. method:: NNTP.getcapabilities()
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci   Return the :rfc:`3977` capabilities advertised by the server, as a
2387db96d56Sopenharmony_ci   :class:`dict` instance mapping capability names to (possibly empty) lists
2397db96d56Sopenharmony_ci   of values. On legacy servers which don't understand the ``CAPABILITIES``
2407db96d56Sopenharmony_ci   command, an empty dictionary is returned instead.
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci      >>> s = NNTP('news.gmane.io')
2437db96d56Sopenharmony_ci      >>> 'POST' in s.getcapabilities()
2447db96d56Sopenharmony_ci      True
2457db96d56Sopenharmony_ci
2467db96d56Sopenharmony_ci   .. versionadded:: 3.2
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci.. method:: NNTP.login(user=None, password=None, usenetrc=True)
2507db96d56Sopenharmony_ci
2517db96d56Sopenharmony_ci   Send ``AUTHINFO`` commands with the user name and password.  If *user*
2527db96d56Sopenharmony_ci   and *password* are ``None`` and *usenetrc* is true, credentials from
2537db96d56Sopenharmony_ci   ``~/.netrc`` will be used if possible.
2547db96d56Sopenharmony_ci
2557db96d56Sopenharmony_ci   Unless intentionally delayed, login is normally performed during the
2567db96d56Sopenharmony_ci   :class:`NNTP` object initialization and separately calling this function
2577db96d56Sopenharmony_ci   is unnecessary.  To force authentication to be delayed, you must not set
2587db96d56Sopenharmony_ci   *user* or *password* when creating the object, and must set *usenetrc* to
2597db96d56Sopenharmony_ci   False.
2607db96d56Sopenharmony_ci
2617db96d56Sopenharmony_ci   .. versionadded:: 3.2
2627db96d56Sopenharmony_ci
2637db96d56Sopenharmony_ci
2647db96d56Sopenharmony_ci.. method:: NNTP.starttls(context=None)
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci   Send a ``STARTTLS`` command.  This will enable encryption on the NNTP
2677db96d56Sopenharmony_ci   connection.  The *context* argument is optional and should be a
2687db96d56Sopenharmony_ci   :class:`ssl.SSLContext` object.  Please read :ref:`ssl-security` for best
2697db96d56Sopenharmony_ci   practices.
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci   Note that this may not be done after authentication information has
2727db96d56Sopenharmony_ci   been transmitted, and authentication occurs by default if possible during a
2737db96d56Sopenharmony_ci   :class:`NNTP` object initialization.  See :meth:`NNTP.login` for information
2747db96d56Sopenharmony_ci   on suppressing this behavior.
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci   .. versionadded:: 3.2
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci   .. versionchanged:: 3.4
2797db96d56Sopenharmony_ci      The method now supports hostname check with
2807db96d56Sopenharmony_ci      :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see
2817db96d56Sopenharmony_ci      :data:`ssl.HAS_SNI`).
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci.. method:: NNTP.newgroups(date, *, file=None)
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci   Send a ``NEWGROUPS`` command.  The *date* argument should be a
2867db96d56Sopenharmony_ci   :class:`datetime.date` or :class:`datetime.datetime` object.
2877db96d56Sopenharmony_ci   Return a pair ``(response, groups)`` where *groups* is a list representing
2887db96d56Sopenharmony_ci   the groups that are new since the given *date*. If *file* is supplied,
2897db96d56Sopenharmony_ci   though, then *groups* will be empty.
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ci      >>> from datetime import date, timedelta
2927db96d56Sopenharmony_ci      >>> resp, groups = s.newgroups(date.today() - timedelta(days=3))
2937db96d56Sopenharmony_ci      >>> len(groups) # doctest: +SKIP
2947db96d56Sopenharmony_ci      85
2957db96d56Sopenharmony_ci      >>> groups[0] # doctest: +SKIP
2967db96d56Sopenharmony_ci      GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m')
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci.. method:: NNTP.newnews(group, date, *, file=None)
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci   Send a ``NEWNEWS`` command.  Here, *group* is a group name or ``'*'``, and
3027db96d56Sopenharmony_ci   *date* has the same meaning as for :meth:`newgroups`.  Return a pair
3037db96d56Sopenharmony_ci   ``(response, articles)`` where *articles* is a list of message ids.
3047db96d56Sopenharmony_ci
3057db96d56Sopenharmony_ci   This command is frequently disabled by NNTP server administrators.
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci.. method:: NNTP.list(group_pattern=None, *, file=None)
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci   Send a ``LIST`` or ``LIST ACTIVE`` command.  Return a pair
3117db96d56Sopenharmony_ci   ``(response, list)`` where *list* is a list of tuples representing all
3127db96d56Sopenharmony_ci   the groups available from this NNTP server, optionally matching the
3137db96d56Sopenharmony_ci   pattern string *group_pattern*.  Each tuple has the form
3147db96d56Sopenharmony_ci   ``(group, last, first, flag)``, where *group* is a group name, *last*
3157db96d56Sopenharmony_ci   and *first* are the last and first article numbers, and *flag* usually
3167db96d56Sopenharmony_ci   takes one of these values:
3177db96d56Sopenharmony_ci
3187db96d56Sopenharmony_ci   * ``y``: Local postings and articles from peers are allowed.
3197db96d56Sopenharmony_ci   * ``m``: The group is moderated and all postings must be approved.
3207db96d56Sopenharmony_ci   * ``n``: No local postings are allowed, only articles from peers.
3217db96d56Sopenharmony_ci   * ``j``: Articles from peers are filed in the junk group instead.
3227db96d56Sopenharmony_ci   * ``x``: No local postings, and articles from peers are ignored.
3237db96d56Sopenharmony_ci   * ``=foo.bar``: Articles are filed in the ``foo.bar`` group instead.
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_ci   If *flag* has another value, then the status of the newsgroup should be
3267db96d56Sopenharmony_ci   considered unknown.
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci   This command can return very large results, especially if *group_pattern*
3297db96d56Sopenharmony_ci   is not specified.  It is best to cache the results offline unless you
3307db96d56Sopenharmony_ci   really need to refresh them.
3317db96d56Sopenharmony_ci
3327db96d56Sopenharmony_ci   .. versionchanged:: 3.2
3337db96d56Sopenharmony_ci      *group_pattern* was added.
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci
3367db96d56Sopenharmony_ci.. method:: NNTP.descriptions(grouppattern)
3377db96d56Sopenharmony_ci
3387db96d56Sopenharmony_ci   Send a ``LIST NEWSGROUPS`` command, where *grouppattern* is a wildmat string as
3397db96d56Sopenharmony_ci   specified in :rfc:`3977` (it's essentially the same as DOS or UNIX shell wildcard
3407db96d56Sopenharmony_ci   strings).  Return a pair ``(response, descriptions)``, where *descriptions*
3417db96d56Sopenharmony_ci   is a dictionary mapping group names to textual descriptions.
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ci      >>> resp, descs = s.descriptions('gmane.comp.python.*')
3447db96d56Sopenharmony_ci      >>> len(descs) # doctest: +SKIP
3457db96d56Sopenharmony_ci      295
3467db96d56Sopenharmony_ci      >>> descs.popitem() # doctest: +SKIP
3477db96d56Sopenharmony_ci      ('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)')
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ci
3507db96d56Sopenharmony_ci.. method:: NNTP.description(group)
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ci   Get a description for a single group *group*.  If more than one group matches
3537db96d56Sopenharmony_ci   (if 'group' is a real wildmat string), return the first match.   If no group
3547db96d56Sopenharmony_ci   matches, return an empty string.
3557db96d56Sopenharmony_ci
3567db96d56Sopenharmony_ci   This elides the response code from the server.  If the response code is needed,
3577db96d56Sopenharmony_ci   use :meth:`descriptions`.
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ci.. method:: NNTP.group(name)
3617db96d56Sopenharmony_ci
3627db96d56Sopenharmony_ci   Send a ``GROUP`` command, where *name* is the group name.  The group is
3637db96d56Sopenharmony_ci   selected as the current group, if it exists.  Return a tuple
3647db96d56Sopenharmony_ci   ``(response, count, first, last, name)`` where *count* is the (estimated)
3657db96d56Sopenharmony_ci   number of articles in the group, *first* is the first article number in
3667db96d56Sopenharmony_ci   the group, *last* is the last article number in the group, and *name*
3677db96d56Sopenharmony_ci   is the group name.
3687db96d56Sopenharmony_ci
3697db96d56Sopenharmony_ci
3707db96d56Sopenharmony_ci.. method:: NNTP.over(message_spec, *, file=None)
3717db96d56Sopenharmony_ci
3727db96d56Sopenharmony_ci   Send an ``OVER`` command, or an ``XOVER`` command on legacy servers.
3737db96d56Sopenharmony_ci   *message_spec* can be either a string representing a message id, or
3747db96d56Sopenharmony_ci   a ``(first, last)`` tuple of numbers indicating a range of articles in
3757db96d56Sopenharmony_ci   the current group, or a ``(first, None)`` tuple indicating a range of
3767db96d56Sopenharmony_ci   articles starting from *first* to the last article in the current group,
3777db96d56Sopenharmony_ci   or :const:`None` to select the current article in the current group.
3787db96d56Sopenharmony_ci
3797db96d56Sopenharmony_ci   Return a pair ``(response, overviews)``.  *overviews* is a list of
3807db96d56Sopenharmony_ci   ``(article_number, overview)`` tuples, one for each article selected
3817db96d56Sopenharmony_ci   by *message_spec*.  Each *overview* is a dictionary with the same number
3827db96d56Sopenharmony_ci   of items, but this number depends on the server.  These items are either
3837db96d56Sopenharmony_ci   message headers (the key is then the lower-cased header name) or metadata
3847db96d56Sopenharmony_ci   items (the key is then the metadata name prepended with ``":"``).  The
3857db96d56Sopenharmony_ci   following items are guaranteed to be present by the NNTP specification:
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci   * the ``subject``, ``from``, ``date``, ``message-id`` and ``references``
3887db96d56Sopenharmony_ci     headers
3897db96d56Sopenharmony_ci   * the ``:bytes`` metadata: the number of bytes in the entire raw article
3907db96d56Sopenharmony_ci     (including headers and body)
3917db96d56Sopenharmony_ci   * the ``:lines`` metadata: the number of lines in the article body
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ci   The value of each item is either a string, or :const:`None` if not present.
3947db96d56Sopenharmony_ci
3957db96d56Sopenharmony_ci   It is advisable to use the :func:`decode_header` function on header
3967db96d56Sopenharmony_ci   values when they may contain non-ASCII characters::
3977db96d56Sopenharmony_ci
3987db96d56Sopenharmony_ci      >>> _, _, first, last, _ = s.group('gmane.comp.python.devel')
3997db96d56Sopenharmony_ci      >>> resp, overviews = s.over((last, last))
4007db96d56Sopenharmony_ci      >>> art_num, over = overviews[0]
4017db96d56Sopenharmony_ci      >>> art_num
4027db96d56Sopenharmony_ci      117216
4037db96d56Sopenharmony_ci      >>> list(over.keys())
4047db96d56Sopenharmony_ci      ['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']
4057db96d56Sopenharmony_ci      >>> over['from']
4067db96d56Sopenharmony_ci      '=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= <martin@v.loewis.de>'
4077db96d56Sopenharmony_ci      >>> nntplib.decode_header(over['from'])
4087db96d56Sopenharmony_ci      '"Martin v. Löwis" <martin@v.loewis.de>'
4097db96d56Sopenharmony_ci
4107db96d56Sopenharmony_ci   .. versionadded:: 3.2
4117db96d56Sopenharmony_ci
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci.. method:: NNTP.help(*, file=None)
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci   Send a ``HELP`` command.  Return a pair ``(response, list)`` where *list* is a
4167db96d56Sopenharmony_ci   list of help strings.
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci
4197db96d56Sopenharmony_ci.. method:: NNTP.stat(message_spec=None)
4207db96d56Sopenharmony_ci
4217db96d56Sopenharmony_ci   Send a ``STAT`` command, where *message_spec* is either a message id
4227db96d56Sopenharmony_ci   (enclosed in ``'<'`` and ``'>'``) or an article number in the current group.
4237db96d56Sopenharmony_ci   If *message_spec* is omitted or :const:`None`, the current article in the
4247db96d56Sopenharmony_ci   current group is considered.  Return a triple ``(response, number, id)``
4257db96d56Sopenharmony_ci   where *number* is the article number and *id* is the message id.
4267db96d56Sopenharmony_ci
4277db96d56Sopenharmony_ci      >>> _, _, first, last, _ = s.group('gmane.comp.python.devel')
4287db96d56Sopenharmony_ci      >>> resp, number, message_id = s.stat(first)
4297db96d56Sopenharmony_ci      >>> number, message_id
4307db96d56Sopenharmony_ci      (9099, '<20030112190404.GE29873@epoch.metaslash.com>')
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci
4337db96d56Sopenharmony_ci.. method:: NNTP.next()
4347db96d56Sopenharmony_ci
4357db96d56Sopenharmony_ci   Send a ``NEXT`` command.  Return as for :meth:`.stat`.
4367db96d56Sopenharmony_ci
4377db96d56Sopenharmony_ci
4387db96d56Sopenharmony_ci.. method:: NNTP.last()
4397db96d56Sopenharmony_ci
4407db96d56Sopenharmony_ci   Send a ``LAST`` command.  Return as for :meth:`.stat`.
4417db96d56Sopenharmony_ci
4427db96d56Sopenharmony_ci
4437db96d56Sopenharmony_ci.. method:: NNTP.article(message_spec=None, *, file=None)
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci   Send an ``ARTICLE`` command, where *message_spec* has the same meaning as
4467db96d56Sopenharmony_ci   for :meth:`.stat`.  Return a tuple ``(response, info)`` where *info*
4477db96d56Sopenharmony_ci   is a :class:`~collections.namedtuple` with three attributes *number*,
4487db96d56Sopenharmony_ci   *message_id* and *lines* (in that order).  *number* is the article number
4497db96d56Sopenharmony_ci   in the group (or 0 if the information is not available), *message_id* the
4507db96d56Sopenharmony_ci   message id as a string, and *lines* a list of lines (without terminating
4517db96d56Sopenharmony_ci   newlines) comprising the raw message including headers and body.
4527db96d56Sopenharmony_ci
4537db96d56Sopenharmony_ci      >>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>')
4547db96d56Sopenharmony_ci      >>> info.number
4557db96d56Sopenharmony_ci      0
4567db96d56Sopenharmony_ci      >>> info.message_id
4577db96d56Sopenharmony_ci      '<20030112190404.GE29873@epoch.metaslash.com>'
4587db96d56Sopenharmony_ci      >>> len(info.lines)
4597db96d56Sopenharmony_ci      65
4607db96d56Sopenharmony_ci      >>> info.lines[0]
4617db96d56Sopenharmony_ci      b'Path: main.gmane.org!not-for-mail'
4627db96d56Sopenharmony_ci      >>> info.lines[1]
4637db96d56Sopenharmony_ci      b'From: Neal Norwitz <neal@metaslash.com>'
4647db96d56Sopenharmony_ci      >>> info.lines[-3:]
4657db96d56Sopenharmony_ci      [b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal']
4667db96d56Sopenharmony_ci
4677db96d56Sopenharmony_ci
4687db96d56Sopenharmony_ci.. method:: NNTP.head(message_spec=None, *, file=None)
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci   Same as :meth:`article()`, but sends a ``HEAD`` command.  The *lines*
4717db96d56Sopenharmony_ci   returned (or written to *file*) will only contain the message headers, not
4727db96d56Sopenharmony_ci   the body.
4737db96d56Sopenharmony_ci
4747db96d56Sopenharmony_ci
4757db96d56Sopenharmony_ci.. method:: NNTP.body(message_spec=None, *, file=None)
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci   Same as :meth:`article()`, but sends a ``BODY`` command.  The *lines*
4787db96d56Sopenharmony_ci   returned (or written to *file*) will only contain the message body, not the
4797db96d56Sopenharmony_ci   headers.
4807db96d56Sopenharmony_ci
4817db96d56Sopenharmony_ci
4827db96d56Sopenharmony_ci.. method:: NNTP.post(data)
4837db96d56Sopenharmony_ci
4847db96d56Sopenharmony_ci   Post an article using the ``POST`` command.  The *data* argument is either
4857db96d56Sopenharmony_ci   a :term:`file object` opened for binary reading, or any iterable of bytes
4867db96d56Sopenharmony_ci   objects (representing raw lines of the article to be posted).  It should
4877db96d56Sopenharmony_ci   represent a well-formed news article, including the required headers.  The
4887db96d56Sopenharmony_ci   :meth:`post` method automatically escapes lines beginning with ``.`` and
4897db96d56Sopenharmony_ci   appends the termination line.
4907db96d56Sopenharmony_ci
4917db96d56Sopenharmony_ci   If the method succeeds, the server's response is returned.  If the server
4927db96d56Sopenharmony_ci   refuses posting, a :class:`NNTPReplyError` is raised.
4937db96d56Sopenharmony_ci
4947db96d56Sopenharmony_ci
4957db96d56Sopenharmony_ci.. method:: NNTP.ihave(message_id, data)
4967db96d56Sopenharmony_ci
4977db96d56Sopenharmony_ci   Send an ``IHAVE`` command. *message_id* is the id of the message to send
4987db96d56Sopenharmony_ci   to the server (enclosed in  ``'<'`` and ``'>'``).  The *data* parameter
4997db96d56Sopenharmony_ci   and the return value are the same as for :meth:`post()`.
5007db96d56Sopenharmony_ci
5017db96d56Sopenharmony_ci
5027db96d56Sopenharmony_ci.. method:: NNTP.date()
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ci   Return a pair ``(response, date)``.  *date* is a :class:`~datetime.datetime`
5057db96d56Sopenharmony_ci   object containing the current date and time of the server.
5067db96d56Sopenharmony_ci
5077db96d56Sopenharmony_ci
5087db96d56Sopenharmony_ci.. method:: NNTP.slave()
5097db96d56Sopenharmony_ci
5107db96d56Sopenharmony_ci   Send a ``SLAVE`` command.  Return the server's *response*.
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci
5137db96d56Sopenharmony_ci.. method:: NNTP.set_debuglevel(level)
5147db96d56Sopenharmony_ci
5157db96d56Sopenharmony_ci   Set the instance's debugging level.  This controls the amount of debugging
5167db96d56Sopenharmony_ci   output printed.  The default, ``0``, produces no debugging output.  A value of
5177db96d56Sopenharmony_ci   ``1`` produces a moderate amount of debugging output, generally a single line
5187db96d56Sopenharmony_ci   per request or response.  A value of ``2`` or higher produces the maximum amount
5197db96d56Sopenharmony_ci   of debugging output, logging each line sent and received on the connection
5207db96d56Sopenharmony_ci   (including message text).
5217db96d56Sopenharmony_ci
5227db96d56Sopenharmony_ci
5237db96d56Sopenharmony_ciThe following are optional NNTP extensions defined in :rfc:`2980`.  Some of
5247db96d56Sopenharmony_cithem have been superseded by newer commands in :rfc:`3977`.
5257db96d56Sopenharmony_ci
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci.. method:: NNTP.xhdr(hdr, str, *, file=None)
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci   Send an ``XHDR`` command.  The *hdr* argument is a header keyword, e.g.
5307db96d56Sopenharmony_ci   ``'subject'``.  The *str* argument should have the form ``'first-last'``
5317db96d56Sopenharmony_ci   where *first* and *last* are the first and last article numbers to search.
5327db96d56Sopenharmony_ci   Return a pair ``(response, list)``, where *list* is a list of pairs ``(id,
5337db96d56Sopenharmony_ci   text)``, where *id* is an article number (as a string) and *text* is the text of
5347db96d56Sopenharmony_ci   the requested header for that article. If the *file* parameter is supplied, then
5357db96d56Sopenharmony_ci   the output of the  ``XHDR`` command is stored in a file.  If *file* is a string,
5367db96d56Sopenharmony_ci   then the method will open a file with that name, write to it  then close it.
5377db96d56Sopenharmony_ci   If *file* is a :term:`file object`, then it will start calling :meth:`write` on
5387db96d56Sopenharmony_ci   it to store the lines of the command output. If *file* is supplied, then the
5397db96d56Sopenharmony_ci   returned *list* is an empty list.
5407db96d56Sopenharmony_ci
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci.. method:: NNTP.xover(start, end, *, file=None)
5437db96d56Sopenharmony_ci
5447db96d56Sopenharmony_ci   Send an ``XOVER`` command.  *start* and *end* are article numbers
5457db96d56Sopenharmony_ci   delimiting the range of articles to select.  The return value is the
5467db96d56Sopenharmony_ci   same of for :meth:`over()`.  It is recommended to use :meth:`over()`
5477db96d56Sopenharmony_ci   instead, since it will automatically use the newer ``OVER`` command
5487db96d56Sopenharmony_ci   if available.
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci
5517db96d56Sopenharmony_ciUtility functions
5527db96d56Sopenharmony_ci-----------------
5537db96d56Sopenharmony_ci
5547db96d56Sopenharmony_ciThe module also defines the following utility function:
5557db96d56Sopenharmony_ci
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci.. function:: decode_header(header_str)
5587db96d56Sopenharmony_ci
5597db96d56Sopenharmony_ci   Decode a header value, un-escaping any escaped non-ASCII characters.
5607db96d56Sopenharmony_ci   *header_str* must be a :class:`str` object.  The unescaped value is
5617db96d56Sopenharmony_ci   returned.  Using this function is recommended to display some headers
5627db96d56Sopenharmony_ci   in a human readable form::
5637db96d56Sopenharmony_ci
5647db96d56Sopenharmony_ci      >>> decode_header("Some subject")
5657db96d56Sopenharmony_ci      'Some subject'
5667db96d56Sopenharmony_ci      >>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=")
5677db96d56Sopenharmony_ci      'Débuter en Python'
5687db96d56Sopenharmony_ci      >>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=")
5697db96d56Sopenharmony_ci      'Re: problème de matrice'
570