Logo
You
Code

Lanzar script php cuando llega un e-mail en POSTFIX

Autor YouCode - http://www.youcode.com.ar/postfix/lanzar-script-php-cuando-llega-un-email-en-postfix-188

En este tutorial, vamos a ver cómo activar un script PHP cada vez que el servidor web recibe algún correo.

Vamos a añadir nuestro filtro. Lo hacemos en el archivo master.cf que contiene la lista de todos los procesos que se ejecutan cuando se entrega un correo electrónico.
myhook unix - n n - - pipe
  flags=F user=www-data argv=/path/to/postfix.php ${sender} ${size} ${recipient}
Hemos registrado un script llamado "myhook".
Quedémonos en master.cf. Ahora tenemos que decirle a Postfix cuando ejecutar ese script.

Para ello, vamos a editar la línea smtp y cambiarla de esta manera:
smtp      inet  n       -       -       -       -       smtpd
        -o content_filter=myhook:dummy
El -o content_filter = myhook: dummy le dice Postfix que ejecute el filtro para todo el correo que llega a través de la entrega SMTP.

NOTA si envias un e-mail utilizando el comando "sendmail", el filtro no se disparará. En este caso, añadir la opción siguiente después del método de entrega "pickup":
pickup    fifo  n       -       -       60      1       pickup
	-o content_filter=myhook:dummy
No olvidar: después de cambiar un archivo de configuración, debe ejecutar el comando:
postfix reload
Ahora, vamos a escribir el script PHP. Vamos a llamarlo "postfix.php"
Lo primero que quiero hacer es hacer que el script tenga permisos de lectura/escritura por cualquier persona (podemos fortalecer los derechos más adelante):
chmod +rx postfix.php
El script debe poder se ejecutado desde la línea de comandos, por lo que debe comenzar con: # !/ usr / bin / php
(asumiendo que su PHP CLI se encuentra en / usr / bin / php)

Primero vamos a escribir un script que no hace nada, excepto escribir una línea en un archivo temporal en "/ tmp / postfixtest".
#!/usr/bin/php
<?php
$file = fopen("/tmp/postfixtest", "a");
fwrite($file, "Script successfully ran at ".date("Y-m-d H:i:s")."\n");
fclose($file);
?>
Ahora, vamos a ejecutarlo desde la línea de comandos:
su www-data
./postfix.php
comprobamos que si funciona. Si ve líneas agregadas en "/ tmp / postfixtest", el script funciona.
Es importante "su" en el usuario que ejecutará el script, ya que esta es la única manera de saber si hay algún problema de seguridad que podría ocurrir.

Si el script está funcionando bien, ahora puedes probar enviando un correo electrónico.
El correo debe estar completamente redirigido a nuestro filtro.

Te darás cuenta de que tu script PHP se está ejecutando (mirando el "/ tmp/postfixtest") , y también nos daremos cuenta que el correo fue enviado de una forma no normal, o sea que a pasado por el filtro.

Si se enfrentan a un problema, el primer lugar para buscar es en los registros de log.
En Ubuntu y Debian, la ubicación predeterminada de los registros es: / var / log / mail.log

Ahora, vamos a crear un script un poco más útil:
#!/usr/bin/php
<?php
$file = fopen("/tmp/postfixtest", "a");
fwrite($file, "Script funcionando ".date("Y-m-d H:i:s")."\n");
 
 
// read from stdin
$fd = fopen("php://stdin", "r");
$email = "";
while (!feof($fd)) {
	$line = fread($fd, 1024);
	$email .= $line;
}
fclose($fd);
 
fwrite($file, $email);
fclose($file);
 
?>

Este script lee el mensaje electrónico que se envía por stdin (la entrada unix estándar).
Se escribe el resultado en nuestro archivo "/ tmp / postfixtest". Así que ahora, se puede ver el contenido del correo en el archivo.

Hagamos que solo funcione para una determinada cuenta de E-Mail

Para ello, tendremos que escribir un archivo de configuración "access". En este archivo de configuración, podemos escribir lo que debe ser filtrado;

ejemplo del contenido del archivo
juanperes@dominio.com FILTER myhook:dummy
Este archivo dice que los correos de "juanperez@dominio.com" deben ser entregados a nuestro filtro.
Postfix no sabe cómo leer un simple archivo "access". Debemos dejarlo como Postfix puede leerlo:
postmap /etc/postfix/access
El comando postmap debe crear un archivo /etc/postfix/access.db. Se trata de una versión de "hash" del archivo de configuración "Acceso" que puede leer rápidamente Postfix.

Por último, hay que hacer referencia al archivo de "acceso" en el archivo main.cf.
Busque la directiva smtpd_recipient_restrictions y añadir al principio de la directiva: 
check_recipient_access :/ etc/postfix/acceso

Directiva siguiente si no está presente en main.cf, agreguela cono la siguiente línea:
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/access, permit_mynetworks, reject_unauth_destination
esto asegura que se utilice el archivo "acceso".
Finalmente, reiniciamos postfix
postfix reload
En otro tuto veremos como analizar un correo con php zend (zend framework)

 
http://www.youcode.com.ar/postfix/lanzar-script-php-cuando-llega-un-email-en-postfix-188