§2 · Architecture
Comment fonctionne réellement un système d'email marketing auto-hébergé.
L'envoi d'une campagne traverse cinq étapes. Les comprendre est le prérequis pour choisir des plateformes, choisir un relais d'envoi et déboguer la délivrabilité quand une campagne sous-performe.
[Marketer's browser]
│
▼ HTTPS POST /campaigns
[Web app — Laravel/Symfony/Go] ◀── REST API also lands here
│
▼ enqueue per-recipient job
[Job queue — Redis / beanstalkd / DB]
│
▼ worker picks job, renders MIME
[Sending driver — SES/Mailgun/SMTP]
│
▼ TLS, AUTH, DATA, .
[Mail Transfer Agent (MTA)]
│
▼ SMTP to recipient MX
[Recipient mail server — Gmail/O365/Yahoo]
│
▼ open pixel · click redirect · bounce · complaint
[Webhook back to web app] ◀── reputation feedback loop
Étape 1 — création de campagne. Le marketeur rédige une campagne dans l'interface web : objet, nom de l'expéditeur, sélection de la liste, éditeur de contenu (drag-and-drop, MJML ou HTML brut). Lorsqu'il clique sur « envoyer », l'application crée un enregistrement de campagne et place en file d'attente les jobs par destinataire pour un traitement en arrière-plan. Rien ne quitte encore le serveur.
Étape 2 — queue + worker. Les workers en arrière-plan dépilent les jobs au rythme configuré (généralement 5–50 envois/seconde par worker). Le worker récupère la ligne de l'abonné, fusionne les champs personnalisés dans le template, intègre un pixel de suivi indexé par message-id et réécrit chaque lien vers une redirection de suivi de clic. Le résultat est un message MIME entièrement personnalisé, prêt à être remis à un sending driver.
Étape 3 — sending driver. Le driver est l'adaptateur entre votre application et le transport choisi : un appel d'API Amazon SES, un POST HTTPS Mailgun, un appel Web API SendGrid ou une poignée de main SMTP brute AUTH PLAIN vers votre propre MTA Postal. Le pattern sending-driver de AcelleMail, par exemple, définit un contrat à 5 méthodes (connect, send, getDeliveryStatus, getCapabilities, validateConfig) que chaque driver implémente — voir /developers/sending-drivers pour le guide complet des drivers. Des drivers intégrés sont livrés pour Amazon SES, SendGrid, Mailgun, SparkPost, Elastic Email, Gmail SMTP et tout serveur SMTP générique (8 fournisseurs vivent dans app/SendingServers/Drivers/Vendors/).
Étape 4 — MTA → destinataire. Le MTA (le vôtre ou celui de votre relais) ouvre une connexion SMTP vers le serveur MX du destinataire, se présente avec un HELO/EHLO, négocie STARTTLS, authentifie les clés de DKIM-signing et soumet le message. Le serveur de messagerie destinataire effectue le scoring spam, la vérification SPF/DKIM/DMARC, le traitement de l'en-tête list-unsubscribe, puis place en boîte de réception ou rejette.
Étape 5 — boucle de feedback. Trois signaux reviennent, tous asynchrones. Les rebonds arrivent par SMTP (codes 5xx pour les hard bounces, 4xx pour les soft) ou via le webhook du relais. Les plaintes (le destinataire a cliqué « spam ») arrivent via la Feedback Loop du Mailbox Provider ou, là encore, via le webhook du relais. L'engagement (impacts du pixel d'ouverture, requêtes de redirection de clic) arrive en HTTP simple vers votre application web. L'application les utilise pour mettre à jour les listes de suppression, retirer les adresses mortes et alimenter les analytics de campagne. Le catalogue d'événements webhook de AcelleMail vit dans config/webhook_events.php — c'est la liste canonique des événements émis et consommés par l'application.
La forme est la même sur toutes les plateformes auto-hébergées, à une variable près : où vivent la queue et le MTA. Le worker de AcelleMail tourne par défaut sur la même machine que l'application web ; Listmonk fait de même ; Mautic utilise Symfony Messenger et prend en charge des machines worker séparées. Le relais mail peut être local (Postal sur la même machine, Postfix sur une machine sœur) ou distant (SES, Mailgun) — cette décision fait l'objet de la §5.