Procmail

 

 

 

            Procmail je program koji automatski procesira pristiglu elektroničku poštu (u nastavku e-mail) ovisno o njenom sadržaju. Pod pojmom procesira podrazumijeva se različita obrada podataka pristiglih u zaglavlju e-maila, te potom obavljanja određene aktivnosti nad tijelom e-maila kao npr. pohranjivanje pristiglih e-mail-ova u različite direktorije ovisno o sadržaju podataka u pojedinim dijelovima zaglavlja (npr. subject), proslijeđivanje e-mail-ova na razne druge adrese, odgovaranje pošiljaocu na određene njegove zahtjeve itd. U slučaju da je jedna od aktivnosti slanje e-maila tada je uz program procmail potreban i program sendmail koji omogućava slanje e-maila. Na većini računala već postoji neki e-mail transfer agent. Važno je da oba programa budu iz istog programskog paketa (u našem slučaju to je debian programski paket, a korišteni programi su procmail_3.13.1-1.deb i sendmail_8.9.3-3.deb). Kod instaliranja sendmaila i procmaila prvo je potrebno instalirati m4_1.4-9.deb, potom sendmail_8.9.3-3.deb, te na kraju procmail_3.13.1-1.deb. Na kraju instalacije podignuti sendmail kao daemon program koji osluškuje port 25.

Koje od navedenih aktivnosti će se obavljati određujemo mi pisanjem odgovarajućih procmail skripti (procmail recipes). Procmail skripte pišu se u skladu s procmail sintaksom, ali postoji već čitav niz gotovih skripti koje obavljaju neke osnovne aktivnosti potrebne većini korisnika, te nije potrebno ulaziti dublje u analizu procmail sintakse. Kada se odlučimo koje aktivnosti želimo da naša procmail skrita obavlja jednostavno potražimo na Web stranicama koje opisuju rad procmaila gotove odgovarajuće skripte ili ih sami napišemo, te ih uključimo u glavni procmail program koji sadrži njihove pozive. U našem slučaju glavni procmail program izgleda ovako:

 

 

VERBOSE = no                                # (ovo je oznaka komentara) stavi yes ako radis debugiranje

 

## LOGABSTRACT = all                      # oznaka ## znaci neukljuceno, koristi se kod debugiranja

 

MAILDIR = $HOME/mail               # kreiranje mail direktorija, tu se nalaze svi mailovi koji se šalju s pine (potrebno ga je kreirati ako ga nema). Po defaultu se svi mail-ovi preusmjeravaju i nalaze u datoteci /var/spool/mail/student

 

PMDIR = $HOME/Procmail                 # kreiranje Procmail direktorija u kojem se moraju nalaziti sve procmail skripte (potrebno ga je kreirati ako ga nema)

 

LOGFILE = $PMDIR/log                # kreiranje log datoteke unutar Procmail direktorija čiji se sadržaj automatski generira, a u kojoj će detaljnije biti opisano što se s pristiglim mailom sve radi

 

INCLUDERC = $PMDIR/testing.rc      # poziv procmail skripte koja služi za elementarno testiranje procmaila

 

INCLUDERC = $PMDIR/adp.rc          # poziv procmail skripte koja obrađuje zahtjev korisnika vezanih za AD pretvorbu

Glavni procmail program potrebno je napisati u jednom od tekstualnih editora (u Linux-u je to npr. joe editor) i spremiti ga u home direktorij pod imenom .procmailrc (rc na kraju imena dolazi od recipe). Skraćeno, na komandnu liniju potrebno je napisati:

 

cd                    /* odlazak u home direktorij */

joe .procmailrc                  /* otvaranje joe tekstualnog editora */

 

            Kao što se vidi iz glavnog programa sve korištene skripte moraju se nalaziti u Procmail direktoriju. Tako se u našem slučaju nalaze testing.rc i adp.rc skripte. Testing.rc skripta svaki e-mail koji u subjectu sadrži riječ test sprema u datoteku in-testing koja će se nalaziti u mail direktoriju, te sadrži slijedeće:

 

:0:

* ^Subject:.*test

in-testing

 

Adp.rc skripta obrađuje zahtjev korisnika za određenim brojem uzoraka mjernog signala s određenog kanala, te željene rezolucije. Navedeni zahtjev nalazi se u subjectu e-maila, adrese student@linlab10.zesoi.fer.hr , i oblika je adp broj_kanala broj_uzoraka rezolucija. Podatci koji se zadaju u subjectu su broj_kanala (broj od 1 do 8), broj_uzoraka (broj od 1 do 1000 i zadaje se u obliku npr. 0324), te rezolucija (zadaje se u obliku l - low, m - middle ili h - high). Npr. subject bi mogao izgledati ovako adp 4 0056 m. Adp.rc skripta sadrži slijedeće:

 

SUBJECT = 'formail –xSubject:'            # konstruktor varijable okoline SUBJECT kojoj pridružuje vrijednost subject-a

:0

* ! ^From +YOUR_USERNAME            # sprečavanje nastajanja mail petlje

* ! ^Subject:.*Re:                         # sprečavanje nastajanja mail petlje

* ! ^FROM_DAEMON               # sprečavanje nastajanja mail petlje

?????                                                  # poziv C programa za parsiranje subjecta

* ^Subject:.*adp                                    # testiranje da li subject sadrži riječ adp

˝(formail –r ; cat rezultat) ˝ $SENDMAIL –oi –t   # slanje dotičnom korisniku datoteke rezultat.txt  kao odgovor na njegov zahtjev           

 

            Prethodno je u konfiguracijskoj datoteci  /etc/mail/sendmail.mf  potrebno dodati slijedeći red:

 

MAILER(procmail)dnl           

 

Slijedeći C program parsira subject dospijelog e-maila, tj. izdvaja redni broj kanala s kojeg će se uzimati uzorci, zatim broj uzoraka koji će se uzeti, te rezoluciju s kojom će se uzimati. Subject se ovdje pojavljuje kao varijabla okoline (SUBJECT) jer se tako definira u procmail skripti koja obrađuje pristigle e-mail-ove. Dobiveni podaci iz subject-a proslijeđuju se programu klijent koji kao rezultat vraća traženi broj uzoraka navedene rezolucije s navedenog kanala. Ti uzorci zapisuju se u datoteku rezultat.txt, koja se kao tijelo e-maila šalje kao odgovor na zahtjev pošiljatelja.

 

 

# include<stdio.h>

# include<stdlib.h>

 

main( )

{

int br_k, br_u, i;

char rez, brkanala, *SUBJECT;

char bruzoraka[4];

 

/* učitavanje ulaznog niza (zahtjeva) iz varijable okoline SUBJECT */

SUBJECT = getenv( ˝SUBJECT˝ );       

 

/* parsiranje subject-a */

brkanala = SUBJECT[4];

br_k = ( int )brkanala;

rez = SUBJECT[11];

 

for( i=0; i<4; i++ )

bruzoraka[i] = SUBJECT[i+6];

 

bruzoraka[4] = ' \0 ';

br_u = atoi( bruzoraka );

 

/* proslijeđivanje parametara programu klijent i ispis uzoraka u datoteku rezultat */

system( ˝/home/student/klijent br_k br_u rez > /home/Procmail/rezultat.txt˝ );

}

 

 

KOMENTAR: Meni nije uspio proraditi dio skripte koji šalje određenu datoteku pošiljaocu, te nisam uspio pronaći kako izgleda poziv C programa u procmail skripti. To neka ostane neriješen problem za slijedeću generaciju!!

 

 

LITERATURA:

 

http://www.procmail.org/jari/   => pm-tips

 

            7.7 Quoting: Passing values to an external program

7.8 Passing values from an external program

8.9 Make your own .procmailrc available to others

12.6 Complaining about html messages

 

http://userpages.umbc.edu/~ian/procmail.html

http://www.ii.com/internet/robots/procmail/

http://www.ii.com/internet/robots/procmail/qs/

http://consult.cern.ch/service/mail/utils/filtering/doc/procmailex.html

http://fsinfo.cs.uni-sb.de/~abe/man/procmailex.html