Skip to content

9. PHP'in ağ işlevleri

Şimdi, PHP'in ağ işlevlerini ele alacağız; bu işlevler, TCP / IP (Transfer Control Protocol / Internet Protocol) programlamasını yapmamızı sağlar.

9.1. İnternetteki bir makinenin adını veya adresini (IP) elde etme (inet_01)


<?php

// Makine adı <--> IP makine adresi işlevini yerine getirir
ini_set("display_errors", "off");
// sabitler
$HOTES = array("istia.univ-angers.fr", "www.univ-angers.fr", "www.ibm.com", "localhost", "", "xx");
// $HOTES makinelerinin IP adresleri
for ($i = 0; $i < count($HOTES); $i++) {
  getIPandName($HOTES[$i]);
}
// son
exit;

//------------------------------------------------
function getIPandName($nomMachine) {
//$nomMachine : adresini öğrenmek istediğimiz makinenin adı IP
// nomMachine-->IP adresi
  $ip = gethostbyname($nomMachine);
  if ($ip != $nomMachine) {
    print "ip[$nomMachine]=$ip\n";
// adres IP --> nomMachine
    $name = gethostbyaddr($ip);
    if ($name != $ip) {
      print "name[$ip]=$name\n";
    } else {
      print "Erreur, machine[$ip] non trouvée\n";
    }
  } else {
    print "Erreur, machine[$nomMachine] non trouvée\n";
  }
}

Sonuçlar:

ip[istia.univ-angers.fr]=193.49.146.171
name[193.49.146.171]=istia.istia.univ-angers.fr
ip[www.univ-angers.fr]=193.49.144.40
name[193.49.144.40]=ametys-fo.univ-angers.fr
ip[www.ibm.com]=129.42.56.216
Erreur, machine[129.42.56.216] non trouvée
ip[localhost]=127.0.0.1
name[127.0.0.1]=localhost127.0.0.1
ip[]=192.168.1.11
name[192.168.1.11]=st-PC.home
Erreur, machine[xx] non trouvée

Yorumlar

  • 4. satır: Yürütme hatlarının görüntülenmemesi istenir.

PHP ağ işlevleri, 15. satırdaki getIpandName işlevinde kullanılmaktadır.

  • 18. satır: gethostbyname($nom) işlevi, $nom adlı makinenin "ip3.ip2.ip1.ip0" adresini elde etmeyi sağlar. $nom adlı makine mevcut değilse, işlev $nom sonucunu döndürür.
  • 22. satır: gethostbyaddr($ip) işlevi, $ip adresine sahip makinenin adını "ip3.ip2.ip1.ip0" biçiminde döndürür. $ip adlı makine mevcut değilse, işlev $ip sonucunu verir.

9.2. Bir web istemcisi ( inet_02)

Bir web sitesinin ana sayfasının içeriğini almayı sağlayan bir komut dosyası.


<?php

// hata yönetimi
ini_set("display_errors","off");
// URL'ten HTML metnini alma
// web siteleri listesi
$SITES = array("istia.univ-angers.fr", "www.univ-angers.fr", "www.ibm.com", "xx");
// $SITES tablosundaki sitelerin ana sayfalarını okuma
for ($i = 0; $i < count($SITES); $i++) {
// $SITES sitesinin ana sayfasını okuma [$i]
  $résultat = getIndex($SITES[$i]);
// sonuçların görüntülenmesi
  print "$résultat\n";
}//for
// son
exit;

//-----------------------------------------------------------------------
function getIndex($site) {
// URL $site/ dosyasını okur ve $site.html dosyasına kaydeder
// $site.html dosyasının oluşturulması
  $html = fopen("$site.html", "w");
  if (!$html)
    return "Erreur lors de la création du fichier $site.html";

// $site'in 80 numaralı bağlantı noktasında bir bağlantı açıyor
  $connexion = fsockopen($site, 80);
// hata durumunda geri dönüş
  if (!$connexion)
    return "Echec de la connexion au site ($site,80) : $erreur";
// $connexion, iki yönlü bir iletişim akışını temsil eder
// istemci (bu program) ile bağlanılan web sunucusu arasında
// bu kanal, komut ve bilgi alışverişi için kullanılır
// iletişim protokolü HTTP'tir
// istemci, URL / dosyasını istemek için get komutunu gönderir
// "get" komutunun sözdizimi: URL HTTP/1.0
// HTTP protokolünün başlıkları (headers) boş bir satırla bitmelidir
  fputs($connexion, "GET / HTTP/1.0\n\n");
// sunucu şimdi $connexion kanalında yanıt verecektir. Bu verilerin tamamını
// bu verileri gönderecek ve ardından kanalı kapatacaktır. Dolayısıyla istemci, $connexion
// kanal kapanana kadar gelen tüm verileri okur
  while ($ligne = fgets($connexion, 1000))
    fputs($html, $ligne);
// kullanıcı da bağlantıyı kapatır
  fclose($connexion);
// $html dosyasının kapatılması
  fclose($html);
// geri dönüş
  return "Transfert réussi de la page index du site $site";
}

Sonuçlar: örneğin, [www.ibm.com] sitesi için alınan dosya:

HTTP/1.1 302 Found
Date: Wed, 08 Jun 2011 15:43:56 GMT
Server: IBM_HTTP_Server
Content-Type: text/html
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Pragma: no-cache
Cache-Control: no-cache, must-revalidate
Location: http://www.ibm.com/us/en/
Content-Length: 209
Kp-eeAlive: timeout=10, max=14
Connection: Keep-Alive

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="http://www.ibm.com/us/en/">here</a>.</p>
</body></html>
  • 1-11. satırlar, sunucunun yanıtındaki HTTP başlıklarıdır
  • 1. satır: sunucu, istemciden 8. satırda belirtilen URL adresine yönlendirilmesini ister
  • 2. satır: yanıtın tarihi ve saati
  • 3. satır: web sunucusunun kimliği
  • 4. satır: Sunucu tarafından gönderilen içerik. Burada, 13. satırdan başlayan bir HTML sayfası bulunmaktadır
  • 12. satır: HTTP başlıklarını sonlandıran boş satır
  • satır 13-19: web sunucusu tarafından gönderilen HTML sayfası.

Kod açıklamaları:

  • 7. satır: Ana sayfasını almak istediğimiz web sitelerinin URL listesi. Bu liste, [nomsite.html] adlı metin dosyasında saklanacaktır.
  • 11. satır: getIndex işlevi işi yapar
  • 19. satır: getIndex($site) işlevi, $site web sitesinin kök sayfasını (veya ana sayfasını) indirir ve $site.html adlı metin dosyasına kaydeder.
  • 27. satır: fsockopen($site,$port) işlevi, TCP hizmetiyle bir bağlantı kurulmasını sağlar / IP hizmetiyle bağlantı kurmaya olanak tanır. İstemci/sunucu bağlantısı kurulduktan sonra, birçok TCP / IP hizmeti metin satırları alışverişinde bulunur. Burada söz konusu olan, HTTP protokolüdür (HyperText Aktarım Protokolü). Sunucudan istemciye gelen veri akışı, bir metin dosyası olarak işlenebilir. Aynı durum, istemciden sunucuya giden veri akışı için de geçerlidir.
  • 38. satır: fputs işlevi, istemcinin sunucuya veri göndermesini sağlar. Burada gönderilen metin satırının anlamı şöyledir: "Bağlı olduğum web sitesinin kök sayfasını (/) istiyorum (GET). HTTP protokolünün 1.0 sürümüyle çalışıyorum". Bu protokolün güncel sürümü 1.1'dir.
  • 42. satır: Sunucunun yanıtındaki metin satırları, bir döngü kullanılarak satır satır okunabilir ve while metin dosyasına kaydedilebilir. Web sunucusu istenen sayfayı gönderdiğinde, istemciyle olan bağlantısını kapatır. İstemci tarafında bu durum, dosya sonu olarak algılanacaktır.

9.3. Bir SMTP istemcisi (inet_03)

TCP / IP protokolleri arasında, SMTP (SendMail Aktarım Protokolü) mesaj gönderme hizmetinin iletişim protokolüdür.

Notlar:

  • Antivirüs programı yüklü bir Windows bilgisayarında, antivirüs programı muhtemelen PHP komut dosyasının bir SMTP sunucusunun 25 numaralı bağlantı noktasına bağlanmasını engelleyecektir. Bu durumda antivirüs programını devre dışı bırakmak gerekir. Örneğin McAfee için şu şekilde işlem yapılabilir:
  • [1]'te, VirusScan konsolunu etkinleştirin
  • [2]'te, [Protection lors de l'accès] hizmetini durdurun
  • [3]'te, hizmet durdurulur

Komut dosyası:


<?php

// mesaj göndermeye olanak tanıyan SMTP istemcisi (SendMail Aktarım Protokolü)
// bilgiler, aşağıdaki satırları içeren bir dosyadan alınır: $INFOS
// 1. satır: smtp, gönderen, alıcı
// sonraki satırlar: mesaj metni
// gönderen: gönderenin e-posta adresi
// alıcı: alıcının e-posta adresi
// smtp: kullanılacak smtp sunucusunun adı
// iletişim protokolü SMTP istemci-sunucu
// -> istemci, SMTP sunucusunun 25 numaralı bağlantı noktasına bağlanır
// <- sunucu, istemciye bir hoş geldin mesajı gönderir
// -> istemci EHLO komutunu gönderir: makinesinin adı
// <- sunucu OK yanıtını gönderir veya göndermez
// -> istemci "mail from: <gönderen>" komutunu gönderir
// <- sunucu OK yanıtını verir veya vermez
// -> istemci, <alıcı> adresine rcpt komutunu gönderir
// <- sunucu OK yanıtını gönderir veya göndermez
// -> istemci data komutunu gönderir
// <- sunucu OK yanıtını verir veya vermez
// -> istemci, mesajının tüm satırlarını gönderir ve sonunda
// tek karakterini içeren bir satırla bitirir.
// <- sunucu OK yanıtını verir veya vermez
// -> istemci quit komutunu gönderir
// <- sunucu OK yanıtını verir veya vermez
// sunucunun yanıtları xxx metin biçimindedir; burada xxx, 3 basamaklı bir sayıdır. Herhangi bir xxx sayısı >=500
// bir hatayı bildirir. Yanıt, son satır hariç hepsi xxx ile başlayan birden fazla satır içerebilir
// şu biçimdedir: xxx(boşluk)
// değiş tokuş edilen metin satırları, RC(#13) ve LF(#10) karakterleriyle bitmelidir

// veriler
$INFOS = "mail.txt"; // e-posta gönderim parametreleri
// e-posta ayarları alınır
list($erreur, $smtpServer, $expéditeur, $destinataire, $message) = getInfos($INFOS);
// hata mı?
if ($erreur) {
  print "$erreur\n";
  exit;
}
print "Envoi du message [$smtpServer,$expéditeur,$destinataire]\n";
// ayrıntılı modda e-posta gönderimi
$résultat = sendmail($smtpServer, $expéditeur, $destinataire, $message, 1);
print "Résultat de l'envoi : $résultat\n";
// son
exit;

//-----------------------------------------------------------------------
function getInfos($fichier) {
// bilgileri döndürür ($smtp,$expéditeur,$destinataire,$message) metin dosyasından alınır $fichier
// 1. satır: smtp, gönderen, alıcı
// sonraki satırlar: mesaj metni

// $fichier dosyasının açılması
  $infos = fopen($fichier, "r");
// $fichier dosyası mevcut mu
  if (!$infos)
    return array("Le fichier $fichier n'a pu être ouvert en lecture");
// 1. satırın okunması
  $ligne = fgets($infos, 1000);
// satır sonu işaretinin silinmesi
  $ligne = cutNewLineChar($ligne);
// smtp, gönderen, alıcı alanlarının alınması
  $champs = explode(",", $ligne);
// alan sayısı doğru mu?
  if (count($champs) != 3)
    return "La ligne 1 du fichier $fichier (serveur smtp, expéditeur, destinataire) a un
nombre de champs incorrect";
// Alınan bilgilerin "işlenmesi"
  for ($i = 0; $i < count($champs); $i++)
    $champs[$i] = trim($champs[$i]);
// alanların alınması
  list($smtpServer, $expéditeur, $destinataire) = $champs;
// mesajın okunması
  $message = "";
  while ($ligne = fgets($infos, 1000))
    $message.=$ligne;
  fclose($infos);
// geri dönüş
  return array("", $smtpServer, $expéditeur, $destinataire, $message);
}

//-----------------------------------------------------------------------

function sendmail($smtpServer, $expéditeur, $destinataire, $message, $verbose) {
// $message'i, $expéditeur adına $smtpserver SMTP sunucusuna gönderir
// $destinataire için. $verbose=1 ise, istemci-sunucu iletişimini izler
// istemcinin adı alınır
  $client = gethostbyaddr(gethostbyname(""));
// $smtpServer'in 25 numaralı bağlantı noktasında bir bağlantı açılır
  $connexion = fsockopen($smtpServer, 25);
// hata durumunda geri dönüş
  if (!$connexion)
    return "Echec de la connexion au site ($smtpServer,25)";
// $connexion, iki yönlü bir iletişim akışını temsil eder
// istemci (bu program) ile bağlanılan SMTP sunucusu arasında
// bu kanal, komut ve bilgi alışverişi için kullanılır

// bağlantı kurulduktan sonra sunucu bir karşılama mesajı gönderir ve bu mesaj okunur
  $erreur = sendCommand($connexion, "", $verbose, 1);
  if ($erreur) {
    fclose($connexion);
    return $erreur;
  }

// ehlo komutu:
  $erreur = sendCommand($connexion, "EHLO $client", $verbose, 1);
  if ($erreur) {
    fclose($connexion);
    return $erreur;
  }

// "mail from" komutu:
  $erreur = sendCommand($connexion, "MAIL FROM: <$expéditeur>", $verbose, 1);
  if ($erreur) {
    fclose($connexion);
    return $erreur;
  }

// rcpt to komutu:
  $erreur = sendCommand($connexion, "RCPT TO: <$destinataire>", $verbose, 1);
  if ($erreur) {
    fclose($connexion);
    return $erreur;
  }

// data komutu
  $erreur = sendCommand($connexion, "DATA", $verbose, 1);
  if ($erreur) {
    fclose($connexion);
    return $erreur;
  }

// gönderilecek mesajın hazırlanması
  // şu satırları içermelidir
  // From: gönderen
  // Kime: alıcı
  // boş satır
  // Mesaj
  // .
  $data = "From: $expéditeur\r\nTo: $destinataire\r\n$message\r\n.\r\n";
  $erreur = sendCommand($connexion, $data, $verbose, 0);
  if ($erreur) {
    fclose($connexion);
    return $erreur;
  }

// çıkış komutu
  $erreur = sendCommand($connexion, "QUIT", $verbose, 1);
  if ($erreur) {
    fclose($connexion);
    return $erreur;
  }

// son
  fclose($connexion);
  return "Message envoyé";
}

// --------------------------------------------------------------------------

function sendCommand($connexion, $commande, $verbose, $withRCLF) {
// $commande'i $connexion kanalına gönderir
// $verbose=1 ise ayrıntılı mod
// $withRCLF=1 ise, RCLF dizisini takasa ekler

// veriler
  if ($withRCLF)
    $RCLF = "\r\n"; else
    $RCLF="";

// $commande boş değilse komut gönder
  if ($commande) {
    fputs($connexion, "$commande$RCLF");

// olası yankı
    if ($verbose)
      affiche($commande, 1);
  }//eğer

// yanıt okuma
  $réponse = fgets($connexion, 1000);

// olası yankı
  if ($verbose)
    affiche($réponse, 2);

// hata kodunun alınması
  $codeErreur = substr($réponse, 0, 3);

// yanıtın son satırı mı?
  while (substr($réponse, 3, 1) == "-") {

     // yanıt okuma
    $réponse = fgets($connexion, 1000);

     // olası yankı
    if ($verbose)
      affiche($réponse, 2);
  }//while
// yanıt tamamlandı

// sunucu tarafından gönderilen hata mı?
  if ($codeErreur >= 500)
    return substr($réponse, 4);

// hatasız dönüş
  return "";
}

// --------------------------------------------------------------------------

function affiche($échange, $sens) {
// ekrana $échange yazdır
// eğer $sens=1 ise -->$echange'i görüntüler
// eğer $sens=2 ise, son iki karakteri (RCLF) hariç <-- $échange'i görüntüler
  switch ($sens) {
    case 1:
      print "--> [$échange]\n";
      return;
    case 2:
      $L = strlen($échange);
      print "<-- [" . substr($échange, 0, $L - 2) . "]\n";
      return;
  }//anahtarı
}

// --------------------------------------------------------------------------

function cutNewLinechar($ligne) {
// varsa, $ligne'teki satır sonu işaretini siler
  ...
}

infos.txt dosyası:

1
2
3
4
5
6
7
smtp.orange.fr, serge.tahe@univ-angers.fr , serge.tahe@istia.univ-angers.fr
Subject: test

ligne1
ligne2

ligne3
  • 1. satır: [smtp.orange.fr] e-postayı göndermek için kullanılan sunucu, [serge.tahe@univ-angers.fr] gönderenin adresi, [serge.tahe@istia.univ-angers.fr] alıcının adresi
  • 2. satır: Mesaj başlıkları. Burada sadece bir tane var, o da mesajın konusu.
  • 3. satır: Boş satır, mesaj başlıklarını sonlandırır
  • 4-7. satırlar: mesaj metni

Ekran çıktısı:

Envoi du message [smtp.orange.fr,serge.tahe@univ-angers.fr,serge.tahe@univ-angers.fr]
<-- [220 mwinf5d05 ME ESMTP server ready]
--> [EHLO st-PC.home]
<-- [250-mwinf5d05 hello [2.1.22.82], pleased to meet you]
<-- [250-HELP]
<-- [250-AUTH LOGIN PLAIN]
<-- [250-SIZE 44000000]
<-- [250-ENHANCEDSTATUSCODES]
<-- [250-8BITMIME]
<-- [250 OK]
--> [MAIL FROM: <serge.tahe@univ-angers.fr>]
<-- [250 2.1.0 <serge.tahe@univ-angers.fr> sender ok]
--> [RCPT TO: <serge.tahe@univ-angers.fr>]
<-- [250 2.1.5 <serge.tahe@univ-angers.fr> recipient ok]
--> [DATA]
<-- [354 enter mail, end with "." on a line by itself]
--> [From: serge.tahe@univ-angers.fr
To: serge.tahe@univ-angers.fr
Subject: test

ligne1
ligne2
ligne3
.
]
<-- [250 2.0.0 Ag3i1h0051mFoG203g3ip1 mail accepted for delivery]
--> [QUIT]
<-- [221 2.0.0 mwinf5d05 ME closing connection]
Résultat de l'envoi : Message envoyé
  • 1. satır: komut dosyasının yürütülmesini izleyen mesaj
  • 2. satır: SMTP sunucusundan gelen ilk yanıt. Bu yanıt, istemcinin SMTP sunucusunun 25 numaralı bağlantı noktasına bağlanmasının ardından gelir. Sunucudan gelen yanıtlar, [xxx message] veya [xxx-message] biçiminde satırlardır. İlk sözdizimi, yanıtın sona erdiğini gösterir. xxx bir sonuç kodudur. 500'e eşit veya daha büyük bir değer, bir hata olduğunu belirtir. İkinci sözdizimi, yanıtın sona ermediğini ve başka bir satırın geleceğini gösterir.
  • 2. satır: SMTP sunucusu, komut almaya hazır olduğunu belirtir
  • 3. satır: İstemci, [EHLO nomDeMachine] komutunu gönderir; burada nomDeMachine, istemcinin çalıştığı makinenin internet adıdır
  • 4-10. satırlar: SMTP sunucusunun yanıtı
  • 11. satır: İstemci, gönderenin e-posta adresini belirten [MAIL FROM: <expéditeur>] komutunu gönderir.
  • 12. satır: SMTP sunucusu bu adresi kabul ettiğini belirtir. Sözdizimi yanlış olsaydı adresi reddedebilirdi. Bununla birlikte, e-posta adresinin gerçekten var olup olmadığını kontrol etmez.
  • 13. satır: İstemci, mesajın alıcısının e-posta adresini belirten [RCPT TO: <destinataire>] komutunu gönderir.
  • 14. satır: SMTP sunucusu bu adresi kabul ettiğini bildirir. Burada da yine sözdizimi denetimi yapılır.
  • 15. satır: İstemci, kullanıcıya takip eden satırların mesajın içeriği olduğunu belirten [DATA] komutunu gönderir.
  • 16. satır: Sunucu, mesajın gönderilebileceğini bildirir. Mesaj, bir tek karakterden (nokta) oluşan bir satırla sona ermesi gereken bir dizi metin satırından oluşur.
  • 17-25. satırlar: istemci tarafından gönderilen mesaj
  • 17-19. satırlar: [From:, To:, Subject:] mesajının başlıkları, sırasıyla mesajın gönderenini, alıcısını ve konusunu belirtir.
  • 20. satır: Başlıkların sonunu belirten boş satır
  • 21-23. satırlar: Mesajın gövdesi
  • 24. satır: Mesajın sonunu belirten, tek bir noktadan oluşan satır.
  • 26. satır: SMTP sunucusu, mesajı kabul ettiğini bildirir
  • 27. satır: istemci, işlemi tamamladığını belirtmek için [QUIT] komutunu gönderir
  • 28. satır: SMTP sunucusu, istemciyle arasındaki bağlantıyı kapatacağını bildirir

Kod Yorumları

Komut dosyası kodunu ayrıntılı olarak ele almayacağız çünkü bolca açıklama eklenmiştir.

  • 48-80. satırlar: Gönderilecek mesajı ve bu gönderim için gerekli bilgileri içeren [infos.txt] dosyasını işleyen işlev. Bu fonksiyon, aşağıdakileri içeren bir dizi ($erreur, $smtpServer, $expéditeur, $destinataire, $messge) döndürür:
    • $erreur: Olası bir hata mesajı; aksi takdirde boştur.
    • $smtpServer: Bağlanılması gereken SMTP sunucusunun adı
    • $expéditeur: gönderenin e-posta adresi
    • $destinataire: Alıcının e-posta adresi
    • $message: Gönderilecek mesaj. Mesaj gövdesinin yanı sıra başlıklar da olabilir.
  • 84-157. satırlar: sendMail işlevi mesajı gönderir. Parametreleri şunlardır:
    • $smtpServer: Bağlanılması gereken SMTP sunucusunun adı
    • $expéditeur: gönderenin e-posta adresi
    • $destinataire: alıcının e-posta adresi
    • $message: gönderilecek mesaj.
    • $verbose: 1 olarak ayarlandığında, SMTP sunucusuyla yapılan iletişimlerin konsolda görüntülenmesi gerekir.

sendMail işlevi bir hata mesajı döndürür; hata yoksa mesaj boş olur.

  • 88. satır: Windows ile çalışan bir bilgisayarın Windows adını almayı sağlar (OS).
  • 99. satır: İstemci/sunucu diyaloğunun şu şekilde ilerlediğini görmüştük:
    • istemcinin tek satırlık bir komut göndermesi
    • sunucunun bir veya birkaç satırlık yanıtı
  • 161-208. satırlar: sendCommand işlevi aşağıdaki parametreleri kabul eder:
    • $connexion: İstemciyi sunucuya bağlayan TCP / IP kanalı
    • $commande: Bu kanal üzerinden gönderilecek komut. Sunucunun bu komuta verdiği yanıt okunacaktır.
    • $verbose: 1 olarak ayarlandığında, SMTP sunucusuyla yapılan iletişimlerin konsolda görüntülenmesi gerektiğini belirtir.
    • $withRCLF: 1 olarak ayarlandığında, komutun sonuna "\r\n" satır sonu işaretinin eklenmesi gerektiğini belirtir
  • 173. satır: komutun istemci tarafından gönderilmesi
  • 181. satır: SMTP sunucusunun xxx metin veya xxx-metin biçimindeki yanıtının ilk satırının okunması. İkinci durum, sunucunun gönderecek başka bir satırı olduğunu gösterir. xxx, sunucu tarafından gönderilen hata kodudur.
  • 188. satır – yanıtın hata kodunun alınması
  • satır 191-199: yanıtın diğer satırlarının okunması
  • 203-204. satırlar: Hata kodu >=500 ise, bu durum SMTP sunucusunun bir hata bildirdiğini gösterir.

9.4. İkinci bir e-posta gönderme programı (inet_04)

Bu komut dosyası, bir önceki ile aynı işlevi görür: e-posta göndermek. Bunun için PEAR kütüphanesindeki modülleri kullanıyoruz. Bu kütüphane, farklı alanları kapsayan onlarca modül içerir. Aşağıdakileri kullanacağız:

  • Net/SMTP: bir SMTP sunucusuyla iletişim kurmaya olanak tanıyan bir modül
  • Mail: Farklı protokollere göre e-posta gönderimini yönetmeye olanak tanıyan bir modül.
  • Mail/Mime: ekli belgeler içerebilen bir mesaj oluşturmaya olanak tanıyan bir modül.

Bu modülleri kullanabilmek için, öncelikle PHP betiğini çalıştıran makineye yüklenmeleri gerekir. WampServer yazılım paketinin kurulumu, PHP yorumlayıcısını da kurmuştur. Bu yorumlayıcının dizin yapısı içinde, PEAR modüllerini kurmak mümkündür.

  • [1]'e, PHP yorumlayıcısının kurulum klasörüne
  • [2]'e, kurulacak olan PEAR modüllerini içerecek olan PEAR klasörüne
  • [3]'e, PEAR kütüphanesini başlatan [go-pear.bat] komut dosyası

PEAR kütüphanesini başlatmak için, bir DOS penceresi açılır ve [go-pear.bat] dosyası çalıştırılır. Bu komut dosyası, PEAR kütüphanesinin web sitesine bağlanacaktır. Bu nedenle internet bağlantısı gereklidir.

C:\serveursSGBD\wamp21\bin\PHP\php5.3.5>go-pear.bat

PEAR kütüphanesinin web sitesine bağlandıktan sonra, komut dosyası belirli sayıda öğeyi indirecektir. Bunların arasında yeni bir komut dosyası olan [pear.bat] da bulunmaktadır. İhtiyacımız olan çeşitli modülleri PEAR bu komut dosyası ile kuracağız. Bu komut dosyası, argümanlarla çağrılır. Bunlardan [help] argümanı, komut dosyasının kabul ettiği komutların listesini almamızı sağlar:

C:\serveursSGBD\wamp21\bin\PHP\php5.3.5>pear help
Commands:
build                  Build an Extension From C Source
bundle                 Unpacks a Pecl Package
channel-add            Add a Channel
channel-alias          Specify an alias to a channel name
channel-delete         Remove a Channel From the List
channel-discover       Initialize a Channel from its server
channel-info           Retrieve Information on a Channel
channel-login          Connects and authenticates to remote channel server
channel-logout         Logs out from the remote channel server
channel-update         Update an Existing Channel
clear-cache            Clear Web Services Cache
config-create          Create a Default configuration file
config-get             Show One Setting
config-help            Show Information About Setting
config-set             Change Setting
config-show            Show All Settings
convert                Convert a package.xml 1.0 to package.xml 2.0 format
cvsdiff                Run a "cvs diff" for all files in a package
cvstag                 Set CVS Release Tag
download               Download Package
download-all           Downloads each available package from the default channel

info                   Display information about a package
install                Install Package
list                   List Installed Packages In The Default Channel
list-all               List All Packages
list-channels          List Available Channels
list-files             List Files In Installed Package
list-upgrades          List Available Upgrades
login                  Connects and authenticates to remote server [Deprecated i
n favor of channel-login]
logout                 Logs out from the remote server [Deprecated in favor of c
hannel-logout]
makerpm                Builds an RPM spec file from a PEAR package
package                Build Package
package-dependencies   Show package dependencies
package-validate       Validate Package Consistency
pickle                 Build PECL Package
remote-info            Information About Remote Packages
remote-list            List Remote Packages
run-scripts            Run Post-Install Scripts bundled with a package
run-tests              Run Regression Tests
search                 Search remote package database
shell-test             Shell Script Test
sign                   Sign a package distribution file
svntag                 Set SVN Release Tag
uninstall              Un-install Package
update-channels        Update the Channel List
upgrade                Upgrade Package
upgrade-all            Upgrade All Packages [Deprecated in favor of calling upgr
ade with no parameters]
Usage: pear [options] command [command-options] <parameters>
Type "pear help options" to list all options.
Type "pear help shortcuts" to list all command shortcuts.
Type "pear help <command>" to get the help for the specified command.

[install] komutu, PEAR modüllerinin yüklenmesini sağlar. [install] komutu hakkında yardım istenebilir:

C:\serveursSGBD\wamp21\bin\PHP\php5.3.5>pear help install
pear install [options] [channel/]<package> ...
Installs one or more PEAR packages.  You can specify a package to install in four ways:

"Package-1.0.tgz" : installs from a local file

"http://example.com/Package-1.0.tgz" : installs from anywhere on the net.

"package.xml" : installs the package described in package.xml.  Useful for testing, or for wrapping a PEAR package in another package manager such as RPM.

"Package[-version/state][.tar]" : queries your default channel's server(pear.php.net) and downloads the newest package with the preferred quality/state (stable).

To retrieve Package version 1.1, use "Package-1.1," to retrieve Package state beta, use "Package-beta."  To retrieve an uncompressed file, append .tar (make sure there is no file by the same name first)

To download a package from another channel, prefix with the channel name like "channel/Package"

More than one package may be specified at once.  It is ok to mix these four ways of specifying packages.

Options:
  -f, --force
        will overwrite newer installed packages
  -l, --loose
        do not check for recommended dependency version
  -n, --nodeps
        ignore dependencies, install anyway
  -r, --register-only
        do not install files, only register the package as installed
  -s, --soft
        soft install, fail silently, or upgrade if already installed
  -B, --nobuild
        don't build C extensions
  -Z, --nocompress
        request uncompressed files when downloading
  -R DIR, --installroot=DIR
        root directory used when installing files (ala PHP's INSTALL_ROOT), use packagingroot for RPM
  -P DIR, --packagingroot=DIR
        root directory used when packaging files, like RPM packaging
  --ignore-errors
        force install even if there were errors
  -a, --alldeps
        install all required and optional dependencies
  -o, --onlyreqdeps
        install all required dependencies
  -O, --offline
        do not attempt to download any urls or contact channels
  -p, --pretend
        Only list the packages that would be downloaded

Yüklenecek PEAR modülleri şunlardır: [Mail], [Mail_Mime], [Net_SMTP]. Dos penceresinde sırasıyla aşağıdaki komutları gireceğiz:

<PHP_installDir>pear install Mail
...
<PHP_installDir>pear install Mail_Mime
<PHP_installDir>pear install Net_SMTP

burada <PHP_installDir>, PHP yorumlayıcısının kurulum klasörüdür (bu örnekte C:\serveursSGBD\wamp21\bin\PHP\php5.3.5)

Yüklü modülleri görebilirsiniz:

C:\serveursSGBD\wamp21\bin\PHP\php5.3.5>pear list
INSTALLED PACKAGES, CHANNEL PEAR.php.NET:
=========================================
PACKAGE          VERSION STATE
Archive_Tar      1.3.7   stable
Console_Getopt   1.3.1   stable
Mail             1.2.0   stable
Mail_Mime        1.8.1   stable
Net_SMTP         1.6.0   stable
Net_Socket       1.0.10  stable
PEAR             1.9.4   stable
PHPUnit          1.3.2   stable
Structures_Graph 1.0.4   stable
XML_Util         1.2.1   stable

Modüller <PHP_installDir>/PEAR klasörüne yüklenmiştir:

PEAR modülleri yüklendiğinde, e-posta gönderme komut dosyası PHP şu şekilde olur:


<?php

// hata yönetimi
ini_set("display_errors", "off");
// modüller
ini_set("include_path", ".;C:\serveursSGBD\wamp21\bin\PHP\php5.3.5\PEAR");
require_once "Mail.php";
require_once "Mail/Mime.php";
require_once "Net/SMTP.php";


// mesaj göndermeye olanak tanıyan SMTP istemcisi (SendMail Aktarım Protokolü)
// bilgiler, aşağıdaki satırları içeren $INFOS dosyasından alınmıştır
// 1. satır: smtp, gönderen, alıcı, ek
// sonraki satırlar: mesaj metni
// gönderen: gönderenin e-posta adresi
// alıcı: alıcının e-posta adresi
// smtp: kullanılacak smtp sunucusunun adı
// ek: eklenecek belgenin adı
// 
// veriler
$INFOS = "mail2.txt"; // e-posta gönderim ayarları
// e-posta ayarları alınır
list($erreur, $smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement) = getInfos($INFOS);
// hata mı?
if ($erreur) {
  print "$erreur\n";
  exit;
}
print "Envoi du message [$smtpServer,$expéditeur,$destinataire,$sujet, $attachement]\n";
// ayrıntılı modda e-posta gönderimi
$résultat = sendmail($smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement);
print "Résultat de l'envoi : $résultat\n";
// son
exit;

//-----------------------------------------------------------------------
function getInfos($fichier) {
// bilgileri döndürür ($smtp,$expéditeur,$destinataire,$message, $sujet, $attachement) $fichier metin dosyasından alınmıştır
// 1. satır: smtp, gönderen, alıcı, konu, ek
// sonraki satırlar: mesaj metni
...
// geri dönüş
  return array("", $smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement);
}

//getInfos
//-----------------------------------------------------------------------

function sendmail($smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement) {
//, $message'i, $expéditeur adına $smtpserver SMTP sunucusuna gönderir
// tarafından $destinataire'e gönderilir. $attachement adlı belge mesaja eklenmiştir
// mesajın konusu $sujet
// 
  // mesaj
  $msg = new Mail_Mime();
  $msg->setTXTBody($message);
  $msg->addAttachment($attachement);
  $headers = $msg->headers(array("From" => $expéditeur, "To" => $destinataire, "Subject" => $sujet));
  // gönderim
  $mailer = &Mail::factory("smtp", array("host" => $smtpServer, "port" => 25));
  $envoi = $mailer->send($expéditeur, $headers, $msg->get());
  if ($envoi === TRUE) {
    return "Message envoyé";
  } else {
    return $envoi;
  }
}

// --------------------------------------------------------------------------

function cutNewLinechar($ligne) {
// varsa, $ligne'teki satır sonu işaretini silin
  
}

[mail2.txt] dosyası:

1
2
3
4
smtp.orange.fr, serge.tahe@univ-angers.fr , serge.tahe@univ-angers.fr, test, document.pdf
ligne1
ligne2
ligne3
  • 1. satır: sırasıyla, SMTP sunucusu, gönderenin adresi, alıcının adresi, mesajın konusu, eklenecek belge.
  • 2-4. satırlar: mesaj metni

Ekran çıktısı

Envoi du message [smtp.orange.fr,serge.tahe@univ-angers.fr,serge.tahe@univ-angers.fr,test, document.pdf]
Résultat de l'envoi : Message envoyé

Açıklamalar

Bu komut dosyası, önceki komut dosyasından yalnızca sendmail işleviyle ayrılır. Bu işlevi aşağıda açıklıyoruz:

  • 6. satır: PHP modüllerinin PEAR komut dosyaları, varsayılan olarak PHP yorumlayıcısı tarafından taranmayan bir dizine yüklenmiştir. Yorumlayıcının PEAR modüllerini bulabilmesi için, PHP yorumlayıcısının taraması gereken klasörleri kendimiz tanımlıyoruz. PHP yorumlayıcısının bazı yapılandırma parametrelerini çalışma sırasında değiştirmek mümkündür. Bu değişiklik, yalnızca değişikliği yapan komut dosyası tarafından ve sadece komut dosyasının yürütülme süresi boyunca görülebilir. PHP yorumlayıcısının varsayılan yapılandırması, <PHP_installdir>/PHP.ini dosyasında bulunabilir. Bu dosya, şu biçimdeki satırları içerir:
clé=valeur

Anahtarın değeri, ini_set(anahtar, nouvelle_valeur) işlevi ile yürütme sırasında değiştirilebilir. Komut dosyası tarafından referans verilen PHP işlevleri ve sınıfları için yorumlayıcının arama yolunu belirleyen anahtar 'include_path'dir. Burada, arama yoluna hem komut dosyasının bulunduğu klasörü (.) hem de PHP yorumlayıcısının kurulum klasöründeki PEAR klasörünü ekliyoruz.

  • 7-9. satırlar: E-posta gönderme komut dosyaları PHP yüklenir.
  • 50. satır: E-posta gönderiminden sorumlu olan sendmail işlevi. Bu işlevin parametreleri şunlardır:
    • $smtpServer: Bağlanılması gereken SMTP sunucusunun adı
    • $expéditeur: gönderenin e-posta adresi
    • $destinataire: alıcının e-posta adresi
    • $message: gönderilecek mesaj.
    • $sujet: Mesajın konusu
    • $attachement: Mesaja eklenecek belgenin adı

sendMail işlevi bir hata mesajı döndürür; hata yoksa boş bir mesaj döndürür.

  • 56. satır: Mail_Mime türünde bir mesaj oluşturulur. Bu mesaj, başlık alanları (From, To, Subject) ve gövdeden (mesajın kendisi) oluşur
  • 57. satır: Mail_Mime mesajının gövdesi belirlenir.
  • 58. satır: Mesaja bir belge eklenir.
  • 59. satır: Mail_Mime mesajının başlıkları (From, To, Subject) belirlenir
  • 61. satır: Mail_Mime mesajını göndermekle görevli sınıf oluşturulur. Yöntemin ilk parametresi, kullanılacak protokolün adıdır; burada SMTP protokolüdür. İkinci parametre, kullanılacak SMTP hizmetinin adını ve bağlantı noktasını belirleyen bir dizidir
  • 62. satır: Mesajın gönderilmesi. send yöntemi üç parametre alır: gönderenin adresi, Mail_Mime mesaj başlıkları ve Mail_Mime mesaj gövdesi. Gönderim başarılı olursa send işlevi TRUE boole değerini döndürür, aksi takdirde bir hata mesajı döndürür.