Provided by:
manpages-pl_20060617-1_all 
NAZWA
procmailex - przykłady plików rc procmaila
SKŁADNIA
przykłady $HOME/.procmailrc
OPIS
Dla opisu formatu pliku rc zobacz stronę 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 znajdziesz w sekcji UWAGI podręcznika
procmail(1), możesz też zajrzeć do przykładowych plików rc, które są
rozprowadzane wraz ze źródłami procmaila jako część dystrybucji
(procmail*/examples/?procmailrc).
PRZYKŁADY
Posortuj pocztę przychodzącą z listy dyskusyjnej scuba-dive do folderu
pocztowego scubafile (używa lokalnego pliku blokującego
scubafile.lock).
:0:
* ^TOscuba
scubafile
Forwarduj pocztę o kompilatorach od petera do williama (i zachowaj
kopię lokalnie, w 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
Jeśli jesteś nowy jeśli chodzi o procmaila i planujesz trochę
poeksperymentować, to dobrze jest mieć jakiś rodzaj sieci
bezpieczestwa. Wstawienie następujących dwóch reguł ponad wszystkimi
innymi regułami, zapewni, że ostatnie 32 wiadomości będą chronione.
Aby działało to zgodnie z oczekiwaniami, musisz utworzyć w katalogu
$MAILDIR katalog `backup'.
:0 c
backup
:0 ic
| cd backup && rm -f dummy `ls -t msg.* | sed -e 1,32d`
Jeśli twój system nie generuje początkowych linii `From ', lub generuje
je w nieprawidłowy sposób, możesz 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 przez formail, który
obetnie wszelkie początkowe `From ' i automatycznie je odtworzy.
:0 fhw
| formail -I "From " -a "From "
Dodaj nagłówki wszystkich wiadomości, które nie przyszły od
postmastera, do prywatnej kolekcji nagłówków (dla statystyk, lub
debuggowania poczty); użyj 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 przez potok poczty.
:0 hwc:
* !^FROM_MAILER
| uncompress headc.Z; cat >>headc; compress headc
Lub jeśli chcesz użyć efektywniejszego gzip-a zamiast compress-a:
:0 hwc:
* !^FROM_MAILER
| gzip >>headc.gz
Forwarduj wszystkie wiadomości krótsze niż 1000 bajtów na mój adres
domowy (w tej regule nie potrzebny jest plik blokujący).
:0
* < 1000
! myname@home
Podziel nadchodzący z listy dyskusyjnej surfing digest na pojedyncze
wiadomości i zachowaj je w surfing, używając lokalnego pliku lokującego
surfing.lock.
:0:
* ^Subject:.*surfing.*Digest
| formail +1 -ds >>surfing
Zachowaj w pliku postm wszystko pochodzące od postmastera, lub mailer-
deamona. Użyj pliku postm.lock jako lokalnego pliku lokują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. Jeśli
zabezpieczenia te nie zostaną podjęte, to może się zdarzyć katastrofa.
Aby reguła odpowiadała na pocztę przychodzącą, powinieneś wstawić ją
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 listy dyskusyjne (tak, regexp
!^FROM_DAEMON powinien je wyłapać, jednak jeśli lista dyskusyjna nie
pracuje zgodnie z konwencjami, to może to być zbyt mało).
: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. Dodatkowo obsługuje bazę vacation,
wyłączając nazwisko nadawcy i wstawiając je do pliku vacation.cache, o
ile było ono nowe (plik vacation.cache jest obsługiwany przez formail,
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 auto-odpowiedź.
SHELL=/bin/sh # dla innych powłok trzeba to poprawić
:0 Whc: vacation.lock
* !^FROM_DAEMON
* !^X-Loop: twój@własny.adres.pocztowy
| 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
Wszelkie wiadomości dotyczące TeX-a zachowaj w oddzielnych, unikalnych
nazwach pliku, 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 zapisujemy listy w numerowanych plikach
(folder pocztowy MH).
:0
* (^TO|^Subject:.*)TeX[^t]
texmail/.
Możesz też wprowadzić list do kilku folderów 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/.
Zachowaj wszystkie listy o spotkaniach (meetings) w folderze, który
jest w comiesięcznie zmienianym katalogu . 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śli katalog `94-01' nie istniałby, to
automatycznie zostanie utworzony:
MONTHFOLDER=`date +%y-%m`
:0 ic
* ? 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 jesteś podłączony do kilku list dyskusyjnych, a ludzie
crosspostują na niektóre z nich, to możesz otrzymywać zduplikowane
listy (po jednym z każdej listy). Następująca reguła eliminuje
powtórzone listy. Mówi formailowi by trzymał 8KB plik cache, w którym
będzie zapisywał Message-ID ostatnio odbieranych listów. Ponieważ
elementy te muszą być unikalne dla każdego nowego listu, to są idealnym
rozwiązaniem na duplikaty. Wstaw zwyczajnie następującą regułę na
początek swojego pliku rc i gotowe.
:0 Wh: msgid.lock
| formail -D 8192 msgid.cache
Podczas bezpośredniego dostarczania do folderów emacsa (np. folderów
pocztowych obsługiwanych przez dowolny pocztowy pakiet emacsowy, np.
RMAIL czy VM), powinieneś używać kompatybilnych z emacsem plików
blokujących. Mailerom emacsowe 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 odpowiada /home/john.
MAILDIR=Mail
:0:/usr/local/lib/emacs/lock/!home!john!Mail!mailbox
* ^Subject:.*cokolwiek
mailbox
Inaczej, możesz 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. Movemail używa lokalnych plików
blokujących mailbox.lock dla danego mailboxa.
Aby wyciągnąć określone nagłówki z listu i wstawić je do zmiennych
środowiskowych, możesz 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 używasz w pliku procmailrc plików tymczasowych i chcesz upewnić
się, że są one usuwane zaraz przed zakończeniem pracy procmaila, możesz
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. jeśli chcesz by procmail zakończył pracę z kodem wyjścia
`1' zamiast standardowego kodu, możesz 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żesz 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 print-serwera.
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 wyż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 masz dwa konta i że używasz ich obu regularnie, lecz są one
w różnych miejscach (np. możesz czytać pocztę z tylko jednego z dwóch
kont). Jeśli chciałbyś forwardować pocztę przybywającą na konto jeden
do konta dwa i odwrotnie. Pierwszą rzeczą, która przychodzi na myśl
jest użycie na obydwu hostach plików .forward; lecz to nie zadziała
gdyż utworzysz pętlę pocztową. Możesz uniknąć pętli przez wstawienie
następującej reguły na początku wszystkich innych reguł w plikach
$HOME/.procmailrc obydwu hostów. Jeśli upewnisz się, że dodałeś te samo
pole X-Loop: na obydwu hostach, to poczta może już być spokojnie
forwardowana na drugie konto.
:0 c
* !^X-Loop: twojlogin@twoj.adres.pocztowy
| formail -A "X-Loop: twojlogin@twoj.adres.pocztowy" | \
$SENDMAIL -oi twojlogin@drugie.konto
Jeśli ktoś przesyła ci 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, uważamy 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ę rzucenie okiem
na SmartList (dostępne w tym samym miejscu co dystrybucja procmaila).
Ten serwer plików odsyła najwyżej jeden plik na dane żą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.
: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 wysyłającym
nadchodzącego listu i chciałbyś, by ten list był zachowany w katalogu
$MAILDIR.pilne zamiast w dowolnym z normalnych folderów pocztowych.
Możesz wówczas zrobić tak (uważaj, długość $HOME/.pilne powinna być
niższa niż $LINEBUF, jeśli to konieczne, zwiększ 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żywasz potoków dla wszystkich
wychodzących list aby upewnić się czy będziemy kodować w MIME tylko
wtedy gdy to konieczne. Np. w tym wypadku możesz uruchomić procmaila
wewnątrz potoku rodzaju:
cat newtext | procmail ./mimeconvert | mail chris@where.ever
Plik rc mimeconvert powinien zawierać coś w rodzaju (=0x80= i =0xff=
powinny być zamienione prawdziwymi 8-bitowymi znakami):
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), binmail(1), uucp(1), aliases(5), sendmail(8), egrep(1),
grep(1), biff(1), comsat(8), mimencode(1), lockfile(1), formail(1)
AUTOR
Stephen R. van den Berg z RWTH-Aachen, Germany
berg@pool.informatik.rwth-aachen.de