Provided by: manpages-pl_0.5-1_all 

NAZWA
procmailex - przykłady plików rc procmaila
SKŁADNIA
przykłady $HOME/.procmailrc
OPIS
Opisu formatu pliku rc znajduje się w procmailrc(5).
Technika punktów ważonych jest opisana szczegółowo na stronie procmailsc(5).
Ta strona podręcznika pokazuje kilka przykładowych reguł. Przykłady kompletnych plików rc znajdują się w
sekcji UWAGI podręcznika procmail(1); można też zajrzeć do przykładowych plików rc w katalogu
/usr/share/doc/procmail/examples.
PRZYKŁADY
Sortuje pocztę przychodzącą z listy dyskusyjnej scuba-dive do folderu pocztowego scubafile (używa
lokalnego pliku blokującego scubafile.lock).
:0:
* ^TOscuba
scubafile
Forwarduje pocztę o kompilatorach od petera do williama (i zachowuje kopię lokalnie w pliku petcompil).
:0
* ^From.*peter
* ^Subject:.*compilers
{
:0 c
! william@somewhere.edu
:0
petcompil
}
Równoważne rozwiązanie, które robi to samo:
:0 c
* ^From.*peter
* ^Subject:.*compilers
! william@somewhere.edu
:0 A
petcompil
Równoważne, lecz trochę wolniejsze rozwiązanie, robiące to samo:
:0 c
* ^From.*peter
* ^Subject:.*compilers
! william@somewhere.edu
:0
* ^From.*peter
* ^Subject:.*compilers
petcompil
Nowicjusze w temacie procmaila, planujący trochę z nim poeksperymentować, powinni zapewnić sobie jakiś
rodzaj sieci bezpieczeństwa. Wstawienie następujących dwóch reguł przed wszystkimi innymi regułami,
zapewni, że ostatnie 32 wiadomości będą chronione. Aby działało to zgodnie z oczekiwaniami, należy przed
dodaniem tych dwóch reguł, w katalogu $MAILDIR utworzyć katalog o nazwie "backup".
:0 c
backup
:0 ic
| cd backup && rm -f dummy `ls -t msg.* | sed -e 1,32d`
Jeśli system nie generuje początkowych linii "From " lub generuje je w nieprawidłowy sposób, to można to
naprawić, wywołując procmail z opcją -f-. Innym sposobem naprawienia tego problemu jest wstawienie
następujących dwóch reguł powyżej wszystkich innych reguł pliku rc. Będą one filtrować nagłówek dowolnego
listu za pomocą formail(1), który obetnie wszelkie początkowe "From " i automatycznie je odtworzy.
:0 fhw
| formail -I "From " -a "From "
Dodaje nagłówki wszystkich wiadomości, które nie przyszły od postmastera, do prywatnej kolekcji nagłówków
(dla statystyk lub debuggowania poczty); używa pliku blokującego "headc.lock". Aby zapewnić, że plik
blokujący nie zostanie usunięty przed zakończeniem potoku, trzeba podać opcję "w"; w przeciwnym wypadku
plik blokujący zostałby usunięty w momencie przyjęcia poczty przez potok.
:0 hwc:
* !^FROM_MAILER
| uncompress headc.Z; cat >>headc; compress headc
Lub aby użyć efektywniejszego gzip-a zamiast compress-a:
:0 hwc:
* !^FROM_MAILER
| gzip >>headc.gz
Forwarduje wszystkie wiadomości krótsze niż 1000 bajtów na podany adres domowy (w tej regule nie jest
potrzebny plik blokujący).
:0
* < 1000
! myname@home
Dzieli pochodzącą z listy dyskusyjnej surfing kolekcję wiadomości (ang. digest) na pojedyncze wiadomości
i zachowuje je w pliku surfing, używając lokalnego pliku blokującego surfing.lock.
:0:
* ^Subject:.*surfing.*Digest
| formail +1 -ds >>surfing
Zachowuje w pliku postm wszystkie e-maile pochodzące od postmastera lub mailer-deamona. Użyje pliku
postm.lock jako lokalnego pliku blokującego.
:0:
* ^FROM_MAILER
postm
Prosta reguła auto-odpowiadająca. Upewnia się, że nie odpowiada na pocztę od jakiegoś demona (np. odbita
poczta lub poczta z list dyskusyjnych), ani na listy pochodzące od Ciebie samego. Bez tych zabezpieczeń
mogłaby się zdarzyć katastrofa. Aby reguła odpowiadała na pocztę przychodzącą, powinno się ją wstawić
przed wszystkie inne reguły pliku rc. Radzi się jednak wstawiać ją za wszelkimi regułami, które
obsługują pocztę pochodzącą z list dyskusyjnych; zazwyczaj nie jest dobrym pomysłem generowanie
automatycznych odpowiedzi na pocztę z list dyskusyjnych (tak, regexp !^FROM_DAEMON powinien je wyłapać,
jednak jeśli lista dyskusyjna nie pracuje zgodnie z przyjętymi konwencjami, to może to być
niewystarczające).
:0 h c
* !^FROM_DAEMON
* !^X-Loop: twój@własny.adres.pocztowy
| (formail -r -A"Precedence: junk" \
-A"X-Loop: twój@własny.adres.pocztowy" ; \
echo "Poczta odebrana.") | $SENDMAIL -t
Bardziej skomplikowana reguła auto-odpowiadająca, która implementuje funkcjonalność znanego programu
vacation(1). Reguła ta jest oparta na tych samych zasadach, co poprzednia (zapobieganie odbijania maili
od demonów). Dodatkowo utrzymuje bazę danych vacation, wyciągając nazwę nadawcy i wstawiając ją do pliku
vacation.cache, o ile była to nowa nazwa (plik vacation.cache jest obsługiwany przez formail(1), który
będzie się upewniał, że zawiera tylko najnowsze nazwiska; rozmiar pliku jest ograniczony do 8192 bajtów).
Jeśli nazwisko było nowe, wysłana zostanie automatycznie wygenerowana odpowiedź.
Jak można zauważyć następująca reguła zawiera komentarze pomiędzy warunkami. Jest to dozwolone. Jednakże
nie można wpisywać komentarzy w linii zawierającej warunek.
SHELL=/bin/sh # dla innych powłok trzeba to poprawić
:0 Whc: vacation.lock
# Szybkie sprawdzenie, czy poczta jest adresowana do nas
* $^To:.*\<$\LOGNAME\>
# Nie odpowiadaj na maile od usług lub z list pocztowych
* !^FROM_DAEMON
# Pętle pocztowe to zło
* !^X-Loop: your@own.mail.address
| formail -rD 8192 vacation.cache
:0 ehc # jeśli nazwiska nie było w cache
| (formail -rA"Precedence: junk" \
-A"X-Loop: twój@własny.adres.pocztowy" ; \
echo "Odebrałem Twój list,"; \
echo "lecz nie wrócę do poniedziałku."; \
echo "-- "; cat $HOME/.signature \
) | $SENDMAIL -oi -t
Zachowuje wszelkie wiadomości dotyczące TeX-a w oddzielnych plikach o unikatowych nazwach w katalogu o
nazwie texmail (katalog musi istnieć); nie ma potrzeby używać w tym wypadku plików blokujących, więc ich
nie używamy.
:0
* (^TO|^Subject:.*)TeX[^t]
texmail
To samo, co powyżej, lecz teraz zapisuje listy w plikach numerowanych (folder pocztowy MH).
:0
* (^TO|^Subject:.*)TeX[^t]
texmail/.
Można także zapisać list w kilku folderach naraz. Następująca reguła dostarczy pocztę do dwóch folderów
MH i jednego folderu katalogowego. Jest to w rzeczywistości tylko jeden plik z dwoma dodatkowymi
dowiązaniami twardymi (hardlinks).
:0
* (^TO|^Subject:.*)TeX[^t]
texmail/. wordprocessing dtp/.
Zachowuje wszystkie listy o spotkaniach (meetings) w folderze znajdującym się w katalogu, którego nazwa
się zmienia co miesiąc. Np. jeśli był styczeń 1994, folder miałby nazwę "94-01/meeting", a lokalny plik
blokujący nazywałby się "94-01/meeting.lock".
:0:
* meeting
`date +%y-%m`/meeting
To samo, co wyżej, lecz jeśliby katalog "94-01" nie istniał, toby został automatycznie utworzony:
MONTHFOLDER=`date +%y-%m`
:0 Wic
* ? test ! -d $MONTHFOLDER
| mkdir $MONTHFOLDER
:0:
* meeting
${MONTHFOLDER}/meeting
To samo, co powyżej, lecz z użyciem innych środków:
MONTHFOLDER=`date +%y-%m`
DUMMY=`test -d $MONTHFOLDER || mkdir $MONTHFOLDER`
:0:
* meeting
${MONTHFOLDER}/meeting
Jeśli jest się zapisanym do kilku list dyskusyjnych, a ludzie wysyłają te same maile na niektóre z nich,
to może się zdarzyć, że otrzyma się zduplikowane listy (po jednym z każdej listy). Następująca reguła
eliminuje powtórzone maile. Mówi formailowi, by trzymał 8-kilobajtowy plik bufora, w którym będzie
zapisywał Message-ID ostatnio odbieranych listów. Ponieważ elementy te muszą być unikatowe dla każdego
nowego listu, to są idealnym rozwiązaniem na duplikaty. Wystarczy wstawić następującą regułę na początek
pliku rc i gotowe.
:0 Wh: msgid.lock
| formail -D 8192 msgid.cache
Uwaga: jeśli wystąpią problemy z dostarczaniem poczty w regułach występujących po tej regule i procmail
spróbuje wrzucić mail z powrotem do kolejki, to w czasie następnego uruchomienia kolejki mail zostanie
uznany za duplikat i wyrzucony. Ktoś, kto nie ma zbyt dużych umiejętności w pisaniu skryptów, może
spróbować użyć następującej reguły, która zapisze duplikaty w osobnym folderze zamiast wyrzucać je
całkowicie. Folder ten można od czasu do czasu przeglądać i opróżniać.
:0 Whc: msgid.lock
| formail -D 8192 msgid.cache
:0 a:
duplicates
Procmail może dostarczać pocztę bezpośrednio do folderów MH, ale nie aktualizuje pliku sekwencji, którym
zarządza prawdziwe MH, zawierającego informacje o nieprzeczytanej poczcie. Aby procmail aktualizował ten
plik także, należy użyć reguły podobnej do poniższej. Reguła ta zapisze wszystko, co zawiera w treści
maila słowo "spam" do folderu MH zwanego spamfold. Proszę zwrócić uwagę na lokalny plik blokujący, który
jest potrzebny, ponieważ programy MH nie blokują pliku sekwencji. Asynchroniczne uruchomienia programów
MH, które zmieniają plik sekwencji, mogą spowodować jego uszkodzenie. Niestety plik blokady nie
rozwiązuje całkowicie problemu, ponieważ rcvstore(1) może zostać uruchomiony w czasie działania poleceń
"show" lub "mark" lub jakiegoś innego programu MH. Problem ma zostać rozwiązany w przyszłych wersjach MH,
zanim to jednak nastąpi należy się liczyć z ryzykiem uszkodzenia plików sekwencji.
:0 :spamfold/$LOCKEXT
* B ?? spam
| rcvstore +spamfold
Podczas bezpośredniego dostarczania do folderów emacsa (np. folderów pocztowych obsługiwanych przez
dowolny pocztowy pakiet emacsowy, np. RMAIL czy VM), powininno się używać kompatybilnych z emacsem plików
blokujących. Mailerom emacsowym brakuje piątej klepki pod tym względem, denerwują się bardzo, jeśli ktoś
dostarcza pocztę do folderów, które znajdują się już w ich buforach wewnętrznych. Następująca reguła
zakłada, że $HOME jest równy /home/john.
MAILDIR=Mail
:0:/usr/local/lib/emacs/lock/!home!john!Mail!mailbox
* ^Subject:.*cokolwiek
mailbox
Inaczej, można kazać procmailowi dostarczać pocztę do swoich własnych mailboxów, a następnie periodycznie
opróżniać je i kopiować do plików emacsowych przy użyciu movemail(1). Movemail używa lokalnych plików
blokujących mailbox.lock dla danego mailboxa. Jest to preferowany tryb współpracy emacsowych mailerów z
procmailem.
Aby wyciągnąć określone nagłówki z listu i wstawić je do zmiennych środowiskowych, można użyć dowolnej z
następujących konstrukcji:
SUBJECT=`formail -xSubject:` # pole regularne
FROM=`formail -rt -xTo:` # przypadek specjalny
:0 h # metoda alternatywna
KEYWORDS=| formail -xKeywords:
Jeśli w pliku .procmailrc używane są pliki tymczasowe, to aby upewnić się, że zostaną one usunięte zaraz
przed zakończeniem pracy procmaila, można użyć linijek podobnych do tych:
TEMPORARY=$HOME/tmp/pmail.$$
TRAP="/bin/rm -f $TEMPORARY"
Słowo kluczowe TRAP może być także użyte do zmiany kodu wyjścia procmaila. Np. aby procmail zakończył
pracę z kodem wyjścia "1" zamiast standardowego kodu, można użyć:
EXITCODE=""
TRAP="exit 1;" # Kończący średnik jest istotny
# gdyż exit nie jest samodzielnym programem
Albo też, jeśli kod wyjścia nie musi zależeć od programów uruchamianych z TRAP, można użyć zwykłego:
EXITCODE=1
Następująca reguła drukuje każdy nadchodzący list, który wygląda jak plik postscriptowy.
:0 Bb
* ^^%!
| lpr
Następująca reguła robi to samo, lecz jest trochę bardziej selektywna. Drukuje tylko te pliki
postscriptowe, które pochodzą od serwera drukarki. Pierwszy warunek dopasowuje tylko, jeśli zostanie
znaleziony w nagłówku. Następny dopasowuje tylko na początku ciała wiadomości.
:0 b
* ^From[ :].*print-server
* B ?? ^^%!
| lpr
To samo, co powyżej, lecz z użyciem innych środków:
:0
* ^From[ :].*print-server
{
:0 B b
* ^^%!
| lpr
}
Podobnie:
:0 HB b
* ^^(.+$)*From[ :].*print-server
* ^^(.+$)*^%!
| lpr
Załóżmy, że mamy dwa konta i że oba są używane regularnie, lecz znajdują się w całkowicie różnych
miejscach (tj. można czytać pocztę tylko z jednego z dwóch kont). Chcielibyśmy przekazywać pocztę
przybywającą na konto pierwsze do konta drugiego i odwrotnie. Pierwszą rzeczą, która przychodzi na myśl
jest użycie na obydwu komputerach plików .forward, lecz to nie zadziała, gdyż utworzy się w ten sposób
pętlę pocztową. Można uniknąć pętli przez wstawienie następującej reguły na początku wszystkich innych
reguł w plikach $HOME/.procmailrc obydwu komputerach. Jeśli dodane zostanie dokładnie to samo pole
"X-Loop:" na obydwu komputerach, to poczta może już być bezpiecznie przekazywana z jednego z tych kont na
drugie.
:0 c
* !^X-Loop: twojlogin@twoj.adres.pocztowy
| formail -A "X-Loop: twojlogin@twoj.adres.pocztowy" | \
$SENDMAIL -oi twojlogin@drugie.konto
Jeśli ktoś prześle pocztę ze słowem "retrieve" w temacie, to następująca reguła automatycznie odeśle z
powrotem zawartość pliku info_file. Jak we wszystkich regułach, należy uważać na pętle pocztowe.
:0
* !^From +TWOJ_USERNAME
* !^Subject:.*Re:
* !^FROM_DAEMON
* ^Subject:.*retrieve
| (formail -r ; cat info_file) | $SENDMAIL -oi -t
A teraz przykład bardzo prostego serwera plików dostępnego przez pocztę. Dla bardziej wymagających
aplikacji, sugeruję zapoznanie się z programem SmartList (dostępnym w tym samym miejscu, co dystrybucja
procmaila). Ten serwer plików odsyła najwyżej jeden plik na żądanie, ignoruje ciało nadchodzących listów,
a linia tematu Subject: musi wyglądać jak "Subject: send file plik_którego_chcesz" (spacje są istotne),
nie zwraca plików, które mają nazwy rozpoczynające się od kropki i nie umożliwia odbioru plików spoza
drzewa katalogów serwera plików (dostosowując ten przykład do własnych potrzeb, prosimy pamiętać o tym,
by nieumyślnie nie zdjąć ostatniego z wymienionych ograniczeń).
:0
* ^Subject: send file [0-9a-z]
* !^X-Loop: twojlogin@twoj.adres.pocztowy
* !^Subject:.*Re:
* !^FROM_DAEMON
* !^Subject: send file .*[/.]\.
{
MAILDIR=$HOME/fileserver # zmień katalog do katalogu serwera plików
:0 fhw # odwróć nagłówek listu i wyciągnij nazwę
* ^Subject: send file \/[^ ]*
| formail -rA "X-Loop: twojlogin@twoj.adres.pocztowy"
FILE="$MATCH" # żądany plik
:0 ah
| cat - ./$FILE 2>&1 | $SENDMAIL -oi -t
}
Następujący przykład zamienia wstępnie wszystkie przychodzące listy w czystym tekście, kodowane w
formatach MIME na ładniejszy format 8-bitowy, który może być używany i wyświetlany w prostszy sposób
przez większość programów. Program mimencode(1) jest częścią pakietu metamail Nathaniela Borensteina.
: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"
}
Następujący przykład jest raczej egzotyczny, lecz służy tylko ilustracji właściwości. Załóżmy, że masz w
swoim katalogu domowym plik o nazwie ".pilne", a osoba wymieniona w tym pliku jest nadawcą nadchodzącego
listu i chciałbyś, by ten list był zachowany w skrzynce "$MAILDIR/pilne" zamiast w dowolnym z normalnych
folderów pocztowych. Można wówczas zrobić tak (uwaga: długość pliku $HOME/.pilne powinna być mniejsza niż
$LINEBUF, jeśli to konieczne, należy zwiększyć wartość LINEBUF):
URGMATCH=`cat $HOME/.pilne`
:0 B:
* $^From.*${URGMATCH}
pilne
Całkowicie innym zastosowaniem procmaila byłoby warunkowe dołączanie filtrów do niektórych (wychodzących)
tekstów lub listów. Typowym przykładem byłoby filtrowanie, w którym używane byłyby potoki dla wszystkich
wychodzących e-maili, aby ustawić kodowanie MIME tylko wtedy, gdy to konieczne. W takim przypadku można
uruchomić procmaila wewnątrz potoku na przykład w taki sposób:
cat newtext | procmail ./mimeconvert | mail chris@where.ever
Plik rc mimeconvert powinien zawierać coś w rodzaju (=0x80= i =0xff= powinny być zastąpione prawdziwymi
znakami 8-bitowymi):
DEFAULT=| # potok na stdout zamiast
# dostarczania pocztę jak zwykle
: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'
ZOBACZ TAKŻE
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)
AUTORZY
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.
BuGless 2001/08/04 PROCMAILEX(5)