Home Index Search Links About Us
  News   Archives   Companies   Tips  

Procmail ile Posta Yönetimi

Yazar: Angel Lopez

Çeviri: Emre Demiralp


Kurulum

Temel Fonksiyonlar

Biçimlendirme

Postalama Dizelgeleri

Postayý Yanýtlama

Sonsuz Döngüler

Dosyalarýn Çözümlenmesi

Sonuç

Conclusion

Kurulum

Ýlk adÝm procmail'in enson sürümünün elde edilmesidir. Bu yazýnýn yazýmýna baþlandýðýnda son sürüm 3.11pre7 idi.

Program için kaynak yazýlýmýn elde edilmesinden sonra, kurulum için, onun gevþetilmesi ve çýkýndan çýkarýlmasý gerekecektir. Bu amaç için verilecek güdüm tar -xzvf procmail.tar.gz olmalýdýr

Bunu izleyen aþama Makefile ve config.h dosyalarýnýn eldengeçirilmesidir. Bu yazýnýn yalnýzca bir giriþ olmasýndan dolayý ve bu ilk giriþte nesneleri basit tutmak amacýyla, bu dosyalarýn biçimlendirme seçeneklerini açýklamayacaðýz. Ýlgilenen okuyucu elyordam sayfalarýna ve kaynaklarla birlikte sunulan kaynaklandýrmalara baþvurabilir.

Yine de hiç olmazsa Makefile dosyasýnda BASENAME seçeneðinin varlýðýndan sözetmek yerinde olacaktýr. Bu seçenekle procmail'in kurulacaðý taban dizini gösterebiliriz. Taban dizin adýndan, gösterdiðimiz dizin bin ve man gibi dizinleri askýya alacaktýr.

Sonunda, çýkýný derlemek için make install güdümünün verilmesi gerekir.

Procmail tüm sistem için yüklenip sendmail(8)'in bazý kurallarýyla çaðrýlabileceði gibi bazý kullanýcýlarýn kendi kullanýmlarý için de devreye sokulabilirler. Ýkinci durumda kullanýcý procmail kullanýmýný kendisinin .forward dosyasýnda, aþaðýdaki biçimde bir satýrla belirtilecektir:

|IFS=' ' && exec /home/juan/procmail/bin/procmail -f- || exit 75 #juan

Bu satýrda juan adlý kullanýcýnýn procmail'i kendi HOME çevresel deðiþkeniyle belirtilen dizinine kurduðunu varsaymaktayým. Bu özel satýr için, derleme sýrasýnda belirtilecek olan BASENAME, /home/juan/procmail'dýr.

Temel Fonksiyonlar

Procmail standart giriþ veriyolundan bilgi okur. O, kullanýcýnýn kendi HOME adresinde bulunmasý gereken ve bir biçimlendirme dosyasý olan .procmailrc adlý dosyaya bakar. Bu dosya, procmail'e bir mesajýn okunmasýndan sonra ne yapacaðýný söyleyen bazý kurallar tanýmlar. O, mesajýn saklanmasý, gözardý edilmesi, kendiliðinden yanýtlanmasý, vs.. gibi konularda karar verebilmek için mesaj baçlýðýnda bazý katarlarý kontrol etmek üzere yönlendirilebilir.

Procmail, gelen ya da bir dosyada depolanan posta ile otomatik olarak ilgilenmemize izin verir.

Biçimlendirme

Kullanýlan biçimlendirme dosyasý .procmailrc olup HOME içine yerleþtirilmeldir.

# ile baþlayan her satýr bilgilendirme amaçlý olup eylem gerçekleþtirme niteliði yoktur.

:0 veya :0: ile baþlayan satýrlar, procmail'e bir mesajla ne yapacaðýný söyleyen yeni bir kuralýn baþlangýcýný gösterirler.

* ile baþlayan satýrlar bir kuralýn uygulanmasý için saðlanmasý gereken bir koþulu gösterirler. Bu, procmail'in hangi mesajlarýn kurala göre iþlenmesi gerektiðini saptamak için kullandýðý düzenektir.

Geriye kalan, yani, :, veya * ile baþlamayanlar güdüm olarak nitelendirilirler. Diðer bir deyiþle, koþulu saðlayan mesaja procmail tarafýndan uygulanacak eylemi nitelendirirler. Bazý olasý eylem ya da güdümler arasýnda, bir mesajýn silinmesi, mesaj yünlendirimi, mesajýn saklanmasýndan sözedilebilir.

Bir .procmailrc dosyasýnda gösterilmesi gereken ilk þeyler çevresel deðiþkenlerdir. Size ait .procmailrc dosyasýnda tanýmlamanýzý salýk verebileceðim deðiþkenlerden bazýlarý aþaðýda sunulmaktadýr.

MAILDIR
Procmail'in posta mesajlý dosyalarý saklayacaðý dizini gösterir. Bu deðiþken genellikle $HOME/mail ya da $HOME/Mail'e yönlendirme yapar. Bunlardan hangisinin geçerli olacaðý kullanýlan posta okuyucusuna baðlýdýr.

LOGFILE
Procmail'in, gerçekleþtirilen haberleþmelerin tümüyle ilgili kayýtlarýn tutulduðu kayýt dosyasýnýn adýný belirtir.

SENDMAIL
Otomatik olarak mesaj yanýtlamada kullanýlacak olan sendmail'in nerede bulunacaðýný belirtir.

FORMAIL
formail'in nerede bulunacaðýný gösterir. Bu program, procmail ile birlikte daðýtýlýr ve amacý posta baþlýklarýný yeniden düzenlemek ya da bir mesajý günderim veya depolama üncesinde yeniden biçimlendirmektir.

DEFAULT
Tanýmlanan kurallardan herhangi birinin procmail tarafýndan uygulanamamasý durumunda bir mesajýn saklandýðý dosyadýr.

Çevresel deðiþkenler, .procmailrc içinde herhangi bir yerde tanýmlanabilirler. Eðer bir deðiþken = simgesini izleyen bir deðerle birlikte gözükmüyorsa, devre düþü býrakýlýr.

Kurallar iki grupta toplanabilirler: Eylemlerinin uygulanmasý sonrasýnda mesaj gönderimine yolaçanlar ve yolaçmayanlar.

Ýlk gruptaki kurallar basittir. Onlarýn eylemlerinin gerçekleþtirilmesi sonrasýnda bu mesaja baþka bir kuralýn uygulanmayacaðý varsayýlýr ve böylece mesaj günderilir.

Mesajýn gönderilmediðini varsayan ikinci grup kurallarýn kullanýlmalarý çok yararlýdýr. Bu durum, mesaja gönderim üncesinde, özelikle çok sayýda kuralýn uygulanmasý ya da eylemin gerçekleþtirilmesi istendiðinde ünem kazanýr.

Bir kural yazýmý için genel yapý aþaðýdaki gibidir:

           :0 [options] [ : [exclusion file] ]
           * condition 1
           * condition 2
                 .
                 .
                 .
           * condition N
           command
           

Þimdi bu yapýyý parça parça çözümleyelim. Her kural :0 ile baþlamalýdýr. Kuralý aþaðýdaki seçeneklerden herhangi biri izleyebilir:

H Koþul posta baþlýðýna uygulanýr.
B Koþul mesaj gövdesi içinde aranýr.
D Koþul soruþturulduðunda küçük ve büyük harfler ayýrdedilebilir olarak nitelenecektir.
A Bu kural, bir önceki uygulandýðýnda uygulanacaktýr.
a A'ya benzer, ama bir önceki kural yanýlgýsýz uygulanmýþ olmalýdýr.
E Bu kural, bir önceki kural uygulanmadýðýnda çalýþtýrýlacaktýr.
e Bu kural, bir önceki kuralýn çalýþtýrýlmýþ olduðu ama bir yanýlgý belirterek devre dýþý kaldýðý durumlarda çalýþtýrýlacaktýr.
h Mesaj baþlýðý güdüme aktarýlýr.
b Mesaj gövdesi güdüme aktarýlýr.
f Güdüm bir süzgeç olarak yorumlanýr.
c Mesajýn bir karbon kopyasýný, cc, oluþturur. Mesajý gönderimiyle ilgili bir kuralýn bu seçenekle çalýþtýrýlmasý durumunda gönderimle ilgili bir iþlev yerine getirilir daha sonra diðer kurallar mesajýn karbon kopyasýna uygulanabilir.
w Güdümün çalýþmasýný, güdüm çüküþ düzgüsünü alana dek bekler.
W Önceki seçenek gibidir ama yanýlgý durumunda herhangi bir ileti yayýnlamaz.
i Olasý yazým yanlýþlarýný gözardý eder.
r Ýletiyi olduðu gibi yazar. Onun sonunun boþ bir satûrla bitip bitmediðini sýnamaz.

Eðer herhangi bir seçenek verilmeyecek olursa, benimsenen eðilim, koþulun posta baþlýðý üzerinde sýnanmasýdýr (seçenek H ). Güdüm, standart giriþ veriyolundan, iletinin hem baþlýðýný hem de gödesini alýr (seçenek h ve b ). Bu durumda büyük ve küçük harf ayýrýmý yoktur.

:0'den ve olasý seçeneklerden sonra, ikinci bir : gelebilir. Bu durumda iletinin yazýlacaðý dosyanýn iki süreç tarafýndan ayný anda dosyaya yazýmý engellemek amacýyla dosya kilitlenmelidir. Kilit olarak kullanýlacak dosya, istenirse, kullanýcý tarafýndan belirlenebilir.

Daha sonra koþullar, her satýra bir tane olacak ve koþul öncesinde * karakteri kullanýlacak biçimde verilir. Bir iletinin baþlýk ya da gövdesinde bi katarý bulabilmek için koþullar genellikle düzgün deyimler olarak yazýlýrlar. Düzgün deyimler diðerlerinin arasýnda aþaðýdaki simgeleri kullanýrlar:

^ Satýrbaþý.
$ Satýrsonu.
. Satýrbaþýnadönüþ dýþýnda herhangi bir simge
* Sýfýr ya da daha çok kez.
+ Bir ya da daha çok kez.
? Sýfýr ya da daha çok kez.
[a-z] Simge bölgesi, bu örnekte a dan z ye.
[^a-z]a dan z ye bölgesi dýþýnda herhangi bir simge.
a|b 'a' ya da 'b'

Koþullardan sonra tek bir güdüm gelir. Eðer güdümün ilk simgesi aþaðýdakilerden birisiyse o zaman özel bir davranýþ sergilenir:

! Ýleti belirtilen posta adreslerinin tümüne birer birer yönlendirilir.
| Eðer bu simge bir çalýþtýrýlabilen tarafýndan izlenirse, koþulun saðlanmasý durumunda bu çalýþtýrýlabilen koþulur. Simgeyi hiçbir þeyin izlememesi durumunda iletinin tam metni standart çýkýþ veriyoluna gönderilir. Simgeyi bir deðiþken adý izleyecek olursa o zaman da belirtilen güdümün sonucu bu deðiþkende saklanýr.

Postalama Dizelgeleri

Procmail'in çok yararlý olabildiði yerlerden biri de postamýzýn iþletimidir. Üç farklý Linux postalama dizelgesinin sürdürümcüsü olduðumuzu varsayalým. Her bir dizelge orijinin adresiyle kimliklendirilir. Sözgelimi, aþaðýdaki adreslere sahip olduðumuzu varsayalým

           l-linux@calvo.teleco.ulpgc.es
           linux@nuclecu.unam.mx
           linux-security@redhat.com
         

Olaðan durumlarda bu postalama dizelgelerinden gelen iletiler ayný posta kutusuna birlikte ulaþýrlar ve birþey yapýlmayacak olursa karmaþýk bir halde alýkonulurlar. Dolayýsýyla, postalarýn geldikçe sýnýflanmasý ve uygun dosyalarda saklanmasý iþleri kolaylaþtýracaktýr.

Procmail bu sorunu kolaylýkla çözebilir. Bu amaçla, .procmailrc adlý dosyayý, aþaðýdaki basit kurallarla, kullanarak bir Linux postalama dizelgesinden gelen postalarýmýzý sýnýflandýrabiliriz:

:0
* ^From.*l-linux@calvo.teleco.ulpgc.es
l-linux

:0
* ^From.*linux@nuclecu.unam.mx
linux-mx

:0
* ^From.*linux-security@redhat.com
linux-security

Kurallardan birini dikkatlice inceleyelim. Eðer bir kuralýn iç çalýþmasýný anlayabilirsek gerisini anlamak daha kolay hale gelir. Çünkü, temel düzenek daima aynýdýr.

Ýlk önce yeni bir kuralýn baþladýðýný belirten :0 katarý aranýp bulunur. Baþka seçenek bulunmadýðýndan procmail bu kural için benimsenmiþ seçeneklerini alacaktýr: büyük ve küçük harfler ayýrdedilebilir olacak, koþul yalnýzca posta baþlýðýna uygulanacak, güdüm hem baþlýk hem de iletinin gövdesini alacaktýr.

Ýzleyen satýrda koþul aranýp bulunur. Önceden sözedildiði gibi bu daima gerçekleþtirilebilir, çünkü ilk simgesi * dir. Koþul ise aþaðýdaki düzgün ifadedir:

^From.*linux@nuclecu.unam.mx

^From altkatarý procmail'e From altkatarýyla baþlayan satýrlarýn saptanmasý gerektiðini söyler.

Daha sonra gelen .* karakteri, herhangi bir sayýda karakter anlamýna gelir. Daha önceden gördüðümüz üzere, bir düzenli ifadedeki "." simgesi herhangi bir karaktere eþdeðer olup * sýfýr ya da daha çok anlamýna gelir. Dolayýsýyla, .*, From den sonra sýfýr ya da daha çok karakter bulunabilir.

Bundan sonra da, mesajýn geldiði yerin adresi olan linux@nuclecu.unam.mx gelir.

Düzenli ifadeler hakkýnda bir parça daha düþünerek, aþaðýdaki satýrlar bu kuralla tanýnacaktýr.:

From: linux@nuclecu.unam.mx
From:linux@nuclecu.unam.mx
FROM linux@nuclecu.unam.mx

Bu kuralla bu adresten ve baþka yerlerden gelen mesajlar ayýrdedilebilir. Bu durumda elde olan mesajla ne yapacaðýz?.

Ýzleyen satýr güdüm(ya da eylem) olup mesajla ne yapýlacaðýný gösterir. Bu durumda, mesaj, saklanacaðý yer olan linux-mx adlý dosyaya gönderilir. Dosyanýn açýk eriþimyolunun belirtilmediði durumlarda, $MAILDIR çevresel deðiþkeninin belirttiði eriþimyolu kullanýlýr.

Farklý dizelgelerden ulaþan iletiler, kökenlerine göre (alandan), çeþitli dosyalara daðýtýlýrlar.

Özdevimli Yanýtlama

Procmail'in yararlý olabileceði diðer bir durum da özdevimli (kendiliðinden) yanýtlamadýr. Sözgelimi, toplumsal OEG anahtarýnýzý, e-posta ile istemiþ bulunan herkese göndermek istemeniz durumunda, procmail'in ne kadar etkin olduðu ortaya çýkacaktýr.

Bu amaçla, OEG toplumsal anahtarýmýz için bir dilekçe gibi düþünülebilecek ve konusu içinde *PGP katarý bulunan bir kural gündeme getirilebilir. Böyle bir kural aþaðýdaki biçimde yazýlabilir:

0:
* ^Subject.*PGP
| (formail -r ; cat $HOME/key.asc) | sendmail -t

Ayný düþünce, tatile gittiðimizi ve onlardan gelebilecek e-posta iletilerini tatil dönüþü yanýtlayacaðýmýzý ileti sahiplerine bildirmeye yönelik bir program yazmamýz durumuna da uygulanabilir:

0:
| (formail -r; cat $HOME/vacations.txt) | sendmail -t

Son durumda, tým iletilerin ayný not içererek gönderilmesinden dolayý bir koþul bulunmamaktadýr.

Özdevimli Yanýtlamalarda Sonsuz Döngülerden Kaçýnma

Önceki örneklerde postanýn özdevimli (kendiliðinden) yanýtlanmasý durumunda ortaya çýkabilen sonsuz döngülerden kaçýnmak için herhangi bir çaba gösterilmemiþtir.

Kökeni kendi E-posta adresimiz olan bir ileti durumunda program o adrese yanýtlama yapacak ve yanýt bize dönecektir. Bu ileti bir kez daha yanýtlanacak ve bu süreç bir sonsuz döngüye dönüþecektir. Bu durumdan kaçýnmak için baþlýða iletinin yanýtlanmýþ durumda bulunduðunu belirten bir satýr daha eklenmelidir. Bu doðrultuda, formail'in -A seçeneði kullanýlabilir:

formail -r -A"X-Loop: dir@email.es"

Bu durumda dir@email.es sizin kendi e-posta adresiniz olacaktýr. Böylece, yanýtlama için baþlýk oluþturulurken, ileride yeni nir kuralla sýnanabilmek için X-Loop satýrý eklenir:

:0
* !^X-Loop: dir@email.es
| (formail -r -A"X-Loop: dir@email.es" ; 
    cat $HOME/vacation.txt) | sendmail -t

Bu kural sonsuz bir döngü oluþmasýný engelleyecektir. Çünkü, baþlýkta X-Loop satýrý içeren bir ileti koþulu saðlamayacak ve sonuçta procmail tarafýndan yanýtlanmayacaktýr.

Dosyalarýn Çözümlenmesi

.procmailrc'miz için Bir diðer ilginç kural da uuencode(1) ile gizyazýlanmýþ olan gelen iletinin kendiliðinden çözümlenmesidir. Kural söyle verilebilir.:

:0 B
* ^begin 644 .*
{
	MAILDIR=$HOME/files
	
	:0
	| uudecode
}

Burada B seçneðinin kullanýmýyla kuralýn koþulunun yalnýzca ileti gövdesi üzerinde sýnanmasý saðlanmýþ olmaktadýr.

Eðer kural "begin 644" katarýyla baþlayan bir satýr bulursa, bunun anlamý uuencode(1) ile gizyazýlanmýþ bir dosyanýn baþlangýcý bulunmuþ demektir.Bu durumda, MAILDIR, çevresel deðiþkeninin devreye sokulmasý, ya da diðer bir deyiþle bu deðiþken tarafýndan gösterilen dizine geçilme sözkonusu olur. O andan baþlayarak, tüm basým ya da gösterim eylemleri gösterilen taban dizini alarak gerçekleþtirilecektir.Bizim durumumuzda alýnan iletilerin $HOME/files dizininde saklanmasý söz konusu olacaktýr..

Bunun ardýnda koþulsuz bir kural varolup iletiyi çözümlemek amacýyla uudecode(1)'ye borular. Özgün dosya $HOME/files dizinine gidecektir.

Sonuç

Bu kýsa giriþten sonra, procmail'in çok yetenekli olduðu ve postanýzýn iþletimini kolay ve etkin olarak yapabilmenize yardýmcý olacaðý açýk bir biçimde gözler önünen serilmiþ bulunmaktadýr. Düzenli ifadeler ve kurallarla deneyler yapmanýzý ve bunlarý gereksinimlerinize uyarlamanýzý önermekteyim. B¢ylelikle, bu kýsa giriþ yazýsýnda deðinemediðim ve daha ileri düzeylere giden procmail olanaklarý çok daha ilginç olanaklar sunabilecektir.


Daha çok bilgi için:
© 1998 Angel Lopez
Bu sanal yörenin bakýmý Miguel A Sepulveda tarafýndan yapýlmaktadýr.