Вы, наверное, замечали: на некоторых сайтах предлагают оставить свой 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>
Здесь по сути две формы - для подписки на рассылку и для отказа от нее.
Далее в сценарии мы будем проверять, какую из предложенных форм заполнил пользователь. Для начала опишем условие <если пользователь решил подписаться на рассылку>:
<?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>
Мы вводим тему рассылки и текст, при нажатии на кнопку <Разослать> данное письмо будет рассылаться на все e-mail'ы, которые указаны в файле emails.dat.
Для обработки формы ниже напишите такой код:
<?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>
Все, сценарий полностью готов, для проверки можете ввести несколько своих почтовых ящиков и попробовать осуществить рассылку.