Вы, наверное, замечали: на некоторых сайтах предлагают оставить свой e-mail для
того чтобы подписаться на рассылку. Вы будете получать по почте сведения о
новинках сайта, и не нужно будет лезть в Интернет, чтобы посмотреть, не
появилось ли там что-то новенькое. Подобный сервис мы сейчас организуем.
Проект наш будет состоять из двух сценариев и базы e-mail'ов. Один сценарий
будет служить для подписки/отписки пользователей, а второй, собственно, будет
осуществлять рассылку. Сначала напишем сценарий для добавления и удаления
почтовых ящиков из базы. Создайте сценарий subscribe.php - для начала
разработаем пользовательскую форму:
<html>
<head>
<title>
Почтовая рассылка
</title>
</head>
<body>
Подписаться на почтовую рассылку новостей сайта.<br>
Введите свой e-mail:
<form action=subscribe.php method=POST>
<input type=text size=40 maxlength=30 name=email>
<input type=submit value=Подписаться>
</form>
<p>
Если вы уже подписаны и хотите отписаться от рассылки, то есть<br> не получать
больше писем с сайта, то вам необходимо заполнить поле ниже: <p>
Далее в сценарии мы будем проверять, какую из предложенных форм заполнил
пользователь. Для начала опишем условие <если пользователь решил подписаться на
рассылку>:
<?php
if (isset($email)) //пользователь заполнил форму подписки
{
//проверяем введенный e-mail на корректность
if (!preg_match("/^([a-z,._,0-9])+@([a-z,._,0-9])+(.([a-z])+)+$/", $email))
$emails= file('emails.dat'); //заносим список e-mail'ов из файла в массив
$kolvo = count($emails); //определяем количество почтовых ящиков в базе
for($i=0;$i<$kolvo;$i++) //делаем цикл для полного перебора всех ящиков
//проверяем, нет ли в базе такого же e-mail'a
if (trim($emails[$i]) === trim($email))
{
echo '<font color=red size=4>Вы уже подписаны на рассылку!</font>';
echo '</body></html>';
exit;
}
$email=StripSlashes($email); //убираем все лишние символы
//открываем базу на дописывание данных
$fp = fopen('emails.dat','a+') or die('Не могу открыть файл базы рассылки!');
fwrite($fp,$email.chr(13).chr(10)); //добавляем новый e-mail в конец базы
fclose($fp); //закрываем базу
}
При попытке добавления нового почтового ящика на подписку мы делаем проверки,
соответствует ли e-mail шаблону и имеется ли уже в базе такой e-mail. Теперь
рассмотрим условие <если пользователь хочет отписаться от рассылки новостей>, то
есть попросту дадим ему возможность удалить свой e-mail из базы:
if (isset($noemail)) //если отправлены данные формы отписки от рассылки
{
$emails= file('emails.dat'); //заносим строки базы в массив
$kolvo = count($emails); //количество строк в файле
for($i=0;$i<$kolvo;$i++) //цикл перебора всех элементов массива
//если найден e-mail, который требуется удалить
if (trim($emails[$i]) === trim($noemail))
break; //прерываем цикл
//если e-mail не был найден
if ($i == $kolvo)
{
//выводим сообщение о том, что e-mail отсутствует в базе
echo '<font color=red size=4>Вы не подписаны на рассылку!</font>';
echo '</body></html>';
exit;
}
$fp = fopen('emails.dat','w+'); //открываем файл на перезапись
for($j=0;$j<$kolvo;$j++) //цикл для перебора массива
{
/* если найден e-mail, предназначенный для удаления из базы,
итерацию цикла не производим */
if ($i==$j) continue;
fwrite($fp,$emails[$j]); //записываем e-mail'ы в базу
}
fclose($fp); //закрываем файл
}
//конец сценария
?>
</body>
</html>
Для удаления указанного почтового ящика из базы мы считываем все e-mail'ы из
базы в массив. После этого методом перебора находим индекс почтового ящика,
который необходимо удалить, и запоминаем его. Когда мы начинаем записывать все
e-mail'ы обратно в базу, то при нахождении почтового ящика, который необходимо
удалить из базы, пропускаем эту итерацию цикла и не записываем его в цикл.
Пользовательский сценарий для подписки готов, теперь создадим сценарий для себя
:-) - он будет осуществлять рассылку. Для начала разработаем внешний вид формы:
создайте сценарий sendmails.php и напишите в нем html-код формы:
обрадовать, что на сайте открылся форум! Будем обсуждать интересные
темы по программированию и вообще ;)
Рассылка сайта www.HeeL.net.UA </textarea>
<p>
<input type=submit value=Разослать>
</form>
На рис. 2 показан внешний вид формы. Мы вводим тему рассылки и текст, при
нажатии на кнопку <Разослать> данное письмо будет рассылаться на все e-mail'ы,
которые указаны в файле emails.dat.