PROCMAILEX(5)

NUME
procmailex - exemple de fișier de configurare al «procmail»

SINOPSIS
exemple de $HOME/.procmailrc

DESCRIERE
Pentru o descriere a formatului fișierului de configurare, consultați procmailrc(5).

Tehnica de punctare ponderată este descrisă în detaliu în pagina de manual procmailsc(5).

Această pagină de manual prezintă câteva exemple de rețete. Pentru exemple de fișiere de configurare complete, puteți consulta secțiunea NOTE din procmail(1) sau fișierele de configurare de exemplu din „/usr/share/doc/procmail/examples”.

EXEMPLE
Sortează toate mesajele primite de la lista de discuții scuba-dive în dosarul de e-mail scubafile (utilizează fișierul de blocare locală scubafile.lock).

    :0: * ^TOscuba scubafile

Transmite toate mesajele de la Peter despre compilatoare lui William (și păstrează o copie a acestora aici în petcompil).

    :0 * ^From.*peter * ^Subject:.*compilatoare {
       :0 c
       ! william@adresă-oarecare.edu

       :0
       petcompil }

O soluție echivalentă care realizează același lucru:

    :0 c * ^From.*peter * ^Subject:.*compilatoare ! william@adresă-oarecare.edu

       :0 A
       petcompil

O soluție echivalentă, dar puțin mai lentă, care realizează același lucru:

    :0 c * ^From.*peter * ^Subject:.*compilatoare ! william@adresă-oarecare.edu

    :0 * ^From.*peter * ^Subject:.*compilatoare petcompil

Dacă sunteți destul de nou la procmail și intenționați să experimentați un pic, de multe ori este util să aveți un fel de rețea de siguranță. Inserarea următoarelor două rețete deasupra tuturor celorlalte rețete va asigura păstrarea ultimelor 32 de mesaje din toate mesajele primite. Pentru a funcționa așa cum este prevăzut, trebuie să creați un director numit `backup' în $MAILDIR înainte de a insera aceste două rețete.

    :0 c backup

    :0 ic | cd backup && rm -f dummy `ls -t msg.* | sed -e 1,32d`

Dacă sistemul dvs. nu generează sau generează linii `From ' de început incorecte la fiecare e-mail, puteți rezolva acest lucru apelând procmail cu opțiunea -f-. Pentru a rezolva aceeași problemă prin mijloace diferite, ați fi putut introduce următoarele două rețete deasupra tuturor celorlalte rețete din rcfile. Acestea vor filtra antetul oricărui mesaj prin formail, care va elimina orice `From ' de la început și îl va regenera automat ulterior.

    :0 fhw | formail -I "From " -a "From "

Adaugă antetele tuturor mesajelor care nu provin de la postmaster la colecția ta privată de antete (pentru statistici sau depanarea corespondenței); și folosește fișierul de blocare `headc.lock'. Pentru a vă asigura că fișierul de blocare nu este eliminat până când conducta nu se termină, trebuie să specificați opțiunea `w'; în caz contrar, fișierul de blocare ar fi eliminat imediat ce conducta ar fi acceptat mesajul.

    :0 hwc: * !^FROM_MAILER | uncompress headc.Z; cat >>headc; compress headc

Sau, dacă ați folosi mai degrabă gzip în loc de compress:

    :0 hwc: * !^FROM_MAILER | gzip >>headc.gz

Transmiteți toate mesajele mai scurte de 1000 de octeți la adresa mea personală (home); această rețetă nu necesită fișier de blocare.

    :0 * < 1000 ! numelemeu@home

Separă pachetele primite de la lista de discuții surfing în mesajele lor individuale și le stochează în surfing, folosind surfing.lock ca fișier de blocare locală.

    :0: * ^Subject:.*surfing.*Digest | formail +1 -ds >>surfing

Stochează tot ce vine de la postmaster sau de la mailer-daemon (cum ar fi corespondența respinsă) în fișierul postm, folosind postm.lock ca fișier de blocare locală.

    :0: * ^FROM_MAILER postm

O rețetă simplă de răspuns automat. Aceasta se asigură că nu se va răspunde automat nici la mesajele primite de la vreun demon (cum ar fi mesajele de tip „bouncing” sau mesajele din listele de difuzare), nici la răspunsurile automate primite de la dvs. În cazul în care nu se ia această măsură de precauție, ar putea rezulta un dezastru (e-mail „ineling”). Pentru ca această rețetă să răspundă automat la toate mesajele primite, trebuie, desigur, să o introduceți înaintea tuturor celorlalte rețete din rcfile. Cu toate acestea, este recomandabil să o introduceți după orice rețetă care procesează mesajele din listele de corespondență abonate; în general, nu este o idee bună să generați răspunsuri automate la listele de corespondență (da, expresia-regulată !^FROM_DAEMON ar trebui să le prindă deja, dar dacă lista de corespondență nu respectă convențiile acceptate, acest lucru ar putea să nu fie suficient).

    :0 h c * !^FROM_DAEMON * !^X-Loop: propria_ta@adresă.de.poștă | (formail -r -I"Precedence: junk" \
        -A"X-Loop: propria_ta@adresă.de.poștă" ; \
       echo "Corespondență primită.") | $SENDMAIL -t

O rețetă mai complicată de răspuns automat care implementează echivalentul funcțional al binecunoscutului program vacation(1). Această rețetă se bazează pe aceleași principii ca și ultima (prevenirea „inelării” corespondenței). Cu toate acestea, în plus, ea menține o bază de date de vacanță prin extragerea numelui expeditorului și inserarea acestuia în fișierul vacation.cache dacă numele era nou (fișierul vacation.cache este menținut de formail, care se va asigura că acesta conține întotdeauna cele mai recente nume, dimensiunea fișierului fiind limitată la un maxim de aproximativ 8192 octeți). Dacă numele a fost nou, se va trimite un răspuns automat.

După cum puteți vedea, următoarea rețetă are comentarii între condiții. Acest lucru este permis. Totuși, nu puneți comentarii pe aceeași linie cu o condiție.

    SHELL=/bin/sh # pentru alte shell-uri, acest lucru ar putea necesita ajustări

    :0 Whc: vacation.lock
     # Efectuează o verificare rapidă pentru a vedea dacă corespondența ne-a fost adresată * $^To:.*\<$\LOGNAME\>
     # Nu răspunde demonilor și listelor de corespondență * !^FROM_DAEMON
     # Buclele poștale sunt malefice * !^X-Loop: propria_ta@adresă.de.poștă | formail -rD 8192 vacation.cache

      :0 ehc # dacă numele nu era în cache
      | (formail -rI"Precedence: junk" \
           -A"X-Loop: propria_ta@adresă.de.poștă" ; \
         echo "Am primit mesajul dvs,"; \
         echo "dar nu mă voi întoarce până luni."; \
         echo "-- "; cat $HOME/.signature \
        ) | $SENDMAIL -oi -t

Stochează toate mesajele referitoare la TeX în nume de fișiere separate, unice, într-un director numit texmail (acest director trebuie să existe); nu este nevoie să se utilizeze fișiere de blocare în acest caz, deci nu o vom face.

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

La fel ca mai sus, doar că acum stocăm mesajele în fișiere numerotate (dosarul de poștă electronică MH).

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

Sau ați putea depune corespondența în mai multe dosare de directoare în același timp. Următoarea rețetă va trimite e-mailul în două dosare MH și într-un dosar de directoare. De fapt, este vorba despre un singur fișier cu două legături dure suplimentare.

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

Stochează toate mesajele despre reuniuni într-un dosar care se află într-un director care se schimbă în fiecare lună. De exemplu, dacă ar fi ianuarie 1994, dosarul ar avea numele „94-01/reuniuni” și fișierul de blocare locală ar fi „94-01/reuniuni.lock”.

    :0: * reuniune `date +%y-%m`/reuniuni

La fel ca mai sus, dar, dacă directorul „94-01” nu ar fi existat, acesta este creat automat:

    DOSARLUNAR=`date +%y-%m`

    :0 Wic * ? test ! -d $DOSARLUNAR | mkdir $DOSARLUNAR

    :0: * reuniune ${DOSARLUNAR}/reuniuni

La fel ca mai sus, dar acum prin metode ușor diferite:

    DOSARLUNAR=`date +%y-%m` DUMMY=`test -d $DOSARLUNAR || mkdir $DOSARLUNAR`

    :0: * reuniune ${DOSARLUNAR}/reuniuni

Dacă sunteți abonat la mai multe liste de corespondență și există persoane care publică mesaje încrucișate pe unele dintre ele, de obicei primiți mai multe mesaje duplicat (câte unul de la fiecare listă). Următoarea rețetă simplă elimină mailurile duplicat. Aceasta îi spune lui formail să păstreze un fișier cache de 8KB în care va stoca ID-urile mesajelor celor mai recente mesaje pe care le-ați primit. Deoarece ID-urile mesajelor sunt garantate a fi unice pentru fiecare mesaj nou, acestea sunt ideale pentru a elimina mesajele duplicat. Pur și simplu puneți următoarea rețetă în partea de sus a fișierului dvs. rc și niciun mesaj duplicat nu va trece de ea.

    :0 Wh: msgid.lock | formail -D 8192 msgid.cache

Atenție dacă aveți probleme de livrare în rețetele de mai jos și procmail încearcă să solicite corespondența, atunci la următoarea execuție a cozii, această corespondență va fi considerată un duplicat și va fi aruncată. Pentru cei care nu sunt atât de încrezători în propriile capacități de scriere de scripturi, puteți utiliza în schimb următoarea rețetă. Aceasta pune dublurile într-un dosar separat în loc să le arunce. Desigur, depinde de dvs. să goliți periodic dosarul.

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

    :0 a: duplicates

Procmail poate livra direct către dosarele MH, dar, nu actualizează secvențele nevăzute pe care le gestionează MH real. Dacă doriți ca procmail să le actualizeze și pe acestea, utilizați o rețetă ca cea de mai jos, care va arhiva tot ceea ce conține cuvântul spam în corpul mesajului într-un dosar MH numit spamfold. Observați fișierul de blocare local, care este necesar deoarece programele MH nu blochează fișierul de secvențe. Prin urmare, invocările asincrone ale programelor MH care modifică fișierul de secvențe îl pot corupe sau pot pierde în mod silențios modificările. Din păcate, fișierul de blocare nu rezolvă complet problema, deoarece rcvstore ar putea fi invocat în timp ce `show' sau `mark' sau un alt program MH rulează. Se așteaptă ca această problemă să fie rezolvată într-o versiune viitoare a MH, dar până atunci, va trebui să puneți în balanță riscul pierderii sau al coruperii secvențelor cu beneficiile secvenței nevăzute.

    :0 :spamfold/$LOCKEXT * B ?? spam | rcvstore +spamfold

Atunci când livrați direct dosare emacs (de exemplu, dosare de e-mail gestionate de orice pachet de e-mail emacs, de exemplu, RMAIL sau VM), ar trebui să utilizați fișiere de blocare compatibile cu emacs. Agenții de poștă electronică emacs sunt un pic „creierul deteriorat” în această privință, ei devin foarte supărați dacă cineva livrează la dosarele de poștă electronică pe care le au deja în tampoanele lor interne. Următoarea rețetă presupune că $HOME este egal cu /home/john.

    MAILDIR=Mail

    :0:/usr/local/lib/emacs/lock/!home!john!Mail!mailbox * ^Subject:.*orice-lucru mailbox

Alternativ, puteți face ca procmail să livreze în propriul set de căsuțe poștale, pe care apoi le goliți periodic și le copiați în fișierele dvs. emacs utilizând movemail. «movemail» utilizează fișiere de blocare locale mailbox.lock pentru fiecare căsuță poștală. Acesta este, de fapt, modul preferat de operare împreună cu procmail.

Pentru a extrage anumite antete dintr-un mesaj și a le pune în variabile de mediu, puteți utiliza oricare dintre următoarele construcții:

    SUBJECT=`formail -xSubject:` # câmp normal FROM=`formail -rt -xTo:` # caz special

    :0 h # metodă alternativă KEYWORDS=| formail -xKeywords:

Dacă utilizați fișiere temporare într-un fișier procmailrc și doriți să vă asigurați că acestea sunt eliminate chiar înainte ca procmail să iasă, ați putea utiliza ceva de felul:

    TEMPORARY=$HOME/tmp/pmail.$$ TRAP="/bin/rm -f $TEMPORARY"

Cuvântul cheie TRAP poate fi utilizat și pentru a schimba codul de ieșire al procmail. De exemplu, dacă doriți ca procmail să returneze un cod de ieșire „1” în loc de codurile sale de ieșire obișnuite, puteți utiliza:

    EXITCODE="" TRAP="exit 1;" # Punctul și virgula din urmă este important
                     # deoarece exit nu este un program de sine stătător

Sau, dacă codul de ieșire nu trebuie să depindă de programele rulate din TRAP, puteți utiliza un simplu:

    EXITCODE=1

Următoarea rețetă imprimă fiecare mesaj primit care arată ca un fișier postscript.

    :0 Bb * ^^%! | lpr

Următoarea rețetă face același lucru, dar este un pic mai selectivă. Aceasta imprimă fișierul postscript numai dacă acesta provine de la serverul de imprimare. Prima condiție se potrivește numai dacă este găsită în antet. A doua condiție se potrivește numai la începutul corpului.

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

La fel ca mai sus, dar acum prin metode ușor diferite:

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

De asemenea:

    :0 HB b * ^^(.+$)*From[ :].*print-server * ^^(.+$)*^%! | lpr

Să presupunem că aveți două conturi, le folosiți pe amândouă în mod regulat, dar se află în locuri foarte diferite (de exemplu, puteți citi doar corespondența care a ajuns la unul dintre conturi). Ați dori să redirecționați corespondența sosită la contul unu către contul doi, și invers. Primul lucru care vă vine în minte este utilizarea fișierelor .forward la ambele situri; desigur, acest lucru nu va funcționa, deoarece veți crea o buclă de poștă electronică. Această buclă poate fi evitată prin inserarea următoarei rețete în fața tuturor celorlalte rețete din fișierele $HOME/.procmailrc de pe ambele situri. Dacă vă asigurați că adăugați același câmp X-Loop: pe ambele situri, e-mailul poate fi redirecționat în siguranță către celălalt cont din oricare dintre acestea.

    :0 c * !^X-Loop: numeletău@adresa.ta.principală.de.poștă | formail -A "X-Loop: numeletău@adresa.ta.principală.de.poștă" | \
       $SENDMAIL -oi numeletăue@altă.adresă.a.ta.de.poștă

Dacă cineva vă trimite un mesaj cu cuvântul „recuperare” în câmpul „subject”, următorul mesaj va trimite automat înapoi expeditorului conținutul fișierului info_file. Ca în toate rețetele în care trimitem mesaje, trebuie să fim atenți la buclele de poștă electronică.

    :0 * !^From +MUMELETĂU_DE_UTILIZATOR * !^Subject:.*Re: * !^FROM_DAEMON * ^Subject:.*recuperare | (formail -r ; cat info_file) | $SENDMAIL -oi -t

Acum urmează un exemplu pentru un server de fișiere foarte simplu accesibil prin poștă electronică. Pentru aplicații mai pretențioase, vă sugerez să aruncați o privire la SmartList (disponibil din același loc ca și distribuția procmail). Conform listei, acest server de fișiere trimite cel mult un fișier pe cerere, ignoră corpul mesajelor primite, linia Subject: trebuie să arate ca „Subject: trimite fișierul fișierul_ce_doriți” (spațiile goale sunt semnificative), nu returnează fișiere care au nume care încep cu un punct și nici nu permite recuperarea fișierelor care se află în afara arborelui de directoare al serverului de fișiere (dacă decideți să modificați acest exemplu, asigurați-vă că nu slăbiți din greșeală această ultimă restricție).

    :0 * ^Subject: send file [0-9a-z] * !^X-Loop: numele-tău@adresa.ta.principală.de email * !^Subject:.*Re: * !^FROM_DAEMON * !^Subject: trimite fișierul .*[/.]\. {
      MAILDIR=$HOME/server-fișierer # schimbă la directorul serverului de fișiere

      :0 fhw # inversează antetul e-mailului și extrage numele
      * ^Subject: trimite fișierul \/[^ ]*
      | formail -rA "X-Loop: numele-tău@adresa.ta.principală.de email"

      FILE="$MATCH" # numele fișierului solicitat

      :0 ah
      | cat - ./$FILE 2>&1 | $SENDMAIL -oi -t }

Următorul exemplu preconvertește toate mesajele în text simplu care sosesc în anumite formate MIME codificate într-un format mai compact pe 8 biți care poate fi utilizat și afișat mai ușor de majoritatea programelor. Programul mimencode(1) face parte din pachetul metamail al lui Nathaniel Borenstein.

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

Următorul este destul de exotic, dar servește doar pentru a demonstra o caracteristică. Să presupunem că aveți un fișier în directorul HOME numit „.urgent”, iar (singura) persoană numită în acel fișier este expeditorul unui mesaj primit, ați dori ca acel mesaj să fie stocat în $MAILDIR/urgent în loc să fie în oricare dintre dosarele de e-mail normale în care ar fi fost sortat. Atunci iată ce ați putea face (atenție, lungimea fișierului $HOME/.urgent ar trebui să fie mult sub $LINEBUF, măriți LINEBUF dacă este necesar):

    URGMATCH=`cat $HOME/.urgent`

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

O aplicație complet diferită pentru procmail ar fi aplicarea condițională a filtrelor la un anumit text sau mesaj (de ieșire). Un exemplu tipic ar fi un filtru prin care treceți toate mesajele de ieșire, pentru a vă asigura că acestea vor fi codificate MIME numai dacă este necesar. Adică, în acest caz, ați putea porni procmail în mijlocul unei conducte cum ar fi:

    cat newtext | procmail ./mimeconvert | mail chris@where.ever

Fișierul rc mimeconvert ar putea conține ceva de genul (=0x80= și =0xff= ar trebui înlocuite cu caractere reale pe 8 biți):

    DEFAULT=| # conductă la stdout în loc să livreze
                  # corespondența ca de obicei :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'

CONSULTAȚI ȘI
procmail(1), procmailrc(5), procmailsc(5), sh(1), csh(1), mail(1), mailx(1), uucp(1), aliases(5), sendmail(8), egrep(1), grep(1), biff(1), comsat(8), mimencode(1), lockfile(1), formail(1)

AUTORI
Stephen R. van den Berg
    <srb@cuci.nl>
Philip A. Guenther
    <guenther@sendmail.com>

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.