# pyzor.client

Networked spam-signature detection client.

    >>> import pyzor
    >>> import pyzor.client
    >>> import pyzor.digest
    >>> import pyzor.config

To load the accounts file:

    >>> accounts = pyzor.config.load_accounts(filename)

To create a client (to then issue commands):

    >>> client = pyzor.client.Client(accounts)

To create a client, using the anonymous user:

    >>> client = pyzor.client.Client()

To get a digest (of an email.message.Message object, or similar):

    >>> digest = pyzor.digest.get_digest(msg)

To query a server (where address is a (host, port) pair):

    >>> client.ping(address)
    >>> client.info(digest, address)
    >>> client.report(digest, address)
    >>> client.whitelist(digest, address)
    >>> client.check(digest, address)

To query the default server (public.pyzor.org):

    >>> client.ping()
    >>> client.info(digest)
    >>> client.report(digest)
    >>> client.whitelist(digest)
    >>> client.check(digest)

Response will contain, depending on the type of request, some of the following keys (e.g. client.ping()[‘Code’]):

All responses will have: - ‘Diag’ ‘OK’ or error message - ‘Code’ ‘200’ if OK - ‘PV’ Protocol Version - ‘Thread’

info and check responses will also contain: - ‘[WL-]Count’ Whitelist/Blacklist count

info responses will also have: - ‘[WL-]Entered’ timestamp when message was first whitelisted/blacklisted - ‘[WL-]Updated’ timestamp when message was last whitelisted/blacklisted

class `pyzor.client.``BatchClient`(accounts=None, timeout=None, spec=None, batch_size=10)

  Bases: `pyzor.client.Client`

  Like the normal Client but with support for batching reports.

  `flush`()

    Deleting any saved digest reports.

  `force`()

    Force send any remaining reports.

  `report`(digest, address=('public.pyzor.org', 24441))
  `whitelist`(digest, address=('public.pyzor.org', 24441))

class `pyzor.client.``CheckClientRunner`(routine, r_count=0, wl_count=0)

  Bases: `pyzor.client.ClientRunner`

  `handle_response`(response, message)

class `pyzor.client.``Client`(accounts=None, timeout=None, spec=None)

  Bases: `object`

  `check`(digest, address=('public.pyzor.org', 24441))
  `info`(digest, address=('public.pyzor.org', 24441))
  `max_packet_size` = 8192
  `ping`(address=('public.pyzor.org', 24441))
  `pong`(digest, address=('public.pyzor.org', 24441))
  `read_response`(sock, expected_id)
  `report`(digest, address=('public.pyzor.org', 24441))
  `send`(msg, address=('public.pyzor.org', 24441))
  `timeout` = 5
  `whitelist`(digest, address=('public.pyzor.org', 24441))

class `pyzor.client.``ClientRunner`(routine)

  Bases: `object`

  `handle_response`(response, message)

    mesaage is a string we’ve built up so far

  `run`(server, args, kwargs=None)

class `pyzor.client.``InfoClientRunner`(routine)

  Bases: `pyzor.client.ClientRunner`

  `handle_response`(response, message)