A desktop GUI (Qt6 / PySide6) tool for SMTP warm-up — gradually sends emails to a list of recipients over multiple days to build sender reputation.
- Qt6 GUI — configure everything visually, no CLI required
- Dark theme — consistent Fusion style across all platforms
- SMTP config — host, port, user, password, TLS toggle — enter directly in the app
- Save / Load config — settings persist to
~/.config/mailwarmer/across sessions - HTML email editor — write or paste HTML directly in the Editor tab, or load from a file
- Recipients file — browse for
.xlsxor.csv(first column, one email per row) - Auto-generated schedule — distributes recipients across N days with gradual ramp-up
- Single day or auto mode — run one day or chain all days automatically
- Pause / Resume — state is saved after every email; close and resume later
- Live log & progress bar — see sends in real time
- Self-update check — notifies when a new release is available (with Download button)
- Flatpak support — install, run, and update via Flatpak
- CLI fallback — headless mode with
--cliflag
pip install PySide6 openpyxl python-dotenv
cp .env.example .env
# Edit .env with your SMTP credentials (or enter them directly in the GUI)
python3 warmup.pyDownload the latest .flatpak from the Releases page.
flatpak install --user mailwarmer.flatpak
flatpak run io.github.mitexleo.mailwarmerTo update:
flatpak update io.github.mitexleo.mailwarmerDownload from the Releases page.
# Debian / Ubuntu
sudo dpkg -i warmup_1.4.4_amd64.deb
# RHEL / Fedora / CentOS
sudo rpm -i warmup-1.4.4-1.x86_64.rpmInstalled to /usr/local/bin/warmup.
| File | Platform | Installation |
|---|---|---|
warmup.exe |
Windows | Download and run the executable |
MailWarmer-1.5.6.dmg |
macOS | Download, open DMG, drag MailWarmer.app to Applications |
- First launch: Right-click
MailWarmer.app→ Open (not double-click). Then click Open in the dialog. This only needs to be done once. - DMG shows two items? No — the DMG should contain only
MailWarmer.app. If you see a second file, it's a stale build. Download the latest release. - Apple Silicon (M1/M2/M3): The app runs natively (arm64).
- Code signing: The app is ad-hoc signed for testing. To remove the Gatekeeper warning entirely, an Apple Developer ID ($99/year) is needed for notarization.
python3 warmup.py --cli -c .env -d recipients.xlsx -e body.html --day 1
python3 warmup.py --cli -c .env -d recipients.csv -e body.html --auto| Variable | Required | Default | Description |
|---|---|---|---|
SMTP_HOST |
Yes | — | SMTP server hostname |
SMTP_PORT |
No | 25 | SMTP server port |
SMTP_USER |
Yes | — | SMTP username |
SMTP_PASS |
Yes | — | SMTP password |
USE_TLS |
No | false | Enable STARTTLS |
FROM_NAME |
Yes | — | Sender display name |
FROM_EMAIL |
Yes | — | Sender email address |
EMAIL_SUBJECT |
Yes | — | Email subject line |
WARMUP_DAYS |
No | 14 | Number of days to spread recipients across |
DELAY_BETWEEN_EMAILS |
No | 10 | Seconds between each email send |
DELAY_BETWEEN_DAYS |
No | 86400 | Seconds between days in auto mode |
STATE_FILE |
No | warmup_state.json | State tracking file |
The recipients file (.xlsx or .csv) should have one email address per row in
the first column. A header row is allowed but not required.
email@example.com
user2@domain.com
user3@domain.com
Or with a header:
Email
email@example.com
user2@domain.com
pip install pyinstaller PySide6 openpyxl python-dotenv
pyinstaller --onefile --name warmup warmup.py warmup_core.py
./dist/warmupwarmup.py — Qt GUI application (+ CLI fallback with --cli)
warmup_core.py — shared SMTP logic (config, send, schedule, state)
flatpak/ — Flatpak packaging files
.github/workflows/ — CI pipeline (.deb, .rpm, .flatpak)
This project was developed with assistance from AI coding agents (Claude/DeepSeek) for code generation, refactoring, and debugging. Specific AI-generated contributions include:
- Initial CLI implementation and subsequent Qt GUI refactor
- SMTP warm-up scheduling algorithm
- GitHub Actions CI/CD pipeline for cross-platform packaging
- Self-update check functionality
- Help system and documentation
- Flatpak packaging support
All AI-generated code was reviewed, tested, and validated by the author before inclusion. The author takes full responsibility for the project's functionality and security.