A CLI tool that generates personalized cold emails from outreach targets and sends or drafts them via SMTP. Built for job seekers who want to send thoughtful, human-reviewed outreach emails at a small scale.
-
Clone the repo and create a virtual environment:
python -m venv .venv .venv\Scripts\activate # Windows source .venv/bin/activate # macOS / Linux
-
Install dependencies:
pip install -r requirements.txt
-
Copy
.env.exampleto.envand fill in your SMTP credentials:cp .env.example .env
Run the pipeline (defaults to dry-run mode — no emails sent):
python -m src.mainReview each generated email in the terminal, then choose send, draft, or skip.
Set DRY_RUN=false in .env to enable real SMTP delivery.
| Variable | Default | Description |
|---|---|---|
SMTP_HOST |
smtp.gmail.com |
SMTP server address |
SMTP_PORT |
587 |
SMTP port (STARTTLS) |
SMTP_USER |
— | Sender email address |
SMTP_PASSWORD |
— | Gmail App Password |
SENDER_NAME |
— | Display name on sent emails |
DRY_RUN |
true |
Skip real delivery when true |
SEND_MODE |
draft |
draft or send |
MAX_OUTREACH_PER_RUN |
5 |
Hard cap on contacts per run |
INPUT_PATH |
contacts.json |
Path to outreach targets file |
├── src/
│ ├── main.py # Orchestrator + CLI loop
│ ├── models.py # Contact, EmailDraft, LogEntry, DeliveryResult
│ ├── config.py # Env loading + AppConfig
│ ├── input_loader.py # JSON/CSV target loading
│ ├── email_generator.py # Template-based email generation
│ ├── preview.py # Terminal preview + confirmation prompts
│ ├── email_sender.py # SMTP / dry-run delivery
│ └── logger.py # outreach_log.csv append
├── docs/
│ ├── architecture.md
│ ├── implementation-plan.md
│ └── problemStatement.md
├── contacts.json # Sample outreach targets
├── outreach_log.csv # Audit trail (generated at runtime)
├── .env.example
├── requirements.txt
└── README.md
- Human review gate — every email is previewed before any delivery
- Dry-run mode —
DRY_RUN=trueby default; no network I/O - Volume cap —
MAX_OUTREACH_PER_RUNlimits contacts per run - Personalization required — emails must include company/role hooks
- No fabricated content — template-only generation in MVP
- Full audit trail — every attempt logged to
outreach_log.csv