Automatic email mass-sender for outreach and campaigns.
A terminal-based bulk emailer that personalizes messages from a CSV contact list, rotates randomly between multiple sender accounts and write-ups, and keeps a per-batch record of who was contacted.
- Overview
- Features
- Requirements
- Installation
- Configuration
- Usage
- CSV & Personalization
- Output
- Project Structure
- Security
- Contributing
- License
- Author
Auto Email Sendr is an interactive command-line tool for sending personalized emails in bulk over SMTP. You point it at a CSV of contacts, configure one or more sender accounts and message templates, and it walks each row β substituting placeholders, picking a template and sender at random, and sending the message β while showing live progress and logging the results.
It is designed for legitimate outreach: newsletters, event invites, recruitment campaigns, and similar mailing to recipients who expect to hear from you.
β οΈ Use responsibly. Only email people who have consented to be contacted, and comply with your email provider's terms and applicable anti-spam laws (e.g. CAN-SPAM, GDPR).
- π¨ Bulk sending over SMTP with
STARTTLS(works with Gmail, Outlook, and most providers). - π§© Placeholder personalization β replace
{name},{company}, etc. in both the subject and body with values from each CSV row. - π² Randomized rotation of multiple sender addresses and message write-ups across recipients.
- π‘οΈ Resilient send loop β a single bad recipient or missing template is logged and skipped, never aborting the whole campaign.
- β±οΈ Configurable throttle (
send_delay_seconds) to reduce provider rate-limiting and spam flags. - ποΈ Result segregation β output CSVs can be split per write-up and/or per sender address.
- π₯οΈ Friendly TUI β arrow-key menus, ASCII-art banners, and a live progress bar.
- π§ First-run setup β
settings.tomlis auto-created from a template; everything is editable from the in-app Settings menu.
- Python 3.8+
- Works on Windows, Linux, and macOS (keyboard handling adapts per platform).
- An SMTP account and credentials (for Gmail, generate an App Password rather than using your login password).
Dependencies (installed via requirements.txt):
| Package | Purpose |
|---|---|
colorama |
Cross-platform colored terminal output |
tomli |
Reading the TOML settings file |
tomli_w |
Writing the TOML settings file |
# 1. Clone the repository
git clone https://github.com/PolybitRockzz/auto-email-sendr.git
cd auto-email-sendr
# 2. Install dependencies
pip install -r requirements.txt
# 3. Run the app
python app.pyOn Windows, you can simply double-click run.bat, which installs the
dependencies and launches the app.
On first launch the app copies settings.example.toml to settings.toml,
which holds your credentials and campaign configuration. You can edit it directly
or β recommended β through the in-app Settings menu.
[smtp]
username = "" # your SMTP login / email address
passkey = "" # SMTP password or app password
smtp_server = "smtp.gmail.com"
smtp_port = 587
send_delay_seconds = 1.0 # pause between sends (seconds)
[emails]
ids = [] # sender addresses (chosen at random per email)
subjects = [] # subject lines, paired by index with writeups
writeups = [] # file paths to message bodies, paired with subjects
isfromfile = [] # internal flag per write-up
[csv]
titles = ["Email"] # CSV column headers to read
placeholders = ["email"] # placeholder names, paired by index with titles
output_folder = "output" # where result CSVs are written
segregate_by_writeups = true
segregate_by_ids = falseKey points:
- An
emailplaceholder is required and must map (viatitles) to a real column in your CSV. subjects[i]andwriteups[i]are paired β write-up i is always sent with subject i.- Write-ups are file paths to plain-text/UTF-8 message bodies.
- Launch the app:
python app.py(orrun.bat). - Open Settings and fill in:
- SMTP β username, passkey, server, and port.
- Email Addresses & Write-ups β your sender address(es), subjects, and body files.
- CSV Data Placeholders β the column titles/placeholders and output filtering.
- From the main menu, choose Run Automation.
- Enter the path to your contacts
.csvfile. - Review the confirmation screen and confirm to start sending.
Navigate menus with the arrow keys and select with Enter.
Your contacts file is a standard CSV with a header row. Column titles must match the
titles configured in settings; each title is bound to a placeholder of the same
index.
Example β contacts.csv:
Email,Name,Company
alice@example.com,Alice,"Acme, Inc"
bob@example.com,Bob,GlobexWith placeholders email β Email, name β Name, company β Company, a write-up
body like:
Hi {name},
We'd love to work with {company}.
β¦and a subject Hello {name} become, for the first row:
Subject: Hello Alice Body: Hi Alice, We'd love to work with Acme, Inc.
Quoted fields containing commas (e.g. "Acme, Inc") are parsed correctly.
After a run, result CSVs are written to the configured output_folder (default
output/). Depending on your filter settings, contacts are recorded:
- Per write-up (
segregate_by_writeups = true) βoutput-<writeup>.csv - Per sender ID (
segregate_by_ids = true) βoutput-<sender>.csv
The run finishes with a summary of emails sent vs. failed, plus a list of any failures and their reasons.
auto-email-sendr/
βββ app.py # Entry point β launches the main menu
βββ pages.py # Page flow: run, send loop, settings, credits, main menu
βββ console.py # Terminal I/O & graphics (menus, key input, banners)
βββ config.py # settings.toml load / save / validation
βββ constants.py # Shared constants (version)
βββ settings.example.toml # Template copied to settings.toml on first run
βββ requirements.txt # Python dependencies
βββ run.bat # Windows convenience launcher
βββ LICENSE # Apache License 2.0
- Your SMTP passkey is stored locally in plaintext in
settings.toml. settings.tomlandsettings_backup.tomlare gitignored by default β never share or commit them.- Prefer a provider App Password scoped to this tool over your main account password.
- The committed
settings.example.tomlcontains no credentials and is safe to share.
Contributions, issues, and feature requests are welcome!
- Fork the repository.
- Create a feature branch:
git checkout -b feature/my-feature. - Commit your changes and open a Pull Request against
main.
Please keep changes focused and describe the motivation in your PR.
Distributed under the Apache License 2.0. See LICENSE for details.
If this project helped you, consider giving it a β on GitHub!