Provided by:
manpages-hu_20010119-5_all 
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
tancs. 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 utn 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 ksrtsk a sorsot , ha mgsem 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>