Skip to main content

langchain-sendmux

LangChain toolkit for Sendmux, the email API for AI agents.

Gives an agent its own mailbox: it can send email, read what arrives, and reply from its own address.

Requirements

  • Python 3.10 or newer
  • langchain-core v1

Installation

pip install langchain-sendmux

Getting an API key

For API-key authentication, use a key that can both send and receive. Two ways to get one:

  • Dashboard — create a mailbox and a mailbox-scoped key (smx_mbx_*). See API keys.
  • Agent self-registration — the agent claims its own @myagent.mx mailbox and gets an smx_agent_* token, with no human signup first. See email for AI agents.

Note on agent tokens: a freshly self-registered smx_agent_* token can read and receive, but cannot send until a human owner has been invited and has approved it. Until then send_email and reply will fail. A dashboard smx_mbx_* key with send permission works immediately.

Read the key from the environment. Never hard-code it.

OAuth access tokens

Set access_token to a bare REST OAuth token or callable instead of api_key:

import os
from langchain_sendmux import SendmuxToolkit

toolkit = SendmuxToolkit(
    access_token=lambda: os.environ["SENDMUX_ACCESS_TOKEN"],
    default_from="agent@yourdomain.dev",
)
tools = toolkit.get_tools()

The provider runs before every tool request. Your application owns protected token storage, expiry checks, and refresh coordination. Request mailbox.read and email.send to use all three tools, and select one mailbox at consent; these tools do not supply a mailbox selector. Credentials are excluded from the toolkit's representation and model serialisation. See REST OAuth.

Quick start

import os

from langchain.agents import create_agent

from langchain_sendmux import SendmuxToolkit

smx = SendmuxToolkit(
    api_key=os.environ["SENDMUX_API_KEY"],
    default_from="agent@yourdomain.dev",
)

agent = create_agent(
    model="gpt-4o",
    tools=smx.get_tools(),
    system_prompt="You triage the support inbox.",
)

agent.invoke(
    {"messages": [{"role": "user", "content": "Reply to anyone asking about pricing."}]}
)

Tools

SendmuxToolkit(...).get_tools() returns three tools.

send_email

Sends through your configured sending providers, to any recipient.

Parameter Type Required Notes
to str yes Recipient email address
subject str yes Subject line
text str yes Plain-text body
html str no HTML body. Generated from text if omitted
var_from str no Sender address. Falls back to default_from
idempotency_key str no Makes a retried send idempotent for 24 hours
delivery_group str or list[str] no One delivery group ID, or a list of IDs, that narrows the eligible provider pool for this send. Omit to keep the default routing

var_from is spelt that way because from is a reserved word in Python.

list_messages

Lists messages in the agent's own mailbox, newest first.

Parameter Type Required Notes
limit int no How many to return, 1 to 100. Defaults to 25

reply

Sends from the agent's own mailbox address, rather than through a sending provider. Use this to answer someone who wrote in.

Parameter Type Required Notes
to str yes Recipient email address
subject str yes Subject line
text str yes Plain-text body
html str no HTML body. Generated from text if omitted
idempotency_key str no Makes a retried send idempotent for 24 hours

Configuration

SendmuxToolkit(api_key=..., default_from=...)
Option Required Purpose
api_key Required unless access_token is set A send + receive mailbox key (smx_mbx_*) or a scoped agent token (smx_agent_*)
access_token Required unless api_key is set A bare REST OAuth token or callable returning the current token; supply exactly one credential option
default_from no Default sender for send_email. Without it, the model has to supply var_from on every call

Retries and duplicate sends

Agents retry. Pass idempotency_key on send_email and reply and Sendmux will send once, even if the same call arrives several times inside 24 hours. Any stable string works — a task id, a thread id, a hash of the message.

Details: idempotency.

Common errors

What you see Why Fix
ValueError: No sender address No var_from on the call and no default_from set Set default_from, or have the model pass var_from
Send rejected on an agent token The token is self-registered and not yet owner-approved Complete the owner invite and approval
Auth failure Key lacks send or receive permission Check the key's scope in the dashboard

Licence

MIT. See the licence file.

Release files for langchain-sendmux 0.4.0

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

Source distribution (sdist)

Source distribution for langchain-sendmux 0.4.0
File Size Uploaded
langchain_sendmux-0.4.0.tar.gz 5.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for langchain-sendmux 0.4.0
File Interpreter ABI Platform
langchain_sendmux-0.4.0-py3-none-any.whl Python 3 none any Details

Total release size: 12.4 kB

Release files / langchain_sendmux-0.4.0.tar.gz

Download URL langchain_sendmux-0.4.0.tar.gz
Size 5.7 kB
Tags Source
SHA-256 checksum
How to use checksums
2c02672d4d0ea2ca5fc87e69ead9001d36c5e2efc2ac1c94e9017d7caa1453c7
BLAKE2b-256 checksum
How to use checksums
17fd08d38f4f0e542ac3846ec00b2e55845634012ed144f9f9d59976c98a6e8a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release files / langchain_sendmux-0.4.0-py3-none-any.whl

Download URL langchain_sendmux-0.4.0-py3-none-any.whl
Size 6.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
49d0f17f53888341a0ccecb9f16f0586340242ca32b6f295f70a27707f0b098d
BLAKE2b-256 checksum
How to use checksums
8ad0f2e549f5f40601f4d52b0150f3e9d7b63f223b89e0ff6c57c86087e82288
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.13

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 19, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.4.0 This release

2 release files

0.3.0

2 release files

0.2.1

2 release files

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