procmailrc - plik rc procmaila
$HOME/.procmailrc
Szybką orientację w temacie można uzyskać, czytając
UWAGI umieszczone na końcu strony podręcznika
procmail(1).
Plik rc składa się z przypisań zmiennych środowiskowych
(niektóre z nich mają specjalne znaczenie dla procmaila) i
reguł. W najprostszej postaci, reguły są po prostu
jednoliniowymi wyrażeniami regularnymi, które są poszukiwane w
nagłówkach przychodzącej poczty. Pierwsza reguła,
która zostanie dopasowana, jest używana do określenia, gdzie
dany list ma pójść (zwykle do pliku). Jeśli przetwarzanie
dojdzie do końca pliku rc, procmail dostarczy pocztę do
$DEFAULT.
Istnieją dwa rodzaje reguł: dostarczające i
niedostarczające. Jeśli dopasowana zostanie
reguła
dostarczająca, procmail zakłada, że poczta (jak się
można domyślić) jest dostarczona i
zakończy
przetwarzanie pliku rc po wykonaniu linii akcji reguły. Jeśli
dopasowana zostanie
reguła niedostarczająca, to
przetwarzanie pliku rc będzie
kontynuowane nawet po wykonaniu
akcji tej reguły.
Reguły dostarczające są tymi, które powodują zapis
nagłówka lub ciała listu do pliku, jego zaabsorbowanie przez
program lub przekazanie (forwardowanie) do innego adresu pocztowego.
Reguły niedostarczające to te, które łapią wyjście
programu lub filtru z powrotem do procmaila, lub te, które
rozpoczynają zagnieżdżony blok.
Można powiedzieć procmailowi, by traktował
regułę
dostarczającą jako niedostarczającą poprzez
przekazanie takiej regule flagi "c". Spowoduje to, że procmail
wygeneruje kopię listu (
carbon copy), dostarczając go regule
i kontynuując przetwarzanie pliku rc.
Używając dowolnej liczby reguł, można posortować
pocztę wprost do określonych folderów pocztowych. Należy
pamiętać jednak, że poczta może wpływać do tych
folderów w tym samym momencie (jeśli kilka procmaili działa
naraz, co nie jest nieprawdopodobne przy dużej ilości poczty). Aby
upewnić się, że nie narobi to bałaganu, zalecane jest
robienie właściwego użytku z plików blokujących.
Inicjacje zmiennych środowiskowych i
reguły mogą
być swobodnie przeplatane w pliku rc. Jeśli zmienna
środowiskowa ma dla procmaila specjalne znaczenie, zostanie użyta
odpowiednio w momencie przetwarzania. (np. można zmienić katalog
bieżący, kiedy tylko jest taka potrzeba, przez podanie nowego
MAILDIR, zamienić pliki blokujące przez podanie nowego
LOCKFILE, zmienić umask, itd., możliwości jest
nieskończenie wiele :-).
Inicjacje i podstawienia tych zmiennych środowiskowych są
obsługiwane dokładnie jak w
sh(1) (włączając w
to wszystkie możliwe cytowania i sekwencje specjalne) i dodatkowo: spacje
dookoła znaku "=" są ignorowane, a każda zmienna nie
zawierająca końcowego "=" zostanie usunięta ze
środowiska. Każdy program w odwrotnych apostrofach, uruchomiony
przez procmail, będzie miał przekazany cały list na swoim
wejściu (stdin).
Słowo zaczynające się od # wraz z wszystkimi znakami
występującymi po nim aż do znaku nowej linii jest ignorowane.
Nie dotyczy to linii warunkowych, które nie mogą być
komentowane.
Linia zaczynająca się od ":" oznacza początek
reguły. Ma następujący format:
:0 [ flagi] [ : [lokalnyplikblokujący] ]
<zero lub więcej warunków (jeden na linię)>
<dokładnie jedna linia akcji>
Warunki zaczynają się od "*" i wszystko, co następuje
po tym znaku, jest przekazywane
niezmienione wewnętrznemu
egrepowi, z wyjątkiem początkowych i końcowych białych
spacji. Wyrażenia regularne są
całkowicie kompatybilne z
normalnymi wyrażeniami regularnymi
egrep(1). Zobacz także
Rozszerzone wyrażenia regularne.
Warunki są logicznie koniugowane; jeżeli nie ma warunków, wynik
jest domyślnie prawdziwy.
Flagi mogą być dowolnymi z następujących:
H Egrepuj nagłówek (domyślnie).
B Egrepuj ciało.
D Powiedz wewnętrznemu egrepowi, aby rozróżniał
duże i małe litery (zachowaniem domyślnym jest ignorowanie
wielkości liter).
A Ta reguła będzie zależeć od ostatniej
poprzedzającej reguły (na bieżącym poziomie
zagnieżdżenia) bez flagi "A" lub "a".
Umożliwia to wiązanie akcji zależących od wspólnego
warunku.
a Ma takie samo znaczenie jak flaga "A" z dodatkowym warunkiem
mówiącym, że bezpośrednio poprzedzająca reguła
musi się
pomyślnie zakończyć przed uruchomieniem
bieżącej reguły.
E Ta reguła jest wykonywana tylko, jeśli bezpośrednio
poprzedzająca reguła nie była wykonana. Wykonanie tej
reguły wyłącza także wszelkie bezpośrednio
następujące reguły z flagą "E". Umożliwia
to definiowanie akcji typu "else if".
e Ta reguła jest wykonywana tylko, jeśli bezpośrednio
poprzedzająca reguła się
nie powiodła (tj.
podjęto próbę wykonania akcji, ale skończyła się
ona błędem).
h Przesyła nagłówek listu do potoku, pliku lub innego
miejsca docelowego (domyślne).
b Przesyła ciało listu do potoku, pliku lub innego miejsca
docelowego (domyślne).
f Zakłada, że potok jest filtrem.
c Generuje kopię
carbon copy tego listu. Ma to tylko sens dla
reguł
dostarczających. Jedyną niedostarczającą
regułą, dla której flaga ta ma jakiś skutek jest wypadek
zagnieżdżonego bloku — w celu wygenerowania kopii proces
procmaila zostanie
sklonowany (pliki blokujące nie zostaną
odziedziczone); podczas gdy klon będzie pracować jak zwykle, rodzic
przeskoczy blok.
w Czeka na zakończenie filtru lub programu i sprawdza kod
wyjścia (normalnie ignorowany); jeśli filtr zwrócił
błąd, tekst nie był filtrowany.
W Ma takie samo znaczenie jak flaga "w", lecz powstrzyma
wszelkie informacje typu "Program failure".
i Ignoruje wszelkie błędy zapisu na tej regule (np. zwykle
przez wcześnie zamknięty potok).
r Tryb surowy: nie próbuje zapewnić, że list kończy
się pustą linią i zapisuje go takim, jakim jest.
Istnieją pewne warunki specjalne, których można użyć, a
które nie są w pełni wyrażeniami regularnymi. Aby je
wybrać, warunek musi zaczynać się od:
! Odwraca warunek.
$ Oszacowuje resztę warunku według reguł podstawiania
sh(1) wewnątrz podwójnych cudzysłowów, pomija
początkowe białe spacje i ponownie przetwarza regułę.
? Używa kodu wyjścia podanego programu.
< Sprawdza, czy całkowita długość listu jest
krótsza niż podana (dziesiętnie) liczba bajtów.
> Analogiczne do "<".
zmienna ?? Porównuje resztę warunku z
wartością tej zmiennej środowiskowej (nie może to być
pseudozmienna). Specjalnymi wypadkami są zmienne "B",
"H", "HB" i "BH", które zwyczajnie
przeciążają domyślny obszar przeszukiwania
nagłówka/ciała (header/body) zdefiniowanego na początku
dla tej reguły.
\ Aby zacytować dowolny z powyższych znaków na
początku linii.
Jeśli umieści się drugi (kończący) ":" w
pierwszej linii reguły, to procmail użyje
lokalnego pliku
blokującego (locallockfile; tylko dla tej reguły). Opcjonalnie
można podać nazwę pliku, który będzie użyty;
jednak jeśli się tego nie zrobi, procmail użyje nazwy pliku
celu (lub nazwy pliku następującej po pierwszym
">>") i dopisze do niej
$LOCKEXT.
Linia akcji może zaczynać się od następujących
znaków:
! Przekazuje (forwarduje) e-mail do wszystkich podanych adresów
pocztowych.
| Uruchamia określony program, prawdopodobnie w
$SHELL-u,
jeśli wykryto któryś ze znaków
$SHELLMETAS.
Można opcjonalnie poprzedzić ten symbol potoku wyrażeniem
zmienna=, co spowoduje, że standardowe wyjście (stdout)
programu zostanie przechwycone do zmiennej środowiskowej
zmienna
(procmail
nie zakończy przetwarzania pliku rc w tym momencie).
Jeśli podany zostanie tylko symbol potoku, bez żadnego programu, to
procmail wypisze list na stdout.
{ Jeśli następuje za tym przynajmniej jedna spacja, tabulacja
lub nowa linia, to oznacza to początek zagnieżdżonego bloku.
Wszystko, aż do następnego nawiasu zamykającego, będzie
zależeć od warunków podanych dla tej reguły. Dozwolone
jest nieograniczone zagnieżdżanie. Nawias zamykający istnieje
zwyczajnie po to, by oddzielić blok; w żadnym wypadku
nie
wywoła zakończenia procmaila w żaden sposób. Po dotarciu
do końca bloku, przetwarzanie będzie kontynuowane, jak zwykle, po
tym bloku. W bloku zagnieżdżonym flagi "H" i "B"
dotyczą tylko warunków prowadzących do tego bloku, flagi
"h" i "b" w ogóle nie działają.
Wszystko inne będzie uznawane za nazwę skrzynki pocztowej
(zarówno nazwę pliku lub katalogu, bezwzględną lub
względną w stosunku do bieżącego katalogu (zobacz opis
zmiennej
MAILDIR)). Jeśli jest to (możliwe że jeszcze
nieistniejąca) nazwa pliku, poczta zostanie do niego doklejona.
Jeśli jest to katalog, poczta zostanie dostarczona do nowo utworzonego,
unikatowego pliku o nazwie
$MSGPREFIX* w podanym katalogu. Jeśli
nazwa skrzynki pocztowej kończy się "/.", to katalog ten
jest uznawany za folder MH, tj. procmail użyje następnego numeru,
który będzie dostępny. Jeśli nazwa skrzynki pocztowej
kończy się znakiem "/", to ten katalog jest uznawany za
folder maildir, tj. procmail zapisze pocztę w pliku w podkatalogu o
nazwie "tmp", a następnie przeniesie go do podkatalogu o nazwie
"new". Jeśli skrzynka pocztowa jest podana jako folder MH lub
maildir, procmail utworzy wymagane katalogi, jeśli nie istnieją,
zamiast traktować skrzynkę pocztową jako
nieistniejącą. Gdy procmail dostarcza do katalogów, można
podać wiele katalogów, do których należy dostarczyć
(procmail dostarczy pocztę, używając twardych
dowiązań).
LOGNAME, HOME i SHELL Twoje (odbiorcy) wartości domyślne
PATH $HOME/bin :/usr/local/bin :/usr/bin :/bin (z wyjątkiem
przetwarzania pliku
/etc/procmailrc, w którego czasie zostanie
ustawione na "/usr/local/bin :/usr/bin :/bin".)
SHELLMETAS & |<>~;?*[
SHELLFLAGS -c
ORGMAIL /var/mail/$LOGNAME
(Chyba że podano
-m, wtedy opcja ta jest nieustawiona)
MAILDIR $HOME
(Chyba że nazwa pierwszego pomyślnie otwartego pliku rc zaczyna
się od "./", w którym wypadku wartością
domyślną jest ".")
DEFAULT $ORGMAIL
MSGPREFIX msg.
SENDMAIL /usr/sbin/sendmail
SENDMAILFLAGS -oi
HOST Nazwa bieżącego komputera
COMSAT no
(Jeśli plik rc jest podany w linii komend)
PROCMAIL_VERSION 3.22
LOCKEXT .lock
Inne czyszczone lub preustawiane zmienne środowiskowe to IFS, ENV i PWD.
Z powodów bezpieczeństwa podczas startu procmail wyrzuci wszystkie
zmienne środowiskowe, co do których ma podejrzenia, że
mogą wpływać na działanie dynamicznego konsolidatora (
ld.so(8)).
Zanim zgubisz się w mętliku zmiennych środowiskowych,
pamiętaj że wszystkie one mają sensowne wartości
domyślne.
MAILDIR Bieżący katalog w momencie, gdy procmail jest
uruchomiany (znaczy to, że wszystkie ścieżki są relatywne
do
$MAILDIR).
DEFAULT Domyślny plik
mailbox (jeśli nie powiedziano
inaczej, procmail wrzuci pocztę do tego pliku). Procmail automatycznie
użyje
$DEFAULT$LOCKEXT jako pliku blokującego przed
zapisaniem czegoś do tej skrzynki pocztowej. Nie trzeba ustawiać tej
zmiennej, ponieważ standardowo wskazuje ona na standardową
skrzynkę pocztową systemu.
LOGFILE Plik ten będzie zawierał wszelkie komunikaty
diagnostyczne i komunikaty o błędach od procmaila (zazwyczaj
żadne) lub od innych programów uruchomionych przez procmaila.
Jeśli plik ten nie jest podany, komunikaty będą przesyłane
e-mailem z powrotem do nadawcy. Zobacz także
LOGABSTRACT.
VERBOSE Ustawiając tę zmienną na "yes" lub
"on", można włączyć
rozszerzoną
diagnostykę, wyłączyć zaś można ją
przez ustawienie zmiennej na "no" lub "off".
LOGABSTRACT Zanim procmail zakończy, raportuje dostarczoną
wiadomość w
$LOGFILE, pokazując pola "From " i
"Subject: " nagłówka, folder, w którym
wiadomość została zapisana, oraz jej długość (w
bajtach). Ustawienie tej zmiennej na "no" powstrzymuje generowanie
tych informacji. Po ustawieniu jej na "all", procmail będzie
logował każdą pomyślnie zakończoną
regułę dostarczenia, którą przetworzy.
LOG Wartość przypisana tej zmiennej będzie dopisana do
pliku
$LOGFILE.
ORGMAIL Zazwyczaj mailbox systemowy (
ORi
Ginal
MAILbox). Jeśli z jakiegoś powodu (jak
przepełnienie
systemu plików), list nie mógł być dostarczony do tego
mailboxa, to procmail dostarczy go tutaj. Jeśli jednak nie będzie
mógł nawet tego uczynić, to list zostanie odbity do nadawcy.
LOCKFILE Globalny plik blokujący. Jeśli plik ten już
istnieje, procmail będzie czekał aż zniknie i utworzy go
samodzielnie (i wyczyści gdy skończy). Jeśli podano więcej
niż jeden
plik blokujący, to poprzedni zostanie usunięty
przed próbą utworzenia nowego. Używanie globalnego pliku
blokującego jest złą praktyką, lepiej używać
lokalnych (zależnych od reguły).
LOCKEXT Domyślne rozszerzenie, które jest dodawane do
plików docelowych, aby określić, którego z lokalnych
plików blokujących użyć (tylko jeśli
używanie tych plików jest włączone dla danej reguły).
LOCKSLEEP Liczba sekund, które procmail ma odespać przed
każdą kolejną próbą użycia pliku
blokującego (jeśli taki już istniał); jeśli liczby
nie podano, to wynosi ona 8 sekund.
LOCKTIMEOUT Liczba sekund, które muszą minąć od
utworzenia lub ostatniej modyfikacji
pliku blokującego, zanim
procmail zdecyduje, że jest to plik blokujący pozostawiony w wyniku
błędu i że trzeba go usunąć na siłę.
Wartość zero mówi, że timeout nie jest ustawiony i że
procmail ma czekać do skutku. Jeśli nie jest podany, to odpowiada
1024 sekundom. Wartość ta jest przydatna w zapobieganiu
niezdefiniowanym zawieszeniom programów
sendmail(8) lub procmail.
Procmail jest odporny na różnice w czasie lokalnym na
różnych komputerach.
TIMEOUT Liczba sekund, które muszą minąć zanim
procmail zdecyduje, że dziecko, które uruchomił, musiało
się zawiesić. Program odbierze od procmaila sygnał
TERMINATE, a przetwarzanie pliku rc pójdzie dalej. Jeśli
podano zero, to nie będzie tu używany czas oczekiwania i procmail
będzie czekać do skutku; jeśli zmienna nie jest podana,
wartość domyślna odpowiada 960 sekundom.
MSGPREFIX Przedrostek nazwy pliku, który jest używany w wypadku
dostarczania do katalogu (nie używany w katalogach maildir lub MH).
HOST Jeśli nie jest to
nazwa bieżącego komputera,
to przetwarzanie bieżącego
pliku rc zostaje natychmiast
przerywane. Jeśli w linii komend podano inne pliki rc, to przetwarzanie
będzie kontynuowane z następnym z nich. Jeśli wykorzystane
zostaną wszystkie pliki rc, program zakończy pracę, lecz nie
wygeneruje błędu (np. mailer będzie sądził, że
wiadomość została dostarczona).
UMASK Nazwa mówi za siebie (jeśli nie, zapomnij o tym :-).
Cokolwiek zostanie przypisane do zmiennej
UMASK jest interpretowane
jako wartość
ósemkowa. Jeśli nie jest podana, to
domyślna wartość maski wynosi 077. Jeśli maska zezwala na
ustawienie o+x, to owo o+x zostanie dodane do praw dostępu wszystkich
skrzynek pocztowych, do których procmail dostarcza pocztę
bezpośrednio. Może to być używane do sprawdzania, czy
przybyła nowa poczta.
SHELLMETAS Jeśli jakikolwiek ze znaków wymienionych w
SHELLMETAS pojawi się w linii określającej filtr lub
program, to linia zostanie przekazana powłoce
$SHELL, a nie
zostanie wywołana bezpośrednio.
SHELLFLAGS Każde wywołanie powłoki
$SHELL
będzie następujące:
"$SHELL" "$SHELLFLAGS" "$*";
SENDMAIL Jeśli nie używa się właściwości
forwardowania, nie należy się tym przejmować.
Określa to program wzywany do forwardowania poczty.
Jest wywoływany jako: "$SENDMAIL" $SENDMAILFLAGS "$@";
NORESRETRY Liczba powtórek, które mają być dokonane
po wystąpieniu jednego z błędów "
process table
full", "
file table full", "
out of
memory" lub "
out of swap space". Jeśli
liczba ta jest ujemna, procmail będzie próbował wiecznie;
jeśli nie jest podana, odpowiada wartości 4. Powtórki
zachodzą co każde
$SUSPEND sekund. Idea, która się
za tym kryje, jest taka, że jeśli np. całkowicie wykorzystane
zostały
obszar pamięci wymiany lub
tablica
procesów, to wiele innych programów wykryje to także i
przerwie działanie lub "padnie", zwalniając cenne
zasoby procmailowi.
SUSPEND Liczba sekund, podczas których procmail będzie
czekał, jeśli musi, na coś, co obecnie jest niedostępne
(pamięć, fork, itd.); jeśli nie podano, to wartością
domyślną jest 16 sekund. Zobacz także:
LOCKSLEEP.
LINEBUF Długość wewnętrznych buforów liniowych,
nie może być mniejsza niż 128. Wszystkie linie odczytywane z
pliku rc nie powinny mieć więcej niż
$LINEBUF
znaków przed i po rozszerzeniu. Jeśli wartość nie jest
podana, odpowiada 2048. Limitu tego oczywiście
nie stosuje
się do samego listu, który może mieć dowolne
długości linii lub może być plikiem binarnym. Patrz
także opis
PROCMAIL_OVERFLOW.
DELIVERED Jeśli ustawione na "yes", to procmail
będzie udawał przed agentem pocztowym, że poczta została
dostarczona. Jeśli poczta nie mogła być dostarczona po
napotkaniu tego ustawienia, zostanie utracona (tj. nie będzie
zwrócona do nadawcy).
TRAP Gdy procmail będzie kończył działanie, ale nie z
powodu otrzymania sygnału, to wywoła zawartość tej
zmiennej. Kopia listu może być odczytana ze stdin. Wszelkie
wyjście wyprodukowane przez tę komendę będzie dodane do
pliku
$LOGFILE. Przykładowe zastosowania
TRAP to: usuwanie
plików tymczasowych, logowanie własnych uzupełnień, itp.
Zobacz także
EXITCODE i
LOGABSTRACT.
EXITCODE Domyślne procmail zwraca zerowy kod błędu
(oznaczający powodzenie), jeśli udało mu się poprawnie
dostarczyć list lub gdy zmienna
HOST nie była ustawiona na
nazwę bieżącego komputera, a w linii poleceń nie podano
kolejnych plików rc. W przeciwnym wypadku zwracany jest błąd.
Przed zakończeniem jednakże procmail sprawdza wartość tej
zmiennej. Jeśli została ustawiona na dodatnią wartość
numeryczną, procmail użyje jej jako kodu wyjścia. Jeśli
zmienna ta jest ustawiona, lecz pusta, procmail ustawi kod wyjścia na
wartość zwracaną przez program
TRAP. Jeśli zmienna
ta nie została ustawiona, procmail ustawi ją na krótko przed
wywołaniem programu
TRAP.
LASTFOLDER Zmienna ta jest inicjowana przez procmail za każdym
razem, gdy dostarcza coś jakiemuś folderowi lub programowi. Zawsze
zawiera nazwę ostatniego foldera (lub programu), do którego coś
dostarczano. Jeśli ostatnie dostarczenie obejmowało
łącznie kilka folderów, to
$LASTFOLDER będzie
zawierał nazwy wszystkich plików (będących de facto
dowiązaniami twardymi) jako listę rozdzieloną spacjami.
MATCH Zmienna ta jest inicjowana przez procmail za każdym razem, gdy
ma wyciągnąć tekst z wyrażenia regularnego. Będzie
zawierać cały tekst odpowiadającego wyrażenia regularnego
występującego po żetonie "
\/".
SHIFT Przypisanie dodatniej wartości tej zmiennej daje taki sam
rezultat, jak komenda "shift" w
sh(1). Komenda ta jest
najbardziej użyteczna do wyciągania dodatkowych argumentów
podanych procmailowi działającemu jako filtr pocztowy.
INCLUDERC Nazywa plik rc (względny w stosunku do bieżącego
katalogu), który powinien być włączony jako
część bieżącego pliku rc. Dozwolone jest
nieograniczone zagnieżdżanie (limitowane tylko przez zasoby
systemowe takie jak pamięć czy liczba dostępnych
deskryptorów plików). Ponieważ nie są są sprawdzane
ani uprawnienia, ani właściciel pliku rc, użytkownicy
INCLUDERC powinni się upewnić, że tylko zaufani
użytkownicy mają prawa do zapisu włączanego pliku rc i do
katalogu, w którym się ten plik znajduje. Przypisanie zmiennej
INCLUDERC wartości w linii poleceń nie ma żadnego
efektu.
SWITCHRC Nazywa plik rc (względny w stosunku do bieżącego
katalogu), na który powinno się przełączyć
przetwarzanie. Jeśli podany plik rc nie istnieje, nie jest zwykłym
plikiem ani plikiem
/dev/null, to zostanie wypisany błąd i
będzie kontynuowane przetwarzanie bieżącego pliku rc. W
przeciwnym razie przetwarzanie bieżącego pliku rc zostanie przerwane
i rozpocznie się przetwarzanie pliku podanego jako wartość tej
zmiennej. Jeśli zmienna
SWITCHRC zostanie usunięta, to
procmail przerywa przetwarzanie bieżącego pliku, tak jakby plik ten
się kończył na linii usuwającej tę zmienną.
Podobnie jak w przypadku
INCLUDERC nie są są sprawdzane ani
uprawnienia, ani właściciel pliku rc, a przypisanie tej zmiennej
wartości w linii poleceń nie ma żadnego efektu.
PROCMAIL_VERSION Numer wersji działającego procmaila.
PROCMAIL_OVERFLOW Zmienna ta zostanie ustawiona na niepustą
wartość, jeśli procmail wykryje przepełnienie bufora.
Patrz rozdział
BŁĘDY poniżej po opis innych
działań podejmowanych po wykryciu przepełnienia bufora.
COMSAT Notyfikacja
comsat(8)/
biff(1) domyślnie jest
włączona, lecz można ją wyłączyć przez
ustawienie tej zmiennej na "no". Alternatywnie, usługę
biff można dokonfigurować przez ustawienie zmiennej na
"service@", "@hostname" lub "sevice@hostname".
Wartością domyślną jest biff@localhost.
DROPPRIVS Jeśli jest to ustawione na "yes", procmail
porzuci wszelkie uprawnienia (suid lub sgid), jakie może mieć. Opcja
ta jest użyteczna, aby zagwarantować, że dolna
część pliku
/etc/procmailrc jest wywoływana w
imieniu odbiorcy.
Następujące żetony rozpoznawane są zarówno przez
wewnętrzny egrep procmaila, jak i przez standardowy
egrep(1)
(proszę być świadomym tego, że niektóre implementacje
egrepa zawierają niestandardowe rozszerzenia, w szczególności
operator powtarzania
{ nie jest obsługiwany przez
wewnętrznego egrepa procmaila):
^ Początek linii.
$ Koniec linii.
. Dowolny znak poza znakiem nowej linii.
a* Dowolna sekwencja składająca się z zera lub więcej
znaków "a".
a+ Dowolna sekwencja składająca się z jednego lub
więcej znaków "a".
a? Ciąg pusty albo jeden znak "a".
[^-a-d] Dowolny znak, który
nie jest kreską, znakiem
"a", "b", "c" lub "d", lub znakiem
nowej linii.
de|abc Albo sekwencja "de", albo "abc".
(abc)* Zero lub więcej sekwencji "abc".
\. Dopasowuje pojedynczą kropkę; należy użyć
\ przed którymkolwiek ze znaków specjalnych, aby pozbyć
się jego specjalnego znaczenia. Patrz także opis podstawień
zmiennych
$\nazwa w rozdziale
BŁĘDY.
Były to tylko przykłady, oczywiście można używać
również bardziej złożonych kombinacji.
Następujące znaczenia żetonów są rozszerzeniami
procmaila:
^ lub
$ Pasuje do znaku nowej linii (dla trafień
wieloliniowych).
^^ Zakotwicza wyrażenie na samym początku obszaru
przeszukiwania lub jeśli napotkane na końcu wyrażenia, na samym
końcu obszaru przeszukiwań.
\< lub
\> Dopasowuje znak przed słowem lub po nim.
Są to ogólnie skróty dla "[^a-zA-Z0-9_]", lecz
mogą także dopasowywać znaki nowej linii. Ponieważ
odpowiadają rzeczywistym znakom, nadają się tylko do
oddzielania słów, nie do oddzielania przestrzeni między
słowami.
\/ Dzieli wyrażenie na dwie części. Wszystko
odpowiadające prawej stronie będzie przypisane do zmiennej
środowiskowej
MATCH.
Patrz strona podręcznika
procmailex(5).
Kontynuowane linie w linii akcji, która określa program, muszą
zawsze kończyć się odwrotnym ukośnikiem, nawet jeśli
używana powłoka nie potrzebuje lub nie chce odwrotnego ukośnika
do wskazania kontynuacji. Jest tak z powodu dwustopniowego procesu
przetwarzania (najpierw procmail, potem powłoka (lub nie, zależnie
od
SHELLMETAS)).
Nie wstawia komentarzy w regule w liniach warunkowych wyrażeń
regularnych, linie te są przekazywane wewnętrznemu egrepowi
wprost (z wyjątkiem odwrotnych ukośników kontynuacji
znajdujących się na końcu linii).
Początkowe białe spacje w kontynuowanych wyrażeniach regularnych
są zazwyczaj ignorowane (więc linie mogą być wcięte),
lecz
nie jest tak w kontynuowanych wyrażeniach warunkowych,
które są odczytywane według reguł podstawiania
sh(1) wewnątrz podwójnych cudzysłowów.
Uwaga na deadlocki podczas wykonywania niezdrowych rzeczy jak przekazywanie
poczty na swoje własne konto. Deadlocki można złamać przez
właściwe użycie
LOCKTIMEOUT.
Wszelkie domyślne wartości, których procmail używa dla
zmiennych środowiskowych
zawsze przeciążą te,
które były wcześniej zdefiniowane. Aby naprawdę
przeciążyć wartości domyślne, należy je albo
wstawić do pliku rc, albo wypisać w linii poleceń jako
argumenty.
Plik
/etc/procmailrc nie może zmienić ustawienia zmiennej
PATH widzianej później przez pliki rc użytkowników
— wartość tej zmiennej jest przywracana, gdy procmail
kończy przetwarzanie pliku
/etc/procmailrc. W
przyszłości należy się spodziewać ulepszenia tego
zachowania, jednakże obecnie jedynym rozwiązaniem jest
przekompilowanie procmaila z żądaną wartością tej
zmiennej.
Zmienne środowiskowe, ustawiane
wewnątrz interpretowanej przez
powłokę części akcji reguły "|",
nie
zachowają swoich wartości po zakończeniu reguły, gdyż
są ustawiane w podpowłoce procmaila. Aby upewnić się,
że wartość zostanie zachowana, należy dokonać
przypisania przed początkowym znakiem "|" reguły, tak
że może przechwycić stdout programu.
Jeśli w regule dostarczającej podana zostanie tylko flaga
"h" lub "b" i reguła ta zostanie dopasowana, to
jeżeli nie użyto flagi "c", ciało listu lub
(odpowiednio) jego nagłówek zostaną utracone.
procmail(1),
procmailsc(5),
procmailex(5),
sh(1),
csh(1),
mail(1),
mailx(1),
uucp(1),
aliases(5),
sendmail(8),
egrep(1),
regexp(5),
grep(1),
biff(1),
comsat(8),
lockfile(1),
formail(1)
Jedyne podstawienia zmiennych środowiskowych, które mogą być
obsługiwane przez samego procmaila są typu
$nazwa,
${nazwa},
${nazwa:-tekst},
${nazwa:+tekst},
${nazwa-tekst},
${nazwa+tekst},
$\nazwa,
$#,
$n,
$$,
$?,
$_,
$- i
$=; gdzie
$\nazwa zostanie zastąpione przez
nazwa z zacytowanymi
wszystkimi znakami mającymi specjalne znaczenie w wyrażeniach
regularnych;
$_ będzie zastąpione nazwą
bieżącego pliku rc,
$- przez
$LASTFOLDER, a
$=
będzie zawierać punktację (score) ostatniej reguły. Co
więcej znaki spacji nigdy nie będą rozdzielać wyniku
podstawiania
$\nazwa. Gdy użyte są opcje
-a lub
-m to
"$@" (cudzysłowy są wymagane) rozwinie
się do podanych argumentów. Jednakże
"$@"
będzie rozwijany tylko wtedy, gdy jest używany na liście
argumentów programu, i tylko jedno wystąpienie tej zmiennej
będzie rozwijane.
Niecytowanie ekspansje zmiennych przeprowadzane przez procmail są zawsze
dzielone na spacjach, tabulatorach i znakach nowej linii; zmienna IFS nie jest
wewnętrznie używana.
Procmail nie wspiera rozwijania "~".
Bufor linii o długości
$LINEBUF jest używany podczas
przetwarzania
pliku rc; wszystkie ekspansje, które nie
mieszczą się w tym limicie długości są obcinane i
ustawiana jest zmienna
PROCMAIL_OVERFLOW. Jeśli zbyt długa
linia jest linią warunku lub akcji, to reguła zawierająca taki
warunek lub akcję jest uznawana za zakończoną niepowodzeniem, a
procmail kontynuować będzie przetwarzanie kolejnych reguł.
Jeśli linia taka występuje w przypisaniu zmiennej lub linii
rozpoczynającej, to procmail przerwie przetwarzanie
pliku rc.
Jeśli globalny plik blokujący ma ścieżkę
relatywną, a bieżący katalog nie jest taki sam, jak
wtedy, gdy globalny plik blokujący został utworzony, to ten globalny
plik blokujący nie zostanie usunięty, jeśli procmail
zakończy w tym momencie działanie (tak więc: należy
używać ścieżek
absolutnych dla globalnych
plików blokujących).
Jeśli plik rc ma ścieżkę
względną, to kiedy
ten plik jest otwierany po raz pierwszy, to
MAILDIR zawiera
ścieżkę względną. Jeśli w którymś
momencie procmail zostanie poinstruowany, żeby się sklonował, a
bieżący katalog roboczy się zmienił od czasu otwarcia
pliku rc, to procmail nie będzie w stanie się sklonować
(lekarstwo: używanie ścieżek
bezwzględnych do
odwołań do plików rc lub upewnienie się, że
MAILDIR zawiera ścieżkę bezwzględną przed
otwarciem pliku rc).
Lokalny plik blokujący reguły, który zaznacza początek
zagnieżdżonego bloku, nie działa tak, jak by się tego
oczekiwało.
Gdy przechwytuje się standardowe wejście z reguły do zmiennej
środowiskowej, to zostanie obcięty dokładnie jeden,
kończący znak nowej linii.
Niektóre nieoptymalne i nieoczywiste wyrażenia regularne
ustawiają niepoprawną wartość zmiennej
MATCH. Takie
wyrażenie regularne można poprawić, usuwając jeden lub
więcej niepotrzebnych operatorów "*", "+" lub
"?" znajdujących się po lewej stronie tokena \/.
Jeśli wyrażenie regularne zawiera "
^TO_", to
zostanie zastąpione przez "
(^((Original-)?(Resent-)?(To |Cc
|Bcc) |(X-Envelope |Apparently(-Resent)?)-To)
:(.*[^-a-zA-Z0-9_.])?)", co powinno złapać wszystkie
specyfikacje celu zawierające określony
adres.
Jeśli wyrażenie regularne zawiera "
^TO", to zostanie
zastąpione przez "
(^((Original-)?(Resent-)?(To |Cc |Bcc)
|(X-Envelope |Apparently(-Resent)?)-To) :(.*[^a-zA-Z])?)",
co powinno złapać wszystkie specyfikacje celu zawierające
określone
słowo.
Jeśli wyrażenie regularne zawiera "
^FROM_DAEMON", to
zostanie zastąpione przez "
(^(Mailing-List : |Precedence
:.*(junk |bulk |list) |To : Multiple recipients of
|(((Resent-)?(From |Sender) |X-Envelope-From) : |>?From
)([^>]*[^(.%@a-z0-9])?(Post(ma?(st(e?r)? |n) |office)
|(send)?Mail(er)? |daemon |m(mdf |ajordomo) |n?uucp |LIST(SERV
'u' |proc) |NETSERV |o(wner |ps) |r(e(quest |sponse) |oot)
|b(ounce 'u' |bs\.smtp) |echo |mirror |s(erv(ices? |er)
|mtp(error)? |ystem) |A(dmin(istrator)? |MMGR
|utoanswer))(([^).! :a-z0-9][-_a-z0-9]*)?[%@>\t
][^<)]*(\(.*\).*)?)?$([^>] |$)))", co powinno
złapać maile pochodzące od większości demonów
(jak się podoba to wyrażenie regularne? :-)
Jeśli wyrażenie regularne zawiera "
^FROM_MAILER", to
zostanie zastąpione przez "
(^(((Resent-)?(From |Sender)
|X-Envelope-From) : |>?From
)([^>]*[^(.%@a-z0-9])?(Post(ma(st(er)? |n) |office)
|(send)?Mail(er)? |daemon |mmdf |n?uucp |ops |r(esponse |oot)
|(bbs\.)?smtp(error)? |s(erv(ices? |er) |ystem) |A(dmin(istrator)?
|MMGR))(([^).! :a-z0-9][-_a-z0-9]*)?[%@>\t
][^<)]*(\(.*\).*)?)?$([^>] |$))" (uproszczona wersja "
^FROM_DAEMON"), co powinno złapać maile pochodzące
od większości demonów pocztowych.
Podczas przypisywania wartości logicznych zmiennym takim jak
VERBOSE,
DELIVERED czy
COMSAT, procmail przyjmuje jako
prawdziwy napis zaczynający się od: cyfry różnej od zera,
"on", "y", "t" lub "e". Fałsz
jest każdym napisem zaczynającym się od: cyfry zero,
"off", "n", "f" lub "d".
Jeśli linia akcji reguły określa program, to pojedyncza para
znaków odwrotny-ukośnik+nowa-linia w niej występująca
zostanie przekształcona w nową linię, pod warunkiem, że
linia nie zawiera innych żadnych znaków.
Silnik wyrażeń regularnych wbudowany w procmaila nie obsługuje
nazwanych klas znaków (np. [:alnum:]).
Ponieważ niecytowane początkowe białe spacje są ogólnie
ignorowane w plikach rc, można zastosować takie wcięcia linii,
jakie nam odpowiadają.
Początkowy znak "|" w linii akcji wskazującej program lub
filtr, jest obcinane przed sprawdzeniem
$SHELLMETAS.
Pliki włączane dyrektywą
INCLUDERC zawierające tylko
przypisania wartości zmiennym środowiskowym mogą być
dzielone z
sh(1).
Nie ma żadnych gwarancji, że bieżące zachowanie
przypisań zmiennych
INCLUDERC i
SWITCHRC w linii
poleceń nie zostanie zmienione. Zostało już raz zmienione w
przeszłości i może być zmienione ponownie lub nawet
usunięte w przyszłych wersjach.
W celu
naprawdę skomplikowanego przetwarzania można nawet
rozważyć rekurencyjne wywoływanie procmaila.
W bardzo starych wersjach procmaila zamiast ":0" rozpoczynającego
regułę trzeba było używać ":n", gdzie n
oznaczało liczbę warunków w regule.
Stephen R. van den Berg
<srb@cuci.nl>
Philip A. Guenther
<guenther@sendmail.com>
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Przemek Borys (PTM) <pborys@dione.ids.pl> i Robert Luberda
<robert@debian.org>.
Polskie tłumaczenie jest częścią projektu manpages-pl;
uwagi, pomoc, zgłaszanie błędów na stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją
3.22 oryginału.