Mailtea Python SDK — send, schedule, and manage email from your app or AI agent.
Project description
mailtea (Python)
The official Python SDK for Mailtea — a thin, zero-dependency wrapper over the REST API. Python 3.9+.
Install
pip install mailtea
Usage
import os
from mailtea import Mailtea
mailtea = Mailtea(os.environ["MAILTEA_API_KEY"])
sent = mailtea.emails.send(
from_="you@yourdomain.com",
to="recipient@example.com",
subject="Hello from Mailtea",
html="<p>Your first email, sent with <strong>Mailtea</strong>.</p>",
)
print(sent.id)
email = mailtea.emails.get(sent.id)
print(email.status)
The API key can be passed to Mailtea(api_key) or read from MAILTEA_API_KEY.
Self-hosting or local dev? pass base_url= or set MAILTEA_API_BASE_URL.
Every method equally accepts a single wire-format dict — handy when you already hold the JSON payload:
sent = mailtea.emails.send({
"from": "you@yourdomain.com",
"to": "recipient@example.com",
"subject": "Hello from Mailtea",
"html": "<p>Your first email, sent with <strong>Mailtea</strong>.</p>",
})
print(sent["id"]) # responses support ["..."] and attribute access alike
Keyword arguments use snake_case wire names; a trailing underscore escapes
Python reserved words (from_= → "from").
API
| Method | Description |
|---|---|
emails.send(params) |
Send a transactional email → {"id": ...} |
emails.batch(emails) |
Send up to 100 emails → {"data": [{"id": ...}]} |
emails.get(id) |
Retrieve an email and its delivery status |
emails.list(params=None) |
List emails → {"data", "total", "limit", "offset", "has_more"} |
emails.update(id, params) |
Reschedule a scheduled email |
emails.reschedule(id, scheduled_at) |
Convenience wrapper over update |
emails.cancel(id) |
Cancel a scheduled email |
emails.analytics(params=None) |
Aggregate transactional metrics over an optional date window |
emails.inbound.list(params=None) |
List received emails in a publication (cursor-paginated) |
emails.inbound.get(id) |
Retrieve a received email with body, headers, and attachments |
emails.inbound.reply(id, params=None) |
Reply to a received email (threads by construction) |
emails.inbound.attachments.list(id) |
List a received email's attachments (signed download URLs) |
emails.inbound.attachments.get(id, attachment_id) |
Retrieve one inbound attachment |
contacts.create / upsert / list / get / update / delete |
Manage audience contacts (upsert = create; the endpoint upserts) |
posts.create(...) |
Create a newsletter post (draft, or send=True) → {"id": ...} |
posts.send(id, scheduled_at=None) |
Send a draft post to the audience, now or scheduled |
posts.send_test(id, params) |
Send a [TEST] copy of a post → {"sent_to", "failed_to"} |
posts.list(params) |
List posts (offset-paginated) → {"data", "total"} |
posts.get(id, params=None) |
Retrieve a post by id |
posts.update(id, params) |
Update a draft post (subject, html, text, from, reply_to, name) |
posts.delete(id, params=None) |
Delete a draft post |
segments.create / list / get / update / delete |
Manage audience segments |
tags.create / list / get / update / delete |
Manage tag definitions (visibility="public" → reader-facing topic) |
senders.create / list / get / update / delete |
Manage named From identities (email immutable) |
templates.create / list / get / update / publish / duplicate / delete |
Manage reusable email templates |
templates.render(params) |
Render a spec to HTML without saving → {"html", "text"} |
suppressions.list / add / remove |
Manage the team-wide do-not-send list |
suppressions.export() |
Export the whole suppression list as CSV (raw text) |
domains.create / list / get / verify / update / delete |
Manage sending domains (add, read DNS records, verify) |
domains.tracking.create / list / verify / delete |
Manage CNAME tracking sub-domains under a domain |
webhooks.create / list / get / update / delete |
Manage outbound event subscriptions |
contact_properties.create / list / update / delete |
Manage custom contact fields (team-scoped) |
api_keys.create / list / revoke |
Manage API keys (settings:write) |
Payloads follow the REST wire format (reply_to, scheduled_at, …), passed as
keyword arguments or a plain dict. Errors raise MailteaError with status,
details, and request_id.
emails.send also accepts tags, custom headers, attachments, and
scheduled_at. Attachments carry base64 content; set a content_id (plus
content_type) to embed an inline image referenced by cid: in the HTML:
mailtea.emails.send(
from_="you@yourdomain.com",
to="recipient@example.com",
subject="Your receipt",
html='<p>Thanks!</p><img src="cid:logo" />',
tags=[{"name": "category", "value": "receipt"}],
attachments=[
{"filename": "receipt.pdf", "content": pdf_base64},
{"filename": "logo.png", "content": logo_base64,
"content_type": "image/png", "content_id": "logo"}, # inline
],
)
Verifying webhooks
Mailtea signs every outbound webhook with Standard Webhooks.
verify_webhook_signature checks the signature and rejects replays. Pass the
raw request body (not re-serialized JSON) and the endpoint's whsec_…
signing secret:
from mailtea import verify_webhook_signature
ok = verify_webhook_signature(
secret=signing_secret, # whsec_… from webhooks.create
msg_id=request.headers["webhook-id"],
timestamp=request.headers["webhook-timestamp"],
payload=raw_body, # exact bytes/string received
signature_header=request.headers["webhook-signature"],
)
if not ok:
return 401
sign_webhook(secret, msg_id, timestamp, payload) produces the same header, handy
for faking deliveries in tests. Both are stdlib-only.
Develop
cd sdks/python
python3 -m unittest discover -s tests -t .
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mailtea-0.3.0.tar.gz.
File metadata
- Download URL: mailtea-0.3.0.tar.gz
- Upload date:
- Size: 21.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
378d047e4534dfc510349e1e77057ba52f36b4393670557668f4ba8ee85cf7e0
|
|
| MD5 |
904beee86c16b09f45962c19373899c9
|
|
| BLAKE2b-256 |
c57a8131ffd40f0b15c364f9e9f5a5ff0d89e20c613f5173c17832566474fc8f
|
Provenance
The following attestation bundles were made for mailtea-0.3.0.tar.gz:
Publisher:
publish-pypi.yml on mailtea-app/mailtea
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mailtea-0.3.0.tar.gz -
Subject digest:
378d047e4534dfc510349e1e77057ba52f36b4393670557668f4ba8ee85cf7e0 - Sigstore transparency entry: 2211817433
- Sigstore integration time:
-
Permalink:
mailtea-app/mailtea@29193a71b71c55702f7de05cec7bf7d56df599d4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mailtea-app
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@29193a71b71c55702f7de05cec7bf7d56df599d4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mailtea-0.3.0-py3-none-any.whl.
File metadata
- Download URL: mailtea-0.3.0-py3-none-any.whl
- Upload date:
- Size: 24.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f6b42051a9b8e3beae52310552e582fe474c60e300580d1bdb20a6c5db2f306f
|
|
| MD5 |
5be8a2fe97924c4b4480e95895d1dd82
|
|
| BLAKE2b-256 |
6ab2217a31ed542272a615b17088f8f3f542c4464d391a11496d3183dec343d4
|
Provenance
The following attestation bundles were made for mailtea-0.3.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on mailtea-app/mailtea
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mailtea-0.3.0-py3-none-any.whl -
Subject digest:
f6b42051a9b8e3beae52310552e582fe474c60e300580d1bdb20a6c5db2f306f - Sigstore transparency entry: 2211817463
- Sigstore integration time:
-
Permalink:
mailtea-app/mailtea@29193a71b71c55702f7de05cec7bf7d56df599d4 -
Branch / Tag:
refs/heads/main - Owner: https://github.com/mailtea-app
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@29193a71b71c55702f7de05cec7bf7d56df599d4 -
Trigger Event:
push
-
Statement type: