Skip to main content

mailbox-client

CI PyPI benethos-mailbox-client Python License

Beta, version 0.4.1. Usable with real accounts. A breaking change of the API or the configuration is announced in the changelog. Stored data is carried forward by migrations.

The Python client of the REST API of mailbox-service, on PyPI as benethos-mailbox-client. It covers the whole REST API: it reads, searches, sorts, drafts and sends mail of the accounts the service holds, and administers the service: accounts, users, roles, tokens, second factors, webhooks, the audit and the state of the service, as far as its token allows. Every operation of the API is a method of both clients, named like its operationId. The MCP server of the project, mailbox-mcp, is built on it.

It knows the service through its REST API alone, and needs nothing but httpx. The REST API follows the status above. This package's Python interface has no stability promise yet.

What the project is for: the repository's README.

Contents

Install

uv add benethos-mailbox-client      # or: pip install benethos-mailbox-client

Use

Make a token on your user's page in the service's UI. The client reads it from MAILBOX_SERVICE_TOKEN, and the address of the service from MAILBOX_SERVICE_URL (default http://127.0.0.1:8080). Both can be passed as arguments instead.

For async code:

from benethos_mailbox_client import MailboxClient

async with MailboxClient() as mailbox:
    me = await mailbox.get_me()
    for account in me.accounts:
        page = await mailbox.list_messages(account.id, folder="inbox", limit=10)
        for summary in page.items:
            print(account.email, summary.sender, summary.subject)

For code without an event loop, SyncMailboxClient has the same methods (close() for aclose()) and answers the same records:

from benethos_mailbox_client import SyncMailboxClient, message_body

with SyncMailboxClient() as mailbox:
    body = message_body(
        to=[("someone@example.org", None)],
        cc=[],
        bcc=[],
        subject="Hello",
        text="Hi there",
        html=None,
        reference=None,
    )
    mailbox.send_message("acc_...", body, idempotency_key="hello-1")

Administering the service works the same way. A user with a grant and a token for it:

from benethos_mailbox_client import Grant, SyncMailboxClient

with SyncMailboxClient() as mailbox:
    user = mailbox.create_user(
        "desktop",
        grants=[Grant(accounts=("acc_...",), allow=("mail.read", "drafts"))],
    )
    made = mailbox.create_token(user.id, "laptop")
    print(made.secret.get_secret_value())  # shown this once

A message comes as a Message, a message in a page, a changed one and a written draft as a MessageSummary, its sender and recipients as Address records.

A secret the service shows once, a new token, a one-time password or a webhook's signing secret, comes as a Secret: repr and str show stars, so it reaches no log by accident, and get_secret_value() reads it. Lists that page answer Paged, with next_cursor for the next page.

request(method, path, ...) sends any request and answers its JSON as it comes, e.g. for a field a record leaves out. The routes and their fields: docs/openapi.json.

The token travels in a header. Over http the client talks only to this machine. To another machine it needs https, or MAILBOX_SERVICE_ALLOW_HTTP=1 (allow_http=True) for a network you trust, such as between containers.

A client made without an address or a token reads the environment when it is made. A program that makes clients for a long time can read it once, with from_environment():

from benethos_mailbox_client import MailboxClient, from_environment

found = from_environment()
client = MailboxClient(found.url, found.token, allow_http=found.allow_http)

Errors

Everything the client raises is a MailboxError:

Error When
ConfigurationError no token, or an address it refuses
ServiceUnavailableError the service cannot be reached
ServiceTimeoutError the service took the request but did not answer in time
ApiError the API answered with an error: status, code, message

Inside

Each endpoint is described once, in endpoints/, one module per resource of the API: its method, path, query, body and how its answer becomes a record of models/. That package sends nothing. MailboxClient sends those requests with httpx.AsyncClient, SyncMailboxClient with httpx.Client, and a method of either is one line made from its endpoint, with the endpoint's name, docstring and signature, get_attachment, which streams, a few more. A test holds every operation of the API to a method of both clients. What both share stands beside them: the address and the token (environment.py), the shape of a request (calls.py), how an answer or a failure is read (answers.py) and an attachment read in chunks (attachments.py).

License

MIT, see LICENSE.

Metadata

Release files for benethos-mailbox-client 0.4.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for benethos-mailbox-client 0.4.1
File Size Uploaded
benethos_mailbox_client-0.4.1.tar.gz 45.0 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for benethos-mailbox-client 0.4.1
File Interpreter ABI Platform
benethos_mailbox_client-0.4.1-py3-none-any.whl Python 3 none any Details

Total release size: 94.7 kB

Release files / benethos_mailbox_client-0.4.1.tar.gz

Download URL benethos_mailbox_client-0.4.1.tar.gz
Size 45.0 kB
Tags Source
SHA-256 checksum
How to use checksums
a29d3ec8c4bfb4e128a275311af4cc5ec4bd5ddf67b86f6df2ea0d0834eec5f7
BLAKE2b-256 checksum
How to use checksums
196c49dd7a9c3e79b1a4781ded9742ef2565b7fa9b61be9fc097377e188f2805
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / benethos_mailbox_client-0.4.1-py3-none-any.whl

Download URL benethos_mailbox_client-0.4.1-py3-none-any.whl
Size 49.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
57e7901e61b4d3097bce9cd34c1eb2b47c570da972100ee5ffc0db772ba9e372
BLAKE2b-256 checksum
How to use checksums
f63d88c56f0679603db7dddb0b656f05d2ce47f37bb2ef3702856ebb8663a34e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.13.0 {"installer":{"name":"uv","version":"0.13.0","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

This release

0.4.1 This release

2 release files

0.4.0

2 release files

0.3.1

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page