En l'hébergeant vous-même, Listmonk tourne sur un VPS que vous payez déjà. L'envoi coûte ce que votre relais SMTP facture pour mille e-mails. Le nombre d'abonnés ne change ni l'un ni l'autre. C'est ce changement structurel qui rend l'auto-hébergement rentable, une fois la configuration faite, dès que vous dépassez une offre gratuite gérée.
Listmonk est un gestionnaire de newsletter open source écrit en Go. Vous obtenez des abonnés, des listes et des campagnes en nombre illimité pour le prix d'un VPS et d'un compte de relais SMTP. Une chose doit être claire avant de taper la moindre commande : Listmonk gère tout sauf l'envoi proprement dit. Que votre e-mail atterrisse dans la boîte de réception ou dans les spams dépend du relais SMTP que vous configurez et des enregistrements DNS que vous définissez sur votre domaine d'envoi.
Ce que couvre ce guide
- Déployer Listmonk et PostgreSQL avec Docker Compose derrière un reverse proxy Nginx (ou Caddy) avec HTTPS
- Choisir le bon relais SMTP selon votre volume et votre budget (Amazon SES, Postmark, Brevo ou autre)
- Configurer SPF, DKIM et DMARC sur votre domaine d'envoi
- Éviter quatre modes de défaillance en production qui ne produisent souvent pas d'erreur claire
- Temps estimé : 30 minutes si vous avez un VPS et un domaine prêts
- Hors périmètre : automatisation par scénarios, e-mails transactionnels, configurations multi-instances (voir la FAQ)
Quand Listmonk est le mauvais outil
Listmonk est la bonne réponse pour une situation précise. Si votre situation est différente, il existe une meilleure réponse.
Volume inférieur à ~10K e-mails par mois. À cette échelle, les offres gratuites gérées de Brevo ou Mailchimp peuvent revenir moins cher au total qu'un VPS plus un relais SMTP. L'auto-hébergement commence à être rentable une fois cette zone franchie. Vérifiez les chiffres face à votre nombre réel d'abonnés et à votre fréquence d'envoi avant de déployer.
Équipe non technique. Mailchimp et Brevo ont des interfaces réellement meilleures pour les personnes qui ne travaillent pas dans un terminal. Listmonk part du principe que quelqu'un dans l'équipe sait se connecter en SSH à un serveur, lire les logs Docker et interpréter la propagation DNS. Si cette personne n'existe pas, les services gérés sont le bon choix.
Besoin de scénarios d'automatisation. Listmonk envoie des campagnes. Il ne prend pas en charge les séquences automatisées, les e-mails déclenchés par comportement ni les constructeurs visuels de scénarios. Si vous en avez besoin, utilisez Mautic ou reliez Listmonk à n8n pour la couche d'automatisation.
Listes d'abonnés sensibles au RGPD. Si vos abonnés se trouvent principalement dans l'UE ou si votre liste est soumise aux règles de résidence des données du RGPD, faites tourner Listmonk dans un datacenter européen. Nous proposons des emplacements à Francfort et Londres qui répondent aux exigences de résidence de l'UE.
Ce dont vous avez besoin avant de commencer
Listmonk, plus PostgreSQL, plus une charge de file d'attente modérée nécessitent 2 GB de RAM au minimum. 4 GB est la cible confortable en production.
Matériel. Pour une liste personnelle de moins de 50K e-mails par mois, un VPS avec 2 vCPU, 4 GB de RAM et 120 GB de stockage NVMe suffit. Les listes en croissance dépassant 200K par mois nécessitent 4 vCPU et 8 GB de RAM. Nous faisons tourner cette configuration Compose sur un VPS de 4 GB à Francfort. Choisissez un emplacement proche de vos abonnés si possible. La latence d'envoi n'a pas grande importance ; la réactivité du panneau d'administration, si.
Domaine. Un domaine pointant vers votre VPS via un enregistrement A. Utilisez un sous-domaine pour l'interface d'administration, par exemple mail.example.com. Le domaine d'envoi et le sous-domaine d'administration peuvent partager le même domaine racine.
Compte de relais SMTP. N'en créez pas encore un. Le choix du relais est la décision la plus lourde de conséquences de ce guide et il dépend de votre volume. Passez directement à la section « Choisir votre relais SMTP », choisissez un fournisseur, puis revenez ici avec l'hôte SMTP, le port, le nom d'utilisateur et le mot de passe en main.
Logiciels sur le VPS. Ubuntu 22.04 LTS ou 24.04 LTS. Docker Engine 24.0 ou supérieur avec le plugin Docker Compose. UFW ou un pare-feu équivalent avec les ports 22, 80 et 443 ouverts. Accès SSH en tant qu'utilisateur sudo non root.
Déployer Listmonk avec Docker Compose

Créez un répertoire pour le déploiement, puis déposez-y un docker-compose.yml fichier avec deux services : postgres pour la base de données et listmonk pour l'application. Les deux redémarrent en cas d'échec. Listmonk se lie à 127.0.0.1 de sorte que le reverse proxy soit la seule chose capable de l'atteindre.
Le fichier Docker Compose
Voici le docker-compose.yml. Vérifiez les tags d'image exacts et les noms de variables d'environnement par rapport à la documentation officielle d'installation de Listmonk. Ils changent à chaque version.
# docker-compose.yml
services:
postgres:
image: postgres:16-alpine
container_name: listmonk-postgres
restart: unless-stopped
environment:
POSTGRES_USER: listmonk
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: listmonk
volumes:
- listmonk-postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U listmonk"]
interval: 10s
timeout: 5s
retries: 6
app:
image: listmonk/listmonk:latest
container_name: listmonk-app
restart: unless-stopped
# Bind to loopback only. The reverse proxy is the public entrypoint.
ports:
- "127.0.0.1:9000:9000"
depends_on:
postgres:
condition: service_healthy
environment:
LISTMONK_app__address: "0.0.0.0:9000"
LISTMONK_db__host: postgres
LISTMONK_db__port: 5432
LISTMONK_db__user: listmonk
LISTMONK_db__password: ${POSTGRES_PASSWORD}
LISTMONK_db__database: listmonk
volumes:
listmonk-postgres:
Créez un .env fichier avec POSTGRES_PASSWORD= défini sur une longue chaîne aléatoire. Démarrez ensuite la stack et lancez l'installation unique de la base de données :
# Pull images and start the database first
docker compose up -d postgres
# Run the install step (creates schema and the first admin user)
docker compose run --rm app ./listmonk --install --idempotent --yes
# Start the application
docker compose up -d
La --install La commande demande un e-mail et un mot de passe d'administrateur. Notez-les. Vérifiez que les deux conteneurs tournent :
docker compose ps
Sortie attendue : deux services listés, tous deux avec le statut Up. La ligne postgres doit afficher (healthy).
La 127.0.0.1:9000 Cette liaison est délibérée. Listmonk n'a ni limiteur de fréquence d'authentification intégré ni liste d'autorisation d'IP. Exposer le port 9000 à l'internet public signifie que n'importe qui sur la planète peut atteindre votre page de connexion d'administration. Le reverse proxy est ce qui rend cette connexion accessible uniquement via HTTPS.
Reverse proxy Nginx et SSL
Installez Nginx et Certbot depuis les dépôts Ubuntu. Créez une configuration de site dans /etc/nginx/sites-available/listmonk avec les en-têtes de proxy dont Listmonk a besoin pour générer des liens de campagne corrects :
# /etc/nginx/sites-available/listmonk
server {
listen 80;
server_name mail.example.com;
location / {
proxy_pass http://127.0.0.1:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Listmonk streams campaign progress over WebSocket
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Créez un lien symbolique dans sites-enabled, testez la configuration, rechargez Nginx, puis émettez un certificat :
sudo ln -s /etc/nginx/sites-available/listmonk /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
sudo certbot --nginx -d mail.example.com
Certbot réécrit le bloc serveur pour écouter sur le 443 avec le nouveau certificat et ajoute une redirection HTTP vers HTTPS. Vérifiez :
curl -I https://mail.example.com
Sortie attendue : HTTP/2 200 avec un en-tête strict-transport-security valide. Si vous obtenez une boucle de redirection, vérifiez que l'en-tête X-Forwarded-Proto est défini dans la configuration Nginx ci-dessus. Neuf fois sur dix, la boucle vient de cet en-tête.
Si Listmonk est la seule chose sur ce VPS, utilisez plutôt Caddy. Le Caddyfile fait trois lignes et gère le renouvellement de certificat sans tâche cron :
mail.example.com {
reverse_proxy 127.0.0.1:9000
}
Corriger l'en-tête Message-ID
Par défaut, Listmonk utilise le nom d'hôte du système dans l'en-tête Message-ID sortant. Si le nom d'hôte de votre VPS est localhost ou tout ce qui n'est pas un FQDN valide, Listmonk envoie Message-ID: <[email protected]>. Les filtres anti-spam de Gmail et Outlook le signalent immédiatement. C'est documenté dans le fil 15410 du forum Cloudron.
Le correctif tient en une ligne dans le config.toml. Pour une nouvelle installation, générez le fichier via docker compose run --rm app ./listmonk --new-config. Définissez ensuite :
[app]
hostname = "mail.example.com"
Redémarrez le conteneur de l'application après la modification :
docker compose restart app
Faites-le avant d'envoyer la moindre campagne. Une liste contaminée par des localhost.localdomain Message-ID est plus difficile à récupérer qu'une liste partie sur des bases saines.
Astuce
Si vous préférez sauter la configuration Compose, découvrez notre VPS Listmonk en un clic pour déployer Listmonk en quelques minutes en un clic. L'instance est préconfigurée avec PostgreSQL. Vous devez toujours configurer votre relais SMTP et ajouter vos enregistrements DNS. Ces étapes ne sont pas optionnelles, quelle que soit la façon dont vous déployez.
Choisir votre relais SMTP

Tous les envois passent par un relais que vous configurez. La réputation d'IP du relais, ses limites de débit et sa gestion des rebonds sont ce qui détermine si votre e-mail atterrit dans la boîte de réception ou dans les spams.
Voici la comparaison fonctionnelle. Les tarifs et les limites des offres gratuites changent. Vérifiez chacun sur la page tarifaire officielle du fournisseur avant de vous engager.
| Fournisseur | Structure de coûts | Webhooks de rebond | Idéal pour |
|---|---|---|---|
| Amazon SES | Au coup par e-mail, très faible en volume | Oui, via SNS | Coût en volume ; déjà sur AWS |
| Postmark | Forfait de base mensuel plus coût par e-mail | Oui, natif | Délivrabilité d'abord ; réputation transactionnelle |
| Brevo | Offre gratuite pour les faibles volumes, offres payantes au-dessus | Oui | Faible volume avec possibilité de montée en gamme |
| Mailgun | Tarification au coup par e-mail | Pas de point de terminaison webhook natif ; utilisez l'API de rebond générique au besoin. | Familier pour les développeurs |
Ce n'était qu'un bref aperçu de chaque relais SMTP. Nous allons maintenant détailler chacun d'eux.
Amazon SES (point de départ recommandé)
SES est l'option la moins chère en volume et la plus discutée dans la communauté Listmonk. La configuration comporte plus d'étapes que Postmark ou Brevo, mais l'écart de coût par e-mail est suffisamment important à tout volume réel pour justifier l'effort.
Configurez-le en trois étapes. D'abord, créez un utilisateur IAM avec la AmazonSESFullAccess politique (ou une politique personnalisée plus stricte avec uniquement ses:SendRawEmail et ses:GetSendQuota). Ensuite, vérifiez votre domaine d'envoi dans la console SES. SES vous guide à travers les CNAME DKIM à ajouter. Enfin, générez des identifiants SMTP depuis le panneau des paramètres SMTP de SES. Ce ne sont pas vos clés d'accès AWS ; SES génère un nom d'utilisateur et un mot de passe SMTP spécifiques distincts quand vous cliquez sur « Create SMTP credentials ».
Dans l'administration de Listmonk, sous Settings → SMTP, ajoutez un nouveau serveur avec :
- Hôte :
email-smtp.<region>.amazonaws.com(utilisez la région SES dans laquelle vous avez vérifié le domaine) - Port : 587
- Protocole d'authentification : LOGIN
- TLS : STARTTLS
- Nom d'utilisateur et mot de passe : les identifiants SMTP générés par SES
SES exige STARTTLS sur le port 587. Si vous laissez TLS sur none ou choisissez le port 465, Listmonk se connecte, SES renvoie 530 Must issue a STARTTLS command first, et le test des identifiants SMTP dans le panneau d'administration peut quand même afficher un succès. Envoyez un vrai e-mail de test vers une boîte de réception personnelle que vous contrôlez avant de lancer la moindre campagne.
Les nouveaux comptes SES démarrent en mode sandbox. En sandbox, vous ne pouvez envoyer qu'à des adresses e-mail vérifiées, ce qui est inutile pour une liste d'abonnés. Ouvrez un ticket de support depuis la console SES pour demander l'accès à la production. L'approbation prend généralement un jour ouvré.
Postmark (alternative axée délivrabilité)
Postmark coûte plus cher par e-mail que SES, mais offre un support natif des webhooks de rebond et une réputation de taux élevé d'arrivée en boîte de réception grâce à des politiques d'expéditeur strictes. Cela en vaut la peine si vos newsletters sont critiques pour votre activité ou si vous ne voulez pas gérer l'approbation sandbox-vers-production de SES.
La configuration Listmonk a la même forme que pour SES : hôte, port 587, STARTTLS, identifiants issus du panneau des jetons d'API du serveur Postmark. Vérifiez votre domaine d'envoi dans la configuration de signature de Postmark, ajoutez les enregistrements DKIM que Postmark génère, et vous êtes prêt à envoyer.
Choisissez Postmark quand la délivrabilité compte plus que le coût par e-mail. Choisissez SES quand le volume compte plus que l'accompagnement.
Un avertissement sur le test des identifiants SMTP. Le test de connexion dans l'administration de Listmonk signale toujours un succès, même avec des identifiants invalides. C'est documenté dans quelques tickets GitHub. Ne lui faites pas confiance. Après avoir configuré le moindre relais, envoyez une campagne à un seul abonné de test et confirmez la réception dans la boîte de réception cible avant d'envoyer à toute votre liste.
Évitez Mailersend pour l'envoi de campagnes en masse. Son plafond de 5 e-mails par connexion produit des erreurs 421 Service not available que Listmonk enregistre comme envoyées alors même que la livraison a échoué. La campagne semble réussie dans Listmonk et perd la plupart de ses messages sans avertissement.
Faire arriver vos e-mails pour de bon : SPF, DKIM et DMARC

Ce sont trois enregistrements DNS sur votre domaine d'envoi qui indiquent aux serveurs de messagerie destinataires que votre domaine a autorisé ce relais à envoyer en votre nom. Sautez-en un seul et une part importante de vos envois finira dans les spams à grande échelle, quelle que soit la propreté de votre relais ou de votre texte. Ajoutez-les chez votre fournisseur DNS avant d'envoyer la première campagne.
Enregistrement SPF
SPF autorise des IP ou des services d'envoi spécifiques à envoyer des e-mails pour votre domaine. Ajoutez un seul enregistrement TXT à la racine de votre domaine d'envoi avec l'include de votre relais. Pour SES, l'enregistrement ressemble à :
v=spf1 include:amazonses.com ~all
Pour Postmark, remplacez l'include par include:spf.mtasv.net. Vérifiez toujours la documentation SPF officielle de votre relais pour la valeur d'include exacte. Elle change selon le fournisseur et parfois selon la région.
Un domaine ne peut avoir qu'un seul enregistrement SPF. Si vous en avez déjà un pour un autre service (Google Workspace, Microsoft 365), fusionnez l'include dans l'enregistrement existant au lieu d'en ajouter un second.
DKIM
DKIM attache une signature cryptographique aux e-mails sortants, que les serveurs destinataires vérifient face à une clé publique dans votre DNS. Votre relais génère la paire de clés. Vous ajoutez la clé publique comme enregistrement TXT sur un sous-domaine de sélecteur (par exemple, sel1._domainkey.example.com) avec la valeur exacte que le relais vous donne.
Listmonk ne gère pas la signature DKIM. C'est le relais qui s'en charge. Il n'y a pas de configuration DKIM spécifique à Listmonk. Suivez l'assistant de configuration DKIM de votre relais, ajoutez les enregistrements qu'il vous donne et attendez la propagation DNS (généralement moins de 30 minutes ; parfois quelques heures).
DMARC
DMARC indique aux serveurs destinataires quoi faire des e-mails qui échouent aux contrôles SPF ou DKIM. Commencez en mode surveillance avec p=none afin de voir les échecs dans les rapports agrégés sans affecter la délivrabilité pendant que vous corrigez les erreurs de configuration. Ajoutez un enregistrement TXT sur _dmarc.example.com:
v=DMARC1; p=none; rua=mailto:[email protected]
Après deux ou trois semaines de rapports propres, durcissez la politique vers p=quarantine or p=reject. Ne sautez pas la phase de surveillance. Une faute de frappe dans votre include SPF combinée à p=reject dès le premier jour anéantira vos propres e-mails légitimes sans le moindre signal que quelque chose a mal tourné.
L'en-tête List-Unsubscribe (RFC 8058) est généré automatiquement par Listmonk. Vérifiez qu'il est activé sous Settings → General. Gmail et Apple Mail font apparaître cet en-tête sous forme d'option de désabonnement en un clic, ce qui protège la réputation de l'expéditeur.
Ce qui casse vraiment en production
Quatre modes de défaillance qui n'apparaissent qu'au moment d'envoyer votre première vraie campagne. Repérez-les avant vos abonnés.
Problème 1 : le taux de rebond ne correspond pas au chiffre de votre relais. Listmonk traite les rebonds en lisant une adresse e-mail de rebond dédiée via POP3 et en supprimant chaque message qu'il lit. Cela inclut les réponses d'absence, les accusés de réception et les notifications d'absence du bureau, toutes classées comme des rebonds. Votre relais ne compte que les véritables échecs de livraison renvoyés par les serveurs de messagerie destinataires. Si SES rapporte 0,6 % et Listmonk rapporte 4 %, c'est là qu'est l'écart. Le correctif consiste à configurer des rappels par webhook de rebond plutôt que POP3. Pour SES, utilisez SNS pour livrer les notifications de rebond au point de terminaison webhook de Listmonk. Pour Postmark, dirigez son webhook natif vers le même point de terminaison. Les rebonds par webhook sont précis ; les rebonds par POP3 gonflent les chiffres.
Problème 2 : le test des identifiants SMTP indique un succès alors qu'il a tort. Comme indiqué dans la section sur les relais, le test de connexion signale toujours un succès, quelle que soit la validité des identifiants. Ne lui faites pas confiance. Envoyez toujours un vrai e-mail de test après avoir configuré ou modifié le moindre paramètre SMTP.
Problème 3 : une campagne s'arrête en cours d'envoi sans erreur. Listmonk marque les campagnes comme Finished même quand seulement 60 % des abonnés ont reçu l'e-mail. Les envois restants ont été rejetés par le relais ou limités au niveau du réseau du VPS, et Listmonk ne fait remonter ni l'un ni l'autre comme une erreur de campagne (le fil 13165 du forum Cloudron. Si une campagne affiche moins d'envois que d'abonnés, ouvrez le tableau de bord de votre relais pour la fenêtre temporelle d'envoi et comparez le nombre accepté par le relais à celui de Listmonk. La vérité est dans le relais.
Problème 4 : personne ne sauvegarde PostgreSQL. Le volume Compose conserve les données au fil des redémarrages. Il ne protège pas contre une panne de l'hôte, un docker volume rm accidentel ou des mises à niveau corrompues. Ajoutez un pg_dump quotidien :
0 2 * * * docker exec listmonk-postgres pg_dump -U listmonk listmonk > /backups/listmonk-$(date +\%Y\%m\%d).sql
Lancez d'abord la ligne une fois à la main. Vérifiez que le fichier de sortie n'est pas vide avant de faire confiance à l'entrée cron. Un script de sauvegarde qui écrit un fichier de zéro octet sans lever d'erreur est pire que pas de sauvegarde du tout, parce que vous cessez d'y penser.
Avant de faire confiance à tout cela en production, envoyez une campagne de test à un seul abonné et confirmez la réception dans la boîte de réception cible. Si cet unique e-mail arrive proprement, les dix mille suivants arriveront aussi.
Foire aux questions
Pourquoi mes taux de rebond Listmonk sont-ils plus élevés que ceux que rapporte Amazon SES ?
Le traitement des rebonds par POP3 de Listmonk gonfle les chiffres en lisant les réponses d'absence du bureau et les réponses automatiques de vacances comme des rebonds. Configurez des rappels par webhook SNS de SES pour des chiffres précis.
Listmonk prend-il en charge les e-mails transactionnels ?
Listmonk est un outil de newsletter et de campagne de diffusion. Il ne gère pas nativement l'e-mail transactionnel (réinitialisations de mot de passe, confirmations de commande, e-mails déclenchés en tête-à-tête). Pour l'e-mail transactionnel depuis le même domaine d'envoi, configurez séparément le point de terminaison transactionnel de votre relais ou utilisez un outil dédié comme Postal ou l'API transactionnelle de Postmark aux côtés de Listmonk.
Comment importer mes abonnés Mailchimp dans Listmonk ?
Exportez votre liste Mailchimp au format CSV depuis Audience → Export Audience. Dans Listmonk, allez dans Subscribers → Import et téléversez le CSV. Associez les colonnes e-mail et nom quand on vous le demande. Listmonk accepte les exports CSV standard de Mailchimp, ConvertKit et de la plupart des plateformes de newsletter sans conversion de format.
Que se passe-t-il quand quelqu'un se désabonne d'une campagne Listmonk ?
Listmonk ajoute par défaut un lien de désabonnement à chaque e-mail de campagne. Quand un abonné clique dessus, il est ajouté à la liste de blocage et retiré de toutes les campagnes futures. L'en-tête List-Unsubscribe (RFC 8058) est inclus automatiquement, de sorte que les clients de messagerie qui prennent en charge le désabonnement en un clic (Gmail, Apple Mail) le font apparaître nativement. La fiche de l'abonné reste dans la base de données à des fins d'audit, mais plus aucune campagne ne lui sera envoyée.