Skip to main content

Python SDK for the zaSend transactional email API and SMTP service

Project description

zasend

License: MIT Python

Official Python client for the zaSend transactional email API.

zaSend is a developer-focused email delivery service for sending product, auth, billing, notification, and lifecycle emails from your application. This package is a small wrapper around the zaSend REST API for Python apps, Django, Flask, FastAPI, background jobs, and scripts.

Use it to:

  • Send transactional email from verified domains
  • Send template-based email with variables
  • Check message status and events
  • Manage suppressions, webhooks, templates, and domains
  • Verify zaSend webhook signatures

The client stays close to the raw API. It has no heavy framework dependencies and uses requests.

Install

pip install zasend

Quick Start

from zasend import ZaSend

client = ZaSend(api_key="sk_live_...")

result = client.send_email(
    from_email="zaSend <noreply@zasend.com>",
    to="user@example.com",
    subject="Welcome",
    text="Thanks for signing up.",
)

print(result["message_id"])

You can use an Account API Key (sk_live_...) for all methods. A Domain Sending Key (dsk_live_...) is restricted to sending email from one verified domain.

Send HTML Email

client.send_email(
    from_email="Acme <noreply@acme.com>",
    to="customer@example.com",
    subject="Your receipt",
    html="<h1>Thanks for your order</h1><p>Your receipt is attached.</p>",
    text="Thanks for your order. Your receipt is attached.",
)

Send to Multiple Recipients

client.send_email(
    from_email="Acme <noreply@acme.com>",
    to=["one@example.com", "two@example.com"],
    subject="Product update",
    text="A new update is available.",
)

zaSend returns one queued message per to recipient. Suppressed recipients reject the whole request so you can fix the list before sending.

Template Send

client.send_template_email(
    from_email="Acme <noreply@acme.com>",
    to="customer@example.com",
    template="welcome",
    variables={"name": "Ada"},
)

Django Example

# settings.py
ZASEND_API_KEY = "sk_live_..."

# anywhere in your app
from django.conf import settings
from zasend import ZaSend

zasend = ZaSend(settings.ZASEND_API_KEY)
zasend.send_email(
    from_email="Acme <noreply@acme.com>",
    to=user.email,
    subject="Reset your password",
    text="Use this link to reset your password.",
)

Flask or FastAPI Example

import os
from zasend import ZaSend

zasend = ZaSend(os.environ["ZASEND_API_KEY"])

def send_signup_email(email):
    return zasend.send_template_email(
        from_email="Acme <noreply@acme.com>",
        to=email,
        template="welcome",
        variables={"product": "Acme"},
    )

Webhook Verification

zaSend signs webhook payloads with HMAC-SHA256. Verify the raw request body before trusting webhook data.

from zasend import verify_webhook_signature

ok = verify_webhook_signature(
    request.get_data(),
    "whsec_...",
    request.headers.get("X-zaSend-Signature"),
)

API Methods

Method Description
send_email(**message) Send direct content or a template email
send_template_email(...) Convenience wrapper for template sends
get_email(message_id) Fetch email status and events
get_rate_limits() Fetch daily usage and limits
list_domains() / add_domain(domain) / verify_domain(id) / delete_domain(id) Manage sending domains
list_suppressions(...) / add_suppression(email, ...) / delete_suppression(id) Manage suppression list entries
list_webhooks() / create_webhook(url, events) / delete_webhook(id) Manage signed delivery webhooks
list_templates() / create_template(...) / get_template(id) / update_template(id, ...) / delete_template(id) Manage email templates

Error Handling

from zasend import APIError, RateLimitError, ValidationError, ZaSend

try:
    ZaSend("sk_live_...").send_email(
        from_email="Acme <noreply@acme.com>",
        to="user@example.com",
        subject="Hello",
        text="Body",
    )
except RateLimitError as exc:
    print("Rate limited:", exc)
except ValidationError as exc:
    print("Invalid request:", exc)
except APIError as exc:
    print("zaSend API error:", exc)

Links

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

zasend-0.1.2.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

zasend-0.1.2-py3-none-any.whl (6.1 kB view details)

Uploaded Python 3

File details

Details for the file zasend-0.1.2.tar.gz.

File metadata

  • Download URL: zasend-0.1.2.tar.gz
  • Upload date:
  • Size: 8.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for zasend-0.1.2.tar.gz
Algorithm Hash digest
SHA256 baae447c60c7b57da1f563088ec98fa8fa1ef49f16c4cdd46c86d5d44bda7a7e
MD5 14a3482c742b3a46c84623a9f877514b
BLAKE2b-256 10b67e3d8091bdde341c8835ef0ff8d8bad629eb5352802c163e93827ede703d

See more details on using hashes here.

File details

Details for the file zasend-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: zasend-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 6.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for zasend-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8814fc0565433d5832fc60592f0de567816fb73dbb40b9ac4030a4e70c5c288e
MD5 5a512486e4362c6f15ce707fab815083
BLAKE2b-256 dd112edb58a42e8667a2ccd1e52f60a977c73afc67902fb933741b865a6f7dc1

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page