Official Python SDK for FreeCustom.Email — disposable inboxes, OTP extraction, real-time WebSocket delivery
Project description
freecustom-email Python SDK
Official Python SDK for FreeCustom.Email — the ultimate API for disposable inboxes, automated OTP extraction, and real-time email delivery via WebSockets.
🚀 Features
- Disposable Inboxes: Instantly register and manage temporary email addresses.
- Automated OTP Extraction: Automatically extract verification codes from incoming emails.
- Real-time Delivery: Receive emails instantly via high-performance WebSockets.
- Async & Sync Support: Native
asynciosupport with an optional synchronous interface. - Custom Domains: Manage and verify your own custom domains for personalized temporary mail.
- Webhooks: Programmatically manage HTTP webhooks for email notifications.
- Type-Safe: Full typing support for a better developer experience.
📦 Installation
pip install freecustom-email
🛠 Quick Start
1. Initialize the Client
Get your API key from the FreeCustom.Email Dashboard.
from freecustom_email import FreeCustomEmail
client = FreeCustomEmail(api_key="fce_your_api_key")
2. Async Usage (Recommended)
import asyncio
from freecustom_email import FreeCustomEmail
async def main():
client = FreeCustomEmail(api_key="fce_...")
# Register an inbox (pass is_testing=True for zero-latency testing, Growth plan+)
await client.inboxes.register("test@ditube.info", is_testing=True)
print("Inbox registered!")
# Wait for an OTP (Growth plan+)
print("Waiting for OTP...")
otp = await client.otp.wait_for("test@ditube.info", timeout_ms=60_000)
print(f"Your OTP is: {otp}")
# List recent messages
messages = await client.messages.list("test@ditube.info")
for msg in messages:
print(f"Subject: {msg.subject} | From: {msg.from_}")
if __name__ == "__main__":
asyncio.run(main())
3. Sync Usage
from freecustom_email import FreeCustomEmail
client = FreeCustomEmail(api_key="fce_...", sync=True)
# Register and wait (pass is_testing=True for zero-latency testing)
client.inboxes.register("sync-test@ditube.info", is_testing=True)
otp = client.otp.wait_for("sync-test@ditube.info")
print(f"OTP received: {otp}")
⚡️ Real-time WebSockets
Connect to our WebSocket server to receive emails instantly as they arrive.
import asyncio
from freecustom_email import FreeCustomEmail
async def main():
client = FreeCustomEmail(api_key="fce_...")
# Subscribe to a specific mailbox or all emails on your plan
ws = client.realtime(mailbox="test@ditube.info")
@ws.on("connected")
async def on_connect(info):
print(f"Connected! Subscribed inboxes: {info.subscribed_inboxes}")
@ws.on("email")
async def on_email(email):
print(f"New Email! Subject: {email.subject}")
if email.otp:
print(f"Extracted OTP: {email.otp}")
@ws.on("error")
async def on_error(event):
print(f"WS Error: {event.message}")
await ws.connect()
await ws.wait() # Block and keep listening
asyncio.run(main())
🧩 Advanced Features
Automated Verification Flow
The get_otp_for_inbox helper handles the entire lifecycle: register → trigger → wait → unregister.
async def trigger_signup():
# Your code to click "Send OTP" on a website
pass
otp = await client.get_otp_for_inbox(
inbox="verify@ditube.info",
trigger_fn=trigger_signup,
timeout_ms=30_000
)
Custom Domains
Manage your own domains directly through the SDK.
# Add a new custom domain
result = await client.domains.add("my-temp-mail.com")
# Check verification status
status = await client.domains.verify("my-temp-mail.com")
if status.verified:
print("Domain is ready to use!")
🛡 Error Handling
The SDK provides typed exceptions for precise error management.
from freecustom.errors import AuthError, PlanError, RateLimitError, WaitTimeoutError
try:
await client.inboxes.register("test@invalid")
except AuthError:
print("Invalid API key.")
except PlanError as e:
print(f"Plan limit reached. Upgrade at: {e.upgrade_url}")
except WaitTimeoutError:
print("No email arrived within the timeout period.")
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
🔗 Links
Observability & Debugging
# Fetch the event timeline for an inbox
timeline = client.inboxes.get_timeline('test@domain.com')
print(timeline)
# Fetch failure insights and warnings
insights = client.inboxes.get_insights('test@domain.com')
print(insights)
Project details
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 freecustom_email-1.0.3.tar.gz.
File metadata
- Download URL: freecustom_email-1.0.3.tar.gz
- Upload date:
- Size: 14.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6f7a9a4fc00ae44ede072a36669ba76f54d23d49302f6d9836418eb5500ca75
|
|
| MD5 |
1f40dec300050c8e196506b47d77a2ed
|
|
| BLAKE2b-256 |
7ea4f8b91dc07562e6b514826dff4b91eb0a38b44fa36ab72e56e48e0d58c016
|
File details
Details for the file freecustom_email-1.0.3-py3-none-any.whl.
File metadata
- Download URL: freecustom_email-1.0.3-py3-none-any.whl
- Upload date:
- Size: 20.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d15482cc1b245d3f68f6f15e9a5188c258eca471b4282afeb0e26c71313936c5
|
|
| MD5 |
ded1d45b30dbcf7170847c9474d6a0f1
|
|
| BLAKE2b-256 |
b0e3d8b12d95475c707521b57eda19ec92a4e9bf3d31e6a6bbe79868d1820aba
|