Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / web / example1 / Введение в PHP.doc
Скачиваний:
103
Добавлен:
18.05.2015
Размер:
3 Mб
Скачать

Отправка почты на php (Функция mail)

Сохраните класс отправки почты под именем mail_class.php. Скрипт проверки можете сохранить под любым именем, например sendmail.php.

Внимание! В тексте скрипта предварительно подставьте реальный почтовый адрес. Запустите на выполнение проверочный скрипт sendmail.php. Если все сработало правильно, то вам придет письмо на тот адрес, что вы указали в проверочном скрипте.

Хотя в некоторых случаях подобное письмо может не дойти до адресата. Например, оно может быть заблокировано антиспамовыми фильтрами.

Класс отправки сообщения (mail_class.php)

<?php

class Mail

{

// создаем переменные, в которых хранится содержимое заголовков

var $to = '';

var $from = '';

var $reply_to = '';

var $cc = '';

var $bcc = '';

var $subject = '';

var $msg = '';

var $validate_email = true;

// проверяет допустимость почтовых адресов

var $rigorous_email_check = true;

// проверяет допустимость доменных имен по записям DNS

var $allow_empty_subject = false;

// допустимость пустого поля subject

var $allow_empty_msg = false;

// допустимость пустого поля msg

var $headers = array();

/* массив $headers содержит все поля заголовка, кроме to и subject*/

function check_fields()

/* метод, проверяющий, переданы ли все значения заголовков

и проверку допустимости почтовых адресов */

{

if(empty($this -> to))

{

return false;

}

if(!$this -> allow_empty_subject && empty($this -> subject))

{

return false;

}

if(!$this -> allow_empty_msg && empty($this -> msg))

{

return false;

}

/* если есть дополнительные заголовки, помещаем их в массив $headers*/

if(!empty($this -> from))

{

$this->headers[] = "From: $this -> from";

}

if(!empty($this -> reply_to))

{

$this -> headers[] = "Reply_to: $this -> reply_to";

}

// проверяем допустимость почтового адреса

if ($this -> validate_email)

{

if (!preg_match("/[0-9a-z_]+@[0-9a-z_^\.]+\.[a-z]{2,3}/i", $this -> to))

{

return false;

}

return true;

}

}

function send()

/* метод отправки сообщения */

{

if(!$this -> check_fields()) return true;

if (mail($this -> to, htmlspecialchars( stripslashes(trim($this -> subject))),

htmlspecialchars(stripslashes(trim($this -> msg)))))

{

return true;

}else{

return false;

}

}

}

?>

Проверочный скрипт (senmail.php)

<?php

include("./mail_class.php");

$mail = new Mail();

$mail -> to = "kuznetsov@domen.ru";

//сюда подставляется реальный адрес

$mail -> subject = "test";

$mail -> msg = "testing...";

$mail -> msg = "testing...";

$mail -> rigorous_email_check = 0;

if($mail->send()){

echo("Success");

}else{

echo("error");

}

echo("<br>");

echo($mail -> msg);

?>

Cookies-наборы: сохраненное состояние

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

Когда программа, выполняемая на Web-сервере, намеревается установить cookie-набор, происходит следующая последовательность событий:

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

НТТР/1.0 200 ОК

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

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

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

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

GET /index.php HTTP/1.0

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

Cookie: user_id=265

Существует ряд ограничений, направленных на на предупреждение неправильного использования cookie-наборов. В HTTP cookie-наборы являются маленькими сегментами текста размерностью не более 4 Кбайт (4096 байт). Клиентскому браузеру можно запретить принимать cookie. Сookie-наборы также могут иметь ограничение на работу только с определенной частью Web-сайта. Это значит, что можно установить cookie-набор для каталога bsu.by/my, который будет работать только в этом каталоге и его подкаталогах. Сookie-наборы имеют время жизни или могут быть сделаны неактуальными в любое время после их установки. В этом случае cookie-набор автоматически удаляется клиентским браузером. Рассмотрим примеры заголовков:

Существует несколько методов использования cookie-наборов в PHP-сценариях. Например, через запрос-ответ HTTP. Синтаксис HTTP-заголовка Set-Cookie:

Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOM_NAME; secure

Параметр NAME представляет собой имя cookie-набора, VALUE — URL-кодированное значение. Параметр DATE (если он указан) задает дату и аремя, когда cookie-набор потеряет актуальность. Формат параметра DATE: <Day>, DD-MMM-YYYY НН:MM:SS GMT. Параметр, secure нужно указывать, если cookie-набор посылается через защищенное HTTP-соединение.

Параметры PATH и DOM_NAME представляют путь и домен, для которых предназначен этот cookie-набор. Параметр PATH может быть опущен. Cookie-наборы затем посылаются только тем доменам, которые соответствуют домену cookie-набора. Указывать полное доменное имя не обязательно. В качестве значения по умолчанию будет использовано полное имя домена, с которого был отправлен cookie-набор. В качестве значения параметра DOMAIN_NAME используется не просто og.org, а .og.org (с ведущей точкой). Это еще одна гарантия от злоупотребления cookie-наборами. Параметр DOM_NAME должен иметь как минимум две точки в имени домена, а в некоторых случаях — и три. Это позволяет предотвратить передачу cookie-наборов с именем домена, такого как .com. Существует несколько доменов верхнего уровня, для которых в имени домена достаточно двух уровней: . СОМ, . EDU, .NET, .ORG, .GOV, .MIL, .BIZ, .SHOP, . INFO. Все другие домены требуют минимум трех точек в параметре DOM_NAME.

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

Set-Cookie: mycookie=myvalue; expires=Tuesday, 03-Dec-2009 13:01:59 GMT; path=/; domain=.cog.org;

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

Посмотрим, как реализовать cookie-наборы в веб.

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

<HEAD>

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

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

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

</HEAD>

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

Дескриптор <META> хорош не только для установки cookie-наборов. Например, с помощью НТТР-загоповка Refresh можно перенаправить браузер на новую страницу:

<МЕТА HTTP-EQUIV="Refresh" CONTENT="0; url=http://www.bsu.by">

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

<?php

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

?>

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

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

Функция setcookie () имеет следующий синтаксис:

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

Здесь $name - имя cookie. Этот идентификатор хранится в глобальной переменной $_COOKIE и доступен в последующих сценариях. Значение $value хранится на компьютере пользователя. Переменная $expire содержит время, когда истекает значение cookie или становится недоступным. Это время можно задать с помощью функции time(). Файлы cookie, без заданного значения времени истечения, завершают свое существование при закрытии браузера. path -указывает пути доступа на сервере, для которых cookie действителен или доступен. Косая черта "/" говорит, что cookie доступен во всех папках. Domain - домен, в котором доступен cookie. Если домен не определен, по умолчанию используется хост, на котором создан cookie. Значения domain должны содержать в строке как минимум две точки ".", чтобы быть допустимыми. $secure=1 указывает, что cookie передается через защищенное соединение HTTPS, значение 0 обозначает стандартную передачу HTTP. Любые необязательные параметры могут быть установлены в NULL.

Так как и для заголовков 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-набор после вывода содержимого. Поскольку вывод буферизуется, cookie-набор по-прежнему предшествует реальному выводу.

<?php

ob_start();

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

setcookie("cookiename", "cookiedata");

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

?>

Рассмотрим еще один пример

<? //php431

/*Игра: отгадай число от 1 до 50.*/

$manlix['result']="<center>";

if(!isset($_COOKIE['random']))

{$random=rand(1,50);

setcookie("random",$random,time()+60*60*24*365);

setcookie("att",0,time()+60*60*24*365);

}

else{$random=$_COOKIE['random'];

$att=$_COOKIE['att'];}

$manlix['result'].="<b>Угадайте число от 1 до 50</b><hr>";

if(!empty($_GET['num']))

{if($_GET['num']==$random){

$manlix['result'].="<font color=red><b>Вы угадали число '<font color=green><b>".$random."</b></font>' с <font color=blue>".$att."</font> попытки</font> </b></font><hr>";

$random=rand(1,50);

setcookie("random",$random,time()+60*60*24*365);

setcookie("att",0,time()+60*60*24*365);}

else{if($_GET['num']>$random)

$manlix['result'].="Загаданное число меньше<hr>";

else $manlix['result'].="Загаданное число больше<hr>";

setcookie("att",$_COOKIE['att']+1,time()+60*60*24*365);}

}

for($i=1;$i<51;$i++)

$manlix['result'].="<a href=?num=".$i.">".$i."</a> ";

echo $manlix['result']."</center>";

?>

<?php

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

?>

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

<?php

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

?>

После того как cookie-набор установлен на клиенте, он остается неактивным до момента, когда браузер запросит у Web-сервера другой документ. Для доступа к значению 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 () без параметров.

Следующий пример демонстрирует, как cookie используется для сохранения имени пользователя. Вначале требуется ввести имя пользователя, чтобы получить доступ к сайту. Затем cookie, содержащий имя пользователя, сохраняется на компьютере пользователя. Доступ в будущем возможен при извлечении cookie с компьютера пользователя.

<?php // Пример. Файл setcookie.php

if ($_REQUEST[auth] == "no")

{

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

}

// Если пользователь щелкает на кнопке Login, создается cookie,

// содержащий его имя пользователя и IP-адрес

if ($_POST[submit] == "Login")

{

$cookie_name = "user";

$cookie_value = $_POST[uname];

$cookie_expire = time() + 14400;

setcookie($cookie_name,$cookie_value,$cookie_expire,"/");

$formDisplay = "no";

}

?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHMTL 1.0 Transitional//EN"

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<title>Страница Web </title>

<style type="text/css">

body {font:10pt arial;color:white}

div#form {background-color:gray;border:solid 1px black;padding:10px}

input {border:solid 2px black}

</style>

<?php

if ($formDisplay == "no")

{

?>

<meta http-equiv='refresh' content='0; url=siteaccess.php?auth=yes'/>

<?php

}

?>

</head>

<body>

<div id="form">

<h4 style="color:red">New User? Create User Name</h4>

<form action="setcookie.php" method="post">

<p>User Name:

<br/>

<input type="text" name="uname" size="7"/>

</p>

<input type="submit" value="Login" name="submit"/>

</form>

<h4 style="color:red">Existing User?

<a style="color:white" href="siteaccess.php?auth=yes">Enter Site</a></h4>

</div>

<br/>

<br/>

<?php

echo "<span style='color:red'>" . $msg . "</span>";

?>

</body>

</html>

siteaccess.php

<?php

// Если пользователь щелкает на кнопке Login,

//создается cookie,содержащий его имя пользователя и IP-адрес

if ($_REQUEST[auth] == "yes" && $_REQUEST[user])

{

echo "Добро пожаловать " . " " . $_COOKIE[user] . " на сайт с ограниченным доступом.

Теперь на вашем диске хранится cookie, и вы можете обращаться к этому сайту без регистрации при каждом обращении";

}

else

{

header("Location:setcookie.php?auth=no");

}

?>

Соседние файлы в папке example1