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: