Skip to main content

Generated page. Written from IdaMilk/email-scheduler at commit 519a7ad on 2026-07-28. The repository has no README, so everything below is inferred from module structure.

Email Scheduler

What is it?

A self-hosted FastAPI service for scheduling recurring emails. Define a template, define a recipient group, define a schedule, and the service sends on that cadence — with an audit trail of what actually went out.

Purpose

Recurring operational email — shift reports, reminders, weekly summaries — otherwise lives in whatever tool happens to be handy, or in someone's calendar. This centralises it: one place where scheduled sends are defined, visible, and logged.

The multi-account SMTP support means different senders can be used for different jobs rather than everything arriving from one shared mailbox.

How it Works

FastAPI with a router per concern. The structure tells the story clearly:

RouterManages
authLogin and sessions
profileUser profile
jobsScheduled send jobs
groupsRecipient groups
templatesEmail templates
smtp_accountsConfigured sending accounts
logsSend history
auditAudit trail

scheduler.py runs the jobs; email_sender.py performs the send; models.py and database.py hold persistence.

crypto.py is the notable module. SMTP account passwords have to be stored — the service must authenticate to send later, so they cannot be one-way hashed like user passwords. A dedicated crypto module means they are encrypted at rest rather than sitting in plain text, which is the right call and not the default one.

Separating logs from audit is likewise deliberate: one records what was sent, the other records who changed the configuration.

Tech Stack

LayerTechnology
FrameworkFastAPI
LanguagePython
PackagingDocker, docker-compose
Dependenciesrequirements.txt

Operations

Docker-based, configured through .env (documented in .env.example).

The encryption key used by crypto.py is the critical piece of configuration: lose it and every stored SMTP credential becomes unrecoverable, requiring each account to be re-entered. It should be backed up separately from the database, not alongside it — a backup containing both the ciphertext and the key protects nothing.

Repository

RepositoryIdaMilk/email-scheduler
Primary languagePython
Files46
Last activity2026-05-21
StatusActive
READMENone

A README covering the schedule format, template variables, and — most importantly — the encryption key backup requirement would be worth writing before the person who set it up forgets.