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-corev1
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.mxmailbox and gets ansmx_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 |
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 |
Related
- Quickstart
- Mailboxes
- All Sendmux SDKs
- Pricing — usage-based, no per-seat or per-mailbox fees
Licence
MIT. See the licence file.
Release files for langchain-sendmux 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| langchain_sendmux-0.3.0.tar.gz | 5.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| langchain_sendmux-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 11.8 kB
Release files / langchain_sendmux-0.3.0.tar.gz
| Download URL | langchain_sendmux-0.3.0.tar.gz |
|---|---|
| Size | 5.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
23ce441083d2288e47e33d7ab0859b471f94fade231c93cfc51b5eeda11811a5
|
|
BLAKE2b-256 checksum How to use checksums |
edbd7b792775fbef116b26d6a004ebb84bf77237ae0e2baca54ba8947b77a0cf
|
| 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 10, 2026.
Transparency logRelease files / langchain_sendmux-0.3.0-py3-none-any.whl
| Download URL | langchain_sendmux-0.3.0-py3-none-any.whl |
|---|---|
| Size | 6.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8ce1181ac1635684c9194fe07cb91e438c37f82aff9fde3aebdd3558ceca9dd1
|
|
BLAKE2b-256 checksum How to use checksums |
e54dc657d2ac01e32122b73ec2aa7694edd4b4af4abd344956985e62ef006d63
|
| 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 10, 2026.
Transparency log