Cómo instalar y configurar Dovecot (IMAP y POP3) en tu VPS: guía completa
Introducción
Si ya tienes Postfix enviando y recibiendo correo en tu servidor, te falta una pieza fundamental: que tus usuarios puedan leer ese correo desde Thunderbird, Outlook, el móvil o un webmail. De eso se encarga Dovecot.
Dovecot es el servidor IMAP y POP3 más utilizado en Linux. Es rápido, seguro por diseño y muy flexible. En una instalación típica cumple tres funciones:
- Servidor IMAP/POP3: permite a los clientes de correo consultar los buzones.
- Entrega local (LMTP): recibe los mensajes de Postfix y los guarda en el buzón correcto, actualizando sus índices al momento.
- Autenticación SMTP (SASL): Postfix le pregunta a Dovecot si un usuario y contraseña son válidos antes de permitirle enviar correo.
Es decir, Postfix transporta el correo entre servidores y Dovecot lo guarda y lo sirve a los usuarios. Juntos forman un servidor de correo completo.
En esta guía instalaremos Dovecot en un VPS, lo protegeremos con un certificado SSL gratuito de Let’s Encrypt, lo integraremos con Postfix y comprobaremos que todo funciona desde la terminal y desde un cliente de correo.
Sobre las versiones: esta guía está escrita para Dovecot 2.3, la versión incluida en Ubuntu 22.04/24.04, Debian 12 y Rocky Linux 9. Dovecot 2.4 (incluido en distribuciones más recientes, como Debian 13) cambia bastante la sintaxis de configuración. Al final del artículo tienes una sección con las diferencias más importantes.
Antes de empezar
Lo que necesitas
- Un VPS con Ubuntu 22.04/24.04, Debian 12 o Rocky Linux 9, con acceso root o sudo
- Al menos 1 GB de RAM (2 GB o más si vas a añadir antispam y webmail)
- Postfix instalado y funcionando
- Un dominio con un registro A para
mail.ejemplo.comque apunte a la IP del servidor y un registro MX que apunte a ese nombre - El puerto 80 accesible temporalmente para obtener el certificado SSL
A lo largo de la guía usaremos ejemplo.com como dominio, mail.ejemplo.com como nombre del servidor y pruebas como usuario de ejemplo. Sustitúyelos por tus datos reales.
Puertos que vamos a usar
| Puerto | Protocolo | Uso |
|---|---|---|
| 993 | IMAPS | Lectura de correo por IMAP cifrado |
| 995 | POP3S | Descarga de correo por POP3 cifrado |
| 587 | Submission | Envío de correo autenticado (Postfix + Dovecot SASL) |
| 143 / 110 | IMAP / POP3 | Opcionales, con STARTTLS obligatorio |
¿IMAP o POP3?
Antes de configurar nada conviene tener clara la diferencia, porque condiciona cómo trabajarán tus usuarios.
Con IMAP, el correo vive en el servidor. El cliente muestra una copia sincronizada, así que si lees, mueves o borras un mensaje en el móvil, el cambio se ve también en el portátil y en el webmail. Es la opción adecuada para prácticamente cualquier uso actual, aunque requiere más espacio en disco en el servidor.
Con POP3, el cliente descarga los mensajes y, normalmente, los borra del servidor. Funciona sin conexión una vez descargado, pero cada dispositivo tiene su propia copia y nada se sincroniza. Hoy solo tiene sentido en casos concretos, como un único equipo que archiva todo el correo en local.
Nuestra recomendación: activa ambos protocolos para no limitar a nadie, pero configura IMAP por defecto en todas las cuentas.
Paso 1: Instalar Dovecot
Ubuntu/Debian
bash
sudo apt update
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd -y
Rocky Linux/AlmaLinux
En Rocky Linux un solo paquete incluye todos los protocolos:
bash
sudo dnf install dovecot -y
sudo systemctl enable --now dovecot
Comprobar la instalación
bash
dovecot --version
sudo systemctl status dovecot
doveconf protocols
El último comando debería devolver imap pop3 lmtp. En Rocky Linux, si falta alguno, añádelo en /etc/dovecot/dovecot.conf:
protocols = imap pop3 lmtp
Paso 2: Conocer la estructura de la configuración
Toda la configuración está en /etc/dovecot/. El archivo principal, dovecot.conf, apenas contiene nada: carga los archivos del directorio conf.d/, cada uno dedicado a un área concreta.
| Archivo | Qué controla |
|---|---|
10-auth.conf | Autenticación y mecanismos de login |
10-mail.conf | Ubicación y formato de los buzones |
10-master.conf | Servicios, puertos y sockets |
10-ssl.conf | Certificados y cifrado |
15-mailboxes.conf | Carpetas especiales (Enviados, Papelera…) |
20-imap.conf, 20-pop3.conf, 20-lmtp.conf | Ajustes de cada protocolo |
Antes de tocar nada, haz una copia de seguridad:
bash
sudo cp -a /etc/dovecot /etc/dovecot.orig
Un comando que usarás mucho: doveconf -n muestra únicamente los ajustes que difieren de los valores por defecto. Es la forma más rápida de ver tu configuración real sin leer decenas de comentarios.
Paso 3: Configurar los buzones en formato Maildir
Dovecot puede guardar el correo en formato mbox (todos los mensajes de una carpeta en un único archivo) o Maildir (un archivo por mensaje). Maildir es más robusto, se lleva mejor con varios accesos simultáneos y simplifica las copias de seguridad incrementales, así que es el que usaremos.
bash
sudo nano /etc/dovecot/conf.d/10-mail.conf
Localiza y ajusta estas líneas:
mail_location = maildir:~/Maildir
mail_privileged_group = mail
Carpetas especiales
Para que los clientes de correo reconozcan automáticamente las carpetas de Enviados, Borradores, Spam y Papelera, y se creen solas la primera vez que un usuario se conecta, edita:
bash
sudo nano /etc/dovecot/conf.d/15-mailboxes.conf
Añade auto = subscribe a cada carpeta:
namespace inbox {
mailbox Drafts {
auto = subscribe
special_use = \Drafts
}
mailbox Sent {
auto = subscribe
special_use = \Sent
}
mailbox Junk {
auto = subscribe
special_use = \Junk
}
mailbox Trash {
auto = subscribe
special_use = \Trash
}
}
Sin esto, es habitual que Outlook o el correo del iPhone creen sus propias carpetas («Sent Items», «Deleted Messages»…) y acabes con carpetas duplicadas.
Paso 4: Obtener un certificado SSL con Let’s Encrypt
Todo el acceso al correo debe ir cifrado. Si todavía no tienes certificado para mail.ejemplo.com, obtenlo con Certbot.
Ubuntu/Debian
bash
sudo apt install certbot -y
Rocky Linux
bash
sudo dnf install epel-release -y
sudo dnf install certbot -y
Solicita el certificado. El modo --standalone levanta un servidor web temporal, así que el puerto 80 debe estar libre y abierto:
bash
sudo certbot certonly --standalone -d mail.ejemplo.com
Los archivos quedarán en /etc/letsencrypt/live/mail.ejemplo.com/.
Los certificados de Let’s Encrypt caducan cada 90 días y Certbot los renueva automáticamente, pero Dovecot y Postfix no cargan el certificado nuevo hasta que se recargan. Crea un hook que lo haga por ti:
bash
sudo nano /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
bash
#!/bin/sh
systemctl reload dovecot
systemctl reload postfix
bash
sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
Si ya tienes una web en el mismo servidor sirviendo el puerto 80, usa en su lugar certbot certonly --webroot -w /ruta/de/tu/web -d mail.ejemplo.com.
Paso 5: Configurar SSL/TLS en Dovecot
bash
sudo nano /etc/dovecot/conf.d/10-ssl.conf
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.ejemplo.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.ejemplo.com/privkey.pem
ssl_min_protocol = TLSv1.2
ssl_prefer_server_ciphers = yes
Dos detalles importantes:
- El símbolo
<delante de la ruta no es un error: le indica a Dovecot que lea el contenido del archivo. Sin él, fallará al arrancar. - Usa siempre
fullchain.pemy nocert.pem. El primero incluye los certificados intermedios; sin ellos, algunos clientes (especialmente en móviles) mostrarán avisos de certificado no válido.
Con ssl = required, Dovecot rechaza cualquier inicio de sesión que no vaya cifrado, ya sea por conexión SSL directa (puertos 993/995) o mediante STARTTLS (puertos 143/110).
Paso 6: Configurar la autenticación
En esta guía usaremos los usuarios del sistema (las cuentas de Linux) como cuentas de correo, que es la opción más sencilla para un único dominio y pocos usuarios. Si necesitas alojar muchos dominios o cientos de buzones, lo adecuado son los usuarios virtuales con base de datos, que veremos en un artículo aparte.
bash
sudo nano /etc/dovecot/conf.d/10-auth.conf
disable_plaintext_auth = yes
auth_mechanisms = plain login
auth_username_format = %Ln
!include auth-system.conf.ext
Qué hace cada línea:
disable_plaintext_auth = yes: prohíbe enviar la contraseña sin cifrar.auth_mechanisms = plain login:plaines el estándar;logines necesario para algunos clientes antiguos de Outlook. Ambos son seguros porque la conexión ya va cifrada.auth_username_format = %Ln: convierte el usuario a minúsculas y elimina la parte del dominio. Así, el usuario puede iniciar sesión comopruebaso comopruebas@ejemplo.comindistintamente, y además evita un error muy común con LMTP que veremos en el paso 8.!include auth-system.conf.ext: valida contra los usuarios del sistema mediante PAM.
Crea un usuario de prueba:
bash
sudo adduser pruebas
En Rocky Linux, adduser no pide contraseña; añádela con sudo passwd pruebas.
Paso 7: Definir servicios, puertos y sockets
Este es el archivo que conecta Dovecot con Postfix:
bash
sudo nano /etc/dovecot/conf.d/10-master.conf
Puertos de IMAP y POP3
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
Si quieres que tus usuarios usen solo las conexiones cifradas desde el principio (993 y 995), puedes desactivar los puertos 143 y 110 poniendo port = 0. Es una configuración más sencilla de mantener y evita errores de configuración en los clientes.
Socket LMTP para la entrega de correo
Busca el bloque service lmtp y déjalo así:
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
Socket de autenticación para Postfix
Dentro del bloque service auth, añade:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
Ambos sockets se crean dentro de /var/spool/postfix/private/ porque, en Debian y Ubuntu, Postfix se ejecuta en un entorno aislado (chroot) y no puede ver archivos fuera de /var/spool/postfix.
Reinicia Dovecot y comprueba que los sockets existen:
bash
sudo systemctl restart dovecot
sudo ls -l /var/spool/postfix/private/ | grep -E "auth|dovecot-lmtp"
Paso 8: Integrar Dovecot con Postfix
Ahora le diremos a Postfix que entregue el correo a través de Dovecot y que use Dovecot para autenticar a los usuarios que envían.
bash
sudo nano /etc/postfix/main.cf
Añade al final:
# Entrega local a través de Dovecot LMTP
mailbox_transport = lmtp:unix:private/dovecot-lmtp
# Autenticación SMTP a través de Dovecot
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_tls_auth_only = yes
# Certificado TLS de Postfix
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.ejemplo.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.ejemplo.com/privkey.pem
smtpd_tls_security_level = may
Usar LMTP en lugar de que Postfix escriba directamente en el Maildir tiene ventajas: Dovecot actualiza sus índices en el momento de la entrega (las búsquedas son más rápidas), aplica cuotas y permite usar filtros Sieve.
Aquí entra en juego el auth_username_format = %Ln del paso 6: Postfix entrega por LMTP con la dirección completa (pruebas@ejemplo.com), pero el usuario del sistema se llama solo pruebas. Sin esa línea, Dovecot respondería que el usuario no existe y el correo quedaría retenido en la cola.
Activar el puerto de envío 587
Los usuarios deben enviar correo por el puerto 587 (submission), autenticándose y con cifrado obligatorio. Edita:
bash
sudo nano /etc/postfix/master.cf
Busca las líneas de submission, descoméntalas y déjalas así (las líneas que empiezan por -o deben ir con sangría):
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
Comprueba la configuración y recarga:
bash
sudo postfix check
sudo systemctl restart postfix
Paso 9: Abrir los puertos en el firewall
UFW (Ubuntu/Debian)
bash
sudo ufw allow 993/tcp comment 'IMAPS'
sudo ufw allow 995/tcp comment 'POP3S'
sudo ufw allow 587/tcp comment 'Submission'
# Solo si mantienes los puertos con STARTTLS:
sudo ufw allow 143/tcp comment 'IMAP'
sudo ufw allow 110/tcp comment 'POP3'
sudo ufw reload
Firewalld (Rocky Linux)
bash
sudo firewall-cmd --permanent --add-service=imaps
sudo firewall-cmd --permanent --add-service=pop3s
sudo firewall-cmd --permanent --add-service=submission
sudo firewall-cmd --reload
No olvides que el puerto 25 también debe estar abierto para que tu servidor reciba correo de otros servidores.
Paso 10: Probar que todo funciona
Revisar la configuración
bash
sudo doveconf -n
Si hay un error de sintaxis, este comando te indicará el archivo y la línea.
Probar la autenticación
bash
sudo doveadm auth test pruebas
Te pedirá la contraseña. La respuesta correcta es passdb: pruebas auth succeeded.
Probar la entrega de correo
Envía un mensaje al usuario desde el propio servidor (necesitas el paquete mailutils en Debian/Ubuntu o s-nail en Rocky):
bash
echo "Mensaje de prueba" | mail -s "Prueba Dovecot" pruebas@ejemplo.com
Comprueba que ha llegado al buzón:
bash
sudo ls /home/pruebas/Maildir/new/
Si no aparece, revisa la cola de Postfix con mailq y el registro con sudo journalctl -u postfix -n 50.
Probar IMAP desde la terminal
bash
openssl s_client -connect mail.ejemplo.com:993 -quiet
Una vez conectado, escribe los comandos uno a uno (el prefijo a, b, c es obligatorio en IMAP):
a LOGIN pruebas tu_contraseña
b SELECT INBOX
c LOGOUT
Tras SELECT INBOX deberías ver cuántos mensajes hay en el buzón.
Probar POP3 desde la terminal
bash
openssl s_client -connect mail.ejemplo.com:995 -quiet
USER pruebas
PASS tu_contraseña
STAT
QUIT
STAT devuelve el número de mensajes y su tamaño total.
Probar el envío autenticado
bash
openssl s_client -starttls smtp -connect mail.ejemplo.com:587 -quiet
Escribe EHLO prueba y comprueba que en la respuesta aparece la línea 250-AUTH PLAIN LOGIN. Eso confirma que Postfix está usando Dovecot para autenticar.
Configurar un cliente de correo
Con todo funcionando, estos son los datos que tus usuarios necesitan en Thunderbird, Outlook o el móvil:
| Ajuste | Valor |
|---|---|
| Servidor entrante (IMAP) | mail.ejemplo.com, puerto 993, SSL/TLS |
| Servidor entrante (POP3) | mail.ejemplo.com, puerto 995, SSL/TLS |
| Servidor saliente (SMTP) | mail.ejemplo.com, puerto 587, STARTTLS |
| Usuario | pruebas o pruebas@ejemplo.com |
| Autenticación | Contraseña normal |
Reforzar la seguridad
Bloquear ataques de fuerza bruta con Fail2ban
Cualquier servidor de correo expuesto recibe intentos de inicio de sesión automatizados a las pocas horas de ponerse en marcha. Fail2ban incluye filtros para Dovecot y Postfix; solo hay que activarlos.
bash
sudo apt install fail2ban -y # Ubuntu/Debian
sudo dnf install fail2ban -y # Rocky Linux (requiere EPEL)
bash
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
[dovecot]
enabled = true
[postfix-sasl]
enabled = true
bash
sudo systemctl enable --now fail2ban
sudo fail2ban-client status dovecot
Limitar conexiones simultáneas por usuario
Por defecto, Dovecot permite 10 conexiones IMAP simultáneas por usuario y dirección IP. Si un usuario tiene varios dispositivos detrás de la misma conexión (por ejemplo, en una oficina), puede que necesite más:
bash
sudo nano /etc/dovecot/conf.d/20-imap.conf
protocol imap {
mail_max_userip_connections = 20
}
No revelar información innecesaria
Por defecto, Dovecot se identifica en el saludo de conexión. Puedes sustituirlo por un mensaje neutro en dovecot.conf:
login_greeting = Servidor de correo listo.
Mantener el sistema actualizado
bash
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo dnf upgrade -y # Rocky Linux
Funciones adicionales
Cuotas de buzón
Para evitar que un solo usuario llene el disco, activa el plugin de cuotas. En 10-mail.conf:
mail_plugins = $mail_plugins quota
En 20-imap.conf, dentro del bloque protocol imap:
mail_plugins = $mail_plugins imap_quota
Y en 90-quota.conf:
plugin {
quota = count:Cuota de usuario
quota_vsizes = yes
quota_rule = *:storage=5G
quota_rule2 = Trash:storage=+500M
}
La regla de la papelera añade margen extra para que el usuario pueda seguir borrando mensajes aunque haya llegado al límite. Consulta el uso de un usuario con sudo doveadm quota get -u pruebas.
Filtros del lado del servidor con Sieve
Sieve permite a los usuarios crear reglas (mover mensajes a carpetas, respuestas automáticas de vacaciones…) que se aplican en el servidor, aunque no tengan ningún cliente abierto.
bash
sudo apt install dovecot-sieve dovecot-managesieved -y
En 20-lmtp.conf:
protocol lmtp {
mail_plugins = $mail_plugins sieve
}
Con ManageSieve activo, webmails como Roundcube ofrecen una interfaz gráfica para crear estas reglas.
Solución de problemas frecuentes
Lo primero ante cualquier problema es mirar el registro. Para ver más detalle en los fallos de autenticación, activa temporalmente auth_verbose = yes y auth_debug = yes en 10-logging.conf, reinicia Dovecot y observa el registro en tiempo real:
bash
sudo journalctl -u dovecot -f
Dovecot no arranca tras editar la configuración. Ejecuta sudo doveconf -n: te indicará el archivo y la línea exacta del error. Los fallos más habituales son una llave } sin cerrar o haber olvidado el < delante de la ruta del certificado.
El cliente muestra «Plaintext authentication disallowed on non-secure connections». El cliente intenta iniciar sesión sin cifrado. Configúralo con SSL/TLS en el puerto 993 (o STARTTLS en el 143).
El cliente avisa de que el certificado no es válido. Comprueba que usas fullchain.pem y que el nombre del servidor configurado en el cliente coincide exactamente con el del certificado (mail.ejemplo.com, no la IP ni el dominio raíz). Revisa la caducidad con sudo certbot certificates.
El correo queda en la cola de Postfix con «User doesn’t exist». Postfix entrega por LMTP la dirección completa y Dovecot no encuentra ese usuario. Revisa que auth_username_format = %Ln está en 10-auth.conf y reinicia Dovecot.
Postfix registra «SASL: Connect to private/auth failed». El socket de autenticación no existe o tiene permisos incorrectos. Comprueba el bloque service auth del paso 7 y que el archivo aparece en /var/spool/postfix/private/.
Los mensajes llegan pero no aparecen en el cliente. Suele deberse a problemas de permisos o a índices desincronizados. Comprueba que el Maildir pertenece al usuario (ls -ld /home/pruebas/Maildir) y regenera los índices con sudo doveadm force-resync -u pruebas INBOX.
Mantenimiento del día a día
Algunos comandos de doveadm que te resultarán útiles:
bash
# Usuarios conectados ahora mismo
sudo doveadm who
# Estado y número de mensajes de un buzón
sudo doveadm mailbox status -u pruebas all INBOX
# Listar las carpetas de un usuario
sudo doveadm mailbox list -u pruebas
# Reconstruir los índices de todas las carpetas
sudo doveadm force-resync -u pruebas '*'
# Ver intentos fallidos de inicio de sesión de hoy
sudo journalctl -u dovecot --since today | grep -i "auth failed"
Y no olvides las copias de seguridad. Gracias a Maildir, basta con copiar los directorios de los usuarios con una herramienta incremental como rsync o restic. Te recomendamos guardar las copias fuera del propio servidor y probar de vez en cuando que se pueden restaurar.
Si usas Dovecot 2.4
Dovecot 2.4 introduce cambios importantes en la configuración, y los archivos de 2.3 no funcionan sin adaptarlos. Algunos ejemplos:
- El archivo de configuración debe empezar declarando la versión con
dovecot_config_versionydovecot_storage_version. mail_locationse sustituye por ajustes separados comomail_driver = maildirymail_path = ~/Maildir.ssl_certyssl_keypasan a llamarsessl_server_cert_fileyssl_server_key_file, y ya no se usa el prefijo<.disable_plaintext_authse sustituye porauth_allow_cleartext.
Si tu distribución instala la versión 2.4 (compruébalo con dovecot --version), consulta la guía de actualización de la documentación oficial antes de aplicar la configuración de este artículo.
Conclusión
Con Dovecot configurado, tu servidor ya ofrece un servicio de correo completo: Postfix envía y recibe, Dovecot almacena los mensajes y los sirve de forma cifrada a cualquier dispositivo, y ambos comparten un mismo sistema de autenticación.
Resumen
- Cifra siempre: usa un certificado válido de Let’s Encrypt y
ssl = required. - Apuesta por IMAP y Maildir: son la combinación más fiable para el uso actual con varios dispositivos.
- Entrega por LMTP: índices actualizados, cuotas y filtros Sieve desde el primer momento.
- Protege el acceso: Fail2ban es imprescindible en cualquier servidor de correo público.
- Vigila y haz copias: revisa los registros periódicamente y guarda copias fuera del servidor.
Próximos pasos
Para que tu servidor de correo esté listo para producción, te recomendamos continuar con:
- SPF, DKIM y DMARC, para que tu correo llegue a la bandeja de entrada y no a spam (tienes la guía completa en nuestro blog)
- Un filtro antispam como Rspamd
- Un webmail como Roundcube, para acceder al correo desde el navegador
- Usuarios virtuales, si necesitas alojar varios dominios en el mismo servidor
Tu servidor de correo en un VPS de BlumHost
Los VPS de BlumHost cuentan con almacenamiento NVMe, protección Anti-DDoS e IP dedicada, todo alojado en España y con soporte en español 24/7. Si prefieres no gestionar tu propio servidor de correo, nuestros planes de hosting con cPanel incluyen cuentas de correo listas para usar.
