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.com que 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

PuertoProtocoloUso
993IMAPSLectura de correo por IMAP cifrado
995POP3SDescarga de correo por POP3 cifrado
587SubmissionEnvío de correo autenticado (Postfix + Dovecot SASL)
143 / 110IMAP / POP3Opcionales, 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.

ArchivoQué controla
10-auth.confAutenticación y mecanismos de login
10-mail.confUbicación y formato de los buzones
10-master.confServicios, puertos y sockets
10-ssl.confCertificados y cifrado
15-mailboxes.confCarpetas especiales (Enviados, Papelera…)
20-imap.conf, 20-pop3.conf, 20-lmtp.confAjustes 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.pem y no cert.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: plain es el estándar; login es 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 como pruebas o como pruebas@ejemplo.com indistintamente, 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:

AjusteValor
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
Usuariopruebas o pruebas@ejemplo.com
AutenticaciónContraseñ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_version y dovecot_storage_version.
  • mail_location se sustituye por ajustes separados como mail_driver = maildir y mail_path = ~/Maildir.
  • ssl_cert y ssl_key pasan a llamarse ssl_server_cert_file y ssl_server_key_file, y ya no se usa el prefijo <.
  • disable_plaintext_auth se sustituye por auth_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

  1. Cifra siempre: usa un certificado válido de Let’s Encrypt y ssl = required.
  2. Apuesta por IMAP y Maildir: son la combinación más fiable para el uso actual con varios dispositivos.
  3. Entrega por LMTP: índices actualizados, cuotas y filtros Sieve desde el primer momento.
  4. Protege el acceso: Fail2ban es imprescindible en cualquier servidor de correo público.
  5. 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.

Miguel Taboada

Ingeniero en Telecomunicaciones e Informática. Creé BlumHost para ofrecer un hosting distinto a los demás, que ofrezca la mejor atención al cliente, al menor precio y con la mejor calidad.

Ver todas las entradas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *