| Разработка собственных листов рассылки |
|
|
|
|
Существует множество способов применения таких механизмов, как листы рассылки: от сообщений пользователям об обновлениях вашего сайта до информирования заинтересованных людей об изменениях, осуществленных вами в процессе работы над некоторым проектом. Однако поддержка такого сложного механизма, как список рассылки, вручную, без соответствующих программных решений, может представлять собой достаточно трудоемкий процесс. В то же время, разработка скриптов, позволяющих вам легко администрировать лист рассылки любой сложности, а посетителям без вашего участия подписываться или отписываться от тех или иных новостей, не является неразрешимой задачей даже для неискушенного в Internet-программировании человека. Администрирование списков рассылкиСоздание нового листа списка рассылки. Добавить адреса в список. Модификация/удаление адресов. Просмотр журнала. Просмотр/редактирование автоответчика. Скорее всего, вы обратили внимание, что приведенный выше текст в большей части представляет собой обычный HTML-код. Исключение составляют строки, ограниченные скобками . Текст между ними и есть команды языка PHP. Давайте рассмотрим чуть подробнее, какую именно задачу они выполняют. В принципе, все достаточно просто. В переменную $groups помещается содержимое файла lists.txt, находящегося в каталоге data/. Затем в цикле происходит разделение каждой строки на поля, для чего используется выражение $grouplist = split("\|", chop($groups[$index])); Из полученных названий списков и соответствующих файлов формируется набор тегов option элемента ввода select (результат виден на рисунке 1). Функция chop используется для удаления повторяющихся пробелов и символа новой строки. Для упрощения работы вы можете прямо в файле прописать текст в элемент ввода адреса отправителя, используемого по умолчанию. Этим вы избавите себя от необходимости вводить каждый раз один и тот же адрес. Итак, после нажатия на кнопку "Отправить" управление вместе со всеми введенными данными передается скрипту с именем sendemail.php. Код, выполняющий рассылку сообщений, достаточно прост и представлен ниже: $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); ?> Ваше сообщение отправлено. Данный скрипт использует несколько весьма полезных функций. Первая - 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. Добавление адреса в список рассылкиСоздание нового листа списка рассылки. Модификация/удаление адресов. Просмотр журнала. Просмотр/редактирование автоответчика. Единственным отличием данного файла от index.php является отсутствие полей ввода, характерных только для рассылки писем, а также имя скрипта, которому передается управление после нажатия на кнопку "Добавить адрес". Ниже приводится текст скрипта savemail.php. 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); } ?> записан в Рассмотрим задачи, выполнение которых должен обеспечить данный скрипт. Во-первых , проверка существования файла со списком адресов. Это делается с помощью функции 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: Создание нового спискаДобавить адреса в список. Модификация/удаление адресов. Просмотр журнала. Просмотр/редактирование автоответчика. makenewlist.php: $Filename = $Filename.".lst"; $myfile = fopen("data/lists.txt","a"); fputs($myfile,$Listname."|".$Filename."\n"); fclose($myfile); ?> Создан список рассылки . Легко заметить, что скрипт makenew-list.php выполняет только одну функцию - добавление названия списка и имени соответствующего файла в lists.txt. Редактирование адресов Для редактирования e-mail адресов списка рассылки в качестве простого и, тем не менее, эффективного решения можно использовать прямое редактирование текста соответствующего файла. В первую очередь у нас должна быть форма, в которой мы будем выбирать редактируемый список рассылки. Ниже приведен текст соответствующего файла. Как видно, он не очень-то отличается от предыдущих файлов с формами и приводится здесь исключительно с целью демонстрации простоты разработки такого типа форм (для тех читателей, кто пока еще не является профессионалом в php-программировании). Редактирование адресовСоздание нового листа списка рассылки. Добавить адреса в список. Просмотр журнала. Просмотр/редактирование автоответчика. Теперь, когда первая форма создана, следует написать скрипт, выводящий на экран содержание списка рассылки. Для этого мы читаем содержимое файла, соответствующего выбранному листу, а затем помещаем его содержимое в элемент ввода типа textarea: Обратите внимание на то, каким образом мы передаем в скрипт writenamefile.php имя файла со списком адресов: Хочу также упомянуть о функции, которую мы использовали для передачи содержимого файла непосредственно в форму: readfile(). В данном файле отсутствуют какие-либо проверки (в частности, на корректность адресов). При разработке своих собственных скриптов вы могли бы реализовать такого рода механизмы с использованием, к примеру, JavaScript. Результат работы скрипта editnames.php представлен на рисунке 3. Следующим шагом будет разработка скрипта, отвечающего за запись отредактированных данных в файл. Здесь все очень просто: получаем данные из элемента ввода типа textarea (переменная $Body) и записываем его содержимое в файл: Изменения сохранены в списке . $myfile = fopen("data/$List","w"); fputs($myfile,$Body); fclose($myfile); ?> Автоответчик В рамках нашего сегодняшнего разговора под автоответчиками будем понимать механизм, высылающий пользователю по электронной почте сообщение после завершения некоторого действия. К примеру, этим событием может быть подписка посетителя к рассылке. Для редактирования текста сообщения, высылаемого скриптом-автоотчетчиком, может использоваться та же технология, что и при редактировании списка адресов. Во-первых, создаем форму для редактирования сообщения: autoresponder.php: Во-вторых, пишем скрипт, сохраняющий в соответствующем файле (autoresponder.txt) произведенные администратором изменения. writeautoresponder.php Сохранено следующее сообщение, использующееся автоответчиком: $myfile = fopen("data/autoresponder.txt","w"); fputs($myfile,$Body); fclose($myfile); ?> Теперь следует обеспечить возможность подписки посетителей к списку рассылки. Для этого создадим HTML-файл примерно со следующим содержанием: Получать новости сервера для администраторов на e-mail: Результат обращения к этому файлу из окна броузера представлен на рис. 4. Последним на сегодня будет скрипт помещения нового e-mail-адреса в соответствующий лист рассылки. В нашем случае файл листа имеет имя "admins.txt" (обратите внимание на скрытый параметр List). Код скрипта thanks.php приводится ниже: $Body = readfile("data/autoresponder.txt"); mail("$Email","Подписка на рассылку","$Body","From: Me\nReply-To: Данный адрес e-mail защищен от спам-ботов, Вам необходимо включить Javascript для его просмотра. "); $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); ?> Спасибо за то, что подписались на нашу рассылку! Вот и все. Теперь, я надеюсь, у вас появилась возможность разрабатывать собственные списки рассылки. Заключение Рассмотренный нами выше вариант организации списков рассылок не является идеальным. Всегда есть необходимость что-нибудь подправить. В частности, при вводе информации можно было бы организовать проверки данных при помощи JavaScript'ов. Кроме того, использование в качестве хранилищ данных не плоских файлов, а базы данных MySQL может сделать эти скрипты более производительными, особенно если вы предполагаете создавать рассылки для большого количества клиентов. Тем более, что делается это просто - вместо команд записи/чтения в файл используются SQL-запросы к БД. Я надеюсь, что смог продемонстрировать вам мощь и простоту языка PHP, тем более, что даже приведенные выше скрипты, при небольшой модернизации, могут быть использованы для совершенно различных задач. Автор: Сергей Кривошеев По материалам сайта: http://codingrus.ru/
|



