Pràctica: Llistes de Distribució amb Mailman i Docker
Objectius
En aquesta pràctica aprendràs a:
- ✅ Desplegar Mailman 3 amb Docker
- ✅ Configurar llistes de distribució personalitzades
- ✅ Crear diferents tipus de llistes (oberta, tancada, moderada)
- ✅ Gestionar usuaris i subscripcions
- ✅ Utilitzar la interfície web Postorius
- ✅ Configurar arxius de missatges amb HyperKitty
- ✅ Documentar la configuració i ús
Requisits
Programari necessari
- Docker Desktop o Docker Engine
- Docker Compose
- Navegador web
- Client de correu (Thunderbird, o accés webmail)
Coneixements previs
- Conceptes de correu electrònic (SMTP, MTA)
- Llistes de distribució
- Docker i contenidors
Part 1: Preparació de l'Entorn
Pas 1.1: Crear estructura de directoris
Crea un directori de treball personalitzat amb el teu nom:
# Substitueix NOMCOGNOM pel teu nom i cognom
mkdir -p ~/mailman-NOMCOGNOM
cd ~/mailman-NOMCOGNOM
# Crear subdirectoris
mkdir -p core web database
Exemple per Francesc Barragan:
Pas 1.2: Descarregar configuració de referència
Mailman 3 té una arquitectura complexa amb múltiples components. Utilitzarem una configuració simplificada.
Part 2: Docker Compose
Pas 2.1: Crear docker-compose.yml
Crea docker-compose.yml amb personalització:
services:
# Base de dades PostgreSQL - PERSONALITZAT
mailman-db-NOMCOGNOM:
image: postgres:13-alpine
container_name: mailman-db-NOMCOGNOM
environment:
- POSTGRES_DB=mailmandb
- POSTGRES_USER=mailman
- POSTGRES_PASSWORD=NOMCOGNOM2026!
volumes:
- ./database:/var/lib/postgresql/data
restart: unless-stopped
networks:
- mailman-network
# Mailman Core - PERSONALITZAT
mailman-core-NOMCOGNOM:
image: maxking/mailman-core:latest
container_name: mailman-core-NOMCOGNOM
hostname: mailman-core-NOMCOGNOM
environment:
- DATABASE_URL=postgresql://mailman:MailmanPass_NOMCOGNOM_2024!@mailman-db-NOMCOGNOM/mailmandb
- DATABASE_TYPE=postgres
- DATABASE_CLASS=mailman.database.postgresql.PostgreSQLDatabase
- HYPERKITTY_API_KEY=ApiKey_NOMCOGNOM_SecretKey
- MTA=postfix
# PERSONALITZA el domini
- MM_HOSTNAME=lists.NOMCOGNOM.local
volumes:
- ./core:/opt/mailman
depends_on:
- mailman-db-NOMCOGNOM
restart: unless-stopped
networks:
- mailman-network
# Mailman Web (Postorius + HyperKitty) - PERSONALITZAT
mailman-web-NOMCOGNOM:
image: maxking/mailman-web:latest
container_name: mailman-web-NOMCOGNOM
hostname: mailman-web-NOMCOGNOM
environment:
- DATABASE_URL=postgresql://mailman:NOMCOGNOM_2026!@mailman-db-NOMCOGNOM/mailmandb
- DATABASE_TYPE=postgres
- HYPERKITTY_API_KEY=ApiKey_NOMCOGNOM_SecretKey
# PERSONALITZA els dominis
- MAILMAN_REST_URL=http://mailman-core-NOMCOGNOM:8001
- MAILMAN_HOST_IP=mailman-core-NOMCOGNOM
- MAILMAN_ADMIN_USER=admin-NOMCOGNOM
- MAILMAN_ADMIN_EMAIL=NOMCOGNOM@sapalomera.cat
- SERVE_FROM_DOMAIN=localhost
- UWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static
ports:
- "8000:8000" # Interfície web
- "8080:8080" # uWSGI stats
volumes:
- ./web:/opt/mailman-web-data
depends_on:
- mailman-db-NOMCOGNOM
- mailman-core-NOMCOGNOM
restart: unless-stopped
networks:
- mailman-network
networks:
mailman-network:
driver: bridge
IMPORTANT: Substitueix NOMCOGNOM a:
- Noms de serveis i contenidors
- Contrasenyes
- API Keys
- Email d'administrador
- Hostnames
Part 3: Desplegament
Pas 3.1: Iniciar els serveis
# Aixecar els contenidors
docker-compose up -d
# Això pot trigar 1-2 minuts la primera vegada
# Mailman necessita crear la base de dades i estructures
# Verificar que tot està actiu
docker-compose ps
Hauries de veure 3 contenidors Up:
Pas 3.2: Verificar logs
# Logs de tots els serveis
docker-compose logs
# Només Mailman Core
docker-compose logs mailman-core-NOMCOGNOM
# Seguir logs en temps real
docker-compose logs -f
Busca missatges com:
mailman-core: Starting Mailman's master runner
mailman-web: Django version X.Y.Z
mailman-web: uWSGI running
Captura de pantalla 1: Sortida de docker-compose ps mostrant els 3 contenidors actius.
Part 4: Accés a la Interfície Web
Pas 4.1: Crear superusuari
Abans d'accedir a la web, crea un compte d'administrador:
# PERSONALITZA el nom d'usuari i email
docker exec -it mailman-web-NOMCOGNOM \
python manage.py createsuperuser
# Et demanarà:
Username: admin-NOMCOGNOM (exemple: admin-fbarragan)
Email: NOMCOGNOM@sapalomera.cat
Password: ********
Password (again): ********
Exemple per Joan Garcia:
Pas 4.2: Accedir a Postorius
Obre el navegador i accedeix a:
Fes login amb les credencials creades.
Captura de pantalla 2: Pàgina principal de Postorius després del login, mostrant el nom d'usuari personalitzat.
Part 5: Creació de Llistes
Pas 5.1: Crear Llista Oberta
Des de Postorius:
- Clica "Lists" → "Create New List"
- Emplena els camps personalitzats:
- List Name:
discussio-NOMCOGNOM(exemple:discussio-fbarragan) - Mail Host:
lists-NOMCOGNOM.local - List Style: Choose a list style → "Discuss"
- Description: "Llista de discussió general de [Nom Complet]"
- Advertise this list: ✅ Sí
- Clica "Create List"
Configuració específica per llista oberta:
- Ves a Lists →
discussio-NOMCOGNOM→ Settings → Message Acceptance - Default action for postings:
- Member:
Accept - Non-member:
Accept(això la fa oberta!) - Save Changes
Tipus: Llista oberta (qualsevol pot enviar, inclús sense subscripció)
Captura de pantalla 3: Llista oberta creada i configurada.
Pas 5.2: Crear Llista Tancada
Crea una segona llista:
- List Name:
equip-NOMCOGNOM(exemple:equip-fbarragan) - Mail Host:
lists-NOMCOGNOM.local - Description: "Llista tancada de l'equip de [Nom Complet]"
- List Style: "Private"
Configuració per llista tancada:
- Settings → Message Acceptance
- Member:
Accept - Non-member:
Hold for moderation(requereix aprovar) - Settings → Subscription Policy
- Subscription Policy:
Moderate(requereix aprovació per subscriure's) - Settings → Archiving
- Archive policy:
private(arxius només visibles per membres)
Tipus: Llista tancada (només membres poden enviar i veure arxius)
Pas 5.3: Crear Llista Moderada
Tercera llista:
- List Name:
anuncis-NOMCOGNOM(exemple:anuncis-fbarragan) - Description: "Anuncis oficials de [Nom Complet] - Només lectura"
- List Style: "Announce only"
Configuració per llista només anuncis:
- Settings → Message Acceptance
- Member:
Hold for moderation(fins i tot membres necessiten aprovació!) - Moderator: Només tu (admin)
- Settings → Subscription Policy
- Subscription Policy:
Open(qualsevol es pot subscriure) - Unsubscription Policy:
Open
Tipus: Llista moderada / només anuncis (només admins publiquen)
Taula resum:
| Llista | Tipus | Qui pot enviar | Qui pot subscriure | Arxius |
|---|---|---|---|---|
| discussio-NOMCOGNOM | Oberta | Qualsevol | Lliure | Públics |
| equip-NOMCOGNOM | Tancada | Només membres | Amb aprovació | Privats |
| anuncis-NOMCOGNOM | Moderada | Només admin | Lliure | Públics |
Captura de pantalla 4: Llista de les 3 llistes creades a Postorius.
Part 6: Gestió d'Usuaris
Pas 6.1: Subscriure usuaris a llista oberta
A discussio-NOMCOGNOM:
- Mass Operations → Mass Subscribe
- Afegeix 3 adreces de correu (poden ser fictícies per aquesta pràctica): Exemple per Joan Garcia:
- Subscribe
Nota: Com que estem en entorn de proves sense servidor SMTP real, els emails no s'enviaran. Això és acceptable per a aquesta pràctica.
Pas 6.2: Subscriure usuaris a llista tancada
A equip-NOMCOGNOM:
- Afegeix 2 membres:
- Subscribe
Pas 6.3: Subscriure usuaris a llista d'anuncis
A anuncis-NOMCOGNOM:
- Afegeix 4-5 subscriptors
- Els usuaris rebran anuncis però no poden enviar
Captura de pantalla 5: Llista de membres d'una de les llistes amb emails personalitzats.
Part 7: Arxius amb HyperKitty
Pas 7.1: Accedir als arxius
Desde Postorius, clica sobre una llista i després "Archives".
Això et portarà a HyperKitty, l'arxiu de missatges.
URL: http://localhost:8000/hyperkitty/list/discussio-NOMCOGNOM@lists-NOMCOGNOM.local/
Pas 7.2: Simular enviament de missatge
Com que no tenim servidor SMTP configurat, simula un missatge directament a la base de dades (només per veure els arxius):
Alternativament, pots visualitzar l'estructura d'arxius sense missatges reals.
Captura de pantalla 6: Pàgina d'arxius de HyperKitty (encara que estigui buida).
Part 8: Configuració Avançada
Pas 8.1: Configurar benvinguda personalitzada
Per a equip-NOMCOGNOM:
- Settings → Automatic Responses
- Welcome message:
- Save
Pas 8.2: Configurar capçaleres de correu
- Settings → Header Filters
- Afegeix capçalera personalitzada:
- Header:
X-Mailman-Version - Pattern:
.*(accepta qualsevol) - Action:
Accept
Pas 8.3: Configurar retenció de missatges
- Settings → Archiving
- Archive policy:
publicoprivatesegons el tipus de llista - Archive rendering mode:
text(més segur) omarkdown
Part 9: Exportació i Backup
Pas 9.1: Exportar configuració de llista
# Llista configuracions de totes les llistes
docker exec mailman-core-NOMCOGNOM mailman lists
# Exportar configuració d'una llista específica
docker exec mailman-core-NOMCOGNOM \
mailman conf -l discussio-NOMCOGNOM@lists-NOMCOGNOM.local \
> config-discussio-NOMCOGNOM.txt
Captura de pantalla 7: Sortida de mailman lists mostrant les 3 llistes creades.
Pas 9.2: Backup de base de dades
# Backup de PostgreSQL
docker exec mailman-db-NOMCOGNOM \
pg_dump -U mailman mailmandb \
> backup-mailman-NOMCOGNOM-$(date +%Y%m%d).sql
Qüestions i Exercicis
Qüestió 1: Tipus de llistes
Completa la taula amb les característiques de cada tipus:
| Característica | Llista Oberta | Llista Tancada | Llista Moderada |
|---|---|---|---|
| Qui pot enviar? | |||
| Subscripció lliure? | |||
| Arxius públics? | |||
| Cas d'ús típic |
Qüestió 2: Configuració
a) Quina diferència hi ha entre Hold for moderation i Reject per a non-members?
b) Per què és important desactivar els arxius públics en llistes privades?
c) Què és la política de digest i quan és útil?
Qüestió 3: Escalabilitat
Si la llista discussio-NOMCOGNOM té 500 subscriptors i reben una mitjana de 10 missatges/dia:
a) Quants emails s'envien diàriament?
b) Si cada email és ~50 KB, quant d'espai ocupen els arxius al mes?
c) Quins problemes podrien aparèixer amb 10.000 subscriptors?
Exercici 1: Llista amb digest
Configura la llista equip-NOMCOGNOM per oferir mode digest:
- Settings → Digest
- Digest size threshold: 30 KB
- Should Mailman send periodic digests: Yes
- Digest send frequency: Daily
Subscriu un usuari en mode digest: digest-NOMCOGNOM@exemple.cat
Exercici 2: Templates personalitzats
Personalitza el template de benvinguda amb HTML:
<html>
<body>
<h2>Benvingut/da a {{list_name}}!</h2>
<p>Administrador: <strong>{{owner}}</strong></p>
<p>Descripció: {{description}}</p>
</body>
</html>
Exercici 3: Script de gestió massiva
Crea un script bash que:
- Llegeix un fitxer CSV amb emails
- Subscriu tots els usuaris a discussio-NOMCOGNOM
- Genera un informe dels subscrits amb èxit
Lliurament
Format de lliurament
Document PDF amb:
1. Portada
- Nom complet, curs, data
2. Configuració
docker-compose.ymlcomplet amb personalitzacions destacades- Captura de variables d'entorn personalitzades
3. Captures de pantalla (mínimes 7)
docker-compose psamb contenidors actius- Postorius després del login (nom d'usuari visible)
- Llista oberta creada i configurada
- Llista de les 3 llistes amb noms personalitzats
- Membres d'una llista amb emails personalitzats
- Pàgina d'arxius HyperKitty
- Sortida de
mailman lists
4. Taula de llistes creades
| Nom llista | Tipus | Política enviament | Política subscripció | Arxius | Membres |
|---|---|---|---|---|---|
| discussio-NOMCOGNOM | Oberta | ... | ... | ... | 3 |
| equip-NOMCOGNOM | ... | ... | ... | ... | ... |
| anuncis-NOMCOGNOM | ... | ... | ... | ... | ... |
5. Respostes a qüestions
- Qüestió 1: Taula completada
- Qüestió 2: a, b, c amb respostes raonades
- Qüestió 3: a, b, c amb càlculs
6. Exercicis opcionals
- Documentació exercicis realitzats
7. Reflexió personal (250-300 paraules)
- Utilitat de les llistes de distribució
- Comparativa Mailman vs grups de Telegram/WhatsApp
- Casos d'ús reals a l'institut/empresa
- Dificultats trobades
Criteris d'Avaluació
| Criteri | Punts | Pes |
|---|---|---|
| Personalització (noms llistes, emails, configuracions) | 1,5 | 15% |
| Docker Compose funcional | 1,5 | 15% |
| 3 llistes creades amb tipus correctes | 2,0 | 20% |
| Configuració específica per tipus | 1,5 | 15% |
| Usuaris subscrits correctament | 1,0 | 10% |
| Captures de pantalla completes | 1,5 | 15% |
| Respostes a qüestions | 1,0 | 10% |
| TOTAL | 10,0 | 100% |
Penalitzacions
| Infracció | Penalització |
|---|---|
| Còpia detectada | -10 (qualificació 0) |
| NOMCOGNOM sense substituir | -2,0 punts |
| Menys de 3 llistes creades | -2,0 punts |
| Llistes sense configuració específica de tipus | -1,5 punts |
| Contenidors no funcionals | -2,5 punts |
| Captura obligatòria absent | -0,25 punts cada una |
Requisits mínims
- 3 contenidors actius (db, core, web)
- 2+ llistes creades amb noms personalitzats
- Accés a Postorius funcional
- Configuració bàsica de tipus de llista
- Captures mínimes (5 de 7)
Recursos Addicionals
Documentació
Alternatives
- Listmonk - Newsletter moderna
- Sympa - Alternativa a Mailman
- Discourse - Fòrum modern amb funcions de llista
Solució de Problemes
Els contenidors no s'inicien
No puc accedir a Postorius
Causa: Contenidor web no està llest.
Solució: Espera 1-2 minuts, després refresca. Verifica:
Error al crear llista
Causa: Domini no configurat correctament.
Solució: Verifica que MM_HOSTNAME a docker-compose coincideix amb el Mail Host utilitzat.
Conclusió
Ara tens un sistema complet de llistes de distribució amb:
- ✅ Mailman 3 desplegat amb Docker
- ✅ 3 tipus de llistes configurades (oberta, tancada, moderada)
- ✅ Gestió d'usuaris i subscripcions
- ✅ Interfície web Postorius
- ✅ Arxius amb HyperKitty
Aquesta configuració és aplicable a: - Comunicació interna d'empreses/institucions - Grups d'estudi i projectes col·laboratius - Newsletters i anuncis oficials - Comunitats i associacions
Enhorabona per dominar les llistes de distribució! 📧📋