El servidor de correo Postfix es muy potente y altamente configurable.
Ente sus multiples opciones, una de ellas es permitir realizar una acción al recibir un correo y esto se puede aprovechar (como se verá más adelante) para ejecutar un script o programa al recibir un correo.
La ventaja con respecto a estar comprobando cada cierto tiempo un buzón de correo es que el script se ejecuta inmediatamente al recibir un correo , no hace falta tener un servidor pop3 y no hace falta borrar el mensaje porque postfix se lo pasa a la aplicación y no lo guarda en ningún sitio.
Para explicar como configurarlo, parto de la base de que ya se tiene configurado el postfix con un dominio y recibe correos en ese dominio. En mi caso tengo el dominio sistemasorp.com dirigido a mi servidor casero.
Como no quiero que interfiera con el correo de mi dominio actual, he de crear un nuevo registro MX en mi servidor DNS para añadir un subdominio, por ejemplo servicios.sistemasorp.com (esto también me dá una ventaja que comentaré más adelante).
El siguiente paso es acceder como root a la consola y entrar en el directorio /etc/postfix (o donde se encuentre el directorio de configuración del postfix).
Editar el fichero main.cf y añadirlas siguientes lineas (si no existían ya)
transport_maps = hash:/etc/postfix/transport
local_recipient_maps=
Editar el fichero master.cf y añadir la siguiente linea:
XXX unix – n n – 1 pipe flags= user=YYY argv=ZZZ ${sender} ${recipient}
- XXX indica el nombre de una alias, en mi caso servicios
- YYY es el usuario del sistema con el que se ejecutará el script (escoge uno que tenga persmisos para lo que quieras hacer)
- ZZZ es la ruta del script o programa que quieres que se ejecute, en mi caso /usr/local/bin/emailprueba.sh
- ${sender} y ${recipient} son dos variables que le pasamos por parámetros al script.
Editar el fichero transport y añadir la siguiente linea:
subdominio XXX:localhost
- subdominio es la parte entera del dominio, en mi caso servicios.sistemasorp.com
- XXX indica el nombre del alias que usamos en el fichero master.cf, en mi caso servicios
Finalmente ejecutar postmap /etc/postfix/transport para crear la base de datos de transportes de postfix.
Con esto, cualquier correo que se dirija al subdominio que hemos creado se pasará directamente a nuestro script. De ahí nuestra ventaja que comentaba antes: da igual el nombre que aparezca a la izquierda de la arroba, no hace falta que esté dado de alta como usuario en linux, por lo que podemos usarlo como un identificador de servicio, el número de un móvil, etc.
Postfix lo que hace es ejecutar el script pasándole por la entrada estandar todo el contenido del mensaje (cabeceras y cuerpo) y como parámetros los que se le indiquen en el master.cf : la variable ${sender} es la cuenta de correo electrónico del remitente y ${recipient} es el nombre que aparece a la izquierda de la arroba, aunque hay muchos más.
Así por ejemplo si queremos tener un servicio de envío de sms podemos crear un mensaje dirigido a 699999999@servicios.sistemasorp.com desde nuestra cuenta google@gmail.com, por lo que el script además de recibir el mensaje entero recibe como parámetros google@gmail.com y 699999999.
Otro ejemplo es tener un servicio de envío de ficheros y uno de traducción de palabras. En el primer caso si enviamos un correo desde nuestra cuenta google@gmail.com a enviame@servicios.sistemasorp.com y como asunto ponemos una URL nos enviaría de vuelta como fichero adjunto el indicado en la URL. En el segundo caso si enviamos un correo desde nuestra cuenta google@gmail.com a traduce@servicios.sistemasorp.com y como asunto ponemos una palabra en inglés nos enviaría de vuelta la traducción del termino. En ambos casos el script es el mismo y se encarga de saber qué servicio estas solicitando por el nombre de la cuenta de correo al que va dirigido y actuar en consecuencia.
Un script sencillo para ir probando los conceptos es este:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash while read linea do cabecera=`echo $linea | cut -d':' -f1` if [ "$cabecera" = Subject ] then mensaje=`echo $linea | cut -d':' -f2` echo $mensaje $2 | mail -s "Esto es lo que enviaste y a quien" $1 echo $1 $2 $mensaje >> /tmp/pruebamail fi done |
Simplemente recibe un correo y vuelve a enviar al remitente otro correo con los datos que envió. Lo podeis probar enviando un mensaje a pepe@servicios.sistemasorp.com, prueba_de_concepto@servicios.sistemasorp.com, asdfhasdjlfhasdjkfhjkdfh@servicios.sistemasorp.com o el destinatario que querais@servicios.sistemasorp.com y un asunto cualquiera (si no lo recibis mirad que no se haya puesto en vuestra carpeta de spam).