Вы, наверное, замечали: на некоторых сайтах предлагают оставить свой 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>
<form action=subscribe.php method=POST>
E-mail:<br><input type=text size=40 maxlength=30 name=noemail>
<input type=submit value=Отписаться>
</form>
Внешний вид формы показан на рис. 1. Здесь по сути две формы — для подписки на
рассылку и для отказа от нее.
<img src=’http://www.codenet.ru/webmast/php/maillist/1.jpg’ style=’margin:5px;’
>
Далее в сценарии мы будем проверять, какую из предложенных форм заполнил
пользователь. Для начала опишем условие <если пользователь решил подписаться на
рассылку>:
<?php
if (isset($email)) //пользователь заполнил форму подписки
{
//проверяем введенный e-mail на корректность
if (!preg_match(«/^([a-z,._,0-9])+@([a-z,._,0-9])+(.([a-z])+)+$/», $email))
//если e-mail не соответствует шаблону
{
//выводим сообщение
echo ‘<font color=red size=4>Неверно указан e-mail!</font>’;
echo ‘</body></html>’; //дописываем окончание страницы
exit; //выходим
}
//иначе
$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-код формы:
<html>
<head>
<title>
Почтовая рассылка
</title>
</head>
<body>
<form action=sendmails.php method=post>
<b>Тема рассылки</b>: <input type=text name=subj
value=»Рассылка сайта www.HeeL.net.UA» size=45><br />
<b>Текст рассылки</b>:<br />
<textarea cols=50 rows=5 name=text>Здравствуйте, хотим вас
обрадовать, что на сайте открылся форум! Будем обсуждать интересные
темы по программированию и вообще
Рассылка сайта www.HeeL.net.UA </textarea>
<p>
<input type=submit value=Разослать>
</form>
На рис. 2 показан внешний вид формы. Мы вводим тему рассылки и текст, при
нажатии на кнопку <Разослать> данное письмо будет рассылаться на все e-mail’ы,
которые указаны в файле emails.dat.
<img src=’http://www.codenet.ru/webmast/php/maillist/2.jpg’ style=’margin:5px;’
>
Для обработки формы ниже напишите такой код:
<?php
$emailfile = «emails.dat»;
if (!isset($text)) //если не указан текст для рассылки
{
echo «</body></html>»; //дописываем конец страницы
exit; //выходим
}
//проверяем, существует ли база и можно ли с нее считывать данные
if ((!File_Exists($emailfile)) || (!is_readable($emailfile)) )
{
echo ‘Ошибка, при работе с базой ‘.$emailfile;
echo ‘</body></html>’;
exit;
}
$emails = file($emailfile);
$kolvo = count($emails);
if (!isset($subj) || ($subj===»)) //если поле <Тема> не заполнено
$subj=’Рассылка сайта www.HeeL.net.UA’; //пишем свою тему <по умолчанию>
//отправляем почту в цикле
for($i=0;$i<$kolvo;$i++)
/* отправляем письмо на каждый e-mail по очереди в цикле */
mail(trim($emails[$i]),trim($subj),$text);
//выводим сообщения об успешности операции
echo ‘<font color=red size=4><p align=center>Все письма успешно разосланы…</p></font>’;
?>
</body>
</html>
Все, сценарий полностью готов, для проверки можете ввести несколько своих
почтовых ящиков и попробовать осуществить рассылку.
Источник: codingrus.ru