Postfix y Courier · 7 min read · Sep 28, 2025
Usuarios Virtuales Y Dominios Con Postfix, Courier, MySQL Y SquirrelMail (Mandriva 2009.1 x86_64) - Página 2
5 Crear La Base De Datos MySQL Para Postfix/Courier
Creamos una base de datos llamada mail:
mysqladmin -u root -p create mailA continuación, vamos a la consola de MySQL:
mysql -u root -pEn la consola de MySQL, creamos el usuario mail_admin con la contraseña mail_admin_password (reemplázala con una contraseña de tu elección) 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].
| 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 reenviar correos para usuarios individuales, dominios completos o todos los correos a otro servidor. Por ejemplo,
| domain | transport |
| example.com | smtp:[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.).
6 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 causaría otros problemas).
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 |
chmod o= /etc/postfix/mysql-virtual_*.cf
chgrp postfix /etc/postfix/mysql-virtual_*.cfAhora 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 -mA continuación, hacemos algunas configuraciones 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_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'
postconf -e 'inet_interfaces = all'
postconf -e 'alias_database = hash:/etc/postfix/aliases'
postconf -e 'alias_maps = hash:/etc/postfix/aliases'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 -x509Nombre del País (código de 2 letras) [GB]: <– Ingresa el Nombre de tu País (por ejemplo, “DE”).
Nombre del Estado o Provincia (nombre completo) [Berkshire]: <– Ingresa el Nombre de tu Estado o Provincia.
Nombre de la Localidad (por ejemplo, ciudad) [Newbury]: <– Ingresa tu Ciudad.
Nombre de la Organización (por ejemplo, empresa) [My Company 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 o el nombre de host de tu servidor) []: <– 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.key7 Configurar Saslauthd
Edita /etc/sasl2/smtpd.conf. Debería verse así:
vi /etc/sasl2/smtpd.conf| # Archivo de configuración de la biblioteca SASL para postfix # todos los parámetros están documentados en: # /usr/share/doc/cyrus-sasl/options.html # Los parámetros mech_list enumeran los mecanismos sasl a usar, # siendo el predeterminado todos los mecanismos encontrados. #mech_list: plain login # Para autenticar usando el daemon saslauthd separado, (por ejemplo, para # usuarios del sistema o ldap). También ver /etc/sysconfig/saslauthd. #pwcheck_method: saslauthd #saslauthd_path: /var/lib/sasl2/mux # Para autenticar contra usuarios almacenados en sasldb. #pwcheck_method: auxprop #auxprop_plugin: sasldb #sasldb_path: /var/lib/sasl2/sasl.db pwcheck_method: authdaemond log_level: 3 mech_list: PLAIN LOGIN authdaemond_path:/var/lib/authdaemon/socket |
Luego crea los enlaces de inicio del sistema para Postfix y comienza Postfix, saslauthd y courier-authdaemon:
chmod 755 /var/lib/authdaemon
chkconfig postfix on
/etc/init.d/courier-authdaemon start
/etc/init.d/postfix start
/etc/init.d/saslauthd start8 Configurar Courier
Ahora tenemos que decirle a Courier que debe autenticar 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" #authmodulelist="authpam authpwd authshadow" [...] |
Luego edita /etc/courier/authmysqlrc. Debería verse exactamente así (nuevamente, asegúrate de llenar los detalles correctos de la base de datos):
cp /etc/courier/authmysqlrc /etc/courier/authmysqlrc_orig
cat /dev/null > /etc/courier/authmysqlrc
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 |
Luego reinicia Courier:
/etc/init.d/courier-authdaemon restart
/etc/init.d/courier-imapd restart
/etc/init.d/courier-pop3d restartAl ejecutar
telnet localhost pop3puedes ver si tu servidor POP3 está funcionando correctamente. Debería devolver +OK Hello there . (escribe quit para volver a la consola de Linux):
[root@server1 postfix]# telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK Hello there.
quit
+OK Better luck next time.
Connection closed by foreign host.
[root@server1 postfix]#Recibe nuevas publicaciones en tu bandeja de entrada.
No spam. Cancela la suscripción en cualquier momento.