listmonk

listmonk

Binaire Go et PostgreSQL pour gérer ses newsletters

listmonk est un gestionnaire de newsletters et de listes de diffusion à héberger soi-même. Le serveur Go et l'interface d'administration tiennent dans un seul binaire, et les données vont dans PostgreSQL 12 ou plus récent. L'interface gère les abonnés, les listes en simple ou double opt-in, les campagnes, les modèles et les statistiques d'ouverture et de clic. L'API /api/tx envoie les e-mails transactionnels d'une application.

listmonk n'est pas un serveur de messagerie : il remet chaque message à un serveur SMTP déclaré dans ses réglages, celui d'un fournisseur comme Amazon SES ou Postmark, ou le vôtre. BillionMail fait l'inverse et installe Postfix, Dovecot et Rspamd avec son interface. Keila passe lui aussi par un relais, en SMTP ou par les API de SES, SendGrid, Mailgun et Postmark.

Le comparatif des logiciels de newsletter auto-hébergés détaille ce que chaque outil prend en charge et ce qu'il laisse au relais SMTP.

Segmentation SQL et débit calé sur le relais

  • Deux choses à faire tourner : le binaire et PostgreSQL. --install crée les tables, --upgrade applique les migrations, et le docker-compose.yml du dépôt lance les deux à chaque démarrage.
  • Plusieurs serveurs SMTP en parallèle : depuis la v6.2.0, listmonk choisit le serveur d'après l'adresse ou le domaine d'expédition, à tour de rôle quand plusieurs serveurs couvrent le même domaine.
  • Un débit calé sur les quotas du relais : par défaut, 10 workers envoient chacun jusqu'à 10 messages par seconde, soit 100 au plus. Une fenêtre glissante, à activer, plafonne le volume sur une période (10 000 messages par heure dans sa configuration initiale). Une campagne se met en pause après 1 000 erreurs d'envoi.
  • Segmentation en SQL : une expression PostgreSQL filtre les abonnés sur leurs champs et sur leurs attributs JSON libres, par exemple subscribers.attribs->>'city' = 'Lyon'.
  • Modèles Go : la syntaxe des templates Go et plus de 100 fonctions Sprig, dans le corps comme dans l'objet du message. Le contenu s'écrit dans un éditeur visuel par blocs, en texte enrichi, en Markdown ou en HTML brut.

Délivrabilité réglée hors de l'outil, un mainteneur principal

La délivrabilité se règle hors de listmonk. Ni ses réglages ni sa documentation ne parlent de SPF, de DKIM ou de DMARC : l'authentification du domaine se fait chez le relais et dans la zone DNS. La documentation prévient aussi que des hébergeurs bloquent les ports sortants 25 et 465, Hetzner par exemple, et qu'il faut alors leur demander de les ouvrir.

Les rebonds demandent une boîte POP3 ou un webhook. Leur traitement est désactivé à l'installation. Pour l'activer, il faut une boîte POP3 derrière l'adresse d'expédition ou un Return-Path dédié, ou bien les webhooks d'Amazon SES, Azure Communication Services, SendGrid, Postmark, Forward Email ou Lettermint. Ces webhooks arrivent sur des routes publiques, comme les pages d'inscription, les liens suivis et le pixel d'ouverture : l'instance doit être joignable depuis Internet.

Léger à l'envoi, lent à l'administration sur des millions d'abonnés. Le site du projet cite une campagne de plus de 7 millions d'e-mails envoyée avec une fraction d'un cœur et 57 Mo de RAM au plus. À cette échelle, prévient la documentation, les pages qui comptent les abonnés et agrègent les statistiques peuvent mettre des dizaines de secondes à s'afficher. Une option met ces chiffres en cache et les recalcule chaque nuit par défaut. Un VACUUM ANALYZE hebdomadaire est conseillé, au prix de quelques secondes de blocage de la base.

À plusieurs comptes, des droits à donner avec soin. Les v6.0.0, v6.1.0 et v6.2.0 corrigent chacune des failles propres aux instances à plusieurs utilisateurs. La page sécurité du projet tient pour acceptés les <script> dans une campagne, les modèles Turing-complets et la permission subscribers:sql_query, qui lit toutes les listes.

Un mainteneur principal, une version mineure par trimestre en 2026. Le dépôt date de juin 2019, la v1.0.0 de mai 2021. Cette année sont sorties la v6.0.0 (2 janvier), la v6.1.0 (29 mars) et la v6.2.0 (26 juin), dernière version stable au 7 octobre. Le propriétaire du dépôt, knadh, signe 1 422 commits, le contributeur humain suivant 32. Les notes de version demandent une sauvegarde de PostgreSQL avant chaque mise à jour, et revenir à une version antérieure impose de restaurer la base d'avant la migration.

AGPL-3.0, sans offre payante ni version hébergée par le projet. La documentation renvoie vers des hébergeurs tiers, dont PikaPods, Elestio et Cloudron, là où Keila vend sa propre version hébergée. Qui modifie listmonk et le fait tourner en service réseau doit fournir le code modifié à ses utilisateurs.