3.1 Mysql
Mysql es un potente pero humilde DBMS. No aguanta el 100% de la sintaxis de otros RDBMS, pero para nuestro caso, es suficiente.
Antes de comenzar, verificar que la database mysql esta creada. No esta demas ejecutar
# mysql_install_db
para crearla.
OJO! La distribucion de RPM de mysql viene con una error: los archivos de mysql no le pertenecen a mysql. Para ello no esta demas devolverles la pertenencia respectiva.
# chown mysql.mysql /var/lib/mysql -R
Hay que arrancar y configurar para partir a mysql.
# /etc/rc.d/init.d/mysqld start
# chkconfig mysql on
Ahora, ejecutar
# mysql
mysql>
Si devolvio la linea de comando mysql, significa que todo estuvo OK.
Ahora se debe crear el usuario Postfix (u otro, es para hacer mas facil el ejemplo).
Hay dos maneras. Una es a traves de mysqladmin, la otra es agregarlo 'a mano' a user.mysql. Prefiero la segunda.
mysql> use mysql;
mysql> insert into user (host, user, password) values ('localhost', 'postfix', password('postfix'));
Se ingresa en la tabla el usuario Postfix con la password "postfix" o con cualquier password que se quiera. Para eso solamente cambiar password('postfix') por password('la_password_que_yo_quiera').
Ahora se debe crear la database 'mail'. Como dije, hay dos maneras. La manera facil, permitiendole al usuario Postfix acceder a ella es :
mysql> insert into db (host, db, user, select_priv) values ('localhost', 'mail', 'postfix', 'Y');
mysql> create database mail;
Salir de mysql.
mysql> quit;
Reiniciar mysql con
# mysqladmin reload
Verificar que el usuario Postfix pueda ejecutar mysql y acceder a la db 'mail':
# mysql -u postfix -p mail
Enter Password:
Ingresar la contrasena de Postfix. Deberia devolver la linea de comando mysql:
mysql>
Si no lo hace, verificar la contrasena del usuario postfix.
Si se olvido la contrasena del usuario postfix, es facil cambiarla. Entrar a mysql como root.
# mysql
mysql> use mysql;
mysql> update user set password=password('nueva_password') where user='postfix';
mysql> quit;
# mysqladmin reload
Si todo funciona bien hasta aqui, hay que crear las siguientes tablas (como root):
transport: Transporte, el mismo transporte de Postfix.
aliases : los 'alias' locales de la maquina. Necesario para entrega en dominios
virtuales y donde van a caer los mensajes (en un spool truculento en /home/postfix).
remote_aliases : 'alias' remotos, que pertenezcan a la maquina o a otra externa.
A crear las tablas!
# mysql
mysql> use mail;
mysql> create table transport(domain varchar(255) Primary Key,
transport char(8), acceso varchar(2) default 'OK');
mysql> create table aliases (id int(6), alias varchar(255) Primary key,
maildir varchar(255) not null, acceso varchar(2) default 'OK');
mysql> create table remote_aliases (alias varchar(255) Primary key,
rcpt varchar(255) not null);
Estas tablas son necesarias para Postfix. Ahora agreguemos la tabla necesaria para autentificar a nuestros usuarios.
Este ejemplo es para el dominio "dominio1.com", aunque puede usarse cualquier nombre, pero no equivocarse en el nombre de esta tabla para futuras referencias en teapop.passwd.
mysql> create table dominio1 (user varchar(255) primary key,
pass varchar(255) not null, maildir varchar(255) not null,
active int(8) default 1);
mysql> quit;
Luego
# mysqladmin reload
OJO!
Ahora hay que cambiar la contrasena de acceso de root para mysql. Esto es para evitar intrusiones desde la consola (o desde la misma maquina). Ademas, se debe borrar el usuario (eso es el usuario comilla comilla, el usuario vacio).
Este paso es totalmente opcional. Por lo general lo uso, para evitar sorpresas en la base de datos.
# mysql
mysql> update user set password=password('nueva_pass_root') where user='root';
mysql> delete from user where user=;
mysql> quit;
# mysqladmin reload
Mysql esta corriendo perfecto!
3.2 Postfix+Mysql
Aqui comienza la configuracion y los pasos mas faciles.
En /etc/postfix se encuentran (un monton!) los archivos de configuracion de postfix. Solo se necesita el principal, main.cf
Necesitamos configurar un par de cosas a este archivo:
myhostname =
mydomain =
inet_interfaces = all
Ahora, agregar las tablas de 'diccionario' (como las llama Postfix) con soporte de mysql. Todo esto en /etc/postfix/main.cf
transport_maps=mysql:/etc/postfix/transport.cf
virtual_mailbox_base=/home/postfix
virtual_uid_maps=mysql:/etc/postfix/ids.cf
virtual_gid_maps=mysql:/etc/postfix/ids.cf
virtual_mailbox_maps=mysql:/etc/postfix/aliases.cf
virtual_maps=mysql:/etc/postfix/remote_aliases.cf
Ahora hay que crear los siguientes archivos en /etc/postfix:
transport.cf
user=postfix
password=<la_password_de_mysql_del_usuario_postfix>
dbname=mail
table=transport
select_field=transport
where_field=domain
hosts=localhost
aliases.cf
user=postfix
password=<la_password_de_mysql_del_usuario_postfix>
dbname=mail
table=aliases
select_field=maildir
where_field=alias
hosts=localhost
ids.cf
user=postfix
password=<la_password_de_mysql_del_usuario_postfix>
dbname=mail
table=aliases
select_field=id
where_field=alias
hosts=localhost
remote_aliases.cf
user=postfix
password=<la_password_de_mysql_del_usuario_postfix>
dbname=mail
table=remote_aliases
select_field=rcpt
where_field=alias
hosts=localhost
Algunas personas me comentaron que no funcionaba si se colocaba hosts=localhost
Gracias a Alvaro Navarro por detectar un "workaround":
Para que lo agregues en tus "workarounds", me funciono poniendo el nombre completo de la maquina, no funciono ni con localhost ni con 127.0.0.1
debido a que poseia un DNS en otra maquina. Gracias, Alvaro!
Todavia NO iniciar postfix (si esta esta corriendo, echarlo abajo).
Con este sistema, se puede hacer la entrega de varios dominios virtuales sin sudar mucho. Todo es gracias a la tabla transport. Se explica esto mas tarde.
Para este ejemplo, crearemos un dominio llamado 'dominio1.com'. Esta demas decir que debe estar configurado previamente en un DNS.
Este dominio, para Postfix es un transporte. Es decir, donde debe entregar los correos. Cualquier transporte que no este en su tabla de transportes, Postfix los considera como externos y los entrega al servidor correspondiente.
# mysql -u root -p
Enter Password:
mysql> use mail;
mysql> insert into transport(domain,transport) values ('dominio1.com', 'virtual:');
mysql> quit;
Con el usuario Postfix, hagamos el "spool":
# su postfix
$ cd /home/postfix
$ mkdir dominio1
$ exit
En este momento, iniciar Postfix con
# /etc/rc.d/init.d/postfix start
3.3 Agregando usuarios
Para hacer que funcione bien el truco, hay que indicar en el campo id de la tabla aliases el mismo USERID del usuario postfix.
De lo contrario, el maillog se va a llenar de "enforcing file restriction"!
# cat /etc/passwd | grep postfix
postfix:x:500:500::/home/postfix:/bin/bash
En este caso, el userid es 500 (UID_POSTFIX). Tratar que el UID/GID sea el mismo. Ahora, agregamos un usuario "usuario" del dominio "midominio".
# mysql -u root -p mail
Enter Password:
mysql>insert into aliases values (UID_POSTFIX,
'usuario@dominio1.com','dominio1/user');
mysql>quit;
# mysqladmin reload
Reemplazar en UID_POSTFIX el valor del UID del usuario Postfix. Ahora viene verificar el log de mail y el de mensajes, en caso de encontrar mensajes raros.
En otra consola (alt-F(algo)), iniciar un simple rastreo del maillog:
# tail -f /var/log/maillog
Y en otra iniciar una sesion smtp:
# telnet localhost 25
Luego, ejecutar la prueba simple de
# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain.
Escape character is '^]'
220 midominio ESMTP Postfix
Lo cual indica que todo salio bien!
Ahora probemos una entrega local, usando comandos SMTP minimos. Voy a colocar los mensajes del servidor y los mios:
svr>220 midominio ESMTP Postfix
yo >mail from: usuario@dominio1.com
svr>250 ok
yo >rcpt to: usuario@dominio1.com
svr>250 ok
yo >data
svr>354 End data with .
yo >Subject: Estoy probando
yo >Hola mundo! este es mi primer mensaje
yo >.
svr>250 Ok: queued as 06DD618415
yo >quit
Ahora revisar el log:
postfix/qmgr[2372]: 6D56718029: from=<usuario@dominio1.com>,
size=341, nrcpt=1 (queue active)
postfix/virtual[2442]: 6D56718029: to=<usuario@dominio1.com>,
relay=virtual, delay=12, status=sent (mailbox)
Todo esta OK! Ahora verificar que haya llegado a nuestro 'spool':
# ls /home/postfix/dominio1/
4 -rw
1 postfix postfix 341 Nov 5 02:03 usuario
Todo Ok! Creado con los permisos de postfix.postfix!