Skip to content

osscv/ResumeSender

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

9 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ“จ Resume Sender

A self-hosted bulk email platform โ€” send personalised job applications, marketing campaigns, newsletters and outreach at scale.

PHP MySQL Tailwind CSS No Composer Self-Hosted Status License Author

Use any SMTP as a sending channel โ€” and stack multiple channels for higher throughput:

Gmail Outlook Yahoo Mail Zoho Mail iCloud Self-Hosted Custom Multi-Channel

What is it? โ€ข Use Cases โ€ข SMTP Channels โ€ข Quick Start โ€ข How to Use โ€ข Why It's Fast


๐Ÿค” What is it?

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.


๐ŸŽฏ Use Cases

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

๐Ÿ“ฎ SMTP Channels

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.

๐Ÿงฉ The multi-channel concept

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.

โ˜๏ธ Common channel setups

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

โš™๏ธ Adding a channel

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.

๐Ÿ’ก Why multiple channels?

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

โœจ Features at a Glance

๐Ÿ“ง Sending

  • Personalised placeholders
  • Multiple SMTP servers
  • Daily quota enforcement
  • Auto-block on quota exceeded
  • File attachments (10MB)
  • Test send before batch
  • Live progress modal

๐Ÿ‘ฅ Multi-User

  • Admin & user roles
  • Account status (active / banned)
  • Last-login tracking (time + IP)
  • Per-user data isolation
  • User profiles
  • Admin dashboard
  • User management

๐Ÿ“Š Data

  • Recipient list (manual + CSV)
  • Email templates
  • Full send history
  • Per-recipient analytics
  • Success/failure logs
  • Attachment audit trail

๐Ÿš€ Quick Start

Requirements: PHP 7.4+, MySQL 5.7+ (or MariaDB 10.3+), Apache or Nginx.

1. Configure DB credentials

Edit config.php:

define('DB_HOST', 'localhost');
define('DB_NAME', 'resumesender');
define('DB_USER', 'resumesender');
define('DB_PASS', 'your-strong-password');

2. Create the database

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';

3. Run setup (creates tables + seeds admin)

php setup_db.php

4. Set permissions

chmod -R 755 uploads

5. Open in browser & log in

URL:      http://localhost/
Username: admin
Password: admin123

โš ๏ธ Change the admin password immediately after logging in.


๐Ÿ“š How to Use

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 Manager
Step 3 โ€” (Optional) Save a template

Templates โ†’ New Template. Loadable on the Send page with one click.

Step 4 โ€” Send

Go to Send, then:

  1. Pick an SMTP server
  2. Choose audience: All / New / Follow-up / Specific
  3. Write subject + body using {company_name}, {position}, {email}
  4. Attach files (uploaded once per batch โ€” see below)
  5. Click Send Emails

Watch the progress modal stream per-recipient results in real time.


โšก Why It's Fast

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

What changed

  • ๐Ÿ“Ž 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

๐Ÿ” Roles

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)

๐Ÿ“‚ Project Structure

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

๐Ÿ—„ Database Schema

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.sql for the authoritative definition.


๐Ÿ›ก Security

  • โœ… 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.


๐Ÿ“ธ Screenshots

Click to view screenshots

Dashboard Home dashboard

Send Email send

SMTP Configuration smtp

Recipients List recipients

Recipient Analytics recipient details


๐Ÿ“œ License

Proprietary โ€” All rights reserved.


๐Ÿ‘ค Author

Lay Yang (DKLY)

Website

Built in PHP โ€” because the simplest stack is often the best one.

About

Resume Sender is a lightweight, self-hosted bulk email engine built on PHP and MySQL. From job applications to marketing campaigns, newsletters, and cold outreach, it handles any one-to-many email workflow.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages