System Filters in Exim

Il system filter e` un filtro (un file con delle regole) che viene applicato a TUTTE le email in transito. Puo` essere utile per elaborare le email in tempo reale, ad esempio per fare un backup delle email in transito sul server.

Configurazione di un System Filter

Per abilitare un system filter occorre inserire nella configurazione di Exim una riga che indica il nome del file contenente il system filter, cosi`:

system_filter = /etc/exim4/system_filter
system_filter_user = mail
system_filter_group = mail
system_filter_file_transport = address_file

Notate che vi sono diverse opzioni in Exim che rigurdano il system filter. Per esempio qui ho impostato l'utente e il gruppo che verranno usati dal system filter quando dovesse fare operazioni sul file system, e ho indicato un trasporto da usare sempre allo scopo di salvare email su file. Non sempre e` necessario specificare informazioni aggiuntive come queste, dipende da quali comandi vogliamo poter usare nel system filter. Siccome in questo caso voglio poter scrivere su disco, mi serve specificare queste impostazioni.

Uso di un system filter per fare il backup delle email

Questo semplice system filter fa un backup delle email in uscita dal sistema. Le email in entrata vengono backuppate usando uno shadow transport. Vediamo i pezzi di configurazione coinvolti, facendo sempre riferimento alla mia configurazione "di base" di Exim.

In Exim4.conf:

Dopo aver modificato exim4.conf, occorre creare il file /etc/exim4/system_filter contenente le regole per eseguire il backup delle mail in uscita:

# System Filter per salvare la mail in uscita nella directory di backup

# se e` un errore, non salvare nulla e procedi
if error_message then finish endif

# se non e` il primo delivery, e` gia stata salvata al primo delivery,
# non salvare nulla e procedi
if not first_delivery then finish endif

# se e` settata la variabile acl_m9, significa che e` una mail classificata
# come "in uscita dal nostro server" e quindi la salvi nel backup delle mail in uscita
if  $acl_m9 is 1
then
      unseen save /var/mail_backups/outgoing/$sender_address_domain/$sender_address_local_part
endif

Per finire, creiamo la directory /var/mail_backups e la rendiamo scrivibile dall'utente "mail" (come indicato nella configurazione, vedi "system_filter_user").

A questo punto e` sufficiente ricaricare la configurazione di Exim, ed avremo un backup delle email divise per "incoming", "outgoing", e poi dominio e utente.

Se si vuole creare dei files targzippati con dentro la mail settimanale, si puo` eseguire questo scriptino da cron:

# Script per il backup settimanale delle copie della mail

# prima di tutto, blocco il delivery di exim
touch /etc/exim4/queue_only

# poi, aspetto 5 minuti perche` la coda si svuoti del tutto
# forse e` una misura eccessiva, ma sono paranoico
sleep 5m

# poi faccio il backup dei files in /var/mail_backups/incoming e outgoing
# avendo cura di nominare i files con la data dell'esecuzione del backup
# e dicendo al tar di cancellare i files mentre crea l'archivio..

tar czf /var/mail_backups/`date -I'date'`-incoming.tgz /var/mail_backups/incoming/*  --remove-files
tar czf /var/mail_backups/`date -I'date'`-outgoing.tgz /var/mail_backups/outgoing/*  --remove-files

# finita la tarratura, sblocco il lock
rm /etc/exim4/queue_only

# abbiamo finito.

Uso di un system filter per inoltrare tutte le mail di un utente a un altro utente

Questo e` un uso forse non proprio etico, ma puo` venire utile. Lo scopo e` inoltrare tutte le email inviate / ricevute da un utente locale del server a un altro utente, locale o remoto, del server.

Dopo aver configurato exim4 per usare i system filter, come al paragrafo precedente "Configurazione di un System Filter", si puo` creare un system filter cosi` fatto:

# System Filter per salvare la mail in uscita nella directory di backup

# se e` un errore, non salvare nulla e procedi
if error_message then finish endif

# se la mail e` da o per un utente specifico, inoltrala ad un altro utente
if ("$h_to:, $h_cc:, $h_bcc" contains "user@domain.com")
   or ("$h_from:" contains "user@domain.com")
then
   unseen deliver "archive-address@domain.com"
endif

LinuxDebian/Exim4-SystemFilters (last edited 2016-05-16 13:21:18 by Kurgan)