Postfix y MySQL · 6 min read · Oct 07, 2025

Usuarios y Dominios Virtuales Con Postfix, Courier Y MySQL (Debian Etch) - Página 2

4 Crear La Base De Datos MySQL Para Postfix/Courier

Por defecto, MySQL se instala sin una contraseña de root, que cambiamos inmediatamente (reemplaza yourrootsqlpassword con la contraseña que deseas usar):

mysqladmin -u root password yourrootsqlpassword

Ahora creamos una base de datos llamada mail:

mysqladmin -u root -p create mail

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 que Postfix y Courier necesitan:

USE mail;
CREATE TABLE domains (  
 domain varchar(50) NOT NULL,  
 PRIMARY KEY (domain) )  
 TYPE=MyISAM;
CREATE TABLE forwardings (  
 source varchar(80) NOT NULL,  
 destination TEXT NOT NULL,  
 PRIMARY KEY (source) )  
 TYPE=MyISAM;
CREATE TABLE users (  
 email varchar(80) NOT NULL,  
 password varchar(20) NOT NULL,  
 quota INT(10) DEFAULT '10485760',  
 PRIMARY KEY (email)  
 ) TYPE=MyISAM;
CREATE TABLE transport (  
 domain varchar(128) NOT NULL default '',  
 transport varchar(128) NOT NULL default '',  
 UNIQUE KEY domain (domain)  
 ) TYPE=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 debe 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, reenviar correos electrónicos de [email protected] a [email protected].

sourcedestination
[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).

emailpasswordquota
[email protected]No9.E4skNvGa. (“secreto” en forma encriptada)10485760

La tabla transport es opcional, es para usuarios avanzados. Permite reenviar correos para usuarios individuales, dominios completos o todos los correos a otro servidor. Por ejemplo,

domaintransport
example.comsmtp:[1.2.3.4]

reenviarí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, (asumo 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.

5 Configurar Postfix

Ahora tenemos que decirle a Postfix dónde puede encontrar toda la información en la base de datos. Por lo tanto, tenemos que crear seis archivos de texto. Notarás que le digo a Postfix que se conecte a MySQL en la dirección IP 127.0.0.1 en lugar de localhost. Esto se debe a que Postfix se está ejecutando en una cárcel chroot y no tiene acceso al socket de MySQL al que intentaría conectarse si le dijera a Postfix que use localhost. Si uso 127.0.0.1, Postfix usa TCP para conectarse a MySQL, lo cual no es un problema incluso en una cárcel chroot (la alternativa sería mover el socket de MySQL a la cárcel chroot, lo que causaría otros problemas).

Por favor, asegúrate de que /etc/mysql/my.cnf contenga la siguiente línea:

vi /etc/mysql/my.cnf

| [...] bind-address = 127.0.0.1 [...] |

Si tuviste que modificar /etc/mysql/my.cnf, por favor reinicia MySQL ahora:

/etc/init.d/mysql restart

Ejecuta

netstat -tap

para asegurarte de que MySQL esté escuchando en 127.0.0.1 (localhost.localdomain):

server1:/usr/src# netstat -tap  
 Conexiones de Internet activas (servidores y establecidas)  
 Proto Recv-Q Send-Q Dirección Local           Dirección Extranjera         Estado       PID/Nombre del Programa  
 tcp        0      0 localhost.localdo:mysql *:*                     LISTEN     3003/mysqld  
 tcp        0      0 *:sunrpc                *:*                     LISTEN     1684/portmap  
 tcp        0      0 *:auth                  *:*                     LISTEN     2036/inetd  
 tcp        0      0 *:1522                  *:*                     LISTEN     2077/rpc.statd  
 tcp        0      0 *:smtp                  *:*                     LISTEN     12053/master  
 tcp6       0      0 *:imaps                 *:*                     LISTEN     3839/couriertcpd  
 tcp6       0      0 *:pop3s                 *:*                     LISTEN     3629/couriertcpd  
 tcp6       0      0 *:pop3                  *:*                     LISTEN     3572/couriertcpd  
 tcp6       0      0 *:imap2                 *:*                     LISTEN     3792/couriertcpd  
 tcp6       0      0 *:www                   *:*                     LISTEN     3712/apache2  
 tcp6       0      0 *:ssh                   *:*                     LISTEN     2058/sshd  
 tcp6       0    148 server1.example.com:ssh ::ffff:192.168.0.2:4515 ESTABLISHED2139/0

Ahora vamos a crear nuestros seis archivos de texto.

vi /etc/postfix/mysql-virtual_domains.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT domain AS virtual FROM domains WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_forwardings.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT destination FROM forwardings WHERE source='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailboxes.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_email2email.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT email FROM users WHERE email='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_transports.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT transport FROM transport WHERE domain='%s' hosts = 127.0.0.1 |

vi /etc/postfix/mysql-virtual_mailbox_limit_maps.cf

| user = mail_admin password = mail_admin_password dbname = mail query = SELECT quota FROM users WHERE email='%s' hosts = 127.0.0.1 |

Luego cambia los permisos y el grupo de estos archivos:

chmod o= /etc/postfix/mysql-virtual_*.cf  
 chgrp postfix /etc/postfix/mysql-virtual_*.cf

Ahora creamos un usuario y grupo llamado vmail con el directorio home /home/vmail. Aquí es donde se almacenarán todos los buzones de correo.

groupadd -g 5000 vmail  
 useradd -g vmail -u 5000 vmail -d /home/vmail -m

A continuación, hacemos alguna configuración de Postfix. Asegúrate de reemplazar server1.example.com con un FQDN válido, ¡de lo contrario, tu Postfix podría no funcionar correctamente!

postconf -e 'myhostname = server1.example.com'  
 postconf -e 'mydestination = server1.example.com, localhost, localhost.localdomain'  
 postconf -e 'mynetworks = 127.0.0.0/8'  
 postconf -e 'virtual_alias_domains ='  
 postconf -e 'virtual_alias_maps = proxy:mysql:/etc/postfix/mysql-virtual_forwardings.cf, mysql:/etc/postfix/mysql-virtual_email2email.cf'  
 postconf -e 'virtual_mailbox_domains = proxy:mysql:/etc/postfix/mysql-virtual_domains.cf'  
 postconf -e 'virtual_mailbox_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailboxes.cf'  
 postconf -e 'virtual_mailbox_base = /home/vmail'  
 postconf -e 'virtual_uid_maps = static:5000'  
 postconf -e 'virtual_gid_maps = static:5000'  
 postconf -e 'smtpd_sasl_auth_enable = yes'  
 postconf -e 'broken_sasl_auth_clients = yes'  
 postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'  
 postconf -e 'smtpd_use_tls = yes'  
 postconf -e 'smtpd_tls_cert_file = /etc/postfix/smtpd.cert'  
 postconf -e 'smtpd_tls_key_file = /etc/postfix/smtpd.key'  
 postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql-virtual_transports.cf'  
 postconf -e 'virtual_create_maildirsize = yes'  
 postconf -e 'virtual_maildir_extended = yes'  
 postconf -e 'virtual_mailbox_limit_maps = proxy:mysql:/etc/postfix/mysql-virtual_mailbox_limit_maps.cf'  
 postconf -e 'virtual_mailbox_limit_override = yes'  
 postconf -e 'virtual_maildir_limit_message = "El usuario que intentas alcanzar está sobre la cuota."'  
 postconf -e 'virtual_overquota_bounce = yes'  
 postconf -e 'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps'

Después creamos el certificado SSL que se necesita para TLS:

cd /etc/postfix  
 openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509
<-- Ingresa el Nombre de tu País (por ejemplo, "DE").  
 <-- Ingresa el Nombre de tu Estado o Provincia.  
 <-- Ingresa tu Ciudad.  
 <-- Ingresa el Nombre de tu Organización (por ejemplo, el nombre de tu empresa).  
 <-- Ingresa el Nombre de tu Unidad Organizativa (por ejemplo, "Departamento de TI").  
 <-- Ingresa el Nombre de Dominio Completamente Calificado del sistema (por ejemplo, "server1.example.com").  
 <-- Ingresa tu Dirección de Correo Electrónico.

Luego cambia los permisos de smtpd.key:

chmod o= /etc/postfix/smtpd.key
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.