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.
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.
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:
queue_only_file = /etc/exim4/queue_only
# Queste ACL hanno lo scopo di verificare se il mittente del messaggio # e` un utente locale, per poter poi dire al system filter che si occupa # del backup delle mail spedite di trattare questa mail come "spedita da noi". # Qui verifico se il mittente e` un host della LAN a cui e` consentito il relay, e se # il sender e` fra i nostri domini locali. Se le condizioni sono vere, setto la variabile # acl_m9 che poi testero` nel system filter dopo. warn sender_domains = +local_domains hosts = +relay_from_hosts set acl_m9 = 1 # Come sopra, pero` il test e` se il sender e` autenticato e se e` fra i nostri domini locali. warn sender_domains = +local_domains authenticated = * set acl_m9 = 1
# Trasporto per il backup delle mail ricevute. # Viene usato dagli altri trasporti come shadow_transport local_backup: driver = appendfile directory_mode = 0700 mode = 0600 create_directory = true file = /var/mail_backups/incoming/${domain}/${local_part} group = mail user = mail delivery_date_add envelope_to_add return_path_add
address_directory, virtual_user_delivery, virtual_user_spam_delivery
# Shadow per il backup shadow_transport = local_backup
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.
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