Skip to main content

multimail

⚠️ DEPRECATED (2026-08-08). This package is retired and will receive no further updates. MultiMail's supported integration surfaces are the MCP server at https://mcp.multimail.dev (LangChain, CrewAI, LlamaIndex, Claude, and all MCP-capable frameworks connect natively) and the REST API (https://multimail.dev/docs). This final release only adds this deprecation notice.

Python SDK for the MultiMail API — email infrastructure for AI agents.

Installation

pip install multimail

Quick Start

from multimail import MultiMail

mm = MultiMail("mm_live_your_api_key")

# List mailboxes
mailboxes = mm.list_mailboxes()
mailbox_id = mailboxes[0]["id"]

# Send an email
result = mm.send_email(
    mailbox_id,
    to=["recipient@example.com"],
    subject="Hello from my agent",
    markdown="This email was sent by an AI agent using **MultiMail**.",
)
print(result)  # {"id": "...", "status": "pending_scan", "thread_id": "..."}

# Check inbox
emails = mm.list_emails(mailbox_id, direction="inbound")

# Read a specific email
email = mm.get_email(mailbox_id, emails["emails"][0]["id"])
print(email["subject"], email["text_body"])

Async Support

from multimail import AsyncMultiMail

async with AsyncMultiMail("mm_live_your_api_key") as mm:
    mailboxes = await mm.list_mailboxes()
    result = await mm.send_email(
        mailboxes[0]["id"],
        to=["recipient@example.com"],
        subject="Async email",
        markdown="Sent asynchronously!",
    )

Oversight & Approval

MultiMail supports graduated oversight modes. When a mailbox uses gated_send, emails require human approval:

# List emails waiting for approval
pending = mm.list_pending()

# Approve or reject
mm.decide(pending[0]["id"], "approve")
mm.decide(pending[1]["id"], "reject", reason="Not relevant")

All Methods

Account

  • get_account() / update_account(**fields) / delete_account()

Mailboxes

  • list_mailboxes() / create_mailbox(address, display_name, oversight_mode=...) / update_mailbox(id, **fields) / delete_mailbox(id)

Emails

  • list_emails(mailbox_id) / get_email(mailbox_id, email_id) / send_email(mailbox_id, to=, subject=, markdown=) / reply_email(mailbox_id, email_id, markdown=) / cancel_email(mailbox_id, email_id) / get_thread(mailbox_id, thread_id) / download_attachment(mailbox_id, email_id, filename)

Tags

  • get_tags(mailbox_id, email_id) / set_tags(mailbox_id, email_id, tags) / delete_tag(mailbox_id, email_id, key)

Contacts

  • list_contacts(q=) / add_contact(email, name=) / delete_contact(contact_id)

Oversight

  • list_pending() / decide(email_id, action, reason=)

API Keys

  • list_api_keys() / create_api_key(name, scopes=) / revoke_api_key(key_id)

Webhooks

  • list_webhooks() / create_webhook(url, events, secret=) / delete_webhook(webhook_id)

Domains

  • list_domains() / add_domain(domain) / verify_domain(domain_id) / delete_domain(domain_id)

Suppression

  • list_suppressions() / remove_suppression(address)

Usage & Audit

  • get_usage() / get_audit_log(limit=)

Error Handling

from multimail import MultiMail, AuthenticationError, RateLimitError

mm = MultiMail("mm_live_your_api_key")
try:
    mm.send_email(mailbox_id, to=["test@example.com"], subject="Hi", markdown="Hello")
except AuthenticationError:
    print("Invalid API key")
except RateLimitError as e:
    print(f"Rate limited, retry after {e.retry_after}s")

Links

Release files for multimail 0.1.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 multimail 0.1.1
File Size Uploaded
multimail-0.1.1.tar.gz 54.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for multimail 0.1.1
File Interpreter ABI Platform
multimail-0.1.1-py3-none-any.whl Python 3 none any Details

Total release size: 62.0 kB

Release files / multimail-0.1.1.tar.gz

Download URL multimail-0.1.1.tar.gz
Size 54.5 kB
Tags Source
SHA-256 checksum
How to use checksums
40786cbabfa065962da5d6b5985c752726d0bf556551007c91d6c18b709fa06b
BLAKE2b-256 checksum
How to use checksums
3504c83f221b112795304a99c3206ccd20c3024e0a25d2df2797b09ac73620d5
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / multimail-0.1.1-py3-none-any.whl

Download URL multimail-0.1.1-py3-none-any.whl
Size 7.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e793e182fb438543fad7ed68ddc4c0ea7cac18d8acd22f01ba4ef98dae59ef67
BLAKE2b-256 checksum
How to use checksums
994ad9d426d8d1e7e247e9989307cba5302f4cb360c055544cd70ff0c74ae070
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files

0.1.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