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.
|