Ospitandolo in autonomia, Listmonk gira su un VPS che già paghi. L'invio costa quanto il tuo relay SMTP applica per ogni mille email. Il numero di iscritti non cambia nessuna delle due cifre. È questo il cambiamento strutturale che rende l'auto-hosting un investimento valido in fatto di tempo di configurazione, una volta superato il piano gratuito di un servizio gestito.
Listmonk è un gestore di newsletter open source scritto in Go. Ottieni iscritti, liste e campagne illimitati al costo di un VPS più un account presso un relay SMTP. Una cosa deve essere chiara prima di toccare un solo comando: Listmonk gestisce tutto tranne l'invio vero e proprio. Che la tua email finisca nella posta in arrivo o nello spam dipende dal relay SMTP che configuri e dai record DNS che imposti sul tuo dominio di invio.
Cosa copre questa guida
- Distribuire Listmonk e PostgreSQL con Docker Compose dietro un reverse proxy Nginx (o Caddy) con HTTPS
- Scegliere il relay SMTP giusto per il tuo volume e il tuo budget (Amazon SES, Postmark, Brevo o altri)
- Configurare SPF, DKIM e DMARC sul tuo dominio di invio
- Evitare quattro modalità di guasto in produzione che spesso non mostrano errori chiari
- Tempo stimato: 30 minuti se hai già pronti un VPS e un dominio
- Fuori ambito: automazione drip, email transazionali, configurazioni multi-istanza (vedi le FAQ)
Quando Listmonk è lo strumento sbagliato
Listmonk è la risposta giusta per una situazione specifica. Se la tua situazione è diversa, esiste una risposta migliore.
Volume inferiore a ~10K email al mese. I piani gratuiti gestiti di Brevo o Mailchimp possono costare meno, tutto incluso, rispetto a un VPS più un relay SMTP a questa scala. L'auto-hosting inizia a convenire una volta superata quella soglia. Verifica i numeri rispetto al tuo reale numero di iscritti e alla frequenza di invio prima di distribuire.
Team non tecnico. Mailchimp e Brevo hanno interfacce davvero migliori per chi non lavora da terminale. Listmonk presuppone che qualcuno nel team sappia collegarsi via SSH a un server, leggere i log di Docker e interpretare la propagazione DNS. Se quella persona non esiste, i servizi gestiti sono la scelta corretta.
Hai bisogno di flussi di automazione. Listmonk invia campagne. Non supporta sequenze drip, email attivate dal comportamento o costruttori visivi di flussi di lavoro. Se ti servono, usa Mautic oppure collega Listmonk a n8n per il livello di automazione.
Liste di iscritti sensibili al GDPR. Se i tuoi iscritti sono principalmente nell'UE o la tua lista è soggetta alle regole GDPR sulla residenza dei dati, esegui Listmonk in un datacenter europeo. Offriamo sedi a Francoforte e Londra che soddisfano i requisiti di residenza UE.
Cosa ti serve prima di iniziare
Listmonk più PostgreSQL più un carico di coda moderato richiedono come minimo 2 GB di RAM. 4 GB è l'obiettivo confortevole per la produzione.
Hardware. Per una lista personale sotto le 50K email al mese, è sufficiente un VPS con 2 vCPU, 4 GB di RAM e 120 GB di storage NVMe. Le liste in crescita che superano le 200K al mese richiedono 4 vCPU e 8 GB di RAM. Noi eseguiamo questa configurazione Compose su un VPS da 4 GB a Francoforte. Scegli una sede vicina ai tuoi iscritti, se puoi. La latenza di invio non conta molto; la reattività del pannello di amministrazione sì.
Dominio. Un dominio puntato al tuo VPS tramite un record A. Usa un sottodominio per l'interfaccia di amministrazione, ad esempio mail.example.com. Il dominio di invio e il sottodominio di amministrazione possono essere lo stesso dominio radice.
Account presso un relay SMTP. Non crearne ancora uno. La scelta del relay è la decisione più importante di questa guida e dipende dal tuo volume. Salta avanti alla sezione "Scegliere il tuo relay SMTP", scegli un provider, poi torna qui con host SMTP, porta, nome utente e password alla mano.
Software sul VPS. Ubuntu 22.04 LTS o 24.04 LTS. Docker Engine 24.0 o superiore con il plugin Docker Compose. UFW o un firewall equivalente con le porte 22, 80 e 443 aperte. Accesso SSH come utente sudo non root.
Distribuisci Listmonk con Docker Compose

Crea una directory per la distribuzione, poi inserisci un file docker-compose.yml con due servizi: postgres per il database e listmonk per l'applicazione. Entrambi si riavviano in caso di errore. Listmonk si lega a 127.0.0.1 così il reverse proxy è l'unica cosa che può raggiungerlo.
Il file Docker Compose
I notice your message seems incomplete - it just says "Here is the" without the actual text to translate.
Could you please provide the full English text you'd like me to translate to Italian? docker-compose.yml. Verifica i tag esatti dell'immagine e i nomi delle variabili d'ambiente rispetto alla documentazione ufficiale di installazione di Listmonk. Cambiano a ogni rilascio.
# 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:
Crea un .env file con POSTGRES_PASSWORD= impostato su una stringa casuale lunga. Poi avvia lo stack ed esegui l'installazione una tantum del database:
# 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
Il --install Il comando richiede un'email e una password di amministratore. Salvale. Verifica che entrambi i container siano in esecuzione:
docker compose ps
Output atteso: due servizi elencati, entrambi con stato Up. La riga di postgres dovrebbe mostrare (healthy).
Il 127.0.0.1:9000 Il binding è deliberato. Listmonk non ha un limitatore di frequenza integrato per l'autenticazione né una allowlist di IP. Esporre la porta 9000 su internet pubblico significa che chiunque sul pianeta può raggiungere il tuo login di amministrazione. Il reverse proxy è ciò che rende quel login raggiungibile solo via HTTPS.
Reverse proxy Nginx e SSL
Installa Nginx e Certbot dai repository di Ubuntu. Crea una configurazione del sito in /etc/nginx/sites-available/listmonk con gli header di proxy di cui Listmonk ha bisogno per generare link di campagna corretti:
# /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";
}
}
Crea un symlink in sites-enabled, testa la configurazione, ricarica Nginx, poi emetti un certificato:
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 riscrive il blocco server per ascoltare sulla porta 443 con il nuovo certificato e aggiunge un redirect da HTTP a HTTPS. Verifica:
curl -I https://mail.example.com
Output atteso: HTTP/2 200 con un header strict-transport-security valido. Se ottieni un loop di redirect, controlla che l'header X-Forwarded-Proto sia impostato nella configurazione Nginx qui sopra. Nove volte su dieci, il loop è quell'header.
Se Listmonk è l'unica cosa su questo VPS, usa Caddy al suo posto. Il Caddyfile è di tre righe e gestisce il rinnovo del certificato senza un cron job:
mail.example.com {
reverse_proxy 127.0.0.1:9000
}
Correggere l'header Message-ID
Per impostazione predefinita, Listmonk usa l'hostname di sistema nell'header Message-ID in uscita. Se l'hostname del tuo VPS è localhost o qualcosa che non è un FQDN valido, Listmonk invia Message-ID: <[email protected]>. I filtri antispam di Gmail e Outlook lo segnalano immediatamente. Questo è documentato nel thread 15410 del Cloudron Forum.
La correzione è una sola riga nel file config.tomldi Listmonk. Per un'installazione nuova, genera il file tramite docker compose run --rm app ./listmonk --new-config. Poi imposta:
[app]
hostname = "mail.example.com"
Riavvia il container dell'app dopo la modifica:
docker compose restart app
Fallo prima di inviare anche una sola campagna. Una lista contaminata con Message-ID localhost.localdomain è più difficile da recuperare di una partita pulita fin dall'inizio.
Consiglio professionale
Se preferisci saltare la configurazione con Compose, dai un'occhiata al nostro VPS Listmonk one-click per distribuire Listmonk in pochi minuti con un clic. L'istanza arriva preconfigurata con PostgreSQL. Devi comunque configurare il tuo relay SMTP e aggiungere i tuoi record DNS. Quei passaggi non sono opzionali, a prescindere da come distribuisci.
Scegliere il tuo relay SMTP

Tutto l'invio passa attraverso un relay che configuri tu. La reputazione IP del relay, i suoi limiti di frequenza e la gestione dei bounce sono ciò che determina se la tua email arriva nella posta in arrivo o nello spam.
Ecco il confronto funzionale. I prezzi e i limiti dei piani gratuiti cambiano. Verifica ciascuno sulla pagina ufficiale dei prezzi del provider prima di impegnarti.
| Fornitore | Struttura dei costi | Webhook di bounce | Ideale per |
|---|---|---|---|
| Amazon SES | Per email, molto basso ad alto volume | Sì, tramite SNS | Costo ad alto volume; già su AWS |
| Postmark | Base mensile più costo per email | Sì, nativo | Orientato alla deliverability; reputazione transazionale |
| Brevo | Piano gratuito per volumi bassi, piani a pagamento oltre | Sì | Volumi bassi con percorso di upgrade |
| Mailgun | Prezzo per email | Nessun endpoint webhook nativo; usa la generica bounce API se necessario. | Familiare agli sviluppatori |
Questa era solo una breve panoramica di ogni relay SMTP. Ora analizzeremo ciascuno in profondità.
Amazon SES (punto di partenza consigliato)
SES è l'opzione più economica ad alto volume e la più discussa nella community di Listmonk. La configurazione ha più passaggi di Postmark o Brevo, ma la differenza di costo per email è abbastanza grande, a qualsiasi volume reale, da giustificare il lavoro.
Configuralo in tre fasi. Primo, crea un utente IAM con la policy AmazonSESFullAccess (o una policy personalizzata più restrittiva con solo ses:SendRawEmail e ses:GetSendQuota). Secondo, verifica il tuo dominio di invio nella console SES. SES ti guida attraverso i CNAME DKIM da aggiungere. Terzo, genera le credenziali SMTP dal pannello delle impostazioni SMTP di SES. Queste non sono le tue chiavi d'accesso AWS; SES genera un nome utente e una password SMTP separati e dedicati quando fai clic su "Create SMTP credentials".
Nell'amministrazione di Listmonk, in Settings → SMTP, aggiungi un nuovo server con:
- Host:
email-smtp.<region>.amazonaws.com(usa la regione SES in cui hai verificato il dominio) - Porta: 587
- Protocollo di autenticazione: LOGIN
- TLS: STARTTLS
- Nome utente e password: le credenziali SMTP generate da SES
SES richiede STARTTLS sulla porta 587. Se lasci TLS impostato su none o scegli la porta 465, Listmonk si connette, SES restituisce 530 Must issue a STARTTLS command first, e il test delle credenziali SMTP nel pannello di amministrazione può comunque mostrare successo. Invia una vera email di prova a una casella personale che controlli prima di lanciare qualsiasi campagna.
I nuovi account SES partono in modalità sandbox. In sandbox puoi inviare solo a indirizzi email verificati, il che non è utile per una lista di iscritti. Apri un ticket di supporto dalla console SES per richiedere l'accesso in produzione. L'approvazione richiede di solito un giorno lavorativo.
Postmark (alternativa orientata alla deliverability)
Postmark costa più di SES per email, ma ha supporto nativo per i webhook di bounce e una reputazione di alti tassi di consegna in posta in arrivo grazie a policy di invio rigorose. Ne vale la pena se le tue newsletter sono critiche per l'attività o non vuoi gestire l'approvazione da sandbox a produzione di SES.
La configurazione di Listmonk ha la stessa forma di SES: host, porta 587, STARTTLS, credenziali dal pannello dei token API del server Postmark. Verifica il tuo dominio di invio nella configurazione delle firme di Postmark, aggiungi i record DKIM che Postmark genera e sei pronto a inviare.
Scegli Postmark quando la deliverability conta più del costo per email. Scegli SES quando il volume conta più dell'assistenza passo passo.
Un avvertimento sul test delle credenziali SMTP. Il test di connessione nell'amministrazione di Listmonk riporta sempre successo, anche con credenziali non valide. Questo è documentato in alcune issue su GitHub. Non fidartene. Dopo aver configurato qualsiasi relay, invia una campagna a un singolo iscritto di prova e conferma la ricezione nella casella di destinazione prima di inviare a tutta la tua lista.
Evita Mailersend per l'invio di campagne in massa. Il suo limite di 5 email per connessione produce errori 421 Service not available che Listmonk registra come inviate anche se la consegna è fallita. La campagna sembra riuscita in Listmonk e perde gran parte dei suoi messaggi senza alcun avviso.
Far arrivare davvero le email: SPF, DKIM e DMARC

Questi sono tre record DNS sul tuo dominio di invio che dicono ai server di posta riceventi che il tuo dominio ha autorizzato questo relay a inviare per tuo conto. Saltane anche uno solo e una parte significativa dei tuoi invii finirà nello spam su larga scala, per quanto puliti siano il tuo relay o i tuoi testi. Aggiungili presso il tuo provider DNS prima di inviare la prima campagna.
Record SPF
SPF autorizza IP o servizi di invio specifici a inviare email per il tuo dominio. Aggiungi un singolo record TXT alla radice del tuo dominio di invio con l'include del tuo relay. Per SES il record ha questo aspetto:
v=spf1 include:amazonses.com ~all
Per Postmark, sostituisci l'include con include:spf.mtasv.net. Controlla sempre la documentazione SPF ufficiale del tuo relay per il valore esatto dell'include. Cambia da provider a provider e a volte da regione a regione.
Un dominio può avere un solo record SPF. Se ne hai già uno per un altro servizio (Google Workspace, Microsoft 365), unisci l'include nel record esistente invece di aggiungerne un secondo.
DKIM
DKIM allega una firma crittografica alle email in uscita che i server riceventi verificano rispetto a una chiave pubblica nel tuo DNS. Il tuo relay genera la coppia di chiavi. Tu aggiungi la chiave pubblica come record TXT in un sottodominio selettore (ad esempio, sel1._domainkey.example.com) con il valore esatto che il relay ti fornisce.
Listmonk non gestisce la firma DKIM. Lo fa il relay. Non esiste una configurazione DKIM specifica per Listmonk. Segui la procedura guidata di configurazione DKIM del tuo relay, aggiungi i record che ti fornisce e attendi la propagazione DNS (di solito meno di 30 minuti; a volte qualche ora).
DMARC
DMARC dice ai server riceventi cosa fare con le email che non superano i controlli SPF o DKIM. Inizia in modalità monitoraggio con p=none così puoi vedere i fallimenti nei report aggregati senza incidere sulla deliverability mentre sistemi le configurazioni errate. Aggiungi un record TXT in _dmarc.example.com:
v=DMARC1; p=none; rua=mailto:[email protected]
Dopo due o tre settimane di report puliti, irrigidisci la policy a p=quarantine or p=reject. Non saltare la fase di monitoraggio. Un errore di battitura nel tuo include SPF combinato con p=reject fin dal primo giorno cancellerà la tua stessa posta legittima senza alcun segnale che qualcosa sia andato storto.
L'header List-Unsubscribe (RFC 8058) viene generato automaticamente da Listmonk. Conferma che sia attivo in Settings → General. Gmail e Apple Mail mostrano questo header come opzione di disiscrizione con un clic, il che protegge la reputazione del mittente.
Cosa si rompe davvero in produzione
Quattro modalità di guasto che non si manifestano finché non invii la tua prima campagna reale. Individuale prima che lo facciano i tuoi iscritti.
Problema 1: il tasso di bounce non corrisponde al numero del tuo relay. Listmonk elabora i bounce leggendo un indirizzo email di bounce designato via POP3 e cancellando ogni messaggio che legge. Questo include risposte di assenza, ricevute di consegna e notifiche di fuori sede, tutte classificate come bounce. Il tuo relay conta solo i veri fallimenti di consegna restituiti dai server di posta dei destinatari. Se SES riporta lo 0,6% e Listmonk riporta il 4%, è questo il divario. La soluzione è configurare callback via webhook per i bounce al posto del POP3. Per SES, usa SNS per consegnare le notifiche di bounce all'endpoint webhook di Listmonk. Per Postmark, punta il suo webhook nativo allo stesso endpoint. I bounce via webhook sono accurati; quelli via POP3 gonfiano i numeri.
Problema 2: il test delle credenziali SMTP dice successo quando è sbagliato. Come notato nella sezione sui relay, il test di connessione riporta sempre successo a prescindere dalla validità delle credenziali. Non fidartene. Invia sempre una vera email di prova dopo aver configurato o modificato qualsiasi impostazione SMTP.
Problema 3: una campagna si ferma a metà invio senza errori. Listmonk segna le campagne come Finished anche quando solo il 60% degli iscritti ha ricevuto l'email. Gli invii restanti sono stati rifiutati dal relay o limitati a livello di rete del VPS, e Listmonk non segnala nessuno dei due come errore a livello di campagna (thread 13165 del Cloudron Forum"). Se una campagna mostra meno invii degli iscritti, apri la dashboard del tuo relay per la finestra temporale dell'invio e confronta il conteggio accettato dal relay con quello di Listmonk. La verità è nel relay.
Problema 4: nessuno sta facendo il backup di PostgreSQL. Il volume di Compose mantiene i dati tra i riavvii. Non protegge da guasti dell'host, da un docker volume rm accidentale o da aggiornamenti corrotti. Aggiungi un pg_dump quotidiano:
0 2 * * * docker exec listmonk-postgres pg_dump -U listmonk listmonk > /backups/listmonk-$(date +\%Y\%m\%d).sql
Esegui prima la riga una volta a mano. Verifica che il file di output non sia vuoto prima di affidarti alla voce cron. Uno script di backup che scrive un file di zero byte senza sollevare un errore è peggio di nessun backup, perché smetti di pensarci.
Prima di affidarti a tutto questo in produzione, invia una campagna di prova a un solo iscritto e conferma la ricezione nella casella di destinazione. Se quella singola email arriva pulita, lo faranno anche le prossime diecimila.
Domande frequenti
Perché i miei tassi di bounce su Listmonk sono più alti di quelli riportati da Amazon SES?
L'elaborazione dei bounce via POP3 di Listmonk gonfia i conteggi leggendo le risposte di fuori sede e gli auto-risponditori di assenza come bounce. Configura i callback via webhook SNS di SES per conteggi accurati.
Listmonk supporta le email transazionali?
Listmonk è uno strumento per newsletter e campagne di invio massivo. Non gestisce nativamente le email transazionali (reset password, conferme d'ordine, email attivate uno a uno). Per le email transazionali dallo stesso dominio di invio, configura separatamente l'endpoint transazionale del tuo relay o usa uno strumento dedicato come Postal o la transactional API di Postmark insieme a Listmonk.
Come importo i miei iscritti di Mailchimp in Listmonk?
Esporta la tua lista Mailchimp come CSV da Audience → Export Audience. In Listmonk, vai su Subscribers → Import e carica il CSV. Mappa le colonne email e nome quando richiesto. Listmonk accetta gli export CSV standard da Mailchimp, ConvertKit e dalla maggior parte delle piattaforme di newsletter senza conversione di formato.
Cosa succede quando qualcuno si disiscrive da una campagna Listmonk?
Listmonk aggiunge un link di disiscrizione a ogni email di campagna per impostazione predefinita. Quando un iscritto fa clic, viene aggiunto alla blocklist e rimosso da tutte le campagne future. L'header List-Unsubscribe (RFC 8058) è incluso automaticamente, così i client di posta che supportano la disiscrizione con un clic (Gmail, Apple Mail) lo mostrano in modo nativo. Il record dell'iscritto resta nel database a fini di audit, ma non gli verranno più inviate campagne.