A small toolkit for running a personal job-application campaign: fetch job postings, render a tailored HTML email + PDF CV per application, send through SMTP, and track follow-ups — with a test-mode safety switch so nothing goes to a real company until you're ready.
fetch.py— fetches a URL and prints cleaned visible text (for reading job ads) or all links on the page (--links), without needing a browser or an LLM round-trip.render_pdf.py— renders an HTML file to PDF (weasyprint), used to generate a per-application CV/cover-letter PDF.send_mail.py— the sender. Supports two modes:- Legacy recipients mode: one shared template + a
recipients.csvlist (simple newsletter-style send). - Applications mode: reads
applications.csv(one row per job application:slug,company,position,subject,real_email), and for each sendsdata/applications/<slug>/email.htmlwithdata/applications/<slug>/cv.pdfattached if present. send_mail.py followup— sendsfollowup.htmlfor any application whose initial send is older thanFOLLOWUP_DAYSand hasn't had a follow-up yet.send_mail.py report— emails a tracking summary (sent/pending/follow-up status per application) to your own inbox.
- Legacy recipients mode: one shared template + a
While TEST_MODE=true (the default), every send is redirected to TEST_RECIPIENTS instead of the real target address, so you can review exactly what a company would receive before turning test mode off. main() refuses to start if test mode is on but TEST_RECIPIENTS is empty.
pip install -r requirements.txt
cp .env.example .env # fill in SMTP credentials, keep TEST_MODE=true at firstAll runtime data — recipients, applications, sent/CV files, logs — lives under data/, which is gitignored; only the code is version-controlled.
docker build -t job-mailer .
docker run --env-file .env -v "$(pwd)/data:/app/data" job-mailerThis automates outbound email to real companies. Keep TEST_MODE=true until you've verified the rendered output, respect the target site's terms of service when fetching job postings, and don't use it for unsolicited bulk email to anyone who hasn't invited an application.
MIT.