Contact
Impressum
Why this name?
FC5 · FC6 · MDV20070 · MDV20071 · MDV20080 · RH9 · RHEL4 · RHEL5 · SLES9 · SLES10 · SUSE101 · SUSE102 · SUSE103 · SUSE110 · centos4 · centos5 · debian-etch · debian-sarge · debian-unstable · f7 · f8 · f9 · ubuntu606 · ubuntu610 · ubuntu704 · ubuntu710 · ubuntu804

PROCMAILEX

NÉV

procmailex − procmail konfigurációs állomány példák

ÁTTEKINTÉS

$HOME/.procmailrc példák

LEÍRÁS

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.

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ó:

     :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.

     :0
     * ^From.*peter
     * ^Subject:.*programozas
     {
        :0 c
        ! istvan@gepe.hu

       :0
        peterprog
     }

Ugyanez egy kicsit másként:

     :0 c
     * ^From.*peter
     * ^Subject:.*programozas
     ! istvan@gepe.hu

       :0 A
        peterprog

Ugyanez, de egy kicsit lassabb módszerrel:

     :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.

     :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.

     :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.

     :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:

     :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:

     :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.

     :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:

     :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.

     :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.

     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:

     :0
     * (^TO|^Subject:.*)TeX[^t]
     texmail

Ugyanezt, de nem egyedi, hanem számozott névvel (MH mappa) elmentett levelekhez ezt kell használni:

     :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.

     :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.

     :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.

     MONTHFOLDER=‘date +%y-%m‘

    :0 Wic
     * ? test ! −d $MONTHFOLDER
     | mkdir $MONTHFOLDER

    :0:
     * megbeszeles
     ${MONTHFOLDER}/megbeszeles

Egy kicsit másként kivitelezve ugyanaz:

     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.

     :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.

     :0 Whc: msgid.lock
     | formail −D 8192 msgid.cache

    :0 a:
     duplikaltak

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.

     :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:

     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:

     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:

     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:

     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:

     EXITCODE=1

A következő szűrővel az összes postscript formájú levelet automatikusan kinyomtathatjuk.

     :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.

     :0 b
     * ^From[ :].*print-server
     * B ?? ^^%!
     | lpr

Mint az előbb, de kicsit másként:

     :0
     * ^From[ :].*print-server
     {
       :0 B b
       * ^^%!
       | lpr
     }

Vagy így:

     :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.

     :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!).

     :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

     :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ó.

     :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):

     URGMATCH=‘cat $HOME/.surgos‘

    :0:
     * $^From.*${URGMATCH}
     surgos

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.

     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):

     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’

LÁSD MÉG

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)

SZERZŐ

Stephen R. van den Berg

     <srb@cuci.nl>

Vizi Szilárd <vizisz@freemail.hu>


FC5 · FC6 · MDV20070 · MDV20071 · MDV20080 · RH9 · RHEL4 · RHEL5 · SLES9 · SLES10 · SUSE101 · SUSE102 · SUSE103 · SUSE110 · centos4 · centos5 · debian-etch · debian-sarge · debian-unstable · f7 · f8 · f9 · ubuntu606 · ubuntu610 · ubuntu704 · ubuntu710 · ubuntu804                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
No Banana Union - No Software Patents