Servidor de correo · 3 min read · Oct 06, 2025
Solución Completa de Servidor de Correo con Dominios y Usuarios Virtuales (Debian Etch, Postfix, Mysql, Dovecot, DSpam, ClamAV, Postgrey, RBL) - Página 4
B. Configuración de Postfix para Usuarios y Dominios Virtuales
Aunque los intercambiadores de correo no entregarán correo a los usuarios y dominios virtuales, rechazarán según destinos válidos/inválidos. Por lo tanto, necesitamos que los servidores mx puedan conectarse al servidor SQL para verificar destinos. Proceda a ingresar la información en postconf:
# postconf -e 'virtual_alias_domains ='
# postconf -e 'virtual_alias_maps = proxy:mysql:$config_directory/mysql_virtual_alias_maps.cf'
# postconf -e 'virtual_mailbox_domains = proxy:mysql:$config_directory/mysql_virtual_domains_maps.cf'
# postconf -e 'virtual_mailbox_maps = proxy:mysql:$config_directory/mysql_virtual_mailbox_maps.cf'
# postconf -e 'virtual_mailbox_base = /vmail'
# postconf -e 'virtual_minimum_uid = 150'
# postconf -e 'virtual_uid_maps = static:150'
# postconf -e 'virtual_gid_maps = static:8'
# postconf -e 'virtual_create_maildirsize = yes'
# postconf -e 'virtual_mailbox_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 intenta alcanzar ha superado su cuota."
# postconf -e 'virtual_overquota_bounce = yes'
# postconf -e 'transport_maps = proxy:mysql:/etc/postfix/mysql_virtual_transports.cf'Hay varios ‘detalles’ aquí. Esta configuración alojará los buzones de correo de usuarios virtuales en /vmail. Si necesita almacenar sus buzones en otra ubicación, cambie la línea virtual_mailbox_base en consecuencia.
El virtual_minimum_uid y virtual_uid_maps apuntan al id de usuario 150. Este id de usuario es para un usuario “Correo Virtual” creado específicamente. Utiliza el grupo estándar “mail”, con el gid predeterminado (Debian) de 8. Puede crear el usuario y el directorio así:
# useradd -r -u 150 -g mail -d /var/vmail -s /sbin/nologin -c "Buzón Virtual" vmail
# mkdir /var/vmail
# chmod 770 /var/vmail/
# chown vmail:mail /var/vmail/Ahora necesitamos instalar las herramientas del cliente NFS:
# apt-get install nfs-common portmapLuego, el directorio necesita ser montado en el recurso compartido NFS. Para hacer una prueba simple, ejecute lo siguiente:
# mount files-1.internal.example.com:/vmail /vmailAhora debería tener acceso al recurso compartido /vmail desde files-1. Intente escribir un archivo (¡No debería funcionar!):
# cd /vmail
# touch tmpNOTA: ¡Debería recibir un error de solo lectura!
Suponiendo que todo esté funcionando, proceda a desmontar el NFS:
# cd /
umount /vmailY luego haga que el montaje sea permanente poniendo lo siguiente en su /etc/fstab:
[...]
files-1.internal.example.com:/vmail /vmail nfs ro,rsize=4096,hard,intr,tcp,noatime,nodev,async 0 0Proceda a montar el sistema de archivos una vez más:
# mount /vmail… ¡y estará listo para usar!
C. Configuración de MySQL de Postfix
Postfix se instaló con soporte para MySQL, pero eso no significa que ya sepa cómo usar nuestra base de datos. Necesita que se le proporcione información de consulta SQL para cada tipo de tabla en nuestra base de datos. Esta información se almacena en los archivos MySQL definidos en el archivo main.cf. Tenga en cuenta que en los siguientes archivos, la última línea contiene un solo comentario (precedido por #) con la consulta completa. Las versiones recientes de Postfix pueden usar esto en lugar de las otras declaraciones. Si está utilizando una versión más nueva, simplemente comente todas las otras líneas y descomente la declaración de consulta.
/etc/postfix/mysql_virtual_alias_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = alias
select_field = goto
where_field = address
additional_conditions = and active = '1'
#query = SELECT goto FROM alias WHERE address='%s' AND active = '1'/etc/postfix/mysql_virtual_domains_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
#query = SELECT domain FROM domain WHERE domain='%s' AND backupmx = '0' AND active = '1'/etc/postfix/mysql_virtual_mailbox_limit_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = quota
where_field = username
additional_conditions = and active = '1'
#query = SELECT quota FROM mailbox WHERE username='%s' AND active = '1'/etc/postfix/mysql_virtual_mailbox_maps.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = mailbox
select_field = CONCAT(domain,'/',maildir)
where_field = username
additional_conditions = and active = '1'
#query = SELECT CONCAT(domain,'/',maildir) FROM mailbox WHERE username='%s' AND active = '1'/etc/postfix/mysql_virtual_transports.cfuser = vmail_user
password = vmail_user_password
hosts = sql-1.internal.example.com
dbname = virtual_mail
table = domain
select_field = transport
where_field = domain
additional_conditions = and active = '1'
#query = SELECT transport FROM domain WHERE domain='%s' AND active = '1'Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.