Рассылаем письма
Итак, определимся, что все скрипты будут находиться в корневой
директории, а файлы с данными - в каталоге data/. Каждый из листов
рассылки будет храниться в отдельном файле. Кроме этого, будет
организован log-файл, также в виде простого тестового файла. Список
листов рассылки будет храниться в файле lists.txt в каталоге data, в
каждой строке которого будет содержаться название списка и имя файла, в
котором хранятся e-mail адреса подписчиков. Поля будут разделены
символом "|". Данный файл будет использоваться для формирования
выпадающего списка в форме администрирования для манипуляции с тем или
иным списком адресов. Я сторонник обеспечения доступа к наиболее часто
используемым механизмам наиболее простым способом. Именно поэтому я
предлагаю разместить на стартовой странице форму для рассылки сообщений
участникам списка рассылки, а обеспечение доступа к остальным механизмам
администрирования организовать с помощью ссылок. Итак, предлагаю вам
взглянуть на текст приведенного ниже файла index.php. На рисунке 1
представлен результат обращения к нему через браузер.
<html><head><title>Администрирование списков рассылки</title></head> <body> <center><H2> Администрирование списков рассылки </H2></center> <form method=post action="sendemail.php"> <table> <tr align="left"> <td width="200" align="left"> <b>Адрес отправителя:</b> </td> <td align="left" width="50"> <input type=text name="From" size="40" value=""> </td> </tr> <tr> <td align="left"> <b>Тема:</b> </td> <td align="left"> <input type=text name="Subject" size="40"> </td> </tr> <tr> <td align="left"> <b>Выберите список:</b> </td> <td align="left"> <select name="List" size=1>
$groups = file("data/lists.txt"); for ($index=0; $index < count($groups); $index++) { $grouplist = split("\|", chop($groups[$index])); ?> <option value=" print $grouplist[1] ?>" if ($index==0) {print " selected ";} ?> >
print $grouplist[0] ?> </select> </td> </tr> <td align="left"> <b>Текст сообщения:</b> </td> <td align="left"> <textarea cols=50 rows=10 name="Body"></textarea> </td> </tr> </table> <input type="submit" name="Submit" value="Отправить"> </form> <a href="newlist.php">Создание нового листа списка рассылки.</a> <br><a href="addnames.php">Добавить адреса в список</a>. <br><a href="picklist.php">Модификация/удаление адресов</a>. <br><a href="data/log.txt">Просмотр журнала</a>. <br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>. </body></html>
Скорее всего, вы обратили внимание, что приведенный выше текст в
большей части представляет собой обычный HTML-код. Исключение составляют
строки, ограниченные скобками . Текст между ними и есть команды языка
PHP. Давайте рассмотрим чуть подробнее, какую именно задачу они
выполняют. В принципе, все достаточно просто. В переменную $groups
помещается содержимое файла lists.txt, находящегося в каталоге data/.
Затем в цикле происходит разделение каждой строки на поля, для чего
используется выражение
$grouplist = split("\|", chop($groups[$index]));
Из полученных названий списков и соответствующих файлов формируется
набор тегов option элемента ввода select (результат виден на рисунке 1).
Функция chop используется для удаления повторяющихся пробелов и символа
новой строки.
Для упрощения работы вы можете прямо в файле прописать текст в
элемент ввода адреса отправителя, используемого по умолчанию. Этим вы
избавите себя от необходимости вводить каждый раз один и тот же адрес.
Итак, после нажатия на кнопку "Отправить" управление вместе со
всеми введенными данными передается скрипту с именем sendemail.php. Код,
выполняющий рассылку сообщений, достаточно прост и представлен ниже:
<html><head><title>Отсылка почты...</title></head><body>
$addresses = file("data/$List"); for ($index=0; $index < count($addresses); $index++) { mail("$addresses[$index]","$Subject", "$Body","From: $From\nReply-To: $From"); } $myfile = fopen("data/log.txt","a"); fputs($myfile, $Subject."\t".date("dS of F Y h:i:s A")."\t".$List."\n"); fclose($myfile); ?> Ваше сообщение отправлено. <br><br> <a href="index.php">На главную</a>. </body></html>
Данный скрипт использует несколько весьма полезных функций. Первая -
mail(), одна из наиболее мощных и в то же время простых в использовании
функций, входящих в состав PHP. При работе Web-сервера под управлением
операционной системы UNIX при выполнении функции mail() по умолчанию
используется sendmail, однако настройку PHP можно изменить, и для
отсылки почты может использоваться любой другой механизм, указанный в
соответствующем разделе файла php.ini. Функция mail() описывается
следующим образом:
mail (string to, string subject, string message, string [additional_headers]);
В качестве значения для параметра additional_headers вы можете
указать ту информацию, которую считаете нужной, включая такие параметры,
как X-Mailer, Reply-To, CC:, Bcc, Mime-Version, также вы можете
сформировать свой собственный заголовок.
Для получения списка e-mail адресов из соответствующего файла
используется функция file(). Имя файла передается в качестве параметра
при вызове скрипта обработки данных формы. Затем осуществляется рассылка
сообщения в цикле по всем адресам.
Добавляем адреса в список рассылки
Следующий вопрос, который я хотел бы рассмотреть в данной статье, -
механизм добавления новых адресов в тот или иной список рассылки. Для
обеспечения такой возможности нам необходимо создать PHP-файл с формой
ввода адресов, а также скрипт, обрабатывающий эту информацию. Сначала
приведу текст файла addnames.php, результат работы которого представлен
на рисунке 2.
<html><head><title>Добавление адреса в список рассылки</title></head> <body> <center><H2>Добавление адреса в список рассылки</H2></center> <form method=post action="sevemail.php"> <table> <tr> <td align="left"> <b>Выберите список:</b> </td> <td align="left"> <select name="List" size=1>
$groups = file("data/lists.txt"); for ($index=0; $index < count($groups); $index++) { $grouplist = split("\|", chop($groups[$index])); ?> <option value=" print $grouplist[1] ?>" if ($index==0) {print " selected ";} ?> >
print $grouplist[0] ?> </option>
} ?> </select> </td> </tr> <tr> <td align="left"> <b>Добавляемый e-mail:</b> </td> <td align="left"> <input type=text name="Email" size="40"> </td </tr> </table> <input type="submit" name="Submit" value="Добавить адрес"> </form> <a href="newlist.php">Создание нового листа списка рассылки.</a> <br><a href="picklist.php">Модификация/удаление адресов</a>. <br><a href="data/log.txt">Просмотр журнала</a>. <br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>. </body></html>
Единственным отличием данного файла от index.php является отсутствие
полей ввода, характерных только для рассылки писем, а также имя скрипта,
которому передается управление после нажатия на кнопку "Добавить
адрес". Ниже приводится текст скрипта savemail.php.
<html><head><title>Записываем файл...</title></head><body> <br><br>
if (file_exists("data/$List")) { $myfile = file("data/$List"); $fh = fopen("data/$List","w"); for ($index=0; $index < count($myfile); $index++) { if ($Email != chop($myfile[$index])) {fputs($fh,$myfile[$index]);} } fputs($fh,$Email."\n"); fclose($myfile); } else { $myfile = fopen("data/$List","w"); fputs($myfile,$Email."\n"); fclose($myfile); } ?> <br> echo $Email ?> записан в echo $List ?> <br><br> <a href="index.php">На главную</a>. </body></html>
Рассмотрим задачи, выполнение которых должен обеспечить данный
скрипт. Во-первых , проверка существования файла со списком адресов. Это
делается с помощью функции file_exists. Если файла с указанным именем
не существует, это означает, что добавляемый нами адрес - первый в
списке. В этом случае просто создаем новый файл и записываем в него
e-mail-адрес. В противном случае после чтения уже сформированного списка
в массив следует добавить переданный из формы e-mail адрес, однако
прежде стоит посмотреть, не введен ли он раньше, т.к. ни один из адресов
не должен дублироваться. Это, в частности, может быть осуществлено в
цикле по всем элементам массива. В данном случае файл со списком будет
открыт на чтение, и в него будут записаны все адреса, не совпадающие со
вновь записываемым. Обратите внимание, что функция открытия файла fopen в
качестве второго параметра использует значение "w". Это означает, что
файл открывается для записи в него данных. Значение "r" означало бы
открытие файла на чтение, "a" - для добавления информации к существующим
данным. Формат вызова функции fopen выглядит следующим образом:
fopen (filename, mode)
Обратите внимание на следующий нюанс: если вы собираетесь открывать
файл одновременно для чтения и записи, вам следует предусмотреть
возможность некорректного завершения работы скрипта. После открытия
файла следует прочитать все его содержимое в массив и все модификации
осуществлять с данными в памяти. Только после обработки всех данных
можно снова открыть файл, теперь уже на запись, и поместить в него
модифицированную информацию.
Рассмотренный нами механизм добавления e-mail адресов во многом
неидеален. Например, вместо одного адреса можно обеспечить ввод сразу
нескольких. Для этого достаточно лишь изменить описание формы в файле
addnames.php, а также немного подкорректировать код обработки
передаваемых в savemail.php данных. Кроме того, можно осуществлять
проверку корректности ввода e-mail адреса по некоторому шаблону
(например, наличие символа "@" внутри строки). Я не буду углубляться в
детали, т.к. это может занять много времени, тем более что моей целью на
данный момент является демонстрация возможностей языка PHP, а также
того, что задача создания такого мощного механизма, как система
управления списками рассылок, не так уж и сложна. Однако предлагаю
перейти к следующему этапу - созданию новых списков рассылки. Как и в
предыдущем случае, для этого необходимо создать два файла, первый из
которых будет содержать форму ввода исходных данных, а второй будет эти
данные обрабатывать. Назовем эти файлы newlist.php и makenewlist.php
соответственно.
newlist.php: <html><head><title>Создание нового списка рассылки</title></head> <body> <center><H2>Создание нового списка</H2></center> <form method=post action="make-newlist.php"> <table> <tr> <td align="left"> <b>Название списка:</b> </td> <td align="left"> <input type=text name="Listname" size="40"> </td> </tr> <tr> <td align="left"> <b>Описание(одно слово):</b> </td> <td align="left"> <input type=text name="Filename" size="40"> </td> </tr> </table> <input type="submit" name="Submit" value="Записать"> </form> <br><a href="addnames.php">Добавить адреса в список</a>. <br><a href="picklist.php">Модификация/удаление адресов</a>. <br><a href="data/log.txt">Просмотр журнала</a>. <br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>. </body></html> makenewlist.php: <html><head><title>Создание файла...</title></head><body>
$Filename = $Filename.".lst"; $myfile = fopen("data/lists.txt","a"); fputs($myfile,$Listname."|".$Filename."\n"); fclose($myfile); ?> Создан список рассылки echo $Listname ?>.<br> <br> <a href="index.php">На главную</a>. </body></html>
Легко заметить, что скрипт makenew-list.php выполняет только одну
функцию - добавление названия списка и имени соответствующего файла в
lists.txt.
Редактирование адресов
Для редактирования e-mail адресов списка рассылки в качестве простого
и, тем не менее, эффективного решения можно использовать прямое
редактирование текста соответствующего файла. В первую очередь у нас
должна быть форма, в которой мы будем выбирать редактируемый список
рассылки. Ниже приведен текст соответствующего файла. Как видно, он не
очень-то отличается от предыдущих файлов с формами и приводится здесь
исключительно с целью демонстрации простоты разработки такого типа форм
(для тех читателей, кто пока еще не является профессионалом в
php-программировании).
<html><head><title>Редактирование адресов</title></head> <body> <center><H2>Редактирование адресов</H2></center> <form method=post action="editnames.php"> <table> <td align="left"> <b>Выберите список:</b> </td> <td align="left"> <select name="List" size=1>
$groups = file("data/lists.txt"); for ($index=0; $index < count($groups); $index++) { $grouplist = split("\|", chop($groups[$index])); ?> <option value=" print $grouplist[1] ?>" if ($index==0) {print " selected ";} ?> >
print $grouplist[0] ?> </option>
} ?> </select> </td> </tr> </table> <input type="submit" name="Submit" value="Редактировать"> </form> <a href="newlist.php">Создание нового листа списка рассылки.</a> <br><a href="addnames.php">Добавить адреса в список</a>. <br><a href="data/log.txt">Просмотр журнала</a>. <br><a href="autoresponder.php"> Просмотр/редактирование автоответчика</a>. </body></html>
Теперь, когда первая форма создана, следует написать скрипт,
выводящий на экран содержание списка рассылки. Для этого мы читаем
содержимое файла, соответствующего выбранному листу, а затем помещаем
его содержимое в элемент ввода типа textarea:
<html><head><title>Редактирование адресов</title></head><body> <form method=post action="writenamefile.php"> <br> Редактируем echo $List ?>. <br><br>
Отредактируйте существующие адреса или исключите из списка, удалив всю строку.
<b>Пустые строки не допускаются!</b> <br><br><textarea cols=50 rows=20 name="Body">
if (file_exists("data/$List")) {readfile("data/$List");} ?> </textarea> <br><br> <input type="hidden" name="List" value=" echo $List ?>"> <input type="submit" name="submit" value="Сохранить"></FORM> <br> <a href="index.php">На главную</a>. </body></html>
Обратите внимание на то, каким образом мы передаем в скрипт writenamefile.php имя файла со списком адресов:
<input type="hidden" name="List" value=" echo $List ?>">
Хочу также упомянуть о функции, которую мы использовали для передачи
содержимого файла непосредственно в форму: readfile(). В данном файле
отсутствуют какие-либо проверки (в частности, на корректность адресов).
При разработке своих собственных скриптов вы могли бы реализовать такого
рода механизмы с использованием, к примеру, JavaScript. Результат
работы скрипта editnames.php представлен на рисунке 3.
Следующим шагом будет разработка скрипта, отвечающего за запись
отредактированных данных в файл. Здесь все очень просто: получаем данные
из элемента ввода типа textarea (переменная $Body) и записываем его
содержимое в файл:
<html><head><title>Сохраняем изменения...</title></head><body> <br><br> Изменения сохранены в списке echo $List ?>.<br>
$myfile = fopen("data/$List","w"); fputs($myfile,$Body); fclose($myfile); ?> <br> <a href="index.php">На главную</a> </body></html>
Автоответчик
В рамках нашего сегодняшнего разговора под автоответчиками будем
понимать механизм, высылающий пользователю по электронной почте
сообщение после завершения некоторого действия. К примеру, этим событием
может быть подписка посетителя к рассылке. Для редактирования текста
сообщения, высылаемого скриптом-автоотчетчиком, может использоваться та
же технология, что и при редактировании списка адресов. Во-первых,
создаем форму для редактирования сообщения:
autoresponder.php: <html><head><title>Настройка автоответчика</title></head><body> <form method=post action="writeautoresponder.php"> <br>
Ниже представлено автоматическое сообщение, высылающееся пользователям, подписавшимся на рассылку для администраторов.
<br><br> <textarea cols=70 rows=20 name="Body"> readfile("data/autoresponder.txt"); ?> </textarea> <br><br> <input type="submit" name="submit" value="Сохранить изменения"></FORM> <br> </body></html>
Во-вторых, пишем скрипт, сохраняющий в соответствующем файле (autoresponder.txt) произведенные администратором изменения.
writeautoresponder.php
<html><head><title>Сохраняем изменения...</title></head><body> <br><br> <b>Сохранено следующее сообщение, использующееся автоответчиком:</b><br>
$myfile = fopen("data/autoresponder.txt","w"); fputs($myfile,$Body); fclose($myfile); ?> <br> <pre> echo $Body ?> </pre><br> <br> <a href="index.php">На главную</a>
Теперь следует обеспечить возможность подписки посетителей к списку
рассылки. Для этого создадим HTML-файл примерно со следующим
содержанием:
<b>Получать новости сервера для администраторов на e-mail:</b><br> <form method="post" action="thanks.php"> <input type="text" name="Email" size="20"> <input type="hidden" name="List" value="admins.txt"> <input type="submit" Value="Подписаться"></form>
Результат обращения к этому файлу из окна броузера представлен на
рис. 4. Последним на сегодня будет скрипт помещения нового e-mail-адреса
в соответствующий лист рассылки. В нашем случае файл листа имеет имя
"admins.txt" (обратите внимание на скрытый параметр List). Код скрипта
thanks.php приводится ниже:
<html><head><title>Спасибо!</title></head><body>
$Body = readfile("data/autoresponder.txt"); mail("$Email","Подписка на рассылку","$Body","From: Me\nReply-To: me@myaddress.com"); $myfile = file("data/admins.lst"); $fh = fopen("data/admins.lst","w"); for ($index=0; $index < count($myfile); $index++) { if ($Email != chop($myfile[$index])) {fputs($fh,$myfile[$index]);} } fputs($fh,$Email."\n"); fclose($fh); ?> Спасибо за то, что подписались на нашу рассылку! <br><br> </body></html>
Вот и все. Теперь, я надеюсь, у вас появилась возможность разрабатывать собственные списки рассылки.
Заключение
Рассмотренный нами выше вариант организации списков рассылок не
является идеальным. Всегда есть необходимость что-нибудь подправить. В
частности, при вводе информации можно было бы организовать проверки
данных при помощи JavaScript'ов. Кроме того, использование в качестве
хранилищ данных не плоских файлов, а базы данных MySQL может сделать эти
скрипты более производительными, особенно если вы предполагаете
создавать рассылки для большого количества клиентов. Тем более, что
делается это просто - вместо команд записи/чтения в файл используются
SQL-запросы к БД.
Я надеюсь, что смог продемонстрировать вам мощь и простоту языка
PHP, тем более, что даже приведенные выше скрипты, при небольшой
модернизации, могут быть использованы для совершенно различных задач.
|