.\"if n .pl +(135i-\n(.pu) .de Id .ds Rv \\$3 .ds Dt \\$4 .. .Id $Id: procmailex.man,v 1.51 1999/03/02 01:27:52 guenther Exp $ .TH PROCMAILEX 5 \*(Dt BuGless .rn SH Sh .de SH .br .ne 11 .Sh "\\$1" .. .rn SS Ss .de SS .br .ne 10 .Ss "\\$1" .. .rn TP Tp .de TP .br .ne 9 .Tp \\$1 .. .rn RS Rs .de RS .na .nf .Rs .. .rn RE Re .de RE .Re .fi .ad .. .de Sx .PP .ne \\$1 .RS .. .de Ex .RE .PP .. .na .SH NÉV procmailex \- procmail konfigurációs állomány példák .SH ÁTTEKINTÉS .B $HOME/.procmailrc példák .ad .SH LEÍRÁS A konfigurációs állomány felépítéséről bővebben a .BR procmailrc (5). súgóban lehet olvasni. .PP A súlyozott értékelési módszerről részletes információ a .BR procmailsc (5) súgóban található. .PP Ebben a súgóban néhány mintapéldát lehet találni. Részletesebb konfigurációs példákat a .BR procmail (1), súgó MEGJEGYZÉS részében, vagy a procmail csomagban (procmail*/examples/?procmailrc) lehet találni. .SH PÉLDÁK 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ó: .Sx 3 :0: * ^TObuvarkodas buvarkodas .Ex 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. .Sx 10 :0 * ^From.*peter * ^Subject:.*programozas { :0 c ! istvan@gepe.hu :0 peterprog } .Ex Ugyanez egy kicsit másként: .Sx 7 :0 c * ^From.*peter * ^Subject:.*programozas ! istvan@gepe.hu :0 A peterprog .Ex Ugyanez, de egy kicsit lassabb módszerrel: .Sx 9 :0 c * ^From.*peter * ^Subject:.*programozas ! istvan@gepe.hu :0 * ^From.*peter * ^Subject:.*programozás peterprog .Ex Procmailben kevésbé járatosak és kísérletezgetőknek jól jöhet néhány .IR 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. .Sx 5 :0 c mentes :0 ic | cd mentes && rm \-f dummy `ls \-t msg.* | sed \-e 1,32d` .Ex 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. .Sx 2 :0 fhw | formail \-I "From " \-a "From " .Ex 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. .Sx 3 :0 hwc: * !^FROM_MAILER | uncompress fejlec.Z; cat >>fejlec; compress fejlec .Ex Vagy a hatékonyabb gzip-es tömörítővel az alábbi módon: .Sx 3 :0 hwc: * !^FROM_MAILER | gzip >>fejlec.gz .Ex 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: .Sx 3 :0 * < 1000 ! nevem@otthon .Ex 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. .Sx 3 :0: * ^Subject:.*szorfing.*Digest | formail +1 \-ds >>szorfoles .Ex 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: .Sx 3 :0: * ^FROM_MAILER postm .Ex 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 .I 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 .I ne kísértsük a sorsot , ha .I mégsem tenné azt. .Sx 6 :0 h c * !^FROM_DAEMON * !^X-Loop: sajat@emilcimed | (formail \-r \-I"Precedence: junk" \e \-A"X-Loop: sajat@emilcimed" ; \e echo "Leveled érkezett.") | $SENDMAIL \-t .Ex A .BR 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. .PP Ahogy látható a szűrési feltételek sorában megjegyzések is .B elhelyezhetők . Azonban .B soha se tegyünk megjegyzést az összehasonlítást végző sorokba. .Sx 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:.*\e<$\eLOGNAME\e> # 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" \e \-A"X-Loop: sajat@emailcimed" ; \e echo "Megkaptam az üzenetedet,"; \e echo "de csak HÉTFŐN vagyok legközelebb."; \e echo "-- "; cat $HOME/.signature \e ) | $SENDMAIL \-oi \-t .Ex 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: .Sx 3 :0 * (^TO|^Subject:.*)TeX[^t] texmail .Ex Ugyanezt, de nem egyedi, hanem számozott névvel (MH mappa) elmentett levelekhez ezt kell használni: .Sx 3 :0 * (^TO|^Subject:.*)TeX[^t] texmail/. .Ex 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. .Sx 3 :0 * (^TO|^Subject:.*)TeX[^t] texmail/. szovegszerkesztes dtp/. .Ex 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. .Sx 3 :0: * megbeszeles `date +%y-%m`/megbeszeles .Ex Mint fenn, de ha még nem létezne a `94-01' könyvtár, akkor automatikusan létre lesz hozva. .Sx 9 MONTHFOLDER=`date +%y-%m` :0 Wic * ? test ! \-d $MONTHFOLDER | mkdir $MONTHFOLDER :0: * megbeszeles ${MONTHFOLDER}/megbeszeles .Ex Egy kicsit másként kivitelezve ugyanaz: .Sx 6 MONTHFOLDER=`date +%y-%m` DUMMY=`test \-d $MONTHFOLDER || mkdir $MONTHFOLDER` :0: * megbeszeles ${MONTHFOLDER}/megbeszeles .Ex 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. .Sx 2 :0 Wh: msgid.lock | formail \-D 8192 msgid.cache .Ex .B 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. .Sx 5 :0 Whc: msgid.lock | formail \-D 8192 msgid.cache :0 a: duplikaltak .Ex Procmail-lel MH mappákba közvetlenül lehet levelet irányítani, azonban a mappa bejegyzéseit nem tudja megfelelően módosítani. Ha ezt is szeretnénk elérni, akkor a következő szűrőre van szükségünk, amely minden spam tartalmú levelet egy spamfold MH mappába helyez át. A záróállománynak itt kiemelt jelentősége van, mivel az MH programok működésük közben nem zárolják a feldolgozandó állományt. MH programok egymástól független futtatása ugyanazon az állományon ezért adatsérülést, vagy akár adatvesztést okozhatnak. Sajnos a záróállomány használata nem old meg minden problémát, mivel az rcvstore programot a `show', `mark' vagy egyéb MH program futása közben is el lehet indítani. Ezt a problémát az MH elkövetkező verziójában ki fogják küszöbölni, addig viszont együtt kell élni azzal, hogy adatsérülést vagy adatvesztést okozhat mappák bejegyzéseinek ilyen irányú módosítása. .Sx 3 :0 :spamfold/$LOCKEXT * B ?? spam | rcvstore +spamfold .Ex 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: .Sx 5 MAILDIR=Mail :0:/usr/local/lib/emacs/lock/!home!jani!Mail!mailbox * ^Subject:.*valami mailbox .Ex 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 .BR 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. .PP Levél bizonyos részeinek környezeti változóba tárolásához a következő módszert lehet használni: .Sx 5 SUBJECT=`formail \-xSubject:` # általános módi FROM=`formail \-rt \-xTo:` # speckó eset :0 h # harmadik módszer KEYWORDS=| formail \-xKeywords: .Ex 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: .Sx 2 TEMPORARY=$HOME/tmp/pmail.$$ TRAP="/bin/rm \-f $TEMPORARY" .Ex 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: .Sx 3 EXITCODE="" TRAP="exit 1;" # fontos a pontosvessző # mivel az exit nem egy önálló program .Ex Vagy ha nem szükséges TRAP-on keresztül átadni a kilépéskódot, akkor használjuk egyszerűen csak ezt: .Sx 1 EXITCODE=1 .Ex A következő szűrővel az összes postscript formájú levelet automatikusan kinyomtathatjuk. .Sx 3 :0 Bb * ^^%! | lpr .Ex 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. .Sx 4 :0 b * ^From[ :].*print-server * B ?? ^^%! | lpr .Ex Mint az előbb, de kicsit másként: .Sx 7 :0 * ^From[ :].*print-server { :0 B b * ^^%! | lpr } .Ex Vagy így: .Sx 4 :0 HB b * ^^(.+$)*From[ :].*print-server * ^^(.+$)*^%! | lpr .Ex 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. .Sx 4 :0 c * !^X-Loop: neved@emailcimed | formail \-A "X-Loop: neved@emailcimed" | \e $SENDMAIL \-oi neved@emailcimed .Ex 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!). .Sx 6 :0 * !^From +YOUR_USERNAME * !^Subject:.*Re: * !^FROM_DAEMON * ^Subject:.*retrieve | (formail \-r ; cat info_file) | $SENDMAIL \-oi \-t .Ex 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 .B 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 .Sx 18 :0 * ^Subject: send file [0-9a-z] * !^X-Loop: neved@emailcimed * !^Subject:.*Re: * !^FROM_DAEMON * !^Subject: send file .*[/.]\e. { MAILDIR=$HOME/fileserver # lekérhető állományok helye :0 fhw # válaszlevél létrehozása * ^Subject: send file \e/[^ ]* | formail \-rA "X-Loop: neved@emailcimed" FILE="$MATCH" # az elküldendő állomány neve :0 ah | cat \- ./$FILE 2>&1 | $SENDMAIL \-oi \-t } .Ex 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 .BR mimencode (1) program Nathaniel Borenstein metamail csomagjában található. .Sx 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" } .Ex 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): .Sx 5 URGMATCH=`cat $HOME/.surgos` :0: * $^From.*${URGMATCH} surgos .Ex Egy másik alkalmazási terület lehet, amikor bizonyos leveleken végzünk el módosításokat, átalakításokat. Egy tipikus példa erre, amikor a kimenő levelek kódolását változtatjuk meg, ha arra szükség van. Ebben az esetben a parancssor közepén használjuk a procmail-t. .Sx 1 cat newtext | procmail ./mimeconvert | mail kriszta@cime .Ex A .B mimeconvert konfigurációs állománya pedig valami hasonlót tartalmazhat (a =0x80= és =0xff= kell 8-bites karakterekkel helyettesíteni): .Sx 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' \e \-I 'Content-Type: text/plain; charset=ISO-8859-1' \e \-I 'Content-Transfer-Encoding: quoted-printable' .Ex .SH "LÁSD MÉG" .na .nh .BR procmail (1), .BR procmailrc (5), .BR procmailsc (5), .BR sh (1), .BR csh (1), .BR mail (1), .BR mailx (1), .BR binmail (1), .BR uucp (1), .BR aliases (5), .BR sendmail (8), .BR egrep (1), .BR grep (1), .BR biff (1), .BR comsat (8), .BR mimencode (1), .BR lockfile (1), .BR formail (1) .hy .ad .SH SZERZŐ Stephen R. van den Berg .RS .\" @MY_ALT_MAIL_ADDR@ .RE .\".if n .pl -(\n(.tu-1i) .rm SH .SH MAGYAR FORDÍTÁS Vizi Szilárd .rn Sh SH .rm SS .rn Ss SS .rm TP .rn Tp TP .rm RS .rn Rs RS .rm RE .rn Re RE