9. Мережеві функції PHP
Тепер розглянемо мережеві функції PHP, які дозволяють нам здійснювати програмування TCP / IP (Transfer Control Protocol / Internet Protocol).
9.1. Отримання імені або адреси IP комп’ютера в Інтернеті (inet_01)
<?php
// функції: ім’я машини <--> адреса машини IP
ini_set("display_errors", "off");
// константи
$HOTES = array("istia.univ-angers.fr", "www.univ-angers.fr", "www.ibm.com", "localhost", "", "xx");
// адреси IP машин з $HOTES
for ($i = 0; $i < count($HOTES); $i++) {
getIPandName($HOTES[$i]);
}
// кінець
exit;
//------------------------------------------------
function getIPandName($nomMachine) {
//$nomMachine: ім'я машини, адресу якої потрібно отримати IP
// nomMachine-->адреса IP
$ip = gethostbyname($nomMachine);
if ($ip != $nomMachine) {
print "ip[$nomMachine]=$ip\n";
// адреса 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";
}
}
Результати:
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
Коментарі
- рядок 4: задано, щоб помилки виконання не відображалися.
Мережеві функції PHP використовуються у функції getIpandName у рядку 15.
- рядок 18: функція gethostbyname($nom) дозволяє отримати адресу IP «ip3.ip2.ip1.ip0» комп’ютера з іменем $nom. Якщо комп'ютер $nom не існує, функція повертає $nom як результат.
- рядок 22: функція gethostbyaddr($ip) дозволяє отримати ім’я комп’ютера з адресою $ip у формі «ip3.ip2.ip1.ip0». Якщо комп’ютер $ip не існує, функція повертає $ip як результат.
9.2. Веб-клієнт ( inet_02)
Скрипт, що дозволяє отримати вміст головної сторінки веб-сайту.
<?php
// обробка помилок
ini_set("display_errors","off");
// отримати текст HTML з URL
// список веб-сайтів
$SITES = array("istia.univ-angers.fr", "www.univ-angers.fr", "www.ibm.com", "xx");
// читання індексних сторінок сайтів із таблиці $SITES
for ($i = 0; $i < count($SITES); $i++) {
// читання індексних сторінок сайту $SITES[$i]
$résultat = getIndex($SITES[$i]);
// виведення результату
print "$résultat\n";
}//for
// кінець
exit;
//-----------------------------------------------------------------------
function getIndex($site) {
// зчитує URL $site/ та зберігає його у файлі $site.html
// створення файлу $site.html
$html = fopen("$site.html", "w");
if (!$html)
return "Erreur lors de la création du fichier $site.html";
// відкриття з'єднання на порту 80 сервера $site
$connexion = fsockopen($site, 80);
// повернення у разі помилки
if (!$connexion)
return "Echec de la connexion au site ($site,80) : $erreur";
// $connexion представляє двонаправлений канал зв’язку
// між клієнтом (цією програмою) та веб-сервером, до якого звертаються
// цей канал використовується для обміну командами та інформацією
// протокол взаємодії — HTTP
// клієнт надсилає команду get для запиту URL /
// синтаксис get: URL HTTP/1.0
// заголовки (headers) протоколу HTTP повинні закінчуватися порожнім рядком
fputs($connexion, "GET / HTTP/1.0\n\n");
// сервер тепер відповість на каналі $connexion. Він надішле всі
// ці дані, а потім закриє канал. Отже, клієнт зчитує все, що надходить з $connexion
// до закриття каналу
while ($ligne = fgets($connexion, 1000))
fputs($html, $ligne);
// клієнт, у свою чергу, закриває з’єднання
fclose($connexion);
// закриття файлу $html
fclose($html);
// повернення
return "Transfert réussi de la page index du site $site";
}
Результати: наприклад, файл, отриманий для сайту [www.ibm.com]:
- рядки 1–11 — це заголовки HTTP у відповіді сервера
- рядок 1: сервер просить клієнта перенаправитися на URL, вказаний у рядку 8
- рядок 2: дата та час відповіді
- рядок 3: ідентифікатор веб-сервера
- рядок 4: вміст, надісланий сервером. У даному випадку це сторінка HTML, яка починається з рядка 13
- рядок 12: порожній рядок, що завершує заголовки HTTP
- рядки 13–19: сторінка HTML, надіслана веб-сервером.
Коментарі до коду:
- рядок 7: список URL-адрес веб-сайтів, з яких потрібно отримати головну сторінку. Цей список буде збережено у текстовому файлі [nomsite.html].
- рядок 11: функція getIndex виконує цю роботу
- рядок 19: функція getIndex($site) завантажує кореневу сторінку (або індексну сторінку) веб-сайту $site і зберігає її у текстовому файлі $site.html.
- рядок 27: функція fsockopen($site,$port) дозволяє встановити з’єднання зі службою TCP / IP, що працює на порту $port комп’ютера $site. Після встановлення з’єднання «клієнт-сервер» численні служби TCP / IP обмінюються рядками тексту. У даному випадку це протокол HTTP (HyperText Transfer Protocol). Потік даних, що надходить від сервера до клієнта, можна розглядати як текстовий файл. Те саме стосується потоку даних, що надходить від клієнта до сервера.
- рядок 38: функція fputs дозволяє клієнту надсилати дані на сервер. У даному випадку надісланий рядок тексту має таке значення: «Я хочу (GET) кореневу сторінку (/) веб-сайту, до якого я підключений. Я працюю з протоколом HTTP версії 1.0». Поточна версія цього протоколу — 1.1.
- рядок 42: рядки тексту відповіді сервера можна зчитувати по одному за допомогою циклу while і записувати у текстовий файл [$site.html]. Коли веб-сервер надіслав запитувану сторінку, він закриває з’єднання з клієнтом. На стороні клієнта це буде розпізнано як кінець файлу.
9.3. SMTP-клієнт (inet_03)
Серед протоколів TCP / IP, SMTP (SendMail Transfer Protocol) є протоколом зв’язку служби надсилання повідомлень.
Примітки:
- на комп’ютері з ОС Windows, на якому встановлено антивірус, останній, ймовірно, заблокує спробу скрипта PHP підключитися до порту 25 сервера SMTP. У такому разі необхідно вимкнути антивірус. Наприклад, для McAfee можна вчинити так:
![]() |
- в [1] активуйте консоль VirusScan
- у [2] зупиняємо службу [Protection lors de l'accès]
- у [3] — служба зупинена
Скрипт:
<?php
// клієнт SMTP (протокол передачі SendMail), що дозволяє надсилати повідомлення
// інформація береться з файлу $INFOS, що містить такі рядки
// рядок 1: smtp, відправник, одержувач
// наступні рядки: текст повідомлення
// відправник: електронна адреса відправника
// адресат: електронна адреса адресата
// smtp: назва сервера smtp, який слід використовувати
// протокол зв’язку SMTP «клієнт-сервер»
// -> клієнт підключається до порту 25 сервера SMTP
// <- сервер надсилає йому привітальне повідомлення
// -> клієнт надсилає команду EHLO: ім’я свого комп’ютера
// <- сервер відповідає OK або ні
// -> клієнт надсилає команду mail from: <відправник>
// <- сервер відповідає OK або ні
// -> клієнт надсилає команду rcpt to: <адресат>
// <- сервер відповідає OK або ні
// -> клієнт надсилає команду data
// <- сервер відповідає OK або ні
// -> клієнт надсилає всі рядки свого повідомлення і завершує його рядком, що містить
// єдиний символ.
// <- сервер відповідає OK або ні
// -> клієнт надсилає команду quit
// <- сервер відповідає OK або ні
// відповіді сервера мають вигляд xxx текст, де xxx — трицифрове число. Будь-яке число xxx >=500
// вказує на помилку. Відповідь може містити кілька рядків, які починаються з xxx, за винятком останнього
// у форматі xxx (пробіл)
// обмінювані рядки тексту повинні закінчуватися символами RC(#13) та LF(#10)
// дані
$INFOS = "mail.txt"; // параметри відправлення листа
// отримуємо параметри листа
list($erreur, $smtpServer, $expéditeur, $destinataire, $message) = getInfos($INFOS);
// помилка?
if ($erreur) {
print "$erreur\n";
exit;
}
print "Envoi du message [$smtpServer,$expéditeur,$destinataire]\n";
// відправлення листа у режимі детального виведення
$résultat = sendmail($smtpServer, $expéditeur, $destinataire, $message, 1);
print "Résultat de l'envoi : $résultat\n";
// кінець
exit;
//-----------------------------------------------------------------------
function getInfos($fichier) {
// повертає інформацію ($smtp,$expéditeur,$destinataire,$message) з текстового файлу $fichier
// рядок 1: smtp, відправник, одержувач
// наступні рядки: текст повідомлення
// відкриття файлу $fichier
$infos = fopen($fichier, "r");
// чи існує файл $fichier
if (!$infos)
return array("Le fichier $fichier n'a pu être ouvert en lecture");
// читання першого рядка
$ligne = fgets($infos, 1000);
// видалення позначки кінця рядка
$ligne = cutNewLineChar($ligne);
// витяг полів smtp, відправник, одержувач
$champs = explode(",", $ligne);
// чи правильна кількість полів?
if (count($champs) != 3)
return "La ligne 1 du fichier $fichier (serveur smtp, expéditeur, destinataire) a un
nombre de champs incorrect";
// «обробка» отриманої інформації
for ($i = 0; $i < count($champs); $i++)
$champs[$i] = trim($champs[$i]);
// витяг полів
list($smtpServer, $expéditeur, $destinataire) = $champs;
// читання повідомлення
$message = "";
while ($ligne = fgets($infos, 1000))
$message.=$ligne;
fclose($infos);
// повернення
return array("", $smtpServer, $expéditeur, $destinataire, $message);
}
//-----------------------------------------------------------------------
function sendmail($smtpServer, $expéditeur, $destinataire, $message, $verbose) {
// надсилає $message на SMTP-сервер $smtpserver від імені $expéditeur
// для $destinataire. Якщо $verbose=1, здійснює відстеження обміну даними між клієнтом і сервером
// отримується ім’я клієнта
$client = gethostbyaddr(gethostbyname(""));
// відкриття з'єднання на порту 25 $smtpServer
$connexion = fsockopen($smtpServer, 25);
// повернення у разі помилки
if (!$connexion)
return "Echec de la connexion au site ($smtpServer,25)";
// $connexion представляє двосторонній канал зв'язку
// між клієнтом (цією програмою) та SMTP-сервером, до якого встановлено з’єднання
// цей канал використовується для обміну командами та інформацією
// після встановлення з’єднання сервер надсилає привітальне повідомлення, яке ми читаємо
$erreur = sendCommand($connexion, "", $verbose, 1);
if ($erreur) {
fclose($connexion);
return $erreur;
}
// команда ehlo:
$erreur = sendCommand($connexion, "EHLO $client", $verbose, 1);
if ($erreur) {
fclose($connexion);
return $erreur;
}
// команда mail from:
$erreur = sendCommand($connexion, "MAIL FROM: <$expéditeur>", $verbose, 1);
if ($erreur) {
fclose($connexion);
return $erreur;
}
// команда rcpt to:
$erreur = sendCommand($connexion, "RCPT TO: <$destinataire>", $verbose, 1);
if ($erreur) {
fclose($connexion);
return $erreur;
}
// команда data
$erreur = sendCommand($connexion, "DATA", $verbose, 1);
if ($erreur) {
fclose($connexion);
return $erreur;
}
// підготовка повідомлення для відправлення
// воно має містити такі рядки
// From: відправник
// To: одержувач
// порожній рядок
// Повідомлення
// .
$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;
}
// команда quit
$erreur = sendCommand($connexion, "QUIT", $verbose, 1);
if ($erreur) {
fclose($connexion);
return $erreur;
}
// кінець
fclose($connexion);
return "Message envoyé";
}
// --------------------------------------------------------------------------
function sendCommand($connexion, $commande, $verbose, $withRCLF) {
// надсилає $commande у канал $connexion
// режим детального виведення, якщо $verbose=1
// якщо $withRCLF=1, додає послідовність RCLF до обміну
// дані
if ($withRCLF)
$RCLF = "\r\n"; else
$RCLF="";
// надсилання команди, якщо $commande не порожній
if ($commande) {
fputs($connexion, "$commande$RCLF");
// можливе відлуння
if ($verbose)
affiche($commande, 1);
}//якщо
// читання відповіді
$réponse = fgets($connexion, 1000);
// можливе відлуння
if ($verbose)
affiche($réponse, 2);
// отримання коду помилки
$codeErreur = substr($réponse, 0, 3);
// останній рядок відповіді?
while (substr($réponse, 3, 1) == "-") {
// читання відповіді
$réponse = fgets($connexion, 1000);
// можливе відлуння
if ($verbose)
affiche($réponse, 2);
}//while
// відповідь завершена
// помилка, повернута сервером?
if ($codeErreur >= 500)
return substr($réponse, 4);
// повернення без помилки
return "";
}
// --------------------------------------------------------------------------
function affiche($échange, $sens) {
// виводить $échange на екран
// якщо $sens=1, виводить -->$echange
// якщо $sens=2, виводить <-- $échange без останніх 2 символів RCLF
switch ($sens) {
case 1:
print "--> [$échange]\n";
return;
case 2:
$L = strlen($échange);
print "<-- [" . substr($échange, 0, $L - 2) . "]\n";
return;
}//перемикач
}
// --------------------------------------------------------------------------
function cutNewLinechar($ligne) {
// видаляється маркер кінця рядка з $ligne, якщо він існує
...
}
Файл infos.txt:
- рядок 1: [smtp.orange.fr] — сервер, який використовується для відправлення листа; [serge.tahe@univ-angers.fr] — адреса відправника; [serge.tahe@istia.univ-angers.fr] — адреса одержувача
- рядок 2: заголовки повідомлення. Тут є лише один — тема повідомлення.
- рядок 3: порожній рядок завершує заголовки повідомлення
- рядки 4–7: текст повідомлення
Результати на екрані:
- рядок 1: повідомлення про хід виконання скрипта
- рядок 2: перша відповідь сервера SMTP. Вона надходить після підключення клієнта до порту 25 сервера SMTP. Відповіді сервера мають вигляд рядків у форматі [xxx message] або [xxx-message]. Перший синтаксис вказує, що відповідь завершена. xxx — це код результату. Значення, більше або рівне 500, вказує на помилку. Другий синтаксис вказує, що відповідь не завершена і що слідуватиме ще один рядок.
- рядок 2: SMTP-сервер повідомляє, що готовий приймати команди
- рядок 3: клієнт надсилає команду [EHLO nomDeMachine], де nomDeMachine — це інтернет-ім’я комп’ютера, на якому працює клієнт
- рядки 4–10: відповідь SMTP-сервера
- рядок 11: клієнт надсилає команду [MAIL FROM: <expéditeur>], яка вказує адресу електронної пошти відправника.
- рядок 12: SMTP-сервер повідомляє, що приймає цю адресу. Він міг би її відхилити, якби синтаксис був неправильним. Однак він не перевіряє, чи електронна адреса дійсно існує.
- рядок 13: клієнт надсилає команду [RCPT TO: <destinataire>], яка вказує адресу електронної пошти одержувача повідомлення.
- рядок 14: SMTP-сервер відповідає, що приймає цю адресу. І тут знову проводиться перевірка синтаксису.
- рядок 15: клієнт надсилає команду [DATA], яка вказує користувачеві, що наступні рядки є текстом повідомлення.
- рядок 16: сервер відповідає, що повідомлення можна надіслати. Воно складається з низки текстових рядків, які мають закінчуватися рядком, що містить лише один символ — крапку.
- рядки 17–25: повідомлення, надіслане клієнтом
- рядки 17–19: заголовки повідомлення [From:, To:, Subject:] вказують відповідно на відправника, одержувача та тему повідомлення.
- рядок 20: порожній рядок, що позначає кінець заголовків
- рядки 21–23: тіло повідомлення
- рядок 24: рядок, що складається з однієї крапки, який позначає кінець повідомлення.
- рядок 26: сервер SMTP відповідає, що приймає повідомлення
- рядок 27: клієнт надсилає команду [QUIT], щоб повідомити про завершення
- рядок 28: SMTP-сервер відповідає, що закриє з’єднання з клієнтом
Коментарі до коду
Ми не будемо детально зупинятися на коді скрипта, оскільки він містить багато коментарів.
- рядки 48–80: функція, яка обробляє файл [infos.txt], що містить повідомлення, яке потрібно надіслати, а також інформацію, необхідну для цього надсилання. Вона повертає масив ($erreur, $smtpServer, $expéditeur, $destinataire, $messge) із:
- $erreur: можливе повідомлення про помилку, в іншому випадку поле порожнє.
- $smtpServer: ім’я SMTP-сервера, до якого потрібно підключитися
- $expéditeur: адреса електронної пошти відправника
- $destinataire: адреса електронної пошти одержувача
- $message: повідомлення, яке потрібно надіслати. Окрім тіла повідомлення, воно може містити заголовки.
- рядки 84–157: функція sendMail відповідає за відправлення повідомлення. Її параметри такі:
- $smtpServer: назва SMTP-сервера, до якого потрібно підключитися
- $expéditeur: адреса електронної пошти відправника
- $destinataire: адреса електронної пошти одержувача
- $message: повідомлення, яке потрібно надіслати.
- $verbose: значення 1 вказує, що обмін даними з SMTP-сервером має відображатися на консолі.
Функція sendMail повертає повідомлення про помилку; якщо помилки не було, повертається порожнє повідомлення.
- рядок 88: дозволяє отримати ім’я комп’ютера в системі Windows, що працює з OS.
- рядок 99: ми бачили, що діалог «клієнт/сервер» має такий вигляд:
- відправлення клієнтом команди в одному рядку
- відповідь сервера в одному або декількох рядках
- рядки 161–208: функція sendCommand приймає такі параметри:
- $connexion: канал TCP / IP, що з’єднує клієнта з сервером
- $commande: команда, яку потрібно надіслати цим каналом. Буде зчитано відповідь сервера на цю команду.
- $verbose: значення 1 вказує, що обмін даними з сервером SMTP має відображатися на консолі.
- $withRCLF: значення 1 означає, що в кінці команди слід додати маркер кінця рядка «\r\n»
- рядок 173: відправлення команди клієнтом
- рядок 181: зчитування першого рядка відповіді сервера SMTP у форматі xxx текст або xxx-текст. Останній випадок вказує, що сервер має ще один рядок для надсилання. xxx — це код помилки, надісланий сервером.
- рядок 188 — отримання коду помилки з відповіді
- рядки 191–199: зчитування інших рядків відповіді
- рядки 203–204: якщо код помилки >=500, це означає, що SMTP-сервер повідомляє про помилку.
9.4. Друга програма для відправлення електронної пошти (inet_04)
Цей скрипт має ту саму функціональність, що й попередній: надсилання електронного листа. Для цього ми використовуємо модулі з бібліотеки PEAR. Ця бібліотека містить десятки модулів, що охоплюють різні сфери. Ми будемо використовувати такі:
- Net/SMTP: модуль, що дозволяє взаємодіяти з сервером SMTP
- Mail: модуль, що дозволяє керувати відправленням електронного листа за різними протоколами.
- Mail/Mime: модуль, що дозволяє створювати повідомлення, до яких можна додавати документи.
Щоб отримати доступ до цих модулів, їх спочатку потрібно встановити на комп’ютері, на якому виконується скрипт PHP. Під час встановлення програмного пакету WampServer було встановлено інтерпретатор PHP. У його деревоподібній структурі можна встановити модулі PEAR.
![]() |
- в [1] — папку інсталяції інтерпретатора PHP
- у [2], папку PEAR, яка міститиме модулі PEAR, що будуть встановлені
- у [3] — файл команд [go-pear.bat], який ініціалізує бібліотеку PEAR
Щоб ініціалізувати бібліотеку PEAR, відкрийте вікно DOS і запустіть файл [go-pear.bat]. Цей скрипт підключиться до веб-сайту бібліотеки PEAR. Тому необхідне підключення до Інтернету.
Підключившись до веб-сайту бібліотеки PEAR, скрипт завантажить певну кількість елементів. Серед них — новий скрипт [pear.bat]. Саме за допомогою цього скрипта ми встановимо різні модулі PEAR, які нам потрібні. Цей скрипт запускається з аргументами. Серед них аргумент [help] дозволяє отримати список команд, які підтримує скрипт:
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] дозволяє встановити модулі PEAR. Допомогу щодо команди [install] можна отримати за адресою:
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
Необхідно встановити такі модулі PEAR: [Mail], [Mail_Mime], [Net_SMTP]. У вікні командного рядка послідовно введіть такі команди:
<PHP_installDir>pear install Mail
...
<PHP_installDir>pear install Mail_Mime
…
<PHP_installDir>pear install Net_SMTP
…
де <PHP_installDir> — це папка інсталяції інтерпретатора PHP (у цьому прикладі — C:\serveursSGBD\wamp21\bin\PHP\php5.3.5)
Можна переглянути встановлені модулі:
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
Модулі встановлено в папці <PHP_installDir>/PEAR:
![]() |
Після встановлення модулів PEAR скрипт PHP для відправлення електронної пошти виглядає наступним чином:
<?php
// обробка помилок
ini_set("display_errors", "off");
// модулі
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";
// клієнт SMTP (протокол передачі SendMail), що дозволяє надсилати повідомлення
// дані взято з файлу $INFOS, що містить такі рядки
// рядок 1: smtp, відправник, одержувач, вкладення
// наступні рядки: текст повідомлення
// відправник: електронна адреса відправника
// адресат: електронна адреса адресата
// smtp: назва сервера smtp, який слід використовувати
// вкладення: назва документа, який потрібно додати
//
// дані
$INFOS = "mail2.txt"; // параметри відправлення листа
// отримано параметри електронного листа
list($erreur, $smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement) = getInfos($INFOS);
// помилка?
if ($erreur) {
print "$erreur\n";
exit;
}
print "Envoi du message [$smtpServer,$expéditeur,$destinataire,$sujet, $attachement]\n";
// відправлення листа у режимі детального виведення
$résultat = sendmail($smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement);
print "Résultat de l'envoi : $résultat\n";
// кінець
exit;
//-----------------------------------------------------------------------
function getInfos($fichier) {
// повертає інформацію ($smtp,$expéditeur,$destinataire, $message, $sujet, $attachement), взяті з текстового файлу $fichier
// рядок 1: smtp, відправник, одержувач, тема, вкладення
// наступні рядки: текст повідомлення
...
// повернення
return array("", $smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement);
}
//getInfos
//-----------------------------------------------------------------------
function sendmail($smtpServer, $expéditeur, $destinataire, $message, $sujet, $attachement) {
// надсилає $message на SMTP-сервер $smtpserver від імені $expéditeur
// для $destinataire. До повідомлення додано документ $attachement
//; тема повідомлення — $sujet
//
// повідомлення
$msg = new Mail_Mime();
$msg->setTXTBody($message);
$msg->addAttachment($attachement);
$headers = $msg->headers(array("From" => $expéditeur, "To" => $destinataire, "Subject" => $sujet));
// відправлення
$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) {
// видаляється позначка кінця рядка з $ligne, якщо вона існує
…
}
Файл [mail2.txt]:
- рядок 1: у порядку: сервер SMTP, адреса відправника, адреса одержувача, тема повідомлення, документ для вкладу.
- рядки 2–4: текст повідомлення
Результати на екрані
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é
Коментарі
Цей скрипт відрізняється від попереднього лише функцією sendmail. Опишемо її:
- рядок 6: скрипти PHP модулів PEAR були встановлені в каталог, який за замовчуванням не сканується інтерпретатором PHP. Щоб інтерпретатор PEAR зміг знайти ці модулі, ми самостійно визначаємо папки, які повинен обшукувати інтерпретатор PHP. Під час виконання можна змінити деякі параметри конфігурації інтерпретатора PHP. Ця зміна помітна лише для скрипта, який її здійснює, і лише протягом часу його виконання. Конфігурацію за замовчуванням інтерпретатора PHP можна знайти у файлі <PHP_installdir>/PHP.ini. Цей файл містить рядки такого вигляду
Значення ключа можна змінити під час виконання за допомогою функції ini_set(ключ, nouvelle_valeur). Ключ для вказання шляху пошуку інтерпретатором функцій та класів PHP, на які посилається скрипт, — це 'include_path'. Тут ми додаємо до шляху пошуку як папку зі скриптом (.), так і папку PEAR з папки інсталяції інтерпретатора PHP.
- рядки 7–9: завантажуються скрипти PHP для відправлення електронної пошти.
- рядок 50: функція sendmail, яка відповідає за відправлення листа. Її параметри такі:
- $smtpServer: ім’я SMTP-сервера, до якого потрібно підключитися
- $expéditeur: адреса електронної пошти відправника
- $destinataire: електронна адреса одержувача
- $message: повідомлення, яке потрібно надіслати.
- $sujet: тема повідомлення
- $attachement: назва документа, який потрібно додати до повідомлення
Функція sendMail повертає повідомлення про помилку; якщо помилки не було, повертається порожнє повідомлення.
- рядок 56: створення повідомлення типу Mail_Mime. Це повідомлення складається з заголовків (From, To, Subject) та тіла (самого повідомлення)
- рядок 57: задається тіло повідомлення Mail_Mime.
- рядок 58: до повідомлення додається документ
- рядок 59: встановлюються заголовки (From, To, Subject) повідомлення Mail_Mime
- рядок 61: створюється клас, відповідальний за відправлення повідомлення Mail_Mime. Першим параметром методу є назва протоколу, що використовується, у даному випадку — протокол SMTP. Другим параметром є масив, що визначає назву та порт SMTP-сервісу, який буде використовуватися
- рядок 62: відправлення повідомлення. Метод send приймає три параметри: адресу відправника, заголовки повідомлення Mail_Mime та тіло повідомлення Mail_Mime. Функція send повертає логічне значення TRUE, якщо відправлення пройшло успішно, інакше — повідомлення про помилку.


