BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > PHP > PHP iletişim formu

PHP iletişim formu

PHP'de e-posta göndermek için kullandığımız mail() fonksiyonu ile basit bir iletişim formu oluşturabilir ve farklı ek özellikler ekleyebiliriz.

bool mail() (string $adres, string $konu, string $mesaj, string $ekbaslik, string $ekparametre)

Parametreler

adres : Epostayı gereği için alacak adresleri gösterir.

konu : Gönderilecek epostanın konusunu gösterir.

mesaj : Gönderilecek epostanın içeriğini gösterir. Her satır bir satır sonu CRLF (\r\n) karakteri ile bitmeli ve 70 karakterden uzun olmamalıdır.

ekbaslik (isteğe bağlı) : Gönderilecek epostanın başlığını gösterir. Epostanın gideceği adres dışında kalan adresleri (From, Cc ve Bcc). Çok sayıda başlık ekleneceğinde birer CRLF (\r\n) ile birbirlerinden ayrılmalıdır.

Eposta gönderilirken From (Kimden) başlığı içermesi gerekir. Bu başlık, bu parametre ile tanımlanabileceği gibi öntanımlı olarak php.ini dosyasında da yer alabilir.

ekparametre (isteğe bağlı) : Eposta gönderirken kullanılan programa komut satırı seçenekleri aktarmak için kullanılır. Eposta gönderme programının adı sendmail_path yapılandırma yönergesinde belirtilir.

mail() fonksiyonu, eğer eposta sunucu tarafından başarıyla alınmışsa TRUE, aksi takdirde FALSE değerini geri verir. Ancak, epostanın sunucu tarafından teslim alınması, epostanın alıcıya ulaştığını göstermez.

Aşağıdaki örnek, kısa içerikli bir mesajı belirtilen adrese gönderir. İşlem başarılı ise epostanın gönderildiğini, aksi takdirde bir hata oluştuğunu ekrana yazar.


<?php
  $adres = "alici@deneme.com";
  $konu = "Deneme Mesajı";
  $mesaj = "Mesaj içeriğini göstermektedir!";  
  $baslik = "From:gönderen@deneme.com";
  if (mail($adres, $konu, $mesaj, $baslik)) echo "Eposta gönderildi!";
  else echo "Eposta gönderme hatası!";
?>

İletişim formu için oluşturulan "iletisim.php" dosyası içinde:

1. İlk olarak aşağıdaki komut ile oturum başlatılır ve html sayfası başlangıç bilgileri girilir:


<?php
   session_start();   
?> 

<html>
<head>
<title>Bilgi günlüğüm</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-9">
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>  

2. Epostaların gönderileceği adres bir değişkene atanır ve bir hata mesajı tanımlanır. Form içinde tanımlanan ve POST metodu ile iletisim.php tarafından yine aynı dosyaya gönderilen eposta değişkeninin tanımlı olup olmadığını kontrol eder. Değişkenin tanımsız olması sayfaya ilk defa girildiğini gösterdiğinden, sayfaya önceden girişten kalan SESSION değişken değerleri session_sil() metodu ile unset fonksiyonu kullanılarak hafızadan silinir. formyaz() metodunu 0 parametresi ile kullanarak formu ekrana yazar:


<?php   
   $to = "deneme@deneme.com"; /* Gönderilecek epostaların gideceği adres */
   $hata_mesaj=''; /* Hata mesajlarını içeren değişken */

   // Sayfa ilk açıldığında form gösterilir.
   if (!isset($_REQUEST['eposta'])) {
       session_sil();
       formyaz(0);    
   }


function session_sil() 
{ 
  unset($_SESSION['isim']);
  unset($_SESSION['eposta']);
  unset($_SESSION['konu']);
  unset($_SESSION['mesaj']);
}

function formyaz($mode) { 
   
  echo'<p style="margin-bottom:20px;">* Tüm alanların doldurulması gereklidir!</p>'; 
   
  echo '<form method="post" action="iletisim.php">
            <div class="formleft">		   
                 <div class="formic">
                      <div class="formicleft"><span class="bg-bold">Ad ve Soyad</span></div>
                      <div class="formicright"><input name="isim" type="text" size="30" value="'.$_SESSION['isim'].'"></div>
                      <div class="clearBoth"></div>
                 </div>		   
                 <div class="formic">
                      <div class="formicleft"><span class="bg-bold">E-posta</span></div>
                      <div class="formicright"><input name="eposta" type="text" size="30" value="'.$_SESSION['eposta'].'"></div>
                      <div class="clearBoth"></div>
                 </div>		   
                 <div class="formic">
                      <div class="formicleft"><span class="bg-bold">Konu</span></div>
                      <div class="formicright"><input name="konu" type="text" size="30" value="'.$_SESSION['konu'].'"></div>
                      <div class="clearBoth"></div>
                 </div>		       
            </div>
		   
            <div class="formright">
                 <div class="formic" style="height:60px;">
                      <div class="formicright" style="width:150px;  margin-right:5px;"><img src="captcha.php" id="captchaimg"></div>
                      <div class="formicright" style="width:20px;"><a href="#" onclick="document.getElementById(\'captchaimg\').src = \'captcha.php?\' + Math.random(); return false"><img src="images/yenile.png"></a></div>
                      <div class="clearBoth"></div>
                 </div>			   
                 <div>
                      <div class="formicleft"><span class="bg-bold">Resim kodu</span></div>
                      <div class="formicright"><input name="resimkod" type="text" size="5" maxlength="5"></div>
                      <div class="clearBoth"></div>
                 </div>		   
            </div>
            <div class="clearBoth"></div>
		   
            <div style="margin-bottom:8px;"><span class="bg-bold">Mesaj</span></div>
            <div style="margin-bottom:8px;"><textarea name="mesaj" rows="10" cols="60">'.$_SESSION['mesaj'].'</textarea></div>
            <div style="margin-bottom:8px;"><input type="submit" value="Gönder"></div>	  
     </form>'; 

  // $hata_mesaj global değişkenine bir fonksiyon içinden ulaşıldığından $GLOBALS değişkeni kullanılır.
  if ($mode) echo '<p class="bg-red bg-bold">' . $GLOBALS['hata_mesaj'] . '</p>';
}

3. Verilerin boşluk kontrolü: Eğer sayfaya ilk giriş değilse ve form yoluyla veriler gönderilmiş ise; form verileri değerlendirmeye alınır. Önce form ile gelen değişkenler SESSION değişkenlerine atanır. Form değişkenlerinin hepsine veri girişi yapılıp yapılmadığı empty() metodu ile kontrol edilir. Eğer herhangi bir değişken değeri boş ise; formyaz() metodu 1 parametresi çağrılarak "Lütfen gerekli alanları doldurunuz!" mesajı ile form yeniden ekrana yazılır.

4. Resim kodu kontrolü: captcha.php içindeki $_SESSION['reskod'] kodu ile form üzerinde girilen $_REQUEST['resimkod'] değeri karşılaştırılır. Eğer değerler birbirinden farklı ise; formyaz() metodu 2 parametresi çağrılarak "Resimdeki kod uyumlu değil!" mesajı ile form yeniden ekrana yazılır.

5. Eposta geçerlilik kontrolü: eposta_kontrol() metodu ile girilen eposta adresinin geçerliliği kontrol edilir. Adres geçersiz ise; formyaz() metodu 3 parametresi çağrılarak "Geçersiz eposta adresi!" mesajı ile form yeniden ekrana yazılır.

Eğer kontrollerin tamamı olumlu sonuçlanırsa; eposta gönderilir:


   // Eğer sayfaya önceden girilmiş ise aşağıdaki kodlar devreye girer.
   else {
       // Form üzerinden girilen değerleri SESION değişkenlerine atar.
       $_SESSION['isim'] = $_REQUEST['isim'];
       $_SESSION['eposta'] = $_REQUEST['eposta'];
       $_SESSION['konu'] = $_REQUEST['konu'];
       $_SESSION['mesaj'] = $_REQUEST['mesaj'];
	  
       // Eğer veri alanlarından hepsi dolu ise koşul sağlanır ve işlem devam eder.
       if (!empty($_REQUEST['isim']) && !empty($_REQUEST['eposta']) && !empty($_REQUEST['konu']) && !empty($_REQUEST['mesaj']) && !empty($_REQUEST['resimkod'])) {
           // Kullanıcı tarafından girilen kodun resimdeki kod ile aynı olup olmadığı kontrol edilir.
           // Kodlar uyumsuz ise form yeniden ekrana yazılır ve işlem sona erer. 
           if ($_SESSION['reskod']!=$_REQUEST['resimkod']) {
               $hata_mesaj = 'Resimdeki kod uyumlu değil!';
               formyaz(2);
           }
           // Girilen kod ile resimdeki kod aynı ise işlem devam eder.
           else {
               // Girilen eposta adresinin geçerliliğini kontrol eder. 
               // Adres geçersiz ise form yeniden yazılır ve işlem sona erer.
               if (!eposta_kontrol($_REQUEST['eposta'])) {
                   $hata_mesaj = 'Geçersiz eposta adresi!'; 
                   formyaz(3);
               }
               // Eposta adresi geçerli ise eposta gönderilir.
               else {
                   $isim = $_REQUEST['isim'];
                   $konu = $_REQUEST['konu'];
                   $mesaj = $_REQUEST['mesaj'];
                   $baslik = 'From: '.$isim.' <'.$_REQUEST['eposta'].'>';
                   if (mail($to, $konu, $mesaj, $baslik)) {
                       session_sil();	
                       echo'<p><img src="images/email.jpg" align="middle"><span class="bg-bold">Formunuz başarıyla gönderildi!</span></p>';
                   }
                   else {
                       session_destroy();
                       echo'<p><img src="images/fail.jpg" align="middle"><span class="bg-bold">Form gönderme hatası! Tekrar deneyin!</span></p>';		           
                   }
               }
           }
       }
       // Aksi takdirde "Lütfen gerekli alanları doldurunuz!" yazısı ile form yeniden yazılır.
       else {
          $hata_mesaj = 'Lütfen gerekli alanları doldurunuz!'; 
          formyaz(1);
       }	
   }
   
function eposta_kontrol ($eposta)
{
  $eposta = filter_var($eposta, FILTER_SANITIZE_EMAIL);

  if (filter_var($eposta, FILTER_VALIDATE_EMAIL)) return TRUE;
  else return FALSE;    
}   

İletişim formu için oluşturulan "contact.php" dosyası içinde:

1. İlk olarak oturum başlatılır. imagecreatefrompng() metodu ile .png bir resim kullanılarak bir resim oluşturulur. Rakam ve küçük karakterlerden oluşan bir dizi oluşturulur:


<?php
session_start(); 

// Bir dosyadan yeni bir resim oluşturur.
$im = imagecreatefrompng("images/bgkod.png");

// Kod oluşturmak için rakam ve küçük harflerden oluşan bir dizi oluşturur.
$chars = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 't', 'u', 'v', 'w', 'x', 'y', 'z');

2. Rastgele seçilecek karakterleri atamak için $str değişkenli boş bir dizi oluşturulur. Bir for döngüsü ile mt_rand() metodu kullanılarak rastgele seçilen 5 adet karakter diziye atanır. Karakterler $_SESSION['reskod'] değişkenine atanır:


// İçi boş olan bir kod dizisi oluşturur.
$str = array ();

// Dizi içinden rastgele elemanlar seçerek kod dizisine atar.
for ($id1=0; $id1<5; $id1++) {
     $str[$id1] = $chars[mt_rand(0, count($chars)-1)];
	 $reskod .= $str[$id1];
}

// Kodları SESSION değişkenine atar.
$_SESSION['reskod'] = $reskod;

3. Font türü, boyutu, yazma açısı ve rengi seçilir. Karakterler resim üzerine yazılır. imagepng() metodu ile resim tarayıcıya gönderilir. imagedestroy() metodu ile resim bellekten silinir:


// Font türünü ve boyutunu belirler.
$font = "arial.ttf";
$size = 24;

// Kodun ekran yazılma açısını ve rengini belirler.
$angle = mt_rand(-5, 5);
$color = imagecolorallocate($im, 80, 80, 80);

// Kodu ekrana yazar.
for ($id1=0, $x = mt_rand(5, 10), $y = mt_rand(30, 36); $id1<5; $id1++, $x+=mt_rand(25, 30), $y+=mt_rand(-2, 2)) {
     imagettftext($im, $size, $angle, $x, $y, $color, $font, $str[$id1]);
}	 

header("Content-type: image/png"); 
// Tarayıcıya resim gönderir.
imagepng($im);
// Resmi bellekten siler.
imagedestroy($im);
?>

Program dosyalarının bulunduğu dizinde "arial.ttf" dosyası da yer almalıdır.

Programın çalışan en son halinde yer alan dosyalar aşağıdadır:

iletisim.php


<?php
   session_start();   
?>   

<html>
<head>
<title>Bilgi günlüğüm</title>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-9">
<link rel="stylesheet" href="style.css" type="text/css" />
</head>
<body>

<?php   
   $to = "deneme@deneme.com"; /* Gönderilecek epostaların gideceği adres */
   $hata_mesaj=''; /* Hata mesajlarını içeren değişken */

   // Sayfa ilk açıldığında form gösterilir.
   if (!isset($_REQUEST['eposta'])) {
       session_sil();
       formyaz(0);    
   }   
   
   // Eğer sayfaya önceden girilmiş ise aşağıdaki kodlar devreye girer.
   else {
       // Form üzerinden girilen değerleri SESION değişkenlerine atar.
       $_SESSION['isim'] = $_REQUEST['isim'];
       $_SESSION['eposta'] = $_REQUEST['eposta'];
       $_SESSION['konu'] = $_REQUEST['konu'];
       $_SESSION['mesaj'] = $_REQUEST['mesaj'];
	  
       // Eğer veri alanlarından hepsi dolu ise koşul sağlanır ve işlem devam eder.
       if (!empty($_REQUEST['isim']) && !empty($_REQUEST['eposta']) && !empty($_REQUEST['konu']) && !empty($_REQUEST['mesaj']) && !empty($_REQUEST['resimkod'])) {
           // Kullanıcı tarafından girilen kodun resimdeki kod ile aynı olup olmadığı kontrol edilir.
           // Kodlar uyumsuz ise form yeniden ekrana yazılır ve işlem sona erer. 
           if ($_SESSION['reskod']!=$_REQUEST['resimkod']) {
               $hata_mesaj = 'Resimdeki kod uyumlu değil!';
               formyaz(2);
           }
           // Girilen kod ile resimdeki kod aynı ise işlem devam eder.
           else {
               // Girilen eposta adresinin geçerliliğini kontrol eder. 
               // Adres geçersiz ise form yeniden yazılır ve işlem sona erer.
               if (!eposta_kontrol($_REQUEST['eposta'])) {
                   $hata_mesaj = 'Geçersiz eposta adresi!'; 
                   formyaz(3);
               }
               // Eposta adresi geçerli ise eposta gönderilir.
               else {
                   $isim = $_REQUEST['isim'];
                   $konu = $_REQUEST['konu'];
                   $mesaj = $_REQUEST['mesaj'];
                   $baslik = 'From: '.$isim.' <'.$_REQUEST['eposta'].'>';
                   if (mail($to, $konu, $mesaj, $baslik)) {
                       session_sil();	
                       echo'<p><img src="images/email.jpg" align="middle"><span class="bg-bold">Formunuz başarıyla gönderildi!</span></p>';
                   }
                   else {
                       session_destroy();
                       echo'<p><img src="images/fail.jpg" align="middle"><span class="bg-bold">Form gönderme hatası! Tekrar deneyin!</span></p>';		           
                   }
               }
           }
       }
       // Aksi takdirde "Lütfen gerekli alanları doldurunuz!" yazısı ile form yeniden yazılır.
       else {
          $hata_mesaj = 'Lütfen gerekli alanları doldurunuz!'; 
          formyaz(1);
       }	
   }
  
function formyaz($mode) { 
   
  echo'<p style="margin-bottom:20px;">* Tüm alanların doldurulması gereklidir!</p>'; 
   
  echo '<form method="post" action="iletisim.php">
            <div class="formleft">		   
                 <div class="formic">
                      <div class="formicleft"><span class="bg-bold">Ad ve Soyad</span></div>
                      <div class="formicright"><input name="isim" type="text" size="30" value="'.$_SESSION['isim'].'"></div>
                      <div class="clearBoth"></div>
                 </div>		   
                 <div class="formic">
                      <div class="formicleft"><span class="bg-bold">E-posta</span></div>
                      <div class="formicright"><input name="eposta" type="text" size="30" value="'.$_SESSION['eposta'].'"></div>
                      <div class="clearBoth"></div>
                 </div>		   
                 <div class="formic">
                      <div class="formicleft"><span class="bg-bold">Konu</span></div>
                      <div class="formicright"><input name="konu" type="text" size="30" value="'.$_SESSION['konu'].'"></div>
                      <div class="clearBoth"></div>
                 </div>		       
            </div>
		   
            <div class="formright">
                 <div class="formic" style="height:60px;">
                      <div class="formicright" style="width:150px;  margin-right:5px;"><img src="captcha.php" id="captchaimg"></div>
                      <div class="formicright" style="width:20px;"><a href="#" onclick="document.getElementById(\'captchaimg\').src = \'captcha.php?\' + Math.random(); return false"><img src="images/yenile.png"></a></div>
                      <div class="clearBoth"></div>
                 </div>			   
                 <div>
                      <div class="formicleft"><span class="bg-bold">Resim kodu</span></div>
                      <div class="formicright"><input name="resimkod" type="text" size="5" maxlength="5"></div>
                      <div class="clearBoth"></div>
                 </div>		   
            </div>
            <div class="clearBoth"></div>
		   
            <div style="margin-bottom:8px;"><span class="bg-bold">Mesaj</span></div>
            <div style="margin-bottom:8px;"><textarea name="mesaj" rows="10" cols="60">'.$_SESSION['mesaj'].'</textarea></div>
            <div style="margin-bottom:8px;"><input type="submit" value="Gönder"></div>	  
     </form>'; 

  // $hata_mesaj global değişkenine bir fonksiyon içinden ulaşıldığından $GLOBALS değişkeni kullanılır.
  if ($mode) echo '<p class="bg-red bg-bold">' . $GLOBALS['hata_mesaj'] . '</p>';
}

function session_sil() 
{ 
  unset($_SESSION['isim']);
  unset($_SESSION['eposta']);
  unset($_SESSION['konu']);
  unset($_SESSION['mesaj']);
}

function eposta_kontrol ($eposta)
{
  $eposta = filter_var($eposta, FILTER_SANITIZE_EMAIL);

  if (filter_var($eposta, FILTER_VALIDATE_EMAIL)) return TRUE;
  else return FALSE;    
}
?>

</body>
</html>

captcha.php


<?php
session_start(); 

// Bir dosyadan yeni bir resim oluşturur.
$im = imagecreatefrompng("images/bgkod.png");

// Kod oluşturmak için rakam ve küçük harflerden oluşan bir dizi oluşturur.
$chars = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 't', 'u', 'v', 'w', 'x', 'y', 'z');

// İçi boş olan bir kod dizisi oluşturur.
$str = array ();

// Dizi içinden rastgele elemanlar seçerek kod dizisine atar.
for ($id1=0; $id1<5; $id1++) {
     $str[$id1] = $chars[mt_rand(0, count($chars)-1)];
	 $reskod .= $str[$id1];
}

// Kodları SESSION değişkenine atar.
$_SESSION['reskod'] = $reskod;

// Font türünü ve boyutunu belirler.
$font = "arial.ttf";
$size = 24;

// Kodun ekran yazılma açısını ve rengini belirler.
$angle = mt_rand(-5, 5);
$color = imagecolorallocate($im, 80, 80, 80);

// Kodu ekrana yazar.
for ($id1=0, $x = mt_rand(5, 10), $y = mt_rand(30, 36); $id1<5; $id1++, $x+=mt_rand(25, 30), $y+=mt_rand(-2, 2)) {
     imagettftext($im, $size, $angle, $x, $y, $color, $font, $str[$id1]);
}	 

header("Content-type: image/png"); 
// Tarayıcıya resim gönderir.
imagepng($im);
// Resmi bellekten siler.
imagedestroy($im);
?>

style.css


body {
  font: 11px Tahoma;
}

textarea {
  font: 12px Verdana, Arial; 
}
  
.formleft, .formright, .formicleft, .formicright
{
  float:left; 
}

.formleft
{
  width:310px; 
  padding-top:8px;	
}

.formright
{
  width:185px; 
  border: 1px solid #DBDBDB; 
  padding:8px 0px 5px 5px;
}

.formic
{
  margin-bottom:8px;
}

.formicleft
{
  width:90px;
}

.clearBoth {clear: both}

.bordo {
  font-weight:bold;
  color:#C40062;
}