La mejor sintaxis sieve que he encontrado: https://mailutils.org/manual/html_chapter/Sieve-Language.html
STATUS:
tengo el ejemplo de configuración de abajo en /etc/dovecot/local.conf
y un guión bash /usr/local/lib/sieve/execute/test
y esto es la prueba en el guión sieve:
if allof(header :contains ["subject"] ["prueba", "sieve"], execute "test") { fileinto "pendiente"; }
doc:
Existe un plugin para sieve que permite ejecutar programas externos pre-definidos mediante su ubicación en un lugar predeterminado.
El plugin activa tres extensiones, que habilitan tres acciones pipe, filter y execute.
Todo ello, plugin, las extensiones que se habilitan y el directorio donde se ubican los programas se define en configuración.
Los programas se pueden ejecutar de dos maneras: directamente mediante un fork del programa a ejecutar o mediante un servicio dovecot específico para esto que permite ejecutar bajo otro usuario.
En los casos de filter y execute, se pueden utilizar en lugar de como acciones, como tests, de forma que si el programa termina sin código de error el test se ha pasado y si no, el test no se ha pasado.
En https://github.com/dovecot/pigeonhole/blob/main/doc/plugins/sieve_extprograms.txt dice: Standard error is written to the LDA log file, que en nuestro caso es syslog, y ahí no aparece nada; tampoco en ~/.dovecot.sieve.log => hacemos log en ~/.log
Y también: If a shell script is expected to read a message or string data, it must fully read the provided input until the data ends with EOF, otherwise the Sieve action invoking the program will fail
Las variables de entorno que recibe el script con execute (con pipe no recibe nada) son: USER, HOME, HOST (local), SENDER (address), RECIPIENT (address) y ORIG_RECIPIENT (address).
Configuración
Se realiza dentro de un bloque plugin { ... }, que puede repetirse tantas veces
como interese dentro de la configuración local doveconf; dentro de ese bloque,
todo lo relativo al plugin sieve lleva el prefijo 'sieve_'.
/etc/dovecot/local.conf es, pues, un buen lugar para esta configuración
Declaración del plugin sieve:
sieve_plugins = sieve_extprograms [ ... ]
Declaración de las extensiones a utilizar del plugin:
sieve_global_extensione = +vnd.dovecot.pipe [ ... ]
sieve_extensions = +vnd.dovecot.execute [ ... ]
... en el primer caso, no es utilizable por scripts sieve de usuario.
Declaración de directorios:
sieve_{pipe|filter|execute}_bin_dir
Ejemplo para utilizar solo la extensión 'execute':
plugin {
sieve_plugins = sieve_extprograms
# enable for user script (once working, we should move to global extensions)
sieve_extensions = +vnd.dovecot.execute
sieve_execute_bin_dir = /usr/local/lib/sieve/execute
}
Uso en script sieve:
require [ "vnd.dovecot.pipe" ] [ "vnd.dovecot.filter" ] [ "vnd.dovecot.execute" ]
Interfaz con los programas:
documentada en https://github.com/dovecot/pigeonhole/blob/main/doc/rfc/spec-bosch-sieve-extprograms.txt
cuando el programa lee el mensaje en su entrada estándar, ha de tragarse el mensaje completo: todo el input que le llega.
La salida de error estándar del programa va al log del LDA (dovecot-lda). Teóricamente pq en mi instalación no aparece en log, lo que es una putada para debug, pq obliga abajo que el propio programa grabe fichero de log. Operación pipe: Entrega el mensaje a la entrada estándar del programa y considera el mensaje entregado: no sigue evaluando reglas si el programa se ejecuta y no devuelve fallo, excepto que se use con ':copy', cuando se considera que pipe entrega una copia del mensaje y no el mensaje en sí. Si el programa no se puede ejecutar, entonces si pipe se usa con 'try' es como si no se hubiera intentaod, mientras que sin ':try' el script sieve entero falla. Si el programa termina con código de error, entonces el mensaje no se da x entregado. Operación filter: Se entrega el mensaje en entrada estádar del programa y se recoge en salida estándar lo que se considera en adelante el mensaje. Tanto si el programa no se puede ejecutar como si devuelve error o no proporciona nada en salida, el mensaje original se mantiene tal cual (y la ejecución completa del script sieve puede darse por fallida, según la implementación). Operaciones como reject o vacation no utilizan la nueva versión del mensaje, sino el original, y si otra operación provoca el fallo del script sieve, igualmente el mensaje que cuenta es el original. Operación execute: Se ejecuta el programa externo con el mensaje u otra info como entrada estándar y se puede recoger la salida para otros fines, pero el mensaje original no se altera ni se da por entregado en ningún caso.