procmailex - procmail konfigurációs állomány példák $HOME/.procmailrc példák A konfigurációs állomány felépítéséről bővebben a procmailrc(5). súgóban lehet olvasni. A súlyozott értékelési módszerről részletes információ a procmailsc(5) súgóban található. Ebben a súgóban néhány mintapéldát lehet találni. Részletesebb konfigurációs példákat a procmail(1), súgó MEGJEGYZÉS részében, vagy a procmail csomagban (procmail*/examples/?procmailrc) lehet találni. Búvárkodással foglalkozó levelező listáról érkező leveleket a buvarkodas nevű mappába irányításhoz (buvarkodas.lock záróállomány [locallockfile] használatával) a következő megoldás használható: 3 :0: * ^TObuvarkodas buvarkodas Pétertől érkező programozásról szóló leveleket Istvánnak az alábbi módon lehet továbbítani, miközben ezekről a levelekről egy másolat a peterprog mappába kerül. 10 :0 * ^From.*peter * ^Subject:.*programozas { :0 c ! istvan@gepe.hu :0 peterprog } Ugyanez egy kicsit másként: 7 :0 c * ^From.*peter * ^Subject:.*programozas ! istvan@gepe.hu :0 A peterprog Ugyanez, de egy kicsit lassabb módszerrel: 9 :0 c * ^From.*peter * ^Subject:.*programozas ! istvan@gepe.hu :0 * ^From.*peter * ^Subject:.*programozás peterprog Procmailben kevésbé járatosak és kísérletezgetőknek jól jöhet néhány tanács. A következő két feltételt a szűrőfeltételek elé beszúrva az utolsó 32 levelünkről mindig készül egy biztonsági másolat. Ahhoz, hogy működjön ez a mentés, el ne felejtsük a $MAILDIR könyvtárban létrehozni egy 'mentes' könyvtárat. 5 :0 c mentes :0 ic | cd mentes && rm -f dummy `ls -t msg.* | sed -e 1,32d` A levelekben a `From ' mező nem mindig megfelelő, ezt egy procmail -f paranccsal lehet kijavítani. Az ilyen típusú hibák javításához az alábbi két feltételt érdemes beszúrni. Ezekkel az összes bejövő levél fejlécében javíthatjuk a `From ' mezőt. 2 :0 fhw | formail -I "From " -a "From " Másik hasznos dolog lehet, ha egy saját fejlécet szúrunk be (statisztikai vagy egyéb indok miatt) az összes olyan levélbe, amely nem a postmaster-től jött (itt fejlec.lock záróállományt is használunk). Annak érdekében, hogy a záróállomány a szűrés befejezésig aktív maradjon a `w' kapcsolót is meg kell adni, különben ahogy a szűrési feltételhez ér a levél a zárolás megszűnne. 3 :0 hwc: * !^FROM_MAILER | uncompress fejlec.Z; cat >>fejlec; compress fejlec Vagy a hatékonyabb gzip-es tömörítővel az alábbi módon: 3 :0 hwc: * !^FROM_MAILER | gzip >>fejlec.gz Az összes 1000 bájtnál kisebb levelek otthoni címünkre irányításához (záróállomány használata nélkül) az alábbira lehet szükségünk: 3 :0 * < 1000 ! nevem@otthon A szörfölés levelezési listáról érkező digest (összefűzött) levelek szétdarabolásához és azok szorfoles mappába irányításához, szorfoles.lock záróállomány használatával a következő szűrőre van szükségünk. 3 :0: * ^Subject:.*szorfing.*Digest | formail +1 -ds >>szorfoles A postmastertől vagy a mailer-daemontól érkező összes levél postm mappába gyűjtéséhez, postm.lock záróállomány használatával az alábbi szükséges: 3 :0: * ^FROM_MAILER postm Egy egyszerű megoldás automatikus válaszadásra. A saját és a levéltovábbító programoktól érkező levelekre automatikus válaszadásnak nem szabad történnie. Ha nem figyelnénk erre, akkor galibába kerülhetünk (pl. körkörös levéltovábbküldés [`ringing' mail]). Hogy hatékonyan működjön ez a szűrő, ezért az összes többi elé célszerű beszúrni. Azonban ajánlatos lehet, a levelezőlistákról érkező levelek szűrése után betenni, mivel levelezőlisták leveleire automatikus választ küldeni nem ildomos. Elméletileg a !^FROM_DAEMON feltétel kiszűri a levelezőlistákat, de ne kísértsük a sorsot , ha mégsem tenné azt. 6 :0 h c * !^FROM_DAEMON * !^X-Loop: sajat@emilcimed | (formail -r -I"Precedence: junk" \ -A"X-Loop: sajat@emilcimed" ; \ echo "Leveled érkezett.") | $SENDMAIL -t A vacation(1) programot akár helyettesítő, összetettebb automatikus válaszadást a következő módon lehet létrehozni. Ez a szűrő az előzőekben ismertetet módszert azzal egészíti ki, hogy egy szünidő adatbázist készít a szunido.cache állományba a levelek feladóiból; ha azok ott még nem szerepeltek, akkor felveszi azokat az állományba. (A szunido.cache állományt a formail hozza létre ügyelve arra, hogy mindig a legfrissebb feladók neveit rátolja maximum 8192 bájt méretben.) Ha a feladó még nem szerepelt az adatbázisban, akkor automatikusan választ kap. Ahogy látható a szűrési feltételek sorában megjegyzések is elhelyezhetők. soha se tegyünk megjegyzést az összehasonlítást végző sorokba. 18 SHELL=/bin/sh # shelltől függően adjuk meg :0 Whc: szunido.lock # Ellenőrizzük, hogy a levél nekünk lett-e címezve * $^To:.*\<$\LOGNAME\> # Levelezőlistákra és felügyelő programoknak nem küldünk választ * !^FROM_DAEMON # Körkörös levélküldés megakadályozása * !^X-Loop: sajat@emailcimed | formail -rD 8192 szunido.cache :0 ehc # ha a feladó még nem szerepelt az adatbázisban | (formail -rI"Precedence: junk" \ -A"X-Loop: sajat@emailcimed" ; \ echo "Megkaptam az üzenetedet,"; \ echo "de csak HÉTFŐN vagyok legközelebb."; \ echo "-- "; cat $HOME/.signature \ ) | $SENDMAIL -oi -t TeX-el foglalkozó levelek texmail könyvtárban (a könyvtárat külön létre kell hozni) tárolásához egyedi állománynevekkel a következőképen oldható meg: 3 :0 * (^TO|^Subject:.*)TeX[^t] texmail Ugyanezt, de nem egyedi, hanem számozott névvel (MH mappa) elmentett levelekhez ezt kell használni: 3 :0 * (^TO|^Subject:.*)TeX[^t] texmail/. Mindezek mellett egyszerre több helyre is lehet irányítani a leveleket. A következőkben két MH mappába és egy könyvtárba kerül a levél és másolatai. Ez majdnem olyan mintha egy állományba mentenénk, de a másikkal "keménykötéssel" (hardlink) összekapcsolnánk. 3 :0 * (^TO|^Subject:.*)TeX[^t] texmail/. szovegszerkesztes dtp/. Az összes megbeszélésről szóló levelet egy olyan mappába irányíthatjuk, amely mondjuk havonta változik a következő megoldással. Pl. 1994. januárban a könyvtár neve 94-01 lenne, a levelek pedig a 94-01/megbeszeles mappába kerülnének, a záróállomány neve pedig `94-01/megbeszeles.lock' lenne. 3 :0: * megbeszeles `date +%y-%m`/megbeszeles Mint fenn, de ha még nem létezne a `94-01' könyvtár, akkor automatikusan létre lesz hozva. 9 MONTHFOLDER=`date +%y-%m` :0 Wic * ? test ! -d $MONTHFOLDER | mkdir $MONTHFOLDER :0: * megbeszeles ${MONTHFOLDER}/megbeszeles Egy kicsit másként kivitelezve ugyanaz: 6 MONTHFOLDER=`date +%y-%m` DUMMY=`test -d $MONTHFOLDER || mkdir $MONTHFOLDER` :0: * megbeszeles ${MONTHFOLDER}/megbeszeles Azok, akik több levelezőlista tagjai és ahol a tagok üzeneteiket több helyre is elküldik, sokszor szeretnének ezektől a duplikált levelektől megszabadulni automatikusan. A következő szűrővel ezeket az ismétlődő leveleket lehet kitöröltetni. A trükk, hogy egy 8 KB-os állományban tároljuk a legfrissebb levelek Message-ID-it (levélazonosítóit). Mivel a Message-ID-k egyediek , ezért ezek alapján könnyű megkeresni az ismétlődő leveleket. Hogy egyetlen ismétlődő levél se jusson át a szűrésen, érdemes a konfigurációs állomány legelejére tenni azt. 2 :0 Wh: msgid.lock | formail -D 8192 msgid.cache Azonban levéltovábbítási hibák esetén ezzel a szűrővel törlődhetnek olyan levelek, amelyeket nem akartunk töröltetni, mivel a procmail újra megpróbálja továbbítani a levelet a hiba esetén, azonban a Message-ID-k alapján ekkor már duplikált leveleknek fogja tekinteni a leveleket, s törli azokat. Így azok, akik még nem biztosak magukban a következő szűrőt használják. Ez a szűrő a duplikált leveleket nem törli, hanem egy külön mappába helyezi. Természetesen ezt a mappát időnként majd üríteni szükséges. 5 :0 Whc: msgid.lock | formail -D 8192 msgid.cache :0 a: duplikaltak Procmail can deliver to MH folders directly, but, it does not update the unseen sequences the real MH manages. If you want procmail to update those as well, use a recipe like the following which will file everything that contains the word spam in the body of the mail into an MH folder called spamfold. Note the local lockfile, which is needed because MH programs do not lock the sequences file. Asynchronous invocations of MH programs that change the sequences file may therefore corrupt it or silently lose changes. Unfortunately, the lockfile doesn't completely solve the problem as rcvstore could be invoked while `show' or `mark' or some other MH program is running. This problem is expected to be fixed in some future version of MH, but until then, you'll have to balance the risk of lost or corrupt sequences against the benefits of the unseen sequence. 3 :0 :spamfold/$LOCKEXT * B ?? spam | rcvstore +spamfold Emacs mappák használata (pl. emacs-on alapuló levelezőprogramok -- RMAIL, VM, stb. -- levélmappái) esetén ügyelni kell arra, hogy emacs kompatíbilis záróállományt hozzunk létre. Az emacs-os programok érzékenyek arra, ha nem megfelelőek a záróállományok. Legyen a $HOME pl. /home/jani , ekkor a következő szűrőt érdemes használunk: 5 MAILDIR=Mail :0:/usr/local/lib/emacs/lock/!home!jani!Mail!mailbox * ^Subject:.*valami mailbox Emellett azt is meg lehet tenni, hogy a procmail-lel egy külön levélmappába válogatjuk a leveleket és időközönként a movemail programmal másoltatjuk a megfelelő emacs állományba. A movemail minden egyes levélmappán záróállományt helyez el, mint a procmail működése közben. Levél bizonyos részeinek környezeti változóba tárolásához a következő módszert lehet használni: 5 SUBJECT=`formail -xSubject:` # általános módi FROM=`formail -rt -xTo:` # speckó eset :0 h # harmadik módszer KEYWORDS=| formail -xKeywords: A konfigurációs állományban megadott ideiglenes fileoktól a procmailből való kilépés előtt az alábbi módon szabadulhatunk meg biztosan: 2 TEMPORARY=$HOME/tmp/pmail.$$ TRAP="/bin/rm -f $TEMPORARY" A TRAP kulcsszóval a procmail kilépéskódját (exitcode) is meg lehet változtatni. Pl. ha azt szeretnénk, hogy a kilépéskód 1 legyen a valós kód helyett, akkor a következőre van szükségünk: 3 EXITCODE="" TRAP="exit 1;" # fontos a pontosvessző # mivel az exit nem egy önálló program Vagy ha nem szükséges TRAP-on keresztül átadni a kilépéskódot, akkor használjuk egyszerűen csak ezt: 1 EXITCODE=1 A következő szűrővel az összes postscript formájú levelet automatikusan kinyomtathatjuk. 3 :0 Bb * ^^%! | lpr A következő szűrő kicsit intelligensebb, mert csak a nyomtatószerverről érkező postscript állományokat próbálja meg kinyomtatni. Az első feltétel csak a megfelelő fejléc esetén érvényesül, míg a második csak akkor, ha a levél törzse a megfelelő kódot tartalmazza. 4 :0 b * ^From[ :].*print-server * B ?? ^^%! | lpr Egy kicsit másként kivitelezve ugyanaz: 7 :0 * ^From[ :].*print-server { :0 B b * ^^%! | lpr } Vagy így: 4 :0 HB b * ^^(.+$)*From[ :].*print-server * ^^(.+$)*^%! | lpr Ha két különböző helyen van felhasználói azonosítód (account), és szeretnéd, ha mindkét helyen ugyanazok a leveleket olvashatnád, akkor egy egyszerű levél átirányítás (forward) nem lenne nyerő, mivel ezzel a leveleket a két cím között végtelenségig küldözgetnéd (mail loop). Ennek elkerülésére alkalmas a $HOME/.procmailrc elejére beszúrni az alábbi szűrőt. A lényeg, hogy mindkét helyen az X-Loop: -nak ugyanazt az értéket kell megadni, mert ekkor csak a szükséges levelek kerülnek továbbításra a másik címre. 4 :0 c * !^X-Loop: neved@emailcimed | formail -A "X-Loop: neved@emailcimed" | \ $SENDMAIL -oi neved@emailcimed A levél tárgyában elhelyezett `retrieve' (küldés) parancsra az alábbi szűrő egy kiválasztott állományt fog automatikusan visszaküldeni. Itt is ügyelni kell, hogy a szűrő csak a megfelelő esetben válaszoljon (levelezőlistáknak, saját magunknak ne válaszoljon!). 6 :0 * !^From +YOUR_USERNAME * !^Subject:.*Re: * !^FROM_DAEMON * ^Subject:.*retrieve | (formail -r ; cat info_file) | $SENDMAIL -oi -t A következőkben egy egyszerű emaillel működtethető fileszervert mutatunk be. Azonban, ha ilyen kiszolgálót szeretnénk működtetni, akkor inkább ajánljuk a SmartList programot (amely ugyanonnan beszerezhető ahonnan a procmail csomag). A fileszerver maximum 1 állományt küld el a kérésnek megfelelően, a levél tartalmát nem veszi figyelembe, mivel csak az alábbi felépítésű levéltárgyát fogadja el; "Subject: send file amitszeretnenek" (a szóközök fontosak). (Mg. A magyarosított levelezőprogramok a Subject: mező helyett Tárgy: mezőt használhatnak, ez esetben a szűrőt értelemszerűen módosítani szükséges.) Rejtett állományokat és a megadott könyvtáron kívül 18 :0 * ^Subject: send file [0-9a-z] * !^X-Loop: neved@emailcimed * !^Subject:.*Re: * !^FROM_DAEMON * !^Subject: send file .*[/.]\. { MAILDIR=$HOME/fileserver # lekérhető állományok helye :0 fhw # válaszlevél létrehozása * ^Subject: send file \/[^ ]* | formail -rA "X-Loop: neved@emailcimed" FILE="$MATCH" # az elküldendő állomány neve :0 ah | cat - ./$FILE 2>&1 | $SENDMAIL -oi -t } A következő szűrővel a megadott MIME kódolású leveleket a sokkal kezelhetőbb 8-bites formátumra lehet átalakítani. A szükséges mimencode(1) program Nathaniel Borenstein metamail csomagjában található. 17 :0 * ^Content-Type: *text/plain { :0 fbw * ^Content-Transfer-Encoding: *quoted-printable | mimencode -u -q :0 Afhw | formail -I "Content-Transfer-Encoding: 8bit" :0 fbw * ^Content-Transfer-Encoding: *base64 | mimencode -u -b :0 Afhw | formail -I "Content-Transfer-Encoding: 8bit" } A következő példa a procmail egyik alkalmazhatóságát mutatja be. Ha mondjuk egy ".surgos" nevű állományban elhelyezzünk egy személynek a címét, akkor a szűrő a tőle érkező leveleket a $MAILDIR/surgos mappába irányítja át. Az ehhez szükséges szűrő így néz ki (fontos megjegyezni hogy a $LINEBUF értékét meg kell növelni, ha a $LINEBUF-nál hosszabb az .surgos állomány tartalma): 5 URGMATCH=`cat $HOME/.surgos` :0: * $^From.*${URGMATCH} surgos An entirely different application for procmail would be to conditionally apply filters to a certain (outgoing) text or mail. A typical example would be a filter through which you pipe all outgoing mail, in order to make sure that it will be MIME encoded only if it needs to be. I.e. in this case you could start procmail in the middle of a pipe like: 1 cat newtext | procmail ./mimeconvert | mail kriszta@cime A mimeconvert konfigurációs állománya pedig valami hasonlót tartalmazhat (a =0x80= és =0xff= kell 8-bites karakterekkel helyettesíteni): 10 DEFAULT=| # a kimenetet a hagyományos kimenetre # irányítjuk a levélküldés helyett :0 Bfbw * [=0x80=-=0xff=] | mimencode -q :0 Afhw | formail -I 'MIME-Version: 1.0' \ -I 'Content-Type: text/plain; charset=ISO-8859-1' \ -I 'Content-Transfer-Encoding: quoted-printable' procmail(1), procmailrc(5), procmailsc(5), sh(1), csh(1), mail(1), mailx(1), binmail(1), uucp(1), aliases(5), sendmail(8), egrep(1), grep(1), biff(1), comsat(8), mimencode(1), lockfile(1), formail(1) Stephen R. van den Berg <srb@cuci.nl> Philip A. Guenther <guenther@sendmail.com> A kézikönyv magyar fordítását a Vizi Szilárd <vizisz@freemail.hu> készítette. Ez a fordítás ingyenes dokumentáció; lásd a GNU General Public License 3 Feltételezzük, hogy NEM FELELŐSSÉG. Ha hibát talál a kézikönyv oldal fordításában, küldje el a e-mail cím: TODO.