Email Infrastructure

Email Queue Architecture in AcelleMail

November 11, 2025 1 min read 6,725 views Guide

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.

A

AcelleMail Team