¿Procmail guarda en un directorio y ejecuta un script?

¿Procmail guarda en un directorio y ejecuta un script?

Estoy usando procmailreglas Maildir/sencillas como la siguiente para guardar los correos electrónicos entrantes en directorios:

:0:
* ^X-Spam-Status: Yes
Spam/

Ahora me gustaría recibir una notificación en el escritorio sobre nuevos correos electrónicos en ciertos directorios/reglas. Ya sé cómo manejar las notificaciones, pero cómo indicar procmailque se guarden en un directorio.yejecutar un script?

Sé que puedotubopero |commandpreferiría dejar que procmailse guarde el archivo y luego simplemente ejecutar un script.

Tener el correo electrónico (al menos los encabezados) en la tubería o la ruta del directorio + archivo como argumentos sería bueno, ejecutar el script de forma asincrónica también sería bueno.

actualizar

Entonces, según la respuesta de @slm, ese es el resultado:

:0 c:
* ^X-Spam-Status: Yes
Spam/

:0 Whi
* ^X-Spam-Status: Yes
| $HOME/install/bin/notify.sh

c Copiarel mensaje en el directorio pero continúa con las siguientes reglas

No lo estoy usando fporque no es un filtro, si la regla coincide, quiero que procmail se detenga aquí (espero no malinterpretar el manual aquí)

Wpara suprimir cualquier fallo del programa

hatubosolo encabezados

ipara ignorar cualquier error de escritura en la tubería

No lo estoy usando wporque no quiero esperar a que regrese el script.

Creo que tampoco necesito un archivo de bloqueo (no :después Whi)

actualización 5/12/14

Al final, adopté exactamente la solución que propuso @tripleee.

También jugué mailutils-comsatddurante unos minutos antes de rendirme.

.procmailrc:

COMSAT=no

Respuesta1

Para ejecutar el correo a través de un script, puede modificar su regla usando 2 reglas:

:0: c
* ^X-Spam-Status: Yes
Spam/

:0: fw
* ^X-Spam-Status: Yes
| /usr/bin/python /work/scripts/process_mail.bash

Su programa recibirá el correo en STDIN. Tendrás que hacer eco del correo posiblemente transformado en STDOUT.

fw significa:

  • fConsidere la tubería como un filtro.
  • wEspere a que finalice el filtro o programa y verifique su código de salida (normalmente ignorado); si el filtro no tiene éxito, entonces el texto no habrá sido filtrado.
  • cGenere una copia carbón de este correo. Esto sólo tiene sentido al entregar recetas. La única receta que no se entrega a la que este indicador tiene efecto es en un bloque de anidamiento. Para generar una copia, esto clonará el proceso de procmail en ejecución (los archivos de bloqueo no se heredarán), por lo que la clonación procederá como de costumbre y el padre saltará a través de la cuadra.

Referencias

Respuesta2

Aquí hay una ligera adaptación de la respuesta de @slm.

No deberías usar el bloqueo con Maildir, y las banderas y los dos puntos del bloqueo estaban al revés. (En realidad, crearía un archivo de bloqueo llamado c, en lugar de clonar el mensaje, por lo que la segunda acción nunca se activaría).

La fbandera parece fuera de lugar.

Invertí el orden de las acciones; Si bien tiene sentido entregar y luego notificar, desde el punto de vista de Procmail, la notificación es una acción secundaria que puede fallar, así que lo hago en un clon e ignoro su estado de salida.

Finalmente, agrupar dos acciones bajo una condición es más intuitivo usando llaves.

:0
* ^X-Spam-Status: Yes
{
    :0cWhi
    | $HOME/install/bin/notify.sh
    :0
    Spam/
}

Dicho esto, también observo que Procmail ya genera comsatnotificaciones listas para usar. Es un protocolo de notificación heredado, pero es posible que puedas usarlo para algo. En segundo lugar, se podría crear un mecanismo de notificación simple utilizando un script que lo monitoree procmail.log. (Pero sí, analizar archivos de registro apesta).

información relacionada