Email Infrastructure
Email Queue Architecture in AcelleMail
Overview
When you launch a campaign, AcelleMail does not send every email immediately. It uses a queue-based architecture to process sends reliably and at scale.
The Campaign Send Flow
Campaign Launched
↓
[CampaignJob dispatched to queue]
↓
Queue Worker picks up job
↓
For each subscriber → [SendEmailJob dispatched]
↓
Worker sends via SMTP server
↓
Status updated: sent / failed / bounced
Job Types
| Job Class | Purpose |
|---|---|
CampaignJob |
Iterates subscribers, dispatches per-email jobs |
SendEmailJob |
Sends one email via configured SMTP server |
ProcessBounceJob |
Parses bounce inbox, updates subscriber status |
TrackOpenJob |
Records open event from tracking pixel request |
Retry Logic
Failed jobs are retried automatically. You can configure in .env:
QUEUE_FAILED_DRIVER=database
And in the job class:
public int \$tries = 3;
public int \$backoff = 60; // seconds between retries
Failed jobs after max retries land in the failed_jobs table. Re-dispatch them with:
php artisan queue:retry all
Monitoring Queue Health
# Check queue depth (Redis)
redis-cli llen queues:default
# Watch workers
supervisorctl status
# View failed jobs
php artisan queue:failed
A healthy queue should have zero failed jobs and a queue depth that drops steadily during a campaign send.