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


