Вы, наверное, замечали: на некоторых сайтах предлагают оставить свой e-mail для того чтобы подписаться на рассылку. Вы будете получать по почте сведения о новинках сайта, и не нужно будет лезть в Интернет, чтобы посмотреть, не появилось ли там что-то новенькое. Подобный сервис мы сейчас организуем.
Проект наш будет состоять из двух сценариев и базы e-mail'ов. Один сценарий будет служить для подписки/отписки пользователей, а второй, собственно, будет осуществлять рассылку. Сначала напишем сценарий для добавления и удаления почтовых ящиков из базы. Создайте сценарий subscribe.php - для начала разработаем пользовательскую форму:
Почтовая рассылка
Подписаться на почтовую рассылку новостей сайта.
Введите свой e-mail:
Если вы уже подписаны и хотите отписаться от рассылки, то есть не получать больше писем с сайта, то вам необходимо заполнить поле ниже:
Внешний вид формы показан на рис. 1. Здесь по сути две формы - для подписки на рассылку и для отказа от нее.
Далее в сценарии мы будем проверять, какую из предложенных форм заполнил пользователь. Для начала опишем условие : if (isset($email)) //пользователь заполнил форму подписки { //проверяем введенный e-mail на корректность if (!preg_match("/^([a-z,._,0-9])+@([a-z,._,0-9])+(.([a-z])+)+$/", $email)) //если e-mail не соответствует шаблону { //выводим сообщение echo 'Неверно указан e-mail!'; echo ''; //дописываем окончание страницы 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 'Вы уже подписаны на рассылку!'; echo ''; 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 'Вы не подписаны на рассылку!'; echo ''; 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); //закрываем файл } //конец сценария ?>
Для удаления указанного почтового ящика из базы мы считываем все e-mail'ы из базы в массив. После этого методом перебора находим индекс почтового ящика, который необходимо удалить, и запоминаем его. Когда мы начинаем записывать все e-mail'ы обратно в базу, то при нахождении почтового ящика, который необходимо удалить из базы, пропускаем эту итерацию цикла и не записываем его в цикл.
Пользовательский сценарий для подписки готов, теперь создадим сценарий для себя :-) - он будет осуществлять рассылку. Для начала разработаем внешний вид формы: создайте сценарий sendmails.php и напишите в нем html-код формы:
Почтовая рассылка
На рис. 2 показан внешний вид формы. Мы вводим тему рассылки и текст, при нажатии на кнопку данное письмо будет рассылаться на все e-mail'ы, которые указаны в файле emails.dat.
Для обработки формы ниже напишите такой код: $emailfile = "emails.dat"; if (!isset($text)) //если не указан текст для рассылки { echo ""; //дописываем конец страницы exit; //выходим } //проверяем, существует ли база и можно ли с нее считывать данные if ((!File_Exists($emailfile)) || (!is_readable($emailfile)) ) { echo 'Ошибка, при работе с базой '.$emailfile; echo ''; 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 '
Все письма успешно разосланы...
'; ?>
Все, сценарий полностью готов, для проверки можете ввести несколько своих почтовых ящиков и попробовать осуществить рассылку