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.

mirror server hosted at Truenetwork, Russian Federation.