Değişik Meziyetler ve POP3
Bir programcının canını en çok sıkan durumlardan biri, yazdığı bir döngünün sonsuz çevrime girmesidir. Bu aslında çok sık rastlanan bir durumdur. Bazen değişken değerlerini arttırmayı unutmak gibi ufak(!) bir hata, bize sonsuz çevrim olarak geri döner.
Örneğin bir while() fonksiyonunu düşünün. Bu fonksiyonun oldukça değişik kullanımları vardır. Ancak en çok kullanın durumu, koşul sağlanana kadar, döngüye devam etmek ve sonunda, yani döngü için gerekli koşul oluştuğunda, işleme son vermektir. Mesela 1 den 100 e kadar olan sayıları ekrana bastırmak için while() fonksiyonu şu şekilde kullanılır:
Bu en basit while kullanımıdır. Burada ++$a satırını atlar iseniz, ekrana sonsuze kadar "0" yazıldığını görürsünüz. Bu gibi bir döngüden çıkmanın tek yolu, Ctrl + C tuşuna basmaktır.
Ancak böyle bir programlama hatası, bazen bizim işimize oldukça güzel bir şekilde yarayabilir! Mesela sürekli yaptığımız işleri, sonsuze giden bir döngü ile yapabiliriz. Örneğin aşağıdaki script, çalıştırıldığı zaman sonsuz döngüye girer, ve her beş saniye de bir hem bir dosyaya hem de ekrana, o anki zamanı, Unix zaman formatında basar:
Burada dikkat edeceğimiz bir iki önemli nokta var. Biz burada while(1) dediğimizde bir sonsuz döngü kurmuş oluyoruz. Bunu gören perl yorumlayıcısı, herhangi bir koşul olmadığını, daha doğrusu koşulun sürekli true olduğunu zanneder. while(1) ama 1 neye eşit? Ya da bu döngüden nasıl çıkılır? gibi tanımalamalar yapmadığımız için bu sonsuz döngü demektir.
Diğer bir nokta ise, sleep() komutu. Sleep komutunu herhangi bir scripte verdiğimiz zaman, scriptimiz o kadar saniye boyunca duracak, sonra kaldığı yerden işleme devam edecektir. Biz mini scriptimizde sleep(5) diyerek, sonsuz döngü her çevrime girdiğinde, önce bir beş saniye durmasını, sonra $t değişkenine o anki zamanı atamasını ve bunu bir dosyaya ve hemen sonra ekrana basmasını, perlden istiyoruz. Perlde, çalışma izinleri müsaade ettiği sürece, ya da, birisi bilgisayarın fişini prizden çekene kadar işleme sürekli devam ediyor!
Bunun biraz daha değişik bir sürümünü yapmak da oldukça basit. Örneğin, ekrana yazılan şeyleri sürekli olarak bir dosyaya kaydeden mini bir script yazalım:
İşte size mini bir not defteri :-)
Bu döngüdende çıkmak istediğinizde, Ctrl+C tuşuna basabilirsiniz.
Ama bir saniye! Biz başlıkta Pop3 demiştik. Bunların pop3 ile alakası nedir?
POP3 Serverlar
Artık devir değişti! Zamanında birçok kişi, web tabanlı e-mail kullanıyordu. Ama artık çoğu kişi, evinde, Outllook Exspress'de, Outlook'ta, ya da herhangi bir Email Aracısında, maillerini görmek istiyor. Bu hem arşivlemek, hem de hız bakımından web tabanlı mail alışverişinden hızlı. Pop protokolu, http ile kıyaslandığınıda, bayağı bir fark atıyor. Yeterki bağlantınız ve karşıkı pop serverın bağlantısı hızlı olsun.
İşte Perl ile uğraşan kişilerden biri, bir vakit gelmiş ve pop serverlar ile haberleşmek istemiş. Bunu başarmış ve bir modül yazarak, ücretsiz olarak dağıtmaya başlamış. Modülün adı da Net::POP3
Bu modülde kullanılacak birkaç komut var. İşte komutlar ve özellikleri:
-
use Net::POP3;
-
-
#$pop adında bir nesne oluşturuyoruz. $host adlı değişken, bağlanacamız, pop3 server.
-
$pop->user($user);
-
#Servera user bilgimizi veriyoruz.
-
$sayi = $pop->pass($pass);
-
#Servera parolamızı gönderiyoruz. Eğer parolamız doğru ise, bu komut bize, mail sayımızı gönderir.
-
$liste = $pop->list();
-
#bu fonksiyon ile, mail listemizi alıyoruz.
-
$pop->quit();
-
#Bağlantıyı kesiyoruz...
Ben bu protokol ile ilgili ufak bir script yazdım. Bu script ilk önce sizden maillerin kontol edileceği serverın adresini, kullanıcı adınızı ve parolanızı alıyor. Daha sonra bu bilgiler ile POP servera bağlanmaya çalışıyor. Eğer bağlanırsa ne âlâ! Bize bize ayrılan yerdeki maillerimizin başlıklarını tarihini gönderiyor. İşte ekran görüntüleri ve kodları:
-
#!/perl
-
-
use Net::POP3;
-
-
$boo = $ENV{'QUERY_STRING'};
-
foreach $sif (@sifu) {
-
$QUE{$on} = $son;
-
}
-
-
if($QUE{'bolum'} eq "" or $QUE{'bolum'} eq "index") {
-
&index_bas;
-
}
-
else {
-
&gogogo;
-
}
-
-
sub index_bas {
-
print "Content-type:text/html\n\n";
-
-
<html><head><title>Bilgileri girin</title>
-
<link rel="stylesheet" type="text/css" href="./default.css" mce_href="./default.css">
-
</head>
-
<body>
-
<form name="selam" action="popmail.cgi?bolum=liste" method="POST">
-
Bağlanılacak pop3 sunucusu:<br>
-
<input type="text" name="sunucu" size="20"><br>
-
Sunucu kullanici adi:<br>
-
<input type="text" name="kullanici" size="20"><br>
-
Parolanız:<br>
-
<input type="password" name="parola" size="20"><br>
-
<input type="submit" value="Yallah" class="button">
-
</form>
-
</body>
-
</html>
-
~;
-
exit;
-
}
-
-
sub gogogo {
-
&oku_parcala();
-
-
$host = $CONT{'sunucu'};
-
$user = $CONT{'kullanici'};
-
$pass = $CONT{'parola'};
-
-
print "Content-type:text/html\n\n";
-
-
$pop->user($user);
-
#pass methodu hesaptaki mail sayısını gönderir.
-
$sayi = $pop->pass($pass);
-
#$pop->login($user,$pass)
-
#Yukarıdaki gene mevcut mail sayısını verir.
-
#Eğer mesaj yoksa 0 gönderir. Boolean olarak true verir
-
-
#popstat() iki eleman gönderir. Sliinmi mesajlar ve octet olarak inbox büyüklüğü
-
-
<html>
-
<head>
-
<title>$host ile bağlantı kuruldu</title>
-
<link rel="stylesheet" type="text/css" href="./default.css" mce_href="./default.css">
-
</head>
-
<body>
-
<div align="center">
-
<center>
-
-
<table>
-
<tr>
-
<td colspan="3">Merhaba $user. $host adlı pop3 sunucusuna bağlanıldı</td>
-
</tr>
-
<tr>
-
<td colspan="3">Şu an da okunmamamış <font color="red">$sayi</font> adet mailin mevcut</td>
-
</tr>
-
<tr>
-
<td>Kimden</td>
-
<td>Konu</td>
-
<td>Tarih</td>
-
</tr>
-
~;
-
-
$liste = $pop->list();
-
-
$baslik_bilgisi = $pop->get($mesaj);
-
foreach $satir (@{$baslik_bilgisi}) {
-
chomp $satir;
-
$name =~ s/\"//ig;
-
$name =~ s/ //ig;
-
$email =~ s/\>//ig;
-
@yaz[0] = "<tr>\n<td><a href=\"mailto:$email\">$name</a></td>\n";
-
}
-
@yaz[1] = "<td>$satir</td>\n";
-
}
-
@yaz[2] = "<td>$satir</td>";
-
}
-
}
-
foreach $p (@yaz) {
-
print "$p";
-
}
-
print "</td>\n";
-
}
-
$pop->quit();
-
exit;
-
}
-
-
sub oku_parcala {
-
-
foreach $bire (@bierhoff) {
-
$CONT{$name} = $value;
-
}
-
}
Burada gördüğünüz gibi, birkaç sub yazdım. Bu sublardan gogogo() adlı sub, action'a bakıyor ve girilen mail server adresi, kullanıcı adı ve parolayı sorgulayarak, mevcut mailleri ekrana basıyor.
Peki O zaman bunlar birleşirse...
Şimdi biz Net::POP3 modülünü ve yukarıda anlattığımız sonsuz döngü durumunu birleştirelim. Ve bu birleşim sonunda, sürekli olarak bizim girdiğimiz zaman boyunca, maillerimizi kontrol eden, bir komut satırı scripti yazalım:
-
#!/perl
-
-
#Net::POP3 modülünü, scriptimize ekleyelim
-
use Net::POP3;
-
-
#Zaman Tanımla
-
@saa = ('00', '01', '02', '03', '04', '05', '06', '07', '08', '09', 10..23);
-
@dak = ('00', '01', '02', '03', '04', '05', '06', '07', '08', '09', 10..59);
-
@san = ('00', '01', '02', '03', '04', '05', '06', '07', '08', '09', 10..59);
-
-
#Gerekli verileri al...
-
-
$denk = 0;
-
-
while(1) {
-
sleep $z;
-
++$denk;
-
$t = "$za[3]-$za[4]-".($za[5] +=1900)." $saa[$za[2]]:$dak[$za[1]]:$san[$za[0]]";$za[5] -=1900;
-
-
$pop = Net::POP3->new($host, Timeout => 240) or die("POP3 sunucusu ile baglantı kurulamadi! - $t\n");
-
if($pop->user($user)) {
-
}
-
if($sayi = $pop->pass($pass)) {
-
}
-
if($pop->quit()) {
-
STDOUT "Baglanti Kesildi\n";
-
}
-
if($sayi == 0) {
-
}
-
else {
-
}
-
}
İşte bu kadar... Şimdi sürekli olarak maillerimizi kontrol edecek bir perl scripti yaptık. Outlook Exspress ya da Outlook ya da herhangi bir mail gözatıcısının yaptığıda bundan o kadar farklı değil. Tabii ki onlar biraz daha işletim sistemi kaynağı ve olanağı kullanabilirler. Ama sorun değil. Biz gene istediğimiz birşeyi Perl ile yapabildik.
Neydi slogan? Her zaman başka bir yol vardır... Bu sloganımızın üzerine, çalışmak başarmanının yarısıdır adlı özlü sözümüzüde bu aylık ekleyelim...
Gelecek ay yeni bir uygulamada görüşmek üzere...
Yazdır
| 184 Görüntülenme | Kategori: Diğer Diller |
Geri İzleme
Etiketler: pop, Programlama, Perl, pop3Benzer Yazılar
Yorum Yap
XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

1 Kasım 2001 |









Henüz yorum yapılmamış.