Lanzar rutinas con Postfix

En este post voy a explicar como añadir un filtro o rutina a Postfix. Esto nos puede servir para desarrollar cualquier aplicación basada en el correo electrónico, como puede ser el control remoto de tu maquina, administración de contenidos de una Web u otro tipo de aplicaciones gestionadas a trabes del correo electrónico.

La configuración de postfix en una maquina GNU/Linux es bastante sencilla, basta con hacer:

$> apt-get install postfix



y configurar Postfix para que acepte correos de nuestros dominios editando el archivo /etc/postfix/main.cf

$> vi /etc/postfix/main.cf


/etc/postfix/main.cf

myhostname = biospam.pandasoftware.local
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = localhost, midominio.com
relayhost =
mynetworks = 127.0.0.0/8



Una vez comprobado que recibimos nuestro correo correctamente pasamos a configurar Postfix para que ejecute un script cada vez que llegue un correo. Por tanto editaremos el archivo /etc/postfix/master.cf de la siguiente manera:

Al principio del documento añadiremos (en negrita):

/etc/postfix/master.cf

# =============================================================
# service type private unpriv chroot wakeup maxproc command
# (yes) (yes) (yes) (never) (100)
# =============================================================
smtp inet …other stuff here, do not change… smtpd
-o content_filter=filter:dummy



Para decirle que aplique la rutina filter por cada conexión smtp entrante.

Abajo definimos la rutina filter de la siguiente manera:

/etc/postfix/master.cf

# =============================================================
# service type private unpriv chroot wakeup maxproc command
# (yes) (yes) (yes) (never) (100)
# =============================================================
filter unix – n n – 10 pipe
flags=Rq user=filter argv=/path/to/script -f ${sender} — ${recipient}



donde argv será la ruta al script que lanzara nuestra aplicación.

Un ejemplo de script podría ser este:

1 #!/bin/sh
2
3 # Simple shell-based filter. It is meant to be invoked as follows:
4 # /path/to/script -f sender recipients…
5
6 # Localize these. The -G option does nothing before Postfix 2.3.
7 INSPECT_DIR=/var/spool/filter
8 SENDMAIL=”/usr/sbin/sendmail -G -i” # NEVER NEVER NEVER use “-t” here.
9
10 # Exit codes from
11 EX_TEMPFAIL=75
12 EX_UNAVAILABLE=69
13
14 # Clean up when done or when aborting.
15 trap “rm -f in.$$” 0 1 2 3 15
16
17 # Start processing.
18 cd $INSPECT_DIR || {
19 echo $INSPECT_DIR does not exist; exit $EX_TEMPFAIL; }
20
21 cat >in.$$ || {
22 echo Cannot save mail to file; exit $EX_TEMPFAIL; }
23
24 # Specify your content filter here.
25 python filter.py
26 echo Message content rejected; exit $EX_UNAVAILABLE; }
27
28 $SENDMAIL “$@”
29
30 exit $?



Donde podríamos llamar a nuestro script en python filter.py que parsearia el mensaje realizando las diferentes funciones. Por ejemplo podríamos recoger el subject del mensaje y lanzarlo como un comando. De tal manera que si mandáramos un mensaje con el subject “halt” podríamos apagar la maquina de forma remota.

Espero que os haya sido de gran ayuda!

3 Responses to Lanzar rutinas con Postfix
  1. Skinner

    Aupa!

    Veo que te has metido con ese gran monstruo que es Postfix… a mi me intimidó en su momento y le cogí apego a qmail.

    Está muy bien el post, muchas veces usamos métodos complicados para llevar a cabo remotamente tareas sencillas (como iniciar o cerrar programas), cuando con un simple mail podríamos solucionarlo, y con la ventaja de que el correo electrónico es universalmente accesible (a diferencia de las soluciones basadas en web, o para qué hablar de VNC o similares…)

    Mira por donde, igual reinstalo postfix en el server…

    Agur!

  2. Napster

    Hola…quisiera hacerles una consulta.
    Tengo un servidor de correo montado con Postfix, el cual hace relay con el de mi proveedor, pero lo que me interesa es hacer un filtro o script para cuando me llegue un mensaje de una direccion mail determinada que en el Subject contenga una direccion mail cualquiera, mi server postfix automaticamente reenvie el correo hacia la direccion mail que viene escrita en el Subject.

    Agradeceria cualquier comentario al respecto

  3. Iker

    Con un script de python puedes leer el correo acceder a la cabecera subject y mediante una expresión regular comprobar que el asunto tiene el formato indicado…

    por ejemplo si accederíamos al subject del mensaje:

    import email
    
    msg = email.message_from_string(texto_del_mail)
    asunto = msgt.get("subject")
    

    http://docs.python.org/library/email.parser.html
    http://docs.python.org/library/email.message.html#email.message.Message

Deja un comentario

Your email address will not be published. Please enter your name, email and a comment.

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>