A self-hosted bulk email platform โ send personalised job applications, marketing campaigns, newsletters and outreach at scale.
Use any SMTP as a sending channel โ and stack multiple channels for higher throughput:
What is it? โข Use Cases โข SMTP Channels โข Quick Start โข How to Use โข Why It's Fast
Resume Sender is a self-hosted, all-purpose bulk email platform built in PHP + MySQL.
Despite its name, it's not just for sending resumes. It's a general-purpose engine for any one-to-many email scenario where you want:
- ๐ง Email marketing campaigns with personalised content
- ๐ผ Job application outreach with attached CV / cover letter
- ๐ฃ Newsletters to your community or customers
- ๐ค Cold outreach for sales, partnerships or PR
- ๐ฎ Transactional batches (event invites, announcements, follow-ups)
It connects to any SMTP server as a sending channel โ your Gmail, Outlook, Yahoo, Zoho, iCloud, your company mail server, your own self-hosted Postfix box, anything that speaks SMTP.
You can stack multiple SMTP channels in one account โ each with its own daily quota โ and the app will track quota per channel and auto-block any channel that hits its limit, so your campaign keeps running on the other channels.
- โ
Personalises every email (
{company_name},{position},{email}placeholders) - โ Multiple file attachments per send (CV, brochure, invoice, etc.)
- โ Tracks who you've contacted, when, with which result
- โ Multi-channel SMTP โ add as many channels as you want, each with its own quota
- โ Sends 100+ emails in under a minute (see Why It's Fast)
- โ Fully self-hosted โ your contact list never leaves your server
No Composer. No Node. No build step. Just PHP + MySQL + Tailwind via CDN.
Anywhere you'd normally reach for a SaaS email tool โ or "let me just BCC 50 people in Outlook" โ Resume Sender does it, on your own server, using your own SMTP channels.
| You are... | You'll use it to... |
|---|---|
| ๐งโ๐ผ A job seeker | Send your CV to 80 companies tonight, with personalised cover letters |
| ๐ฃ A marketer | Run email marketing campaigns โ product launches, promos, drip sequences |
| ๐ฐ A newsletter author | Send your weekly digest to subscribers with rich HTML and attachments |
| ๐ผ A freelancer / consultant | Cold-pitch prospects without SaaS quotas eating your margin |
| ๐ A small business | Send invoices, receipts, order updates, customer announcements |
| ๐ A small recruiter | Manage candidate outreach with multi-user accounts and per-recruiter lists |
| ๐ An event organiser | Send invitations, reminders, follow-up surveys to attendees |
| ๐ค A sales team | Cold outreach with templates, follow-up tracking, multi-SMTP rotation |
| ๐ข A PR / community manager | Press releases, member updates, partner communications |
| ๐ A developer | Hack on a clean, dependency-light PHP/MySQL outreach base |
Resume Sender treats every SMTP server you add as a sending channel. You can add as many channels as you want, each with its own daily quota โ no third-party SaaS, no API keys, just plain SMTP.
One channel = one SMTP account. Stack multiple channels to multiply your daily sending capacity and survive any single-channel outage.
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Your Campaign โ
โ (e.g. 1,500 emails) โ
โโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโ
โ โ โ
โโโโโโผโโโโโ โโโโโโผโโโโโ โโโโโโผโโโโโ
โ Channel โ โ Channel โ โ Channel โ
โ #1 โ โ #2 โ โ #3 โ
โ Gmail A โ โ Gmail B โ โ Outlook โ
โ 500/day โ โ 500/day โ โ 300/day โ
โโโโโโโโโโโ โโโโโโโโโโโ โโโโโโโโโโโ
โ โ โ
โโโโโ Auto-block on quota โโโ
Continue on the rest
If one channel hits its quota mid-campaign, the app auto-blocks that channel for the day and keeps sending through the others.
| Channel type | Host | Port | Encryption | Notes |
|---|---|---|---|---|
| ๐ง Gmail / Google Workspace | smtp.gmail.com |
587 |
TLS | Use an App Password โ quota ~500/day |
| ๐จ Outlook / Hotmail / Microsoft 365 | smtp-mail.outlook.com / smtp.office365.com |
587 |
TLS | Quota ~300 (consumer) / ~10,000 (M365) per day |
| ๐ Yahoo Mail | smtp.mail.yahoo.com |
465 |
SSL | App password required โ quota ~500/day |
| ๐ฌ iCloud Mail | smtp.mail.me.com |
587 |
TLS | App-specific password required |
| ๐ Zoho Mail | smtp.zoho.com |
465 |
SSL | Quota varies by plan |
| ๐จ๐ณ QQ / 163 / Sina | provider-specific | 465 |
SSL | Authorisation code required |
| ๐ข Your company mail server | your hostname | varies | varies | Use the SMTP creds your IT team gave you |
| ๐ง Self-hosted Postfix / Mailcow / iRedMail | your hostname | 587 |
TLS | Full control, unlimited quota |
| ๐ง Any custom SMTP | anything | anything | anything | If it speaks SMTP, it works |
In Settings โ Add SMTP Server, you only need:
Host: smtp.your-provider.com
Port: 587 (TLS) or 465 (SSL) or 25 (none)
Username: your-account@example.com
Password: your-password / app-password
Encryption: TLS / SSL / None
From email: sender@example.com
From name: Your Name
Daily quota: 500 โ matches your channel's limit
That's it โ Resume Sender handles the SMTP handshake, AUTH LOGIN, MIME assembly, attachments and connection pooling automatically.
| Benefit | What it means in practice |
|---|---|
| ๐ Higher throughput | 3 Gmail channels ร 500/day = 1,500 emails/day instead of 500 |
| ๐ก Quota safety | One channel hitting its limit doesn't kill the campaign |
| ๐ญ Multiple identities | Send from different from-addresses for different campaigns |
| ๐ Provider diversity | Mix Gmail + Outlook + your own server โ no single point of failure |
| ๐ฐ Zero SaaS cost | Reuse free SMTP accounts you already have |
|
|
|
Requirements: PHP 7.4+, MySQL 5.7+ (or MariaDB 10.3+), Apache or Nginx.
Edit config.php:
define('DB_HOST', 'localhost');
define('DB_NAME', 'resumesender');
define('DB_USER', 'resumesender');
define('DB_PASS', 'your-strong-password');CREATE DATABASE resumesender CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'resumesender'@'localhost' IDENTIFIED BY 'your-strong-password';
GRANT ALL PRIVILEGES ON resumesender.* TO 'resumesender'@'localhost';php setup_db.phpchmod -R 755 uploadsURL: http://localhost/
Username: admin
Password: admin123
โ ๏ธ Change the admin password immediately after logging in.
Step 1 โ Add an SMTP channel
Go to Settings โ Add SMTP Server and add your first channel โ Gmail, Outlook, Yahoo, your company mail server, your own Postfix box, anything that speaks SMTP.
See ๐ฎ SMTP Channels for host / port reference for the most common channels.
๐ก Gmail tip: use an App Password, not your real password. Daily quota = 500.
๐ก Need higher throughput? Add multiple SMTP channels โ e.g. 3ร Gmail = 1,500 emails/day. The app rotates between them automatically and auto-blocks any channel that hits its quota.
Step 2 โ Add recipients
- Manually: Recipients โ Add Recipient
- Bulk CSV: Recipients โ Upload CSV
CSV format:
email,company_name,position
john@example.com,Acme Inc,Software Engineer
jane@example.com,Tech Corp,Marketing ManagerStep 3 โ (Optional) Save a template
Templates โ New Template. Loadable on the Send page with one click.
Step 4 โ Send
Go to Send, then:
- Pick an SMTP server
- Choose audience: All / New / Follow-up / Specific
- Write subject + body using
{company_name},{position},{email} - Attach files (uploaded once per batch โ see below)
- Click Send Emails
Watch the progress modal stream per-recipient results in real time.
The send pipeline was rebuilt for batch performance. Here's the difference for 100 recipients with a 2MB attachment:
| Old pipeline | New pipeline | |
|---|---|---|
| โฑ Wall clock | ~250โ400 s | ~25โ40 s |
| ๐ค Upload | ~200 MB | ~2 MB |
| ๐ SMTP handshakes | 100 | ~10 |
- ๐ Upload attachments once per batch, not once per recipient
- ๐ Pool SMTP connections โ one TCP+TLS+AUTH handshake per chunk of 10 emails
- โก Parallel chunks โ browser sends 3 chunks concurrently
- ๐พ Pre-encode attachments โ base64 once, reuse N times
- ๐ Smart abort โ quota errors auto-block the SMTP and skip remaining recipients
| Role | Can do |
|---|---|
| ๐ค User | Manage own SMTP servers, recipients, templates, send history |
| ๐ Admin | Everything a user can do, plus Admin Dashboard, system-wide stats, user management (create / suspend / ban) |
Click to expand file tree
resume-sender/
โโโ api/
โ โโโ recipients_api.php # CRUD for recipients
โ โโโ send_email_api.php # Single-recipient send (legacy)
โ โโโ send_batch_api.php # Batched send (reused SMTP connection)
โ โโโ smtp_api.php # CRUD for SMTP configs
โ โโโ upload_attachments_api.php # Upload-once endpoint
โโโ pages/
โ โโโ admin/
โ โ โโโ dashboard.php
โ โ โโโ users.php
โ โโโ home.php # User dashboard
โ โโโ login.php / logout.php
โ โโโ profile.php
โ โโโ recipients.php
โ โโโ recipient_details.php
โ โโโ send.php # Compose + send UI
โ โโโ settings.php # SMTP config
โ โโโ templates.php
โ โโโ template_edit.php
โโโ utils/
โ โโโ auth.php # Sessions, roles, IP detection
โ โโโ csv_parser.php
โ โโโ email_sender.php # SMTPMailer
โโโ uploads/
โ โโโ attachments/
โ โโโ csv/
โโโ config.php
โโโ database_schema.sql
โโโ setup_db.php # Schema + admin seeder
โโโ index.php # Auth gate
โโโ layout.php # Sidebar layout
โโโ README.md
6 tables, InnoDB, utf8mb4_unicode_ci:
| Table | What it stores |
|---|---|
users |
Accounts, roles, status, login tracking, profile |
smtp_configurations |
Per-user SMTP servers + quota state |
recipients |
Per-user recipient list |
email_templates |
Per-user saved templates |
email_logs |
Every send attempt with status & error |
email_attachments |
Files attached to each successful send |
See
database_schema.sqlfor the authoritative definition.
- โ All DB queries use PDO prepared statements
- โ
All pages gated by
requireAuth()/requireAdmin() - โ
Per-user data scoping via
getUserFilter() - โ File uploads validated by extension + size (10MB)
- โ
Attachment references are opaque tokens โ server reconstructs paths and verifies they resolve inside
ATTACHMENT_DIR(path-traversal protected)
โ ๏ธ Before production: change the seeded admin password, change the DB password, serve over HTTPS.
Click to view screenshots
Proprietary โ All rights reserved.




