📧 mailer-sdk
A simple, production-ready Python SDK for sending emails via SMTP. Zero dependencies. Gmail, Outlook, and Yahoo supported out of the box.
Installation
pip install mailer-sdk
Quick Start
from mailer_sdk import Mailer
with Mailer(email="you@gmail.com", password="your-app-password") as mailer:
mailer.send(
to = "friend@example.com",
subject = "Hello!",
body = "Hey, this was sent using mailer-sdk!"
)
Environment Variables (Recommended)
Instead of hardcoding credentials, use environment variables:
export MAILER_EMAIL=you@gmail.com
export MAILER_PASSWORD=your-app-password
export MAILER_PROVIDER=gmail # optional, default is gmail
from mailer_sdk import Mailer
with Mailer() as mailer: # reads from env automatically
mailer.send(to="friend@example.com", subject="Hi", body="Hello!")
Features
| Method | Description |
|---|---|
send() |
Send plain text or HTML email |
send_html() |
Shortcut for HTML emails |
send_bulk() |
Send individually to multiple recipients |
send_template() |
Send HTML with {{placeholder}} fill-in |
send_with_retry() |
Auto-retry with exponential backoff |
Usage Examples
Plain Text
mailer.send(
to = "friend@example.com",
subject = "Hello!",
body = "Plain text email."
)
HTML Email
mailer.send_html(
to = "friend@example.com",
subject = "Welcome!",
body = "<h1>Hello!</h1><p>This is an <b>HTML</b> email.</p>"
)
With CC, BCC, and Attachment
mailer.send(
to = "friend@example.com",
subject = "Report",
body = "Please find the report attached.",
cc = ["manager@example.com"],
bcc = ["archive@example.com"],
attachments = ["report.pdf"]
)
Bulk Send
result = mailer.send_bulk(
recipients = ["a@example.com", "b@example.com", "c@example.com"],
subject = "Newsletter",
body = "Hello, here is this month's update!"
)
print(f"Sent {result['sent']}/{result['total']}")
Template Email
mailer.send_template(
to = "customer@example.com",
subject = "Order Confirmed",
template = "<h2>Hi {{name}}!</h2><p>Order <b>#{{order_id}}</b> confirmed. Total: ${{total}}</p>",
context = {"name": "Alice", "order_id": "1042", "total": "59.99"}
)
Retry on Failure
mailer.send_with_retry(
to = "friend@example.com",
subject = "Important",
body = "Please read this.",
max_retries = 3, # default
backoff = 1 # 1s → 2s → 4s
)
Supported Providers
| Provider | Value |
|---|---|
| Gmail | "gmail" |
| Outlook | "outlook" |
| Yahoo | "yahoo" |
# Outlook example
mailer = Mailer(email="you@outlook.com", password="pass", provider="outlook")
Gmail App Password Setup
Gmail requires an App Password (not your real password):
1. Go to → myaccount.google.com
2. Security → 2-Step Verification (enable it)
3. Security → App Passwords → Generate
4. Copy the 16-character password
5. Use it as your password above
Error Handling
from mailer_sdk import Mailer, AuthError, SendError, ConnectError, ValidationError
try:
with Mailer(email="you@gmail.com", password="wrong-pass") as mailer:
mailer.send(to="friend@example.com", subject="Hi", body="Hello!")
except AuthError as e:
print(f"Auth failed [{e.code}]: {e.message}") # bad credentials
except ConnectError as e:
print(f"Can't connect [{e.code}]: {e.message}") # server unreachable
except SendError as e:
print(f"Send failed [{e.code}]: {e.message}") # delivery failed
except ValidationError as e:
print(f"Bad input [{e.code}]: {e.message}") # invalid inputs
Logging
Control SDK verbosity using Python's standard logging:
import logging
# See all SDK activity
logging.getLogger("mailer_sdk").setLevel(logging.DEBUG)
# Quiet mode — only errors
logging.getLogger("mailer_sdk").setLevel(logging.ERROR)
License
DT © Rishabh
Release files for mailer-sdk 1.0.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| mailer_sdk-1.0.9.tar.gz | 9.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| mailer_sdk-1.0.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.0 kB
Release files / mailer_sdk-1.0.9.tar.gz
| Download URL | mailer_sdk-1.0.9.tar.gz |
|---|---|
| Size | 9.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9878681f3273e3d40b4a0e4a6f2e54dd05a578458875652beb43e53043f5f514
|
|
BLAKE2b-256 checksum How to use checksums |
7e0f3154b00c2d0227d19d2fb11ae96c91f0c926eb7454bf16527873ab605ec0
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Feb 20, 2026.
Transparency logRelease files / mailer_sdk-1.0.9-py3-none-any.whl
| Download URL | mailer_sdk-1.0.9-py3-none-any.whl |
|---|---|
| Size | 8.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
3c6ab92527b6e53b0d3caa3e0af714094bb3b5a62d887dfd3e74c9d4489428ca
|
|
BLAKE2b-256 checksum How to use checksums |
0a990ccadde19ac1943b3ebebc52c95b4cce4a48602877488014acd8f4a046a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.7
|
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 Feb 20, 2026.
Transparency log