1:mod:`nntplib` --- NNTP protocol client 2======================================= 3 4.. module:: nntplib 5 :synopsis: NNTP protocol client (requires sockets). 6 7**Source code:** :source:`Lib/nntplib.py` 8 9.. index:: 10 pair: NNTP; protocol 11 single: Network News Transfer Protocol 12 13-------------- 14 15This module defines the class :class:`NNTP` which implements the client side of 16the Network News Transfer Protocol. It can be used to implement a news reader 17or poster, or automated news processors. It is compatible with :rfc:`3977` 18as well as the older :rfc:`977` and :rfc:`2980`. 19 20Here are two small examples of how it can be used. To list some statistics 21about a newsgroup and print the subjects of the last 10 articles:: 22 23 >>> s = nntplib.NNTP('news.gmane.io') 24 >>> resp, count, first, last, name = s.group('gmane.comp.python.committers') 25 >>> print('Group', name, 'has', count, 'articles, range', first, 'to', last) 26 Group gmane.comp.python.committers has 1096 articles, range 1 to 1096 27 >>> resp, overviews = s.over((last - 9, last)) 28 >>> for id, over in overviews: 29 ... print(id, nntplib.decode_header(over['subject'])) 30 ... 31 1087 Re: Commit privileges for Łukasz Langa 32 1088 Re: 3.2 alpha 2 freeze 33 1089 Re: 3.2 alpha 2 freeze 34 1090 Re: Commit privileges for Łukasz Langa 35 1091 Re: Commit privileges for Łukasz Langa 36 1092 Updated ssh key 37 1093 Re: Updated ssh key 38 1094 Re: Updated ssh key 39 1095 Hello fellow committers! 40 1096 Re: Hello fellow committers! 41 >>> s.quit() 42 '205 Bye!' 43 44To post an article from a binary file (this assumes that the article has valid 45headers, and that you have right to post on the particular newsgroup):: 46 47 >>> s = nntplib.NNTP('news.gmane.io') 48 >>> f = open('article.txt', 'rb') 49 >>> s.post(f) 50 '240 Article posted successfully.' 51 >>> s.quit() 52 '205 Bye!' 53 54The module itself defines the following classes: 55 56 57.. class:: NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False, [timeout]) 58 59 Return a new :class:`NNTP` object, representing a connection 60 to the NNTP server running on host *host*, listening at port *port*. 61 An optional *timeout* can be specified for the socket connection. 62 If the optional *user* and *password* are provided, or if suitable 63 credentials are present in :file:`/.netrc` and the optional flag *usenetrc* 64 is true, the ``AUTHINFO USER`` and ``AUTHINFO PASS`` commands are used 65 to identify and authenticate the user to the server. If the optional 66 flag *readermode* is true, then a ``mode reader`` command is sent before 67 authentication is performed. Reader mode is sometimes necessary if you are 68 connecting to an NNTP server on the local machine and intend to call 69 reader-specific commands, such as ``group``. If you get unexpected 70 :exc:`NNTPPermanentError`\ s, you might need to set *readermode*. 71 The :class:`NNTP` class supports the :keyword:`with` statement to 72 unconditionally consume :exc:`OSError` exceptions and to close the NNTP 73 connection when done, e.g.: 74 75 >>> from nntplib import NNTP 76 >>> with NNTP('news.gmane.io') as n: 77 ... n.group('gmane.comp.python.committers') 78 ... # doctest: +SKIP 79 ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') 80 >>> 81 82 .. audit-event:: nntplib.connect self,host,port nntplib.NNTP 83 84 .. audit-event:: nntplib.putline self,line nntplib.NNTP 85 86 All commands will raise an :ref:`auditing event <auditing>` 87 ``nntplib.putline`` with arguments ``self`` and ``line``, 88 where ``line`` is the bytes about to be sent to the remote host. 89 90 .. versionchanged:: 3.2 91 *usenetrc* is now ``False`` by default. 92 93 .. versionchanged:: 3.3 94 Support for the :keyword:`with` statement was added. 95 96 .. versionchanged:: 3.9 97 If the *timeout* parameter is set to be zero, it will raise a 98 :class:`ValueError` to prevent the creation of a non-blocking socket. 99 100.. class:: NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False, [timeout]) 101 102 Return a new :class:`NNTP_SSL` object, representing an encrypted 103 connection to the NNTP server running on host *host*, listening at 104 port *port*. :class:`NNTP_SSL` objects have the same methods as 105 :class:`NNTP` objects. If *port* is omitted, port 563 (NNTPS) is used. 106 *ssl_context* is also optional, and is a :class:`~ssl.SSLContext` object. 107 Please read :ref:`ssl-security` for best practices. 108 All other parameters behave the same as for :class:`NNTP`. 109 110 Note that SSL-on-563 is discouraged per :rfc:`4642`, in favor of 111 STARTTLS as described below. However, some servers only support the 112 former. 113 114 .. audit-event:: nntplib.connect self,host,port nntplib.NNTP_SSL 115 116 .. audit-event:: nntplib.putline self,line nntplib.NNTP_SSL 117 118 All commands will raise an :ref:`auditing event <auditing>` 119 ``nntplib.putline`` with arguments ``self`` and ``line``, 120 where ``line`` is the bytes about to be sent to the remote host. 121 122 .. versionadded:: 3.2 123 124 .. versionchanged:: 3.4 125 The class now supports hostname check with 126 :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see 127 :data:`ssl.HAS_SNI`). 128 129 .. versionchanged:: 3.9 130 If the *timeout* parameter is set to be zero, it will raise a 131 :class:`ValueError` to prevent the creation of a non-blocking socket. 132 133.. exception:: NNTPError 134 135 Derived from the standard exception :exc:`Exception`, this is the base 136 class for all exceptions raised by the :mod:`nntplib` module. Instances 137 of this class have the following attribute: 138 139 .. attribute:: response 140 141 The response of the server if available, as a :class:`str` object. 142 143 144.. exception:: NNTPReplyError 145 146 Exception raised when an unexpected reply is received from the server. 147 148 149.. exception:: NNTPTemporaryError 150 151 Exception raised when a response code in the range 400--499 is received. 152 153 154.. exception:: NNTPPermanentError 155 156 Exception raised when a response code in the range 500--599 is received. 157 158 159.. exception:: NNTPProtocolError 160 161 Exception raised when a reply is received from the server that does not begin 162 with a digit in the range 1--5. 163 164 165.. exception:: NNTPDataError 166 167 Exception raised when there is some error in the response data. 168 169 170.. _nntp-objects: 171 172NNTP Objects 173------------ 174 175When connected, :class:`NNTP` and :class:`NNTP_SSL` objects support the 176following methods and attributes. 177 178Attributes 179^^^^^^^^^^ 180 181.. attribute:: NNTP.nntp_version 182 183 An integer representing the version of the NNTP protocol supported by the 184 server. In practice, this should be ``2`` for servers advertising 185 :rfc:`3977` compliance and ``1`` for others. 186 187 .. versionadded:: 3.2 188 189.. attribute:: NNTP.nntp_implementation 190 191 A string describing the software name and version of the NNTP server, 192 or :const:`None` if not advertised by the server. 193 194 .. versionadded:: 3.2 195 196Methods 197^^^^^^^ 198 199The *response* that is returned as the first item in the return tuple of almost 200all methods is the server's response: a string beginning with a three-digit 201code. If the server's response indicates an error, the method raises one of 202the above exceptions. 203 204Many of the following methods take an optional keyword-only argument *file*. 205When the *file* argument is supplied, it must be either a :term:`file object` 206opened for binary writing, or the name of an on-disk file to be written to. 207The method will then write any data returned by the server (except for the 208response line and the terminating dot) to the file; any list of lines, 209tuples or objects that the method normally returns will be empty. 210 211.. versionchanged:: 3.2 212 Many of the following methods have been reworked and fixed, which makes 213 them incompatible with their 3.1 counterparts. 214 215 216.. method:: NNTP.quit() 217 218 Send a ``QUIT`` command and close the connection. Once this method has been 219 called, no other methods of the NNTP object should be called. 220 221 222.. method:: NNTP.getwelcome() 223 224 Return the welcome message sent by the server in reply to the initial 225 connection. (This message sometimes contains disclaimers or help information 226 that may be relevant to the user.) 227 228 229.. method:: NNTP.getcapabilities() 230 231 Return the :rfc:`3977` capabilities advertised by the server, as a 232 :class:`dict` instance mapping capability names to (possibly empty) lists 233 of values. On legacy servers which don't understand the ``CAPABILITIES`` 234 command, an empty dictionary is returned instead. 235 236 >>> s = NNTP('news.gmane.io') 237 >>> 'POST' in s.getcapabilities() 238 True 239 240 .. versionadded:: 3.2 241 242 243.. method:: NNTP.login(user=None, password=None, usenetrc=True) 244 245 Send ``AUTHINFO`` commands with the user name and password. If *user* 246 and *password* are ``None`` and *usenetrc* is true, credentials from 247 ``~/.netrc`` will be used if possible. 248 249 Unless intentionally delayed, login is normally performed during the 250 :class:`NNTP` object initialization and separately calling this function 251 is unnecessary. To force authentication to be delayed, you must not set 252 *user* or *password* when creating the object, and must set *usenetrc* to 253 False. 254 255 .. versionadded:: 3.2 256 257 258.. method:: NNTP.starttls(context=None) 259 260 Send a ``STARTTLS`` command. This will enable encryption on the NNTP 261 connection. The *context* argument is optional and should be a 262 :class:`ssl.SSLContext` object. Please read :ref:`ssl-security` for best 263 practices. 264 265 Note that this may not be done after authentication information has 266 been transmitted, and authentication occurs by default if possible during a 267 :class:`NNTP` object initialization. See :meth:`NNTP.login` for information 268 on suppressing this behavior. 269 270 .. versionadded:: 3.2 271 272 .. versionchanged:: 3.4 273 The method now supports hostname check with 274 :attr:`ssl.SSLContext.check_hostname` and *Server Name Indication* (see 275 :data:`ssl.HAS_SNI`). 276 277.. method:: NNTP.newgroups(date, *, file=None) 278 279 Send a ``NEWGROUPS`` command. The *date* argument should be a 280 :class:`datetime.date` or :class:`datetime.datetime` object. 281 Return a pair ``(response, groups)`` where *groups* is a list representing 282 the groups that are new since the given *date*. If *file* is supplied, 283 though, then *groups* will be empty. 284 285 >>> from datetime import date, timedelta 286 >>> resp, groups = s.newgroups(date.today() - timedelta(days=3)) 287 >>> len(groups) # doctest: +SKIP 288 85 289 >>> groups[0] # doctest: +SKIP 290 GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m') 291 292 293.. method:: NNTP.newnews(group, date, *, file=None) 294 295 Send a ``NEWNEWS`` command. Here, *group* is a group name or ``'*'``, and 296 *date* has the same meaning as for :meth:`newgroups`. Return a pair 297 ``(response, articles)`` where *articles* is a list of message ids. 298 299 This command is frequently disabled by NNTP server administrators. 300 301 302.. method:: NNTP.list(group_pattern=None, *, file=None) 303 304 Send a ``LIST`` or ``LIST ACTIVE`` command. Return a pair 305 ``(response, list)`` where *list* is a list of tuples representing all 306 the groups available from this NNTP server, optionally matching the 307 pattern string *group_pattern*. Each tuple has the form 308 ``(group, last, first, flag)``, where *group* is a group name, *last* 309 and *first* are the last and first article numbers, and *flag* usually 310 takes one of these values: 311 312 * ``y``: Local postings and articles from peers are allowed. 313 * ``m``: The group is moderated and all postings must be approved. 314 * ``n``: No local postings are allowed, only articles from peers. 315 * ``j``: Articles from peers are filed in the junk group instead. 316 * ``x``: No local postings, and articles from peers are ignored. 317 * ``=foo.bar``: Articles are filed in the ``foo.bar`` group instead. 318 319 If *flag* has another value, then the status of the newsgroup should be 320 considered unknown. 321 322 This command can return very large results, especially if *group_pattern* 323 is not specified. It is best to cache the results offline unless you 324 really need to refresh them. 325 326 .. versionchanged:: 3.2 327 *group_pattern* was added. 328 329 330.. method:: NNTP.descriptions(grouppattern) 331 332 Send a ``LIST NEWSGROUPS`` command, where *grouppattern* is a wildmat string as 333 specified in :rfc:`3977` (it's essentially the same as DOS or UNIX shell wildcard 334 strings). Return a pair ``(response, descriptions)``, where *descriptions* 335 is a dictionary mapping group names to textual descriptions. 336 337 >>> resp, descs = s.descriptions('gmane.comp.python.*') 338 >>> len(descs) # doctest: +SKIP 339 295 340 >>> descs.popitem() # doctest: +SKIP 341 ('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)') 342 343 344.. method:: NNTP.description(group) 345 346 Get a description for a single group *group*. If more than one group matches 347 (if 'group' is a real wildmat string), return the first match. If no group 348 matches, return an empty string. 349 350 This elides the response code from the server. If the response code is needed, 351 use :meth:`descriptions`. 352 353 354.. method:: NNTP.group(name) 355 356 Send a ``GROUP`` command, where *name* is the group name. The group is 357 selected as the current group, if it exists. Return a tuple 358 ``(response, count, first, last, name)`` where *count* is the (estimated) 359 number of articles in the group, *first* is the first article number in 360 the group, *last* is the last article number in the group, and *name* 361 is the group name. 362 363 364.. method:: NNTP.over(message_spec, *, file=None) 365 366 Send an ``OVER`` command, or an ``XOVER`` command on legacy servers. 367 *message_spec* can be either a string representing a message id, or 368 a ``(first, last)`` tuple of numbers indicating a range of articles in 369 the current group, or a ``(first, None)`` tuple indicating a range of 370 articles starting from *first* to the last article in the current group, 371 or :const:`None` to select the current article in the current group. 372 373 Return a pair ``(response, overviews)``. *overviews* is a list of 374 ``(article_number, overview)`` tuples, one for each article selected 375 by *message_spec*. Each *overview* is a dictionary with the same number 376 of items, but this number depends on the server. These items are either 377 message headers (the key is then the lower-cased header name) or metadata 378 items (the key is then the metadata name prepended with ``":"``). The 379 following items are guaranteed to be present by the NNTP specification: 380 381 * the ``subject``, ``from``, ``date``, ``message-id`` and ``references`` 382 headers 383 * the ``:bytes`` metadata: the number of bytes in the entire raw article 384 (including headers and body) 385 * the ``:lines`` metadata: the number of lines in the article body 386 387 The value of each item is either a string, or :const:`None` if not present. 388 389 It is advisable to use the :func:`decode_header` function on header 390 values when they may contain non-ASCII characters:: 391 392 >>> _, _, first, last, _ = s.group('gmane.comp.python.devel') 393 >>> resp, overviews = s.over((last, last)) 394 >>> art_num, over = overviews[0] 395 >>> art_num 396 117216 397 >>> list(over.keys()) 398 ['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject'] 399 >>> over['from'] 400 '=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= <martin@v.loewis.de>' 401 >>> nntplib.decode_header(over['from']) 402 '"Martin v. Löwis" <martin@v.loewis.de>' 403 404 .. versionadded:: 3.2 405 406 407.. method:: NNTP.help(*, file=None) 408 409 Send a ``HELP`` command. Return a pair ``(response, list)`` where *list* is a 410 list of help strings. 411 412 413.. method:: NNTP.stat(message_spec=None) 414 415 Send a ``STAT`` command, where *message_spec* is either a message id 416 (enclosed in ``'<'`` and ``'>'``) or an article number in the current group. 417 If *message_spec* is omitted or :const:`None`, the current article in the 418 current group is considered. Return a triple ``(response, number, id)`` 419 where *number* is the article number and *id* is the message id. 420 421 >>> _, _, first, last, _ = s.group('gmane.comp.python.devel') 422 >>> resp, number, message_id = s.stat(first) 423 >>> number, message_id 424 (9099, '<20030112190404.GE29873@epoch.metaslash.com>') 425 426 427.. method:: NNTP.next() 428 429 Send a ``NEXT`` command. Return as for :meth:`.stat`. 430 431 432.. method:: NNTP.last() 433 434 Send a ``LAST`` command. Return as for :meth:`.stat`. 435 436 437.. method:: NNTP.article(message_spec=None, *, file=None) 438 439 Send an ``ARTICLE`` command, where *message_spec* has the same meaning as 440 for :meth:`.stat`. Return a tuple ``(response, info)`` where *info* 441 is a :class:`~collections.namedtuple` with three attributes *number*, 442 *message_id* and *lines* (in that order). *number* is the article number 443 in the group (or 0 if the information is not available), *message_id* the 444 message id as a string, and *lines* a list of lines (without terminating 445 newlines) comprising the raw message including headers and body. 446 447 >>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>') 448 >>> info.number 449 0 450 >>> info.message_id 451 '<20030112190404.GE29873@epoch.metaslash.com>' 452 >>> len(info.lines) 453 65 454 >>> info.lines[0] 455 b'Path: main.gmane.org!not-for-mail' 456 >>> info.lines[1] 457 b'From: Neal Norwitz <neal@metaslash.com>' 458 >>> info.lines[-3:] 459 [b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal'] 460 461 462.. method:: NNTP.head(message_spec=None, *, file=None) 463 464 Same as :meth:`article()`, but sends a ``HEAD`` command. The *lines* 465 returned (or written to *file*) will only contain the message headers, not 466 the body. 467 468 469.. method:: NNTP.body(message_spec=None, *, file=None) 470 471 Same as :meth:`article()`, but sends a ``BODY`` command. The *lines* 472 returned (or written to *file*) will only contain the message body, not the 473 headers. 474 475 476.. method:: NNTP.post(data) 477 478 Post an article using the ``POST`` command. The *data* argument is either 479 a :term:`file object` opened for binary reading, or any iterable of bytes 480 objects (representing raw lines of the article to be posted). It should 481 represent a well-formed news article, including the required headers. The 482 :meth:`post` method automatically escapes lines beginning with ``.`` and 483 appends the termination line. 484 485 If the method succeeds, the server's response is returned. If the server 486 refuses posting, a :class:`NNTPReplyError` is raised. 487 488 489.. method:: NNTP.ihave(message_id, data) 490 491 Send an ``IHAVE`` command. *message_id* is the id of the message to send 492 to the server (enclosed in ``'<'`` and ``'>'``). The *data* parameter 493 and the return value are the same as for :meth:`post()`. 494 495 496.. method:: NNTP.date() 497 498 Return a pair ``(response, date)``. *date* is a :class:`~datetime.datetime` 499 object containing the current date and time of the server. 500 501 502.. method:: NNTP.slave() 503 504 Send a ``SLAVE`` command. Return the server's *response*. 505 506 507.. method:: NNTP.set_debuglevel(level) 508 509 Set the instance's debugging level. This controls the amount of debugging 510 output printed. The default, ``0``, produces no debugging output. A value of 511 ``1`` produces a moderate amount of debugging output, generally a single line 512 per request or response. A value of ``2`` or higher produces the maximum amount 513 of debugging output, logging each line sent and received on the connection 514 (including message text). 515 516 517The following are optional NNTP extensions defined in :rfc:`2980`. Some of 518them have been superseded by newer commands in :rfc:`3977`. 519 520 521.. method:: NNTP.xhdr(hdr, str, *, file=None) 522 523 Send an ``XHDR`` command. The *hdr* argument is a header keyword, e.g. 524 ``'subject'``. The *str* argument should have the form ``'first-last'`` 525 where *first* and *last* are the first and last article numbers to search. 526 Return a pair ``(response, list)``, where *list* is a list of pairs ``(id, 527 text)``, where *id* is an article number (as a string) and *text* is the text of 528 the requested header for that article. If the *file* parameter is supplied, then 529 the output of the ``XHDR`` command is stored in a file. If *file* is a string, 530 then the method will open a file with that name, write to it then close it. 531 If *file* is a :term:`file object`, then it will start calling :meth:`write` on 532 it to store the lines of the command output. If *file* is supplied, then the 533 returned *list* is an empty list. 534 535 536.. method:: NNTP.xover(start, end, *, file=None) 537 538 Send an ``XOVER`` command. *start* and *end* are article numbers 539 delimiting the range of articles to select. The return value is the 540 same of for :meth:`over()`. It is recommended to use :meth:`over()` 541 instead, since it will automatically use the newer ``OVER`` command 542 if available. 543 544 545Utility functions 546----------------- 547 548The module also defines the following utility function: 549 550 551.. function:: decode_header(header_str) 552 553 Decode a header value, un-escaping any escaped non-ASCII characters. 554 *header_str* must be a :class:`str` object. The unescaped value is 555 returned. Using this function is recommended to display some headers 556 in a human readable form:: 557 558 >>> decode_header("Some subject") 559 'Some subject' 560 >>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=") 561 'Débuter en Python' 562 >>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=") 563 'Re: problème de matrice' 564