Official Python SDK for MailFlat — disposable, automation-friendly email inboxes with one-line OTP retrieval.
Project description
MailFlat — Python SDK
Official Python client for MailFlat: disposable, automation-friendly email inboxes with one-line OTP retrieval. Spin up a real inbox, read the verification code your app just sent, and move on — no flaky polling, no shared mailbox state.
pip install mailflat
Quickstart
from mailflat import MailFlat
mf = MailFlat(api_key="mf_live_...") # or set MAILFLAT_API_KEY
# 1 · spin up a disposable inbox
inbox = mf.create(label="signup-test")
print(inbox.address) # → signup-test-8f3@x7k2m.mailflat.net
# 2 · your app/browser submits the form using inbox.address ...
# 3 · grab the OTP (polls until it arrives or times out)
otp = inbox.wait_for_otp(timeout=30)
print(otp) # → "123456"
# inbox auto-clears in 2h — no cleanup needed (or call inbox.delete())
For AI agents
Hand an agent one API key and it spins up real inboxes on demand:
mf = MailFlat() # reads MAILFLAT_API_KEY
inbox = mf.create(label="deep-research")
browser.fill("#email", inbox.address)
browser.click("Sign up")
otp = inbox.wait_for_otp(timeout=30)
browser.fill("#code", otp)
API
MailFlat(api_key=None, *, base_url="https://mailflat.net", timeout=30.0, max_retries=2)
Client. api_key falls back to the MAILFLAT_API_KEY environment variable. Use base_url
for self-hosted / BYOD deployments. Supports use as a context manager (with MailFlat() as mf:).
create(*, prefix=None, label=None, subdomain=None, domain=None, retention_hours=None) -> Inbox— open a new inbox.create_inbox(...)is an alias.list() -> list[Inbox]— inboxes opened with this key.inbox(address) -> Inbox— attach to an existing address without a network call.
Inbox
.address— the email address..messages() -> list[Message]— all messages, newest first..latest() -> Message | None— most recent message..wait_for_otp(*, timeout=30, poll_interval=1.0) -> str— poll until an OTP arrives; returns the code..wait_for_message(*, timeout=30, poll_interval=1.0) -> Message— poll until any message arrives..send(to, *, subject="", body="", html=None) -> dict— send a DKIM-signed email from this inbox..delete() -> dict— delete the inbox and all its messages.
Message
.otp, .subject, .sender, .text, .html, .to_address, .direction, .received_at, .raw.
Errors
All errors subclass MailFlatError: AuthenticationError (401), PermissionError (403),
NotFoundError (404), RateLimitError (429), APIError (other), OTPTimeoutError
(no OTP before timeout), EncryptedInboxError (the inbox is end-to-end encrypted, so the
server cannot read its contents — use a non-encrypted inbox for agent automation).
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mailflat-0.2.0.tar.gz.
File metadata
- Download URL: mailflat-0.2.0.tar.gz
- Upload date:
- Size: 9.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a4bb74fd39c2d4b5381703ef9008ad8418162a557688c254988a51031cf3ef0f
|
|
| MD5 |
f2de36f9752b1201d9ecb6435c3ace7f
|
|
| BLAKE2b-256 |
f3bd49d58c7c767f22dd77bd0f10fa0f26bf532840364c27b64e9406feb7e57a
|
File details
Details for the file mailflat-0.2.0-py3-none-any.whl.
File metadata
- Download URL: mailflat-0.2.0-py3-none-any.whl
- Upload date:
- Size: 11.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a17effe41d49ee160f14d0914e5c87ffd309f8075de96380f8644a8f8b1e4cd
|
|
| MD5 |
74ae7b292498e6ff077f50cfa37c2166
|
|
| BLAKE2b-256 |
b091499d3e70ad0d22d431198b24e1d9d1f8dfe77a86a76848e93c2c9c582541
|