Üdvözöljük a Hallgatói Számítógép Központ honlapján!

Bevezetés a procmail használatába

Tartalomjegyzék


Mi a Procmail?

A Procmail egy elektronikus levelek szűrésére való program. Hasznos nagy mennyiségű beérkező e-mail feldolgozására és szétválogatására. Használhatjuk levelezési listák leveleinek szétválogatására, automatikus válasz létrehozására, akár levelezési lista működtetésére is.

A Procmail működését egy, a home könyvtárunkban levő fájllal vezérelhetjük. Ez a leírás ennek a fájlnak szerkezetével foglalkozik.

A leírás csak az alapvető dolgokat mondja el. Először egy minta szűrőt készítünk. Azután gyakorlásképpen készítünk még pár szűrőt. Ennek elégnek kell lennie, hogy ezután már saját magad is készíthess szűrőket.


Első lépések

A Procmail-t egy .procmailrc nevű, a home könyvtáradban levő fálj vezérli. Nagyon fontos, hogy Unixos újsor karakterek legyenek a fájlban!! Ezért használjuk Unixos szerkesztőt, például az mc-nek az editorját. NE szerkesszük a fájlt Windows alatt!

Megjegyzés

A Unixban a ponttal kezdődő fájnevek rejtett fájlokat jelölnek. Az ls parancs nem listázza alapból ki őket, csak ha megadjuk neki a -a opciót: ls -a

Első látásra a .procmailrc fájl kicsit furcsának tűnhet, ezért először egy egyszerű példát nézünk meg. Utána majd bemutatásképpen készítünk egy új .procmailrc-t.

Példa .procmailrc:

# .procmailrc
# a bejövő leveleket szétválogatjuk mappákba
MAILDIR=$HOME/mail           # a mappák a ~/mail könyvtárban vannak
LOGFILE=$HOME/procmail_log   # a feldolgozás naplózása ebbe a fájlba történik
# Vigyázat! A logfile nagyra nőhet, ha sosem töröljük!

# a DC-Linux levelezőlistáról jövő leveleket a dclinux mappába tesszük.
:0:
* ^(From|Cc|To).*dc-linux
dclinux
A #-val kezdődő sorok megjegyzéseket jelölnek, a Procmail nem veszi őket figyelembe

A .procmailrc-nek két része van: a beállítások és a receptek. A beállítások részben néhány változót állítunk be, azért, hogy a Procmail tudja, hogy hol vannak a leveles mappáink. A receptek megmondják a szűrési feltételeket.

Beállítások
Ez a rész megmondja a Procmailnek, hogy hol találja a leveles mappákat, és a programokat, amiket esetleg le kell futtatnia. Csak a legfontosabb beállításokat ismertetem, a többi megtalálható a procmailrc manualban.

PATH=/bin:/usr/bin:/usr/local/bin
Ez a beállítás megmondja a Procmailnek, hogy hol keresse a lefuttatandó programokat. Sokszor nincs rá szükség.
MAILDIR=$HOME/mail           # a mappák a ~/mail könyvtárban vannak
A MAILDIR könytárban vannak a mappáink. A $HOME a home könyvtárunkat jelöli. A Pine levelezőprogram alapbeállításban ebbe a könyvtárba teszi a leveleket.
DEFAULT=/var/mail/$LOGNAME
A DEFAULT a bejövő e-mailek alapbeállítás szerinti helye. Az Ural2-n nincs szükség beállítani, alapértelmezés szerint /var/mail/felhasználónév.
LOGFILE=$HOME/procmail_log  # a feldolgozás naplózása ebbe a fájlba történik
Ez megmondja, hogy a Procmail működéséről hova kerüljön a log. Ha nem kívánunk értesülni róla, adjunk neki /dev/null értéket, vagy hagyjuk el ezt a beállítást. Ne feledjük el, hogy a logfájl mérete nagyon nagyra nőhet, ha sosem töröljük.
SHELL=/usr/local/bin/bash
Ez megmondja azt a shellt, amit a Procmailnek használnia kell a programok elindítására. Nem kötelező megadni, ha nem adjuk meg, ugyanazt használja, mint ami a flhasználó default shellje.
Receptek
Most nézzük a recepteket.

A recepteknek a következő a formátumuk:

:0 [flagek] [: [lock-fájl] ]
nulla vagy több feltétel
egy akció sor
A flagekről és a lock-fájlról később ejtünk szót. Az alapötlet az, hogy ha a feltétel igaz, akkor végrehajtódik az akció sor. Most nézzük a fenti dclinux-os receptet.
# a DC-Linux levelezőlistáról jövő leveleket a dclinux mappába tesszük.
:0:
* ^(From|Cc|To).*dc-linux
dclinux
Az akció sor ebben az esetben egyszerű: dclinux. Ez azt jelenti, hogy ebbe a folderbe tegye a Procmail a levelet. Lehetne egy e-mail cím is, vagy egy elindítandó program, esetleg több program. Később nézünk példákat.

A feltétel megmondja, hogy a Procmail mit keressen a levélben. A feltételek egy *-gal kezdődnek, a többi rész egy keresendő minta. Ha a levél fejlécében megtalálható a minta, akkor végrehajtódik az akciósor. A minta egy reguláris kifejezés. A fenti feltétel magyarra lefordítva:

ha a sor elején 'From' vagy 'Cc' vagy 'To' van, azt pár karakter követi, azt pedig 'dc-linux' követi
Ezért ez a minta megtalálható azokban a levelekben, amiknek 'dc-linux' van a From, Cc, vagy To sorokban a levél fejlécében.

A legtöbb .procmailrc fájlnak több receptje van. A szabály az, hogy ha mást nem mondunk, akkor a Procmail az első illeszkedő receptnél megáll, és nem vizsgálja az illeszkedést a többi receptre.

Reguláris kifejezések
A reguláris kifejezések magától értetődőek lesznek, amint megértjük a működésüket.

Először is, bármilyen NEM speciális karakter illeszkedik magára. Ebben benne van minden szám, betű, és néhány írásjel. Egy reguláris kifejezés:

	Bob
illeszkedik a "Bob" sztringre. A Procmail nem tesz különbséget a kis- és a nagybetűk között, ezért a kifejezés illeszkedik a "bob"-ra, a "bOb"-ra, és a "BOB"-ra is.

A pont ('.') illeszkedik minden karakterre, kivéve az újsor karakterre. Tehát a

	.ob Jones
kifejezés illeszkedik a "Bob Jones"-ra, a "Rob Jones"-ra, és a "Qob Jones"-ra is.

Bármilyen karakter után álló * illeszkedik az adott karakter nullától tetszőleges számú ismétlődéseire. Ezért a

	Bob* Jones
illeszkedik a "Bo Jones"-ra, "Bob Jones"-ra, és a "Bobbbbbbbbbb Jones"-ra is. A ".*" minta illeszkedik tetszőleges számú bármilyen karakterre.

Használhatók még a '+' lés a '?' módosítók. A "a+" kifejezés illeszkedik egy vagy több a-ra. A "a?" illeszkedik nulla vagy egy a-ra.

Zárójeleket használhatunk a minták módosítóval való használatára. Tehát a

	B(ob)+
illeszkedik "Bob"-ra, és "Bobobobobobob"-ra is.

Ha egy adott pozíciónál levő karakter több is lehet egy mintában, akkor használhatjuk a szögletes zárójelet:

	Part [abcd]
illeszkedi "Part a"-ra, "Part b"-re, "Part c"-re, and "Part d"-re is. A '^' karakterrel negálhatunk:
	[^aeiou]+
illeszkedik egy vagy több NEM magánhangzóra.

A '|' karakterrel VAGY kapcsolatot teremthetünk két reguláris kifejezés között:

	Bob|Joe
illeszkedik "Bob"-ra és "Joe"-ra.

Az utolsó két említendő speciális karakter a '^' és a '$'. '^' a sor elejét jelenti, s '$' a sor végét. Tehát

	^To:
illeszkedik a 'To:'-ra a sor elején.

A manualban többet olvashatunk a speciális karakterekről.


Receptek készítése

Készítsünk egy .procmailrc-t, amit akár a való életben is használhatunk. Még több példát olvashatunk a procmailex manual oldalban.

A mintapéldában adott beállításokat használjuk ezekhez a példákhoz.

Tegyük fel, hogy az Israeline levelező listát járatjuk. Tegyük ezeket a leveleket egy 'israel' mappába.

A levelek erről a listáról így vannak megcímezve:

To: Multiple recipients of list <israeline@nysernet.org>
A minta ilyen lesz: "egy 'To:'-val kezdődő sor, amiben benne van az 'israeline'". Vagy reguláris kifejezéssel: ^To:.*israeline. A recept ilyen lesz:
:0:                # az utolsó kettőspont azt jelenti, hogy lock-fájlt használunk
* ^To:.*israeline
israel             # a leveleket az israel mappába tesszük
Fontos még megemlítenünk, hogy tilos a feltételek sorába megjegyzést tenni! Különben ezt is a reguláris kifejezés részének tekintené a procmail.

Mi is a lock-fájl? Tegyük fel, hogy két israeline levél érkezik egyszerre. A levelezőrendszer két Procmailt indítana, és mindkettő egyszerre akarna a mappába írni. A lock-fájl használatával az első lefutó Procmail lefoglalja magának a mappát, így a másik nem tud beleírni addig, amíg az első fel nem szabadította.

Most írjunk egy szűrőt, ami Bob viccleveleit továbbítja a rocky@wossamatta.edu címünkre:

:0
* ^From.*bob
* ^Subject:.*(joke|funny)
! rocky@wossamatta.edu
A levél továbbítását a '!' karakter jelzi az akciósor elején. Azért nincs kettőspont a From után, mert egy levélben több From sor is lehet, olyan is, amiben van kettőspont és olyan is, amiben nincs. Lock-fáljra most nincs szükség, mert nem írunk mappába.

Most írjunk egy olyan szűrőt, ami nem csak továbbítja a vicceket, hanem archiválja is őket!

A módosított recept:

:0:
* ^From.*bob
* ^Subject:.*(joke|funny)
{
  :0 c
  ! rocky@wossamatta.edu

  :0 b:
  | gzip >> joke-archive.gz
}
Akciósor helyett most egy blokkot kell használnunk, mert egy receptben csak egyetlen akció lehet, viszont az az akció állhat egy újabb receptblokkból. Ezt a kapcsos zárójelek jelzik. Ez olyan mint egy másodlagos .procmailrc, tehetünk bele tetszőleges számú receptet, amiket a Procmail csak akkor vesz figyelembe, ha a "szülő" recept illeszkedik a levélre.

Az első recept a blokkban a továbbítás. Használunk egy flaget is, a 'c'-t. A 'c' flag hatására a Procmail, lemásolja a levelet, és a feldolgozás nem áll meg, hanem a következő receptnél folytatódik.

A programnak a '|' szimbólummal adhatjuk át a levelet.

A belső receptek közül a másodikkal archiváljuk a továbbított leveleket egy tömörített fájlban. Itt egy újabb flaget használunk. A 'b' flag azt jelenti, hogy az akciósor csak a levél törzsét kapja meg, a fejlécet nem.

A levél törzsét a "gzip" programnak küldjük, "gzip", ami összetömöríti, és a "junk-archive.gz" fájl végére teszi. Ezt később a "gunzip" paranccsal tudjuk kitömöríteni:

	gunzip junk-archive.gz
Most már tudjuk az alap dolgokat a Procmailről. A manual oldalakban találhatunk több információt. A procmailrc oldal írja le a használható flageket. A procmailex oldal még több példát tartalmaz.

Hogyan indíthatjuk el a procmail programot?

Az Ural2-n fel van telepítve a Procmail, de alapértelmezett levélfeldolgozóként nincs beállítva. Ezért létre kell hoznod egy .forward nevű fájlt (a . fontos a fájlnév elején!) a home könyvtáradban, a következő tartalommal:

"|IFS=' '&&p=/usr/local/bin/procmail&&test -f $p&&exec $p -Yf-||exit 75 #ab123"
Az idézőjelek is kellenek a fájlba! A # után a saját login nevedet kell írnod. Ezt a fájlt a legegyszerűbben úgy hozhatod létre, ha az előző sort egy editorral (pico, joe, vi, emacs, stb.) beleírod.

Miután létrehoztuk a .forward és a .procmailrc fájlokat, a következő parancsokkal állíthatjuk be a jogosultságaikat:

chmod 600 ~/.forward
chmod 600 ~/.procmailrc

Hogyan tovább?

Ez a leírás csak a legalapvetőbb dolgokat mondta el a Procmailről. Több információt a manual oldalakban találhatunk a man paranccsal:
man topic
ahol a topic általában egy parancs neve. A Procmail-nak több man oldala van, amik elmagyarázzák a működését:
procmail
Az alap leírása a programnak. Tartalmazza a Procmail opcióit, és van pár példa a végén.
procmailrc
A részletes leírása a .procmailrc formátumának.
procmailex
Számos működő példa a .procmailrc-re. Nagyon hasznos.
procmailsc
A súlyozással való levélszűréssel foglalkozik.

A dokumentum eredeti szerzője: Ian Soboroff -- ian@umbc.edu -- University of Maryland Baltimore County
Fordítás, átdolgozás: Németh Ádám -- na498@hszk.bme.hu