MultiServis.Net //PHP El Kitabı

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>

PHP ve Email - Bolum 1 Yazar: Serkan Tarih: 01/03/02

Gectigimiz bir kac yil icerisinde email ile iletisim tum dunyanin gozde iletisim araci haline gelmistir.Bu iletisim araci bazi buyuk sirketler icin bile su anda standart ve yaygin olarak is dunyasi icinde kullanilmaktadir..

Durum boyle iken sizinde bir web programcisi olarak programlarinizda bu gozde iletisim aracinin tum olanaklarini kullanmaniz beklenmektedir.Bu yazi icerisinde sizlere PHP'nin email ile ilgili islemlerde nasil kullanilabilecegini anlatacagiz.

PHP icinde Email gonderilmesi

Iste bu konu ile ilgili sizlere cok sevineceginiz bazi haberlerimiz var.PHP icerisinde mail gondermek icin yanlizca bir tek fonksiyonu kullanmaniz yeterli.Bu fonksiyo'nun adi mail ().Evet sadece bu fonksiyon ile tum email islemlerinizi bir adimda agrisiz sizisiz bir sekilde gerceklestirebilirsiniz.

mail () fonksiyonu'nun kullanilmasi

Bu fonksiyon sadece uc argument almaktadir:(Dorduncu argument opsiyoneldir.Genel olarak bir mailin gonderilmesi icin yeterli kriterler asagidaki gibidir.)

- Mail'in gonderilecegi adres (Alicinin adresi)

- Mail'in konusu

- Mail govdesi (Tum email metni ve ekler)

  Not: Burada bahsedilen mail konusu ve mail govdesi argumentleri bos olarak birakilabilir.Normal olarak gunluk hayatimiz kullandigimiz sekilde mail govdesi bosve konusu olmayan maillerde PHP icinden gonderilebilir.

  Dorduncu argument olarak ek mail basliklari da tanimlanabilir.(Mail Headers)...Bu konuya daha sonra deginecegiz.

  mail () fonksiyonun duzgun calismasi icin php.ini dosyasinda bazi ayarlamalari yapmaniz gerekmektedir.Bu ayar PHP ye local mail server sisteminizin ne oldugunu soylemekten ibarettir.Bu noktadan sonra mail fonksiyonu burada yer alan ayari kullanarak programlariniz icinden gondereceginiz email'leri yerel email omurgasina iletecektir.

  php.ini dosyasi icerisinde asagidaki satirlarin benzerlerini goreceksiniz ;

  > [mail function]
  > SMTP = localhost ; for win32 only
  > sendmail_from = me@localhost.com ; for win32 only
  > ;sendmail-path = ;for unix only,may supply arguments as well

  Email'leriniz icin uzakta bir SMTP server kullaniyorsaniz (bunu yanlizca PHP yi Windows uzerinde kulaniyorsaniz yapabilirsiniz) Bu server sizin mailllerinizi almak icin ayarlanmis olmalidir.Gunumuzde cogu mail server bu sekilde gelen mailleri spam mail gonderenlere firsat vermemek icin kabul etmemektedir.(Mail Relaying)

  Burada anlatilmak istenen konu kisaca, kiraladiginiz Internet Servis Saglayici (ISS) hesabiniz,onlarin SMTP serverini da bu tip amaclar icin kullanacaksiniz anlamina gelmemektedir.Bu konudaki en iyi kaynaga kendi ISS'nizin dokumanlarindan ulasabilirsiniz.Sonucta PHP'yi bir Windows makinede calistiriyorsaniz size bu mailleri gondermke icin bir SMTP server hesabi olmasi gerekliligidir.

  Windows NT isletim sistemi uzerinde IIS (Internet Information Services) web server kullaniyorsaniz,zaten ongorulen olarak kurulmus "localhost" mail server isinizi pekela gorecektir.

  Unix isletim sistemleri uzerinde ongorulen olarak kurulan sendmail programi ile PHP fevkalade uyum icinde caliscaktir.Sendmail hemen hemen butun Unix(TM) ve turev sistemleri uzerinde (Bunlara ucretsiz dagitilan Linux ve BSD'de dahildir) berbaer olarak gelir.Kurulum sirasinda siz ozel olarak mudahele etmediysseniz otomatik olarak kurulur.

  Sendmail dunyanin gelmis gecmis en komplike programlarindan birisidir.Kendi icinde bazi makro dilleride icermektedir.Yaptigi is cok basittir:

  "Gonderilcek email'leri,alicilarin uzerinde yer aldigi mail server makinelerine gondermektir."

  Buraya kadar yerel mail programlarini ve SMTP serverlari gordukten sonra mail () fonksyionunun bu tabloda aldigi rolu inceleyelim.Bu fonksiyon aslinda verilen komutlarla hazirlanan emaili yerel email programlari (Sendmail gibi) veya
  uzaktaki SMTP sunuculara gecirmekle yukumludur.Eger basarili bir sekilde gecis saglanmissa fonksiyon basarili true sonucunu dondurur.Bu fonksiyon kesinlikle mailin yerine ulastigini garanti etmez.Onun sorumlulugu verilen emaili sisteme gondermektir.Duzgun calisan bir yerel mail server paketiniz olsa bile bu her zaman maillerinizin gidecegi anlamina gelmemektedir.

  Olusacak hata halinde bu fonksiyon ne yazik ki herhangi bir sonuc dondurmez.(Sanildigi gibi false sonucu bile sisteme geri donmez.Bu fonksyion eger herhangi bir sekilde calismayi durdurursa browsera herhangi bir geri bilgi akimi saglanamayacagi icin script calismasi donar.(Freezing)

  Simdide bir ornek yapalim ve bir kisisye PHP yi kullanarak hazirlayacagimiz kodlarla bir email gonderelim.

  Birazdan yazacagimiz kod icinde 3 degisik degisken hazirlayarak bunlari mail () fonksiyonuna gecirecegiz.

  > <?php
  > //ilk_email.php

  > $email_kime = "oktay@turk-php.com";

  > $email_konusu = "Bir saldiri girisimi yapildi!";

  > $email_govdesi = "Bugun sitemizdeki bir acik kullanilarak saldiri girisimi yapildi.\n";
  > $email_govdesi .= "Acik kapatildi su anda hersey yolunda.\n";
  > $email_govdesi .= "Bir formdan aldigimiz verilerin sayfa devamli refresh edilerek\n";
  > $email_govdesi .= "tekrarlanmasi sonucu ayni verileri sistem bir dakika icinde \n";
  > $email_govdesi .= "tam olarak 60 kez almistir.\n";
  > $email_govdesi .= "Bilgilerinize.\n";

  > if (mail ($email_kime, $email_konusu, $email_govdesi))
  > echo "$email_konusu konulu email basarili bir sekilde $email_kime isimli kullaniciya ulastirildi.";
  > else echo "$email_konusu konulu email gonderilemedi.";
  > ?>

  Bu sekilde programlama yapmak (dorduncu argument olan header'lari isin icine sokmadan) belkide en az bas agritan ve en kolay email gonderme bicimidir.Cogu zaman bundan fazlasina gereksinimde yoktur zaten.(Bu konu gelsimis email gonderilmesi bolumunde en ince ayrintisina kadar incelenecektir.Simdilik basitten karmasiga dogru bir ilerleme ile size bir memail gonderilmesi islemi anlatilmaktadir.)

  Programlarinizda yogun olarak email islemlerini e-ticaret islemlerinde kullanacaksiniz.Bu sekilde musteri ile temas kurmak dunyanin en ucuz iletisim bicimidir.Bir siparisin takibi icin bilgilendirme yolu olarak email kullanilmasi dunya uzerinde yaygin bir uygulamadir.

  Her zaman bir tek kisiye mail gonderilmesi zorunlu degildir.Bir dongu icinde kullanildiginda bir text dosyasi icindeki tum alicilara, mail () fonksiyonu ile mail gondermekte mumkundur.

  Burada bir konuyu yeri gelmisken hatirlatali.Turkiyede olmasa bile dunyanin cesitli ulkelerinde "istenmeyen email" (spam) gonderilmesi yasa ile kanun disi ilan edilmistir.Bu sucun cezasi Amerika Birlesik Devletlerinde kisi basina 600 dolardir.Bir suc icin bu ulkede ne kadar agir ceza verildigini,en son aldigim arabamin degerinin 800 dolar oldugunu soylersem daha iyi dusunebilirsiniz.

  Ben bana gelen her spam mail icin kendi servis saglayicima durumu bildirmekteyim.Bu durumda gerekli yasal islemler yapilmaktadir.

  Turkiye'deki servis saglayicilar icin durum icler acisidir.Gordugum kadariyla bazilari binlerce email iceren CD'leri korkusuca piyasaya surmektedir.Ulke insanlari icin yazik bir durum ve utanc verici tablolar ortaya cikmaktadir.Burada (ABD) email adresi evinizin adresinden farksizdir.Bilgi toplumu olmak diye iste buna denilmektedir...Ulkenin gelecegini dusunen herkese iletilir.

  Herneyse bu kadar aciklama yeter simdi bir ornek yaparak devam edelim.Sonucta bizim gorevimiz programlama yapmak gerisini yapmasi gerekenlere birakalim.

  Siimdi elimizde bir text dosyasi var ve icindeki alicilar listesinde her kisinin email adresi yeni bir satirda yer almaktadir.PHP'nin mail () fonksiyonu her aliciyi "," virgul ile (noktali virgul degil lutfen dikkat) ayirarak tanimlanmasina izin vermketedir.Bu durumda algoritmamizi yazacak olursak :

  <?php
  //birden_fazla_kisiye_email.php

  $email_dosyamiz = "./alicilar_listesi.txt";
  $email_adresleri = file($email_dosyamiz);

  for (i=0; $i < count($email_adresleri); $i++)
  $email_adresleri[$i] = trim($email_adresleri[$i]);

  $alicilar = implode(",", $email_adresleri);

  $email_konusu = "Merhaba!";
  $email_govdesi = "Bugun toplanti 4:30 da. Lutfen zamaninda gel.\n";
  $email_govdesi .= "Serkan Hadi Ceylani \n";

  mail ($alicilar, $email_konusu, $email_govdesi);
  echo "$email_konusu konulu eposta $alicilar adresine basarili bir sekilde gonderildi.";
  ?>

  Yukaridaki ornekte komutlarimizi aciklamak istersek,

  file () komutu ile bir dosyanin icerigini her satira yeni dizi elemani gelecek sekilde ayirmis oluyoruz.(Dosya icerigini bir dizinin elemanlarina yukluyoruz.)

  trim () komutu ile bosluklari (bunlara yeni satirlarda dahil) diziden silip atiyoruz.

  implode komutu ile bu dizinin butun elemanlarini $email_adresleri dizisine,aralarina "," virgul koyarak katiyoruz.

  Dongu,text dosyasi icindeki butun email adresleri bitene kadar devam ediyor.

  Bir Emai'in Anatomisi(Bir Email nedir?,Hangi elemanlardan olusur?,Hangi prensiplere gore gonderilir?)

  Simdi bazi seyleri kesfetmenin zamani geldi.Bu yazi dizisi icerisinde sizlere bu konuda en ince detaya kadar bilgi vermek yoluna gidecegim.Bunun sebebi durumun anlasilmasinda yeterli kaynak olmayisindan dolayi bu belgenin turkce dilinde hazirlanip ulkemize kazandirilmasidir.Bazen bildiginiz seyler hakkinda,bazende size cok yabanci konularda bilgi sahibi olacaksiniz.

  Bir email mesaji duz text dosyasindan baska bir sey degildir.Bu mesajin icinde bazi ,header tabir edilen basliklar ve mesaj govdesi yer almaktadir.(Kaynak:RFC 822 )

  http://rfc.net/rfc822.html

  Ornek bir email mesaji asagidaki gibidir:

  *******************************************************************

  > Return-path: <nobody@artemis.jtlnet.com>
  > Envelope-to: serkan@turk-php.com
  > Delivery-date: Fri, 18 May 2001 16:25:30 -0400
  > Received: from nobody by artemis.jtlnet.com with local (Exim 3.20 #1)
  > id 150qoU-0008VR-00; Fri, 18 May 2001 16:25:30 -0400
  > To: Serkan <serkan@turk-php.com>,Tayfun <tayfun@turk-php.com>
  > Subject: ADMIN BASVURUSU
  > From: turk-php.com <serkan@turk-php.com>
  > X-Sender: <mail.turk-php.com>
  > X-Mailer: Admin 1.0 by serkan@turk-php.com
  > X-Priority: 1
  > Message-Id: <E150qoU-0008VR-00@artemis.jtlnet.com>
  > Sender: Nobody <nobody@artemis.jtlnet.com>
  > Date: Fri, 18 May 2001 16:25:30 -0400

  > Adi:Deneme
  > Soyadi:Deneme yapiliyor
  > Mail Adresi:Test
  > Ulkesi:Test
  > Yabanci Dilleri:Test
  > IP:172.149.117.88
  > http://www.turk-php.com/pages.php?page=Bizekatilin
  > Tarih:18 05 2001 20 30
  > -----------

  > Admin Basvurusu Hazirlayan:Serkan Hadi Ceylani
  > Lutfen bu kisi ile temasa gecerek,sizde olusan fikirleri
  > admin@turk-php.com listesine gonderiniz.

  ********************************************************************

  Simdi de bazi temel kavramlari aciklayalim.Bu email mesajinda yukarida goruldugu gibi basliklar(header) mesaj govdesinden ayri olarak yer almaktadir.Bu bir zorunluluktir ve carriage return/line feed (CR/LF) (Tam Turkcesi satir besleme'dir ) ciftleri ile bu durum saglanmaktadir.Bunula beraber mesajin icinde yeni satirlar olusturmak icin UNIX sistemlerinde \n ,Windows sistemlerinde \r\n cifti kullanilmaktadir.

  Yukaridaki ornekte yer alan "header"(baslik kisimi)da goruldugu uzere bazi alanlar tanimlanmis ve bir bosluk birakilarak karsiliklari yazilmistir.Burada mail programi icin bazi tanimlamalar yapilmistir.

  Bir email'de genel olarak asagidaki alanlarin oldugu gorulur:

  > To : Virgul ile ayrilan alicilar listesi.
  > From : Gonderen kisinin email adresi.
  > Reply-to: Mail icin cevaplarin gidecegi adres.
  > Cc : Karbon kopya.Virgul ile ayrilmis olan email adresleri icin ek alicilar listesi.
  > Subject : Mesajin Konusu.

  Extra "header" (basliklar) mail () fonksiyonuna eklenecek dorduncu argument ile yerel mail sitemine gecirilebilir.Bir ornek vermke istersek From ve Reply-to "header"lari icin kendiniz degerler belirlemek ve bunun mailde header olarak tanimlanmasini istiyorsunuz:

  mail ("birileri@a.com", "Merhaba", "Bu bir email mesajidir.","From: digerleri@b.com\r\nReply-to: digerleri2.bcom");

  Not:Mutlaka satir beslemesi saglanmalidir.burada goruldugu uzere \r\n ile bu saglanmistir.Headerlardan sonra mutlaka bir bosluk birakilmalidir.Ornek: From: bosluk birakildi. Gordugunuz gibi iki nokta ile bosluk kelimesini yazmadan once bir bosluk biraktim.

  Cc ve Bcc headerlarini da ayni sekilde ekleyebilirdik.

  mail ("birileri@a.com", "Merhaba", "Bu bir email mesajidir.","From: digerleri@b.com\r\nReply-to: digerleri2.bcom\r\n Cc: serkan@turk-php.com\r\nBcc: admin@turk-php.com");

  Bu durumda 3 adet mail kopyasi yaratilacaktir.Bunlara goz atmak istersek:

- birileri@a.com isimli mail adresinin sahibi serkan@turk-php.com adresine de bir kopyanin gittigini gorebilecektir.

- serkan@turk-php.com mail adresinin sahibi birileri@a.com isimli kullaniciya orjinal mesajin gittigini gorebilecektir.

- admin@turk-php.com isimli mail adresinin sahibi yukarida sozu gecen her iki kullaniciyada mesajin gittigini gorebilecektir.

  Not:Yukaridaki iki kullanicida (birileri@a.com ve serkan@turk-php.com ) admin@turk-php.com'unda ayni maili aldigini kesinlikle bilmeyecektir.

<<= Önceki Sayfa | PHP Ana Sayfa | Sonraki Sayfa =>>