Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Веб программирование.Начало.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
7 Мб
Скачать
☆

Работа с e-mail

E-mail посылается с сервера Web через службу протокола пересылки почты SMTP. В PHP для отправки e-mail используется функция:

mail( $to,$subj, $msg[, $headers[, ad_par]]);

Функция mail() отправляет сообщение $msg получателю $to. Разде­лив запятой адреса, можно задать несколько получателей, например $to= ' user@ex.com, anouser@ex.com'. Переменная $subj указывает тему, headers содержит необязательные заголовки, в число которых входит адрес отправителя. С помощью mail() можно высылать сообщения с присоединенными файлами. Функция возвращает TRUE, если почта была успешно принята для доставки, FALSE в ином случае. Пример:

<?php

$to = 'address@domain.com';

$subject = 'HelloMail’;

$message = 'hello';

$headers = 'From: master@example.com' . "\r\n" .

'Reply-To: master@example.com' . "\r\n" .

'X-Mailer: PHP/' . phpversion();

if(mail($to, $subject, $message, $headers))

{ print("Yes");} else{ print("No"); };

?>

Функция mail() не отправляет сообщение, а обрашается к почтовому агенту реализованному в функции sendmail(). В системе Windows при использовании localhost sendmail() представляет псевдопочтового агента, который помещает почту в файл.

Приведенная ниже форма HTML, которая поволяет пользователю вводить имя и адрес. Когда нажимается кнопка "Registration", данные формы передаются приложению email.php как переменные $_POST[]:

<html><head>

<title>pr42.htm</title>

</head>

<body>

<FORM NAME="testForm" ACTION="email.php" METHOD="POST">

name: <INPUT TYPE="text" NAME="fname"><BR>

e-mail: <INPUT TYPE="text" NAME="email"><BR>

<INPUT TYPE="SUBMIT" value="Registration">

</form>

</body></html>

<?php // email.php

$to = $_POST['email'];

$subject = "Подтверждение регистрации";

$msg = "Дорогой: " . $_POST['fname'] . " " . ",\n\n";

$msg .= "Вы успешно зарегистрировались.";

$headers = "From: Registration Site <myaddr@mydomain.com>";

$headers .= "Reply-To: registration@mydomain.com";

if(mail($to, $subject, $msg, $headers))

{

echo "$msg". "Message sent! ,". $_POST['fname'];

}

else { echo "Message not sent!"; }

?>

Дорогой: valera , Вы успешно зарегистрировались.

Message sent! ,valera

Cookies-наборы

РНР не имеет средств для запоминания предыдущих запросов клиента к серверу. Если необходимо создать Web-сайт, запоминающий посетителей и использующий их данные для создания персонального содержимого, решение мо­жет быть в использовании cookies. Cookies - это механизм хранения данных о предыдущем по­сещении сайта на компьютере клиента. При первом посещении сайта сервер передает браузеру клиента для сохранения в файле идентифицирующий клиента cookie-набор. При следующем посещении данного сайта, браузер вместе с запросом перешлет этот cookie-файл обратно серверу. Cookie хранятся в системном каталоге Cookies в текстовых файлах формата user­name@host.txt.

Когда серверное приложение намеревается установить cookie-набор, происходит следующая последовательность событий: Сервер посылает клиенту в HTTP – ответе заголовок Set-cookie, содержащий данные о клиенте, которые он хочет сохранить.

НТТР/1.0 200 ОК

[Здесь опять идут заголовки]

Set-Cookie: user_id=265; domain=bsu.by ;

Expires=Mon, 20-Sep-2010 16:54:56 GMT;Path=/

Клиент сохраняет эту информацию в cookie-наборе, существующем как маленький текстовый файл, содержащий значения для данного сайта. При последующих запросах этого сайта браузер вспомнит: "есть cookie-набор для этого сайта. " и отправит эту информацию в виде:

GET /index.php HTTP/1.0

[Злесь идут заголовки]

Cookie: user_id=265

Синтаксис HTTP-заголовка Set-Cookie:

Set-Cookie: NAME=VAL; expires=DATE; path=PATH; domain=DNAME; secure

Параметр NAME - имя cookie-набора, VAL — URL-кодированное значение. Параметр DATE задает дату и время, когда cookie потеряет актуальность. Параметр secure указывается, если cookie посылается через защищенное HTTP-соединение. Параметры PATH и DNAME представляют путь и домен, для которых предназначен cookie-набор. В качестве значения параметра DNAME используется не просто my.org, а .my.org (с ведущей точкой). Это еще одна гарантия от злоупотребления cookie. Существует несколько доменов верхнего уровня, для которых в имени домена достаточно двух уровней: .СОМ, .EDU, .NET, .ORG, .GOV, .MIL, .INFO. Все другие домены требуют минимум трех точек в DNAME.

Значение cookie можно изменить, послав дополнительный заголовок Set-Cookie с новым значением. Для удаления достаточно изменить текущее значение времени так, чтобы набор потерял актуальность в прошлом.

Set-Cookie: my=myvl; expires=Tuesday, 03-Dec-2012 13:01:59 GMT; path=/; domain=.co.org;

Здесь был установлен cookie-набор my со значением myvl для всех файлов в домене co.org. Этот cookie-набор установлен с граничной датой актуальности декабря 2012 года (03-Dec-2009) и временем 13:01:59 GMT.

Посмотрим другие возможности реализации cookie-наборов, например использование HTML-дескрипторов. Дескриптор <МЕТА> можно использовать для имитации HTTP-заголовков внутри HTML-страницы, применяя атрибуты HTTP-EQUIV и CONTENT.

<head>

<title><!--HTML-код --> </title>

<МЕТА HTTP-EQUIV="Set-Cookie" CONTENT="mycookie=myvalue;

path=/; domain=.bsu.by">

</head>

<!— остаток HTML-документа //-->

Вторым методом установки cookie-набора в PHP-коде является создание заголовка Set-Cookie с помощью PHP-функции header().

<?php

header("Set-Cookie:mycookie=myvl; path=/;domain=.cg.org");

?>

Поскольку эта функция используется для отправки HTTP-заголовков, она должна быть выполнена до пересылки содержимого с помощью операторов echo или print.

Третий и наиболее известный метод установки cookie-наборов — использование PHP-функции setcookie ():

setcookie($name [,$value [, $expire [, $path [, $domain (, $secure]]]]]);

Так как и для заголовков header() перед фунцией setcookie () не должно быть ника­кого вывода, даже пустая строка перед открывающим дескриптором <?php > вызовет ошибку. Рассмотрим пример:

<?php //cooke0.php

$userid = $_COOKIE['userid'];

setcookie($userid, 12);

print_r($_COOKIE);

?>

Вывод:

Array ( [First] => [vc] => 24 )

<?php //cooke1.php

$username=$_POST['userid'];

if(isset($_COOKIE[$username]))

{ $userid = $_COOKIE[$username];

echo "id1=",$userid,"<br>"; }

else {

$userid=$username;

setcookie($userid, "value", mktime(0,0,0,1,22,2011),"/");

$userid = $_COOKIE[$username];

echo "id2=",$userid,"<br>"; }

//echo "id=",$userid,"<br>";

print_r($_COOKIE);

?>

Вывод:

id1=value Array ( [First] => [vc] => 24 [value] => [Mycooke] => value )

Следует помнить, что cookie-наборы должны предшествовать началу документа, пересылаемого по HTTP. Если нельзя установить cookie-набор перед отправкой части документа, используйте функкцию буферизации ob_start(), которая позволит устанавливать cookie-набор после вывода содержимого.

<?php

ob_start();

echo "Hello\n";//вывод в буфер

setcookie("cookiename", "cookiedata");

ob_end_flush();//Вывод буфера

?>

Для удаления cookie-набора можно задать параметр $value равным NULL.

<?php

setcookie("mycookie", NULL, NULL, "/", ".bsu.by");

?>

Для доступа к значению cookie-набора, полученного от браузера, РНР использует суперглобальный массив $_COOKIE, который хранит значения cookie-наборов. Каждый ключ (имя переменной cookie-набора) в этом массиве представляет отдельный cookie-набор.Обращение к функции setcookie() было быть помещено до любого вывода, включая теги и символы разделители. Если setcookie() выполняется успешно, то возвращается TRUE, однако это еще не означает, что пользователь принял cookie. Проверка поддержки cookie-наборов из РНР рассматривается в следующем примере

<?php

if(!isset(_GET[‘testcookie'])) {

setcookie("testcookie", "test_value");

header("Location: $_SERVER["PHP_SELF"])?testcookie=l");

exit; }

else {

if(isset($_COOKIE['testcookie'])) {

setcookie("testcookie");

echo "Прием cookie-наборов включен"; }

else {

echo "cookie-наборы не поддерживаются!";

}

}

?>

В первом операторе if делается попытка создать cookie-набор и затем перенаправить браузер на другую страницу с помощью дополнительного параметра GET. После повторного выполнения сценария с дополнительным параметром проверяется существование cookie-набора. Если клиент не поддерживает cookie-наборы, тестовый cookie-набор уничтожается вызовом функции setcookie () без параметров.