Filtry w eximie

Do zalet exima należy i ta, że można mu zlecić wykonywanie różnych dodatkowych czynności, za pomocą filtrów zapisanych w osobnych plikach. W ten sposób niektórzy zbudowali całkiem niezłe systemy antyspamowe, które wspomagane greylistingiem i kilkoma dodatkowymi regułami dają ogromną skuteczność. Jeśli ktoś chciałby zbudować sobie taki system filtrowania, powinien poszukać tekstów z frazami „exim, filter, forward” i zapewne znajdzie sporo przydatnych opisów. W większości po angielsku – ale to chyba nie stanowi problemu 😉
Jak zbudować filtry – o tym poniżej.

Po reorganizacji swojego serwera pocztowego miałem problem. Stosowany do rozmaitych dodatkowych zadań (np wysyłanie sms) procmail już nie mógł zostać zastosowany. Procmail musi mieć swój plik konfiguracyjny w katalogu użytkownika i ten plik musi być własnością tegoż użytkownika. Wirtualnych użytkowników nie ma w systemie – dla procmaila oni więc nie istnieją.
Podobną barierą okazało się stosowanie dyrektywy „userworward”, która działa świetnie, ale tu sprawa rozbiła się o podobny problem. Nie da się jej zastosować w przypadku wirtualnych użytkowników.
Pozostał mi zatem filtr systemowy, a do tego należało dodać kilka opcji konfiguracyjnych, których domyślnie nie ma. W pliku exim.conf w sekcji głównej dodałem:

###############
# filtr systemowy
system_filter = /etc/mail/exim.filter
system_filter_user = mail
message_body_visible = 5000
system_filter_pipe_transport = sms_pipe
system_filter_file_transport = address_file
system_filter_reply_transport = address_pipe
#####################

Nie wszystkie z tych opcji są mi potrzebne, ale mogą się przydać komuś, kto na przykład będzie chciał analizować nagłówki czy treść. Najważniejsza dla mnie opcja „sms_pipe” pozwala wysyłać sms przez mały skrypcik, jaki mam w systemie. Jednak to jest nazwa wymyślona przeze mnie i exim nie będzie wiedział, co ma robić i to zapewne zaowocuje błędem. Dlatego trzeba tę wartość zdefiniować, w sekcji Transport dodałem:

##############
# definicja sms_pipe
sms_pipe:
driver = pipe

Filtr, który sobie wymyśliłem ma wysyłać smsa po otrzymaniu poczty. Od razu zaznaczam, że jest to sensowne, jeśli przychodzi bardzo mało maili i mamy konto w plusie (lub też mamy jakiś specjalny program wysyłający płatne smsy). W przypadku mojego serwera chodzi o jednego użytkownika, który dostaje mail raz na kilka dni i chce dokładnie wiedzieć kiedy.
Teraz pora na konfigurację pliku /etc/mail/exim.filter.
Wygląda on następująco:

# Exim filter

if
$header_to contains „user@domena”
then
unseen pipe „/bin/sendsms 6xxxxxxxx nowa_poczta”
endif

Ważna jest pierwsza linia, żeby exim wiedział – jaki plik czyta. Następnie mamy warunek, że jeśli odbiorcą jest to należy niewidocznie uruchomić program /bin/sendsms z parametrami i następuje konic warunku. W ten sposób poczta dochodzi do użytkownika, a sms na jego komórkę. Oczywiście można znacznie zawęzić warunki wysyłania sms.

if
$header_to contains „synek@domena”
$header_from contains „mama@innadomena”
then unseen pipe „/bin/sendsms 6xxxxxxxxx poczta_od_mamy”
endif

Ważne są podkreślniki i nie możemy z nich zrezygnować. Bezpośrednio z linii poleceń wysyła się cały sms w cudzysłowach, tu z nich trzeba zrezygnować i w takim wypadku bez podkreślników został by wysłany tylko pierwszy wyraz.
Oczywiście możemy wykorzystać filtr np. do tego, żeby robić kopie maili, żeby filtrować je w zależności od tematu, zawartości lub załączników. Wszystko zależy od inwencji administratora.

autor: W. Trąmpczyński (Maciek)


Dodaj komentarz