Değişik Meziyetler ve POP3

Yazan: Faruk Enes | Tarih 1 Kasım 2001 | Yorum  1 Yorum
BerbatKötüOrtaGüzelHarika Henüz puan verilmemiş
Loading ... Loading ...

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:

:
  1. #!/
  2.  
  3. $a = 0;
  4.  
  5. while($a <= 100) {
  6.     print STDOUT "$a\n";
  7.     ++$a;
  8. }

ansugo-001.png

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

:
  1. #!/
  2.  
  3. $dizin = './';
  4. $dosya = 'alarmtest';
  5.  
  6. while(1) {
  7.     sleep 5;
  8.     $t = time();
  9.     open(F,">>$dizin/$dosya");
  10.     print F "$t\n";
  11.     close(F);
  12.     print STDOUT "$t\n";
  13. }

ansugo-002.png

Burada dikkat edeceğimiz bir iki önemli nokta var. Biz burada while(1) dediğimizde bir sonsuz döngü kurmuş oluyoruz. Bunu gören 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:

:
  1. #!/
  2.  
  3. $dizin = "C:/inetpub/wwwroot/pop";
  4. $dosya = "deneme\.txt";
  5.  
  6. while(1) {
  7.     $in = <STDIN>;
  8.     open(FI,">>$dizin/$dosya");
  9.     print FI "$in";
  10.     close(FI);
  11. }

ansugo-003.png

ansugo-004.png

İş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 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:

:
  1. use Net::POP3;
  2.  
  3. $pop = Net::POP3->new($host, Timeout => 240) or die("Serverınız ile bağlantı kurulamıyor");
  4. #$pop adında bir nesne oluşturuyoruz. $host adlı değişken, bağlanacamız, pop3 server.
  5. $pop->user($user);
  6. #Servera user bilgimizi veriyoruz.
  7. $sayi = $pop->pass($pass);
  8. #Servera parolamızı gönderiyoruz. Eğer parolamız doğru ise, bu komut bize, mail sayımızı gönderir.
  9. $liste = $pop->list();
  10. #bu fonksiyon ile, mail listemizi alıyoruz.
  11. $pop->quit();
  12. #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ı:

ansugo-005.png

ansugo-006.png

:
  1. #!/
  2.  
  3. use Net::POP3;
  4.  
  5. $boo = $ENV{'QUERY_STRING'};
  6. @sifu = split "\&amp;",$boo;
  7. foreach $sif (@sifu) {
  8.     ($on,$son) = split "=",$sif;
  9.     $QUE{$on} = $son;
  10. }
  11.  
  12. if($QUE{'bolum'} eq "" or $QUE{'bolum'} eq "index") {
  13.     &amp;index_bas;
  14. }
  15. else {
  16.     &amp;gogogo;
  17. }
  18.  
  19. sub index_bas {
  20.     print "Content-type:text/html\n\n";
  21.  
  22.     print qq~
  23.     <html><head><title>Bilgileri girin</title>
  24.     <link rel="stylesheet" type="text/css" href="./default.css" mce_href="./default.css">
  25.     </head>
  26.     <body>
  27.     <form name="selam" action="popmail.cgi?bolum=liste" method="POST">
  28.     Bağlanılacak pop3 sunucusu:<br>
  29.     <input type="text" name="sunucu" size="20"><br>
  30.     Sunucu kullanici adi:<br>
  31.     <input type="text" name="kullanici" size="20"><br>
  32.     Parolanız:<br>
  33.     <input type="password" name="parola" size="20"><br>
  34.     <input type="submit" value="Yallah" class="button">
  35.     </form>
  36.     </body>
  37.     </html>
  38.     ~;
  39.     exit;
  40. }
  41.  
  42. sub gogogo {
  43.     &amp;oku_parcala();
  44.  
  45.     $host = $CONT{'sunucu'};
  46.     $user = $CONT{'kullanici'};
  47.     $pass = $CONT{'parola'};
  48.  
  49.     print "Content-type:text/html\n\n";
  50.  
  51.     $pop = Net::POP3->new($host, Timeout => 240) or die("Serverınız ile bağlantı kurulamıyor");
  52.     $pop->user($user);
  53.     #pass methodu hesaptaki mail sayısını gönderir.
  54.     $sayi = $pop->pass($pass);
  55.     #$pop->login($user,$pass)
  56.     #Yukarıdaki gene mevcut mail sayısını verir.
  57.     #Eğer mesaj yoksa 0 gönderir. Boolean olarak true verir
  58.  
  59.     #popstat() iki eleman gönderir. Sliinmi mesajlar ve octet olarak inbox büyüklüğü
  60.  
  61.     print qq~
  62.     <html>
  63.     <head>
  64.     <title>$host ile bağlantı kuruldu</title>
  65.     <link rel="stylesheet" type="text/css" href="./default.css" mce_href="./default.css">
  66.     </head>
  67.     <body>
  68.     <div align="center">
  69.     <center>
  70.  
  71.     <table>
  72.     <tr>
  73.     <td colspan="3">Merhaba $user. $host adlı pop3 sunucusuna bağlanıldı</td>
  74.     </tr>
  75.     <tr>
  76.     <td colspan="3">Şu an da okunmamamış <font color="red">$sayi</font> adet mailin mevcut</td>
  77.     </tr>
  78.     <tr>
  79.     <td>Kimden</td>
  80.     <td>Konu</td>
  81.     <td>Tarih</td>
  82.     </tr>
  83.     ~;
  84.  
  85.     $liste = $pop->list();
  86.  
  87.     foreach $mesaj (sort keys %{$liste}) {
  88.         $baslik_bilgisi = $pop->get($mesaj);
  89.         foreach $satir (@{$baslik_bilgisi}) {
  90.             chomp $satir;
  91.             if($satir =~ m#^From: (.*)#) {
  92.                 $satir =~ s/From: //ig;
  93.                 ($name,$email) = split "\<",$satir;
  94.                 $name =~ s/\"//ig;
  95.                 $name =~ s/\"//ig;
  96.                 $name =~ s/ //ig;
  97.                 $email =~ s/\>//ig;
  98.                 @yaz[0] = "<tr>\n<td><a href=\"mailto:$email\">$name</a></td>\n";
  99.             }
  100.             elsif($satir =~ m#^Subject: (.*)#) {
  101.                 $satir =~ s/Subject: //ig;
  102.                 @yaz[1] = "<td>$satir</td>\n";
  103.             }
  104.             elsif($satir =~ m#^Date: (.*)#) {
  105.                 $satir =~ s/Date: //ig;
  106.                 @yaz[2] = "<td>$satir</td>";
  107.             }
  108.         }
  109.         foreach $p (@yaz) {
  110.             print "$p";
  111.         }
  112.         print "</td>\n";
  113.     }
  114.     $pop->quit();
  115.     print qq~</table></center></div></body></html>~;
  116.     exit;
  117. }
  118.  
  119. sub oku_parcala {
  120.     read(STDIN,$buf,$ENV{'CONTENT_LENGTH'});
  121.     @bierhoff = split(/\&amp;/,$buf);
  122.  
  123.     foreach $bire (@bierhoff) {
  124.         ($name, $value) = split(/=/, $bire);
  125.         $value =~ tr/+/ /;
  126.         $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  127.         $value =~ s/\|/|/g;
  128.         $value =~ s/\r//g;
  129.         $value =~ s/\n+//g;
  130.         $CONT{$name} = $value;
  131.     }
  132. }

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:

:
  1. #!/
  2.  
  3. #Net::POP3 modülünü, scriptimize ekleyelim
  4. use Net::POP3;
  5.  
  6. #Zaman Tanımla
  7. @saa = ('00', '01', '02', '03', '04', '05', '06', '07', '08', '09', 10..23);
  8. @dak = ('00', '01', '02', '03', '04', '05', '06', '07', '08', '09', 10..59);
  9. @san = ('00', '01', '02', '03', '04', '05', '06', '07', '08', '09', 10..59);
  10.  
  11. #Gerekli verileri al...
  12. print STDOUT "POP3 sunucusunun adresi:\n";
  13. chop($host = <STDIN>);
  14. print STDOUT "Kullanici Adi:\n";
  15. chop($user = <STDIN>);
  16. print STDOUT "Parolaniz:\n";
  17. chop($pass = <STDIN>);
  18. print STDOUT "Kac saniyede bir kontrol edilsin?\n";
  19. chop($z = <STDIN>);
  20.  
  21. $denk = 0;
  22.  
  23. while(1) {
  24.     sleep $z;
  25.     ++$denk;
  26.     @za = gmtime(time());
  27.     $t = "$za[3]-$za[4]-".($za[5] +=1900)." $saa[$za[2]]:$dak[$za[1]]:$san[$za[0]]";$za[5] -=1900;
  28.  
  29.     print STDOUT "---  $denk  ---\n";
  30.     $pop = Net::POP3->new($host, Timeout => 240) or die("POP3 sunucusu ile baglantı kurulamadi! - $t\n");
  31.     if($pop->user($user)) {
  32.         print STDOUT "Kullanici Adi Dogrulandi\n";
  33.     }
  34.     if($sayi = $pop->pass($pass)) {
  35.         print STDOUT "Parola Dogrulandi\n";
  36.     }
  37.     if($pop->quit()) {
  38.         print
  39.  STDOUT "Baglanti Kesildi\n";
  40.     }
  41.     if($sayi == 0) {
  42.         print STDOUT "Yeni mailiniz yok - $t\n";
  43.     }
  44.     else {
  45.         print STDOUT "Toplam $sayi mailiniz var - $t\n";
  46.     }
  47.     print STDOUT "---  $denk  ---\n\n";
  48. }

ansugo-007.png

İşte bu kadar... Şimdi sürekli olarak maillerimizi kontrol edecek bir 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 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 Yazdır | 184 Görüntülenme | Kategori: Diğer Diller | Trackback  Geri İzleme
Etiketler  Etiketler: , , ,

Benzer Yazılar


Yorum Yap


(gerekli)

(gerekli,yayınlanmaz)




XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>