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

Download files

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

Source Distribution

multimail-0.1.1.tar.gz (54.5 kB view details)

Uploaded Source

Built Distribution

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

multimail-0.1.1-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file multimail-0.1.1.tar.gz.

File metadata

  • Download URL: multimail-0.1.1.tar.gz
  • Upload date:
  • Size: 54.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.13

File hashes

Hashes for multimail-0.1.1.tar.gz
Algorithm Hash digest
SHA256 40786cbabfa065962da5d6b5985c752726d0bf556551007c91d6c18b709fa06b
MD5 290738b8b35d56adb21f140d46a707e2
BLAKE2b-256 3504c83f221b112795304a99c3206ccd20c3024e0a25d2df2797b09ac73620d5

See more details on using hashes here.

File details

Details for the file multimail-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: multimail-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 7.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.13

File hashes

Hashes for multimail-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e793e182fb438543fad7ed68ddc4c0ea7cac18d8acd22f01ba4ef98dae59ef67
MD5 f4ca1020cc461d0c968e766fa9388217
BLAKE2b-256 994ad9d426d8d1e7e247e9989307cba5302f4cb360c055544cd70ff0c74ae070

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