Postfix Configuration · 8 min read · Sep 28, 2025

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

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 utiliza la red 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 causa 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 | grep mysql

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

server1:/usr/src# netstat -tap | grep mysql  
tcp        0      0 localhost.localdo:mysql *:*                     LISTEN      4559/mysqld  
server1:/usr/src#

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 todas las bandejas de entrada.

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 'message_size_limit = 30720000'  
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_sasl_authenticated_header = 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 su 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

Nombre del país (código de 2 letras) [AU]: <– Ingresa el nombre de tu país (por ejemplo, “DE”).
Nombre del estado o provincia (nombre completo) [Some-State]: <– Ingresa el nombre de tu estado o provincia.
Nombre de la localidad (por ejemplo, ciudad) []: <– Ingresa tu ciudad.
Nombre de la organización (por ejemplo, empresa) [Internet Widgits Pty Ltd]: <– Ingresa el nombre de tu organización (por ejemplo, el nombre de tu empresa).
Nombre de la unidad organizativa (por ejemplo, sección) []: <– Ingresa el nombre de tu unidad organizativa (por ejemplo, “Departamento de TI”).
Nombre común (por ejemplo, TU nombre) []: <– Ingresa el nombre de dominio completamente calificado del sistema (por ejemplo, “server1.example.com”).
Dirección de correo electrónico []: <– Ingresa tu dirección de correo electrónico.

Luego cambia los permisos de smtpd.key:

chmod o= /etc/postfix/smtpd.key

6 Configurar Saslauthd

Primero ejecuta

mkdir -p /var/spool/postfix/var/run/saslauthd

Luego edita /etc/default/saslauthd. Establece START en yes y cambia la línea OPTIONS=”-c -m /var/run/saslauthd” a OPTIONS=”-c -m /var/spool/postfix/var/run/saslauthd -r”:

vi /etc/default/saslauthd

| # # Configuraciones para el demonio saslauthd # Por favor, lee /usr/share/doc/sasl2-bin/README.Debian para más detalles. # # ¿Debería saslauthd ejecutarse automáticamente al inicio? (predeterminado: no) START=yes # Descripción de esta instancia de saslauthd. Recomendado. # (sugerencia: Demonio de Autenticación SASL) DESC="Demonio de Autenticación SASL" # Nombre corto de esta instancia de saslauthd. Muy recomendado. # (sugerencia: saslauthd) NAME="saslauthd" # ¿Qué mecanismos de autenticación debería usar saslauthd? (predeterminado: pam) # # Opciones disponibles en este paquete de Debian: # getpwent -- usar la función de biblioteca getpwent() # kerberos5 -- usar Kerberos 5 # pam -- usar PAM # rimap -- usar un servidor IMAP remoto # shadow -- usar el archivo de contraseña local shadow # sasldb -- usar el archivo de base de datos sasldb local # ldap -- usar LDAP (la configuración está en /etc/saslauthd.conf) # # Solo se puede usar una opción a la vez. Consulta la página del manual de saslauthd # para más información. # # Ejemplo: MECHANISMS="pam" MECHANISMS="pam" # Opciones adicionales para este mecanismo. (predeterminado: ninguna) # Consulta la página del manual de saslauthd para información sobre opciones específicas del mecanismo. MECH_OPTIONS="" # ¿Cuántos procesos de saslauthd deberíamos ejecutar? (predeterminado: 5) # Un valor de 0 generará un nuevo proceso para cada conexión. THREADS=5 # Otras opciones (predeterminado: -c -m /var/run/saslauthd) # Nota: ¡DEBES especificar la opción -m o saslauthd no se ejecutará! # # ADVERTENCIA: NO ESPECIFIQUES LA OPCIÓN -d. # La opción -d hará que saslauthd se ejecute en primer plano en lugar de como # un demonio. Esto PREVENIRÁ QUE TU SISTEMA ARRANQUE CORRECTAMENTE. Si deseas # ejecutar saslauthd en modo de depuración, por favor ejecútalo manualmente para estar seguro. # # Consulta /usr/share/doc/sasl2-bin/README.Debian para información específica de Debian. # Consulta la página del manual de saslauthd y la salida de 'saslauthd -h' para información general # sobre estas opciones. # # Ejemplo para usuarios de postfix: "-c -m /var/spool/postfix/var/run/saslauthd" #OPTIONS="-c -m /var/run/saslauthd" OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r" |

Luego crea el archivo /etc/pam.d/smtp. Debe contener solo las siguientes dos líneas (asegúrate de llenar tus detalles de base de datos correctos):

vi /etc/pam.d/smtp

| auth required pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 account sufficient pam_mysql.so user=mail_admin passwd=mail_admin_password host=127.0.0.1 db=mail table=users usercolumn=email passwdcolumn=password crypt=1 |

A continuación, crea el archivo /etc/postfix/sasl/smtpd.conf. Debe verse así:

vi /etc/postfix/sasl/smtpd.conf

| pwcheck_method: saslauthd mech_list: plain login allow_plaintext: true auxprop_plugin: mysql sql_hostnames: 127.0.0.1 sql_user: mail_admin sql_passwd: mail_admin_password sql_database: mail sql_select: select password from users where email = '%u' |

A continuación, agrega el usuario postfix al grupo sasl (esto asegura que Postfix tenga permiso para acceder a saslauthd):

adduser postfix sasl

Luego reinicia Postfix y Saslauthd:

/etc/init.d/postfix restart  
/etc/init.d/saslauthd restart

7 Configurar Courier

Ahora tenemos que decirle a Courier que debe autenticarse contra nuestra base de datos MySQL. Primero, edita /etc/courier/authdaemonrc y cambia el valor de authmodulelist para que diga:

vi /etc/courier/authdaemonrc

| [...] authmodulelist="authmysql" [...] |

Luego haz una copia de seguridad de /etc/courier/authmysqlrc y vacía el archivo antiguo:

cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig  
cat /dev/null > /etc/courier/authmysqlrc

Luego abre /etc/courier/authmysqlrc y pon las siguientes líneas en él:

vi /etc/courier/authmysqlrc

| MYSQL_SERVER localhost MYSQL_USERNAME mail_admin MYSQL_PASSWORD mail_admin_password MYSQL_PORT 0 MYSQL_DATABASE mail MYSQL_USER_TABLE users MYSQL_CRYPT_PWFIELD password #MYSQL_CLEAR_PWFIELD password MYSQL_UID_FIELD 5000 MYSQL_GID_FIELD 5000 MYSQL_LOGIN_FIELD email MYSQL_HOME_FIELD "/home/vmail" MYSQL_MAILDIR_FIELD CONCAT(SUBSTRING_INDEX(email,'@',-1),'/',SUBSTRING_INDEX(email,'@',1),'/') #MYSQL_NAME_FIELD MYSQL_QUOTA_FIELD quota |

Durante la instalación, los certificados SSL para IMAP-SSL y POP3-SSL se crean con el nombre de host localhost. Para cambiar esto al nombre de host correcto (server1.example.com en este tutorial), elimina los certificados…

cd /etc/courier  
rm -f /etc/courier/imapd.pem  
rm -f /etc/courier/pop3d.pem

… y modifica los siguientes dos archivos; reemplaza CN=localhost con CN=server1.example.com (también puedes modificar los otros valores, si es necesario):

vi /etc/courier/imapd.cnf

| [...] CN=server1.example.com [...] |

vi /etc/courier/pop3d.cnf

| [...] CN=server1.example.com [...] |

Luego recrea los certificados…

mkimapdcert  
mkpop3dcert

… y reinicia Courier:

/etc/init.d/courier-authdaemon restart  
/etc/init.d/courier-imap restart  
/etc/init.d/courier-imap-ssl restart  
/etc/init.d/courier-pop restart  
/etc/init.d/courier-pop-ssl restart

Al ejecutar

telnet localhost pop3

puedes ver si tu servidor POP3 está funcionando correctamente. Debería devolver +OK Hello there. (Escribe quit para volver a la shell de Linux.)

server1:/etc/courier# telnet localhost pop3  
Trying 127.0.0.1...  
Connected to localhost.  
Escape character is '^]'.  
+OK Hello there.  
quit  
+OK Better luck next time.  
Connection closed by foreign host.  
server1:/etc/courier#

8 Modificar /etc/aliases

Ahora deberíamos abrir /etc/aliases. Asegúrate de que el postmaster apunte a root y root a tu propio nombre de usuario o tu dirección de correo electrónico, por ejemplo, así:

vi /etc/aliases

| [...] postmaster: root root: [email protected] [...] |

o así (si administrador es tu propio nombre de usuario):

| [...] postmaster: root root: administrator [...] |

Cada vez que modifiques /etc/aliases, debes ejecutar

newaliases

despues y reiniciar Postfix:

/etc/init.d/postfix restart
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

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