Correo electrónico · 8 min read · Jan 26, 2026
Usuarios y Dominios Virtuales Con Postfix, Courier, MySQL Y SquirrelMail (Ubuntu 14.04LTS)
Este tutorial es Copyright (c) 2014 por Falko Timme & Srijan Kishore. Se deriva de un tutorial de Christoph Haas que puedes encontrar en http://workaround.org. Eres libre de usar este tutorial bajo la licencia Creative Commons 2.5 o cualquier versión posterior.
Este documento describe cómo instalar un servidor de correo Postfix que se basa en usuarios y dominios virtuales, es decir, usuarios y dominios que están en una base de datos MySQL. También demostraré la instalación y configuración de Courier (Courier-POP3, Courier-IMAP), para que Courier pueda autenticar contra la misma base de datos MySQL que utiliza Postfix.
El servidor Postfix resultante es capaz de SMTP-AUTH y TLS y cuota (la cuota no está integrada en Postfix por defecto, mostraré cómo parchear tu Postfix adecuadamente). Las contraseñas se almacenan en forma encriptada en la base de datos (la mayoría de los documentos que encontré trataban con contraseñas en texto plano, lo cual es un riesgo de seguridad). Además de eso, este tutorial cubre la instalación de Amavisd, SpamAssassin y ClamAV para que los correos electrónicos sean escaneados en busca de spam y virus. También mostraré cómo instalar SquirrelMail como una interfaz de webmail para que los usuarios puedan leer y enviar correos electrónicos y cambiar sus contraseñas.
La ventaja de tal configuración “virtual” (usuarios y dominios virtuales en una base de datos MySQL) es que es mucho más eficiente que una configuración basada en usuarios del sistema “reales”. Con esta configuración virtual, tu servidor de correo puede manejar miles de dominios y usuarios. Además, es más fácil de administrar porque solo tienes que lidiar con la base de datos MySQL cuando agregas nuevos usuarios/dominios o editas los existentes. No más comandos postmap para crear archivos db, no más recargas de Postfix, etc. Para la administración de la base de datos MySQL, puedes usar herramientas basadas en la web como phpMyAdmin, que también se instalará en este tutorial. La tercera ventaja es que los usuarios tienen una dirección de correo electrónico como nombre de usuario (en lugar de un nombre de usuario + una dirección de correo electrónico), lo cual es más fácil de entender y recordar.
Este tutorial está destinado a ser una guía práctica; no cubre los antecedentes teóricos. Estos se tratan en muchos otros documentos en la web.
¡Este documento se proporciona sin garantía de ningún tipo! Quiero decir que esta no es la única forma de configurar un sistema así. Hay muchas maneras de lograr este objetivo, pero este es el camino que elijo. No emito ninguna garantía de que esto funcione para ti!
1 Nota Preliminar
Este tutorial se basa en Ubuntu 14.04 Server (Trusty Tahr), así que deberías configurar una instalación básica del servidor Ubuntu 14.04 antes de continuar con este tutorial. El sistema debe tener una dirección IP estática. Uso 192.168.0.100 como mi dirección IP en este tutorial y server1.example.com como el nombre del host.
Asegúrate de que estás conectado como root (escribe
sudo su
a para convertirte en root), porque debemos ejecutar todos los pasos de este tutorial como usuario root.
Es muy importante que hagas de /bin/sh un enlace simbólico a /bin/bash…
dpkg-reconfigure dash
¿Usar dash como el shell del sistema por defecto (/bin/sh)? <– No
… y que desactives AppArmor, si obtienes apparmor: servicio no reconocido, entonces elimínalo de update-rc.d
service apparmor stop
update-rc.d -f apparmor remove
apt-get remove apparmor apparmor-utils
2 Instalar Postfix, Courier, Saslauthd, MySQL, phpMyAdmin
Para instalar Postfix, Courier, Saslauthd, MySQL y phpMyAdmin, simplemente ejecutamos
apt-get install postfix postfix-mysql postfix-doc mysql-client mysql-server courier-authdaemon courier-authlib-mysql courier-pop courier-pop-ssl courier-imap courier-imap-ssl libsasl2-2 libsasl2-modules libsasl2-modules-sql sasl2-bin libpam-mysql openssl phpmyadmin apache2 libapache2-mod-php5 php5 php5-mysql libpam-smbpass
Se te harán algunas preguntas:
Nueva contraseña para el usuario MySQL “root”: <– tucontraseñadeMySQLroot
Repetir contraseña para el usuario MySQL “root”: <– tucontraseñadeMySQLroot
¿Crear directorios para la administración basada en web? <– No
Tipo general de configuración de correo: <– Internet Site
Nombre del correo del sistema: <– server1.example.com
¿Se requiere certificado SSL? <– Ok
Servidor web para reconfigurar automáticamente: <– apache2
¿Configurar base de datos para phpmyadmin con dbconfig-common? <– No
3 Aplicar El Parche de Cuota A Postfix
Tenemos que obtener las fuentes de Postfix, parcharlo con el parche de cuota, construir nuevos paquetes Postfix.deb e instalar esos paquetes .deb:
apt-get build-dep postfix
A veces puedes obtener un error como el siguiente:-
root@server1:~# apt-get build-dep postfix
Leyendo listas de paquetes… Hecho
Construyendo árbol de dependencias
Leyendo la información de estado… Hecho
E: Debes poner algunas ‘source’ URIs en tu sources.list
root@server1:~#
Puedes corregirlo de la siguiente manera, añadiendo los repositorios de origen:
vi /etc/apt/sources.list
Haz la entrada como en mi caso es
deb http://archive.ubuntu.com/ubuntu trusty main restricted universe
deb http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb http://archive.canonical.com/ubuntu trusty partner
deb-src http://archive.ubuntu.com/ubuntu trusty main restricted universe
deb-src http://archive.ubuntu.com/ubuntu trusty-updates main restricted universe
deb-src http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
deb-src http://archive.canonical.com/ubuntu trusty partner
A continuación
apt-get update
apt-get build-dep postfix
cd /usr/src
apt-get source postfix
(Asegúrate de usar la versión correcta de Postfix en los siguientes comandos. Tengo Postfix 2.11.0 instalado. Puedes averiguar tu versión de Postfix ejecutando
postconf -d | grep mail_version
La salida debería verse así:
root@server1:/usr/src# postconf -d | grep mail_version
mail_version = 2.11.0
milter_macro_v = $mail_name $mail_version
root@server1:/usr/src#
wget http://vda.sourceforge.net/VDA/postfix-vda-v13-2.10.0.patch
cd postfix-2.11.0
patch -p1 < ../postfix-vda-v13-2.10.0.patch
A continuación, abre debian/rules y cambia DEB_BUILD_HARDENING de 1 a 0:
vi debian/rules
| [...] export DEB_BUILD_HARDENING=0 [...] | |
Si no haces esto, tu compilación fallará con los siguientes mensajes de error:
maildir.c: En la función âdeliver_maildirâ:
maildir.c:974:17: error: el formato no es un literal de cadena y no hay argumentos de formato [-Werror=format-security]
maildir.c:977:17: error: el formato no es un literal de cadena y no hay argumentos de formato [-Werror=format-security]
maildir.c:983:17: error: el formato no es un literal de cadena y no hay argumentos de formato [-Werror=format-security]
maildir.c:986:17: error: el formato no es un literal de cadena y no hay argumentos de formato [-Werror=format-security]
maildir.c: En la función âsql2fileâ:
maildir.c:404:25: warning: ignorando el valor de retorno de âreadâ, declarado con el atributo warn_unused_result [-Wunused-result]
maildir.c:417:26: warning: ignorando el valor de retorno de âwriteâ, declarado con el atributo warn_unused_result [-Wunused-result]
cc1: algunas advertencias se están tratando como errores
make: [maildir.o] Error 1
make: Saliendo del directorio `/usr/src/postfix-2.11.0/src/virtual’
make[1]: [update] Error 1
make[1]: Saliendo del directorio `/usr/src/postfix-2.11.0’
make: * [build] Error 2
dpkg-buildpackage: error: debian/rules build dio error de estado de salida 2
root@server1:/usr/src/postfix-2.11.0#
Ahora podemos construir los nuevos paquetes Postfix.deb:
dpkg-buildpackage
Ahora subimos un directorio, ahí es donde se han creado los nuevos paquetes .deb:
cd ..
El comando
ls -l
te muestra los paquetes disponibles:
root@server1:/usr/src# ls -l
total 6824
drwxr-xr-x 18 root root 4096 Abr 30 04:28 postfix-2.11.0
-rw-r–r– 1 root root 46756 Abr 30 04:28 postfix-cdb_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 142842 Abr 30 04:28 postfix-dev_2.11.0-1_all.deb
-rw-r–r– 1 root root 851842 Abr 30 04:28 postfix-doc_2.11.0-1_all.deb
-rw-r–r– 1 root root 53898 Abr 30 04:28 postfix-ldap_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 48500 Abr 30 04:28 postfix-mysql_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 48610 Abr 30 04:28 postfix-pcre_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 48324 Abr 30 04:28 postfix-pgsql_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 55701 Jun 7 2013 postfix-vda-v13-2.10.0.patch
-rw-r–r– 1 root root 267855 Abr 30 04:27 postfix_2.11.0-1.diff.gz
-rw-r–r– 1 root root 1522 Abr 30 04:27 postfix_2.11.0-1.dsc
-rw-r–r– 1 root root 3885 Abr 30 04:28 postfix_2.11.0-1_amd64.changes
-rw-r–r– 1 root root 1329238 Abr 30 04:28 postfix_2.11.0-1_amd64.deb
-rw-r–r– 1 root root 4034741 Feb 12 01:38 postfix_2.11.0.orig.tar.gz
root@server1:/usr/src#
Selecciona los paquetes postfix y postfix-mysql e instálalos así:
dpkg -i postfix_2.11.0-1_amd64.deb postfix-mysql_2.11.0-1_amd64.deb
4 Crear La Base De Datos MySQL Para Postfix/Courier
Ahora creamos una base de datos llamada mail:
mysqladmin -u root -p create mail
Se te hará esta pregunta:
Introduce la contraseña: <– tucontraseñadeMySQLroot
A continuación, vamos a la consola de MySQL:
mysql -u root -p
En la consola de MySQL, creamos el usuario mail_admin con la contraseña mail_admin_password (reemplázala con tu propia contraseña) que tiene privilegios SELECT, INSERT, UPDATE, DELETE en la base de datos mail. Este usuario será utilizado por Postfix y Courier para conectarse a la base de datos de correo:
GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost’ IDENTIFIED BY ‘mail_admin_password’;
GRANT SELECT, INSERT, UPDATE, DELETE ON mail. TO ‘mail_admin’@’localhost.localdomain’ IDENTIFIED BY ‘mail_admin_password’;
FLUSH PRIVILEGES;
Aún en la consola de MySQL, creamos las tablas necesarias para Postfix y Courier:
USE mail;
CREATE TABLE domains (
domain varchar(50) NOT NULL,
PRIMARY KEY (domain) )
ENGINE=MyISAM;
CREATE TABLE forwardings (
source varchar(80) NOT NULL,
destination TEXT NOT NULL,
PRIMARY KEY (source) )
ENGINE=MyISAM;
CREATE TABLE users (
email varchar(80) NOT NULL,
password varchar(20) NOT NULL,
quota INT(10) DEFAULT ‘10485760’,
PRIMARY KEY (email)
) ENGINE=MyISAM;
CREATE TABLE transport (
domain varchar(128) NOT NULL default ‘’,
transport varchar(128) NOT NULL default ‘’,
UNIQUE KEY domain (domain)
) ENGINE=MyISAM;
quit;
Como habrás notado, con el comando quit; hemos salido de la consola de MySQL y estamos de vuelta en la consola de Linux.
La tabla domains almacenará cada dominio virtual para el cual Postfix debería recibir correos electrónicos (por ejemplo, example.com).
| domain |
| example.com |
La tabla forwardings es para aliasar una dirección de correo electrónico a otra, por ejemplo, redirigir correos electrónicos de [email protected] a [email protected].
| source | destination |
| [email protected] | [email protected] |
La tabla users almacena todos los usuarios virtuales (es decir, direcciones de correo electrónico, porque la dirección de correo electrónico y el nombre de usuario son los mismos) y contraseñas (¡en forma encriptada!) y un valor de cuota para cada buzón de correo (en este ejemplo, el valor predeterminado es 10485760 bytes, lo que significa 10MB).
| password | quota | |
| [email protected] | No9.E4skNvGa. (“secreto” en forma encriptada) | 10485760 |
La tabla transport es opcional, es para usuarios avanzados. Permite redirigir correos para usuarios individuales, dominios completos o todos los correos a otro servidor. Por ejemplo,
| domain | transport |
| example.com | smtp:[1.2.3.4] |
redirigiría todos los correos electrónicos para example.com a través del protocolo smtp al servidor con la dirección IP 1.2.3.4 (los corchetes [] significan “no hacer una búsqueda del registro MX DNS” (lo cual tiene sentido para direcciones IP…). Si usas un nombre de dominio completamente calificado (FQDN) en su lugar, no usarías los corchetes.).
Por cierto, (asumiendo que la dirección IP de tu sistema de servidor de correo es 192.168.0.100) puedes acceder a phpMyAdmin a través de http://192.168.0.100/phpmyadmin/ en un navegador e iniciar sesión como mail_admin. Luego puedes echar un vistazo a la base de datos. Más adelante puedes usar phpMyAdmin para administrar tu servidor de correo.
Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.