How to Configure and Run the Email Worker
Framework M handles email delivery asynchronously to ensure web request handlers are not blocked by SMTP connection latency. Outbound emails are stored in a database queue and sent by a scheduled background worker.
This guide explains how to configure SMTP settings and run the background email worker.
Configuration
Add your SMTP connection parameters to your application's configuration file (e.g. .env or config.yaml):
[email.smtp]
host = "smtp.mailtrap.io"
port = 2525
username = "your-username"
password = "your-password"
use_tls = true
use_ssl = false
default_sender = "noreply@example.com"
Queueing an Email
To queue an email, create an EmailRequest and dispatch it through the container's email queue adapter.
from framework_m_core.container import Container
from framework_m_core.interfaces.email_queue import EmailRequest
container = Container()
request = EmailRequest(
from_address="noreply@example.com",
to=["user@example.com"],
subject="Welcome!",
body="Thank you for signing up.",
)
await container.email_queue().queue_email(request)
Running the Email Worker
The email sender runs as a background task consuming events from the send_direct_email queue. It requires Taskiq (or a similar job queue) and the framework standard worker to be running.
Start the Worker Process
To start listening to scheduled jobs and background tasks:
uv run m worker
Manual Trigger
You can also import and enqueue direct jobs manually for testing:
from framework_m_standard.adapters.factory import get_job_queue
# Manually enqueue an email job payload
await get_job_queue().enqueue("send_direct_email", queue_id="123", request_data={...})