Управление контентом с помощью Procmail

Авторы: (C) Прадип Падала [Pradeep Padala] и Пракаш Булусу [Prakash Bulusu]
Перевод: (C) Сергей Скороходов


"Прекрасное -- в малом"
         -- философия Unix

Введение

Когда-нибудь задавались вопросом, трудно ли создать веб-сайт, которым можно "рулить" исключительно по e-mail? Вы -- фанат электронной почты, который хотел бы все на свете делать через "емелю"? Вы как раз тот парень, который хочет сделать что-то иначе, не так, как все? Если вы ответили "да" хотя бы на один вопрос, то читайте дальше...

Вам интересно, как специальный корреспондент CNN посылает репортаж из отдаленнейшей точки Земли и заставляет веб-страницу отразить его последние сообщения? Или как "дот-ком" газеты ежедневно обновляют и изменяют сотни HTML страниц? Это достигается благодаря концепции под названием Система Управления Содержанием (или, как теперь принято говорить по отношению к веб-сайтам и т.д. -- Система Управления Контентом) [Content Management System или CMS].

Управление контентом -- одна из самых серьезных проблем, которую приходится решать каждому веб-сайту, от маленьких сайтов с крохотной нагрузкой до так называемых "интенсивно-содержательных" [ content-intensive], сайтов со значительным количеством постоянно и часто меняющейся информации-контента. Минимальное требование к системе управления содержанием -- "дружелюбный" интерфейс для изменения веб-контента. Развитая CMS может гораздо больше: не только предоставляет возможности по созданию, модификации и удалению содержания сайта, но и выполняет функцию системы контроля версий, ролевой иерархии, многоканальных управления и доставки контента и т.д. В этой статье мы поговорим об относительно новом канале управления веб-контентом, который, тем не менее, прекрасно известен читателям: об электронной почте! Хотя этот канал используется такими коммерческими CMS, как Vignette, эти решения довольно дороги и продаются с оплатой каждой отдельной функции.

Если только что прочитанные абзацы были для вас китайской грамотой, то это значит -- вы Подходящий Читатель для этой статьи. Вперед и вы узнаете о самой простой из всех возможных реализации системы управления веб-контентом, основанной на электронной почте. Эта реализация использует Procmail.

Мы покажем, что веб-страницу можно обновить, просто послав электронное сообщение на определенный адрес. Мы воспользуемся для примера страницей http://www.cise.ufl.edu/~ppadala/procmail.html (для того, чтобы увидеть ее в браузере как надо, нужно разрешить Javascript). Весь ее "контент" -- бегущая строка. Мы будем обновлять текст этой бегущей строки по получению электронного сообщение с правильным полем subject!!!

Я посмотрел эту страницу в Opera и в Mozilla 0.9.7. В Oper'е бегущая строка "не бежала", но, по крайней мере, была видна (т.е. был ее текст был виден целиком и сразу). В Mozill'е бегущей строки просто не было видно, возможно, я что-то неверно настроил и такие бегущие строки "подавлялись" браузером. И только в IE5.5 все было нормально:( -- прим. пер.

procmail

А при чем здесь Procmail? Procmail следует философии UNIX: одна программа выполняет одну задачу, и делает это эффективно. По своей сути Procmail является удивительно мощной утилитой фильтрации почты. Все, что надо сделать -- написать рецепты, которые будут выполняться по прибытии электронной почты определенного типа. Обычно Procmail используют для того, чтобы раскладывать входящую почту по отдельным директориям. Говоря словами разработчиков:

Procmail можно использовать для создания почтовых серверов, списков рассылки, сортировки входящей почты по папкам или файлам (большое удобство для тех,кто подписан на один или несколько списков рассылки или для того, кто хочет рассортировать почту в соответствии с какими-либо приоритетами), предварительной обработки почты, запуска программ по прибытии почты (т.е. создания на вашей рабочей станции разных "звонков", оповещающих о прибытии разного вида электронной почты) или избирательно направлять определенную почту куда-либо.

Если вы не все поняли из сказанного -- не паникуйте. Просто откиньтесь на спинку стула и расслабьтесь. Вскоре мы приведем элементарные примеры того, как это работаем и объясним изящный способ обновления бегущей строки на вашей веб-странице.

Лиха беда начало

Как уже говорилось, Procmail -- утилита фильтрации электронной почты. Он может запускаться по прибытии каждого сообщения и соответствующим образом его обрабатывать. Скажем, вы хотите, чтобы каждое сообщение с темой discuss сохранялось в папке по имени discuss. Тогда вам надо сделать так:

Создайте в своей домашней директории файл .forward следующей строкой:

"|IFS=' ';exec /usr/local/bin/procmail USER=<username>"

Замените usrname вашим регистрационным именем и убедитесь, что путь к procail'у указан верно. Не беспокойтесь о деталях. В следующей секции мы в них вникнем подробнее.

Создайте в вашей домашней директории файл .procmailrc и поместите в него следующие сроки:

 :0
 * ^Subject:.*discuss
 discuss

Для писем с темой discuss создайте в своей домашней директории папку discuss.

Теперь попробуйте послать себе письмо, в котором будет содержаться по крайней мере слово "discuss" в поле темы. Это сообщение будет автоматически помещено в директорию discuss.

Давайте попытаемся понять, что происходит. Когда почта посылается серверу smtp он, с помощью MDA (Mail Delivery Agent -- Агент Доставки Почты, например sendmail) доставит ее соответствующему ползователью. Эта программа ищет файл с имененем .forward: если он существует, то она пытается выполнить указанные там правила. Обычно в .forward содержится адрес, на которую должна пересылаться вся почта. В этом файле можно писать команды для запуска программ, таких как Procmail. Именно это и делает строка в приведенном примере файла .forward. Более подробное изложение того, что можно помещать в .forward можно посмотреть на http://www.ling.helsinki.fi/users/reriksso/procmail/mini-faq.html#forward. При запуске Procmail ищет файл .procmailrc, содержащий инструкции по обработке почты -- какие действия надо произвести над сообщениями различного типа.

Файл .procmailrc

Этот файл содержит правила, по которым фильтруется почта. В примере, показанном выше, правило говорит, что вся почта с темой discuss направляется в директорию по имени discuss. Общий синтаксис для написания правил (называемых на жаргоне Procmail рецептами) таков:

 :0 [флаги] [ : [locallockfile] ]
 <ноль или более условий (по одному на каждой строке)>
 <в точности одна команда>

Первую строку можно пока проигнорировать. Начиная со второй строки вы можете вставлять условия. Условие, начинающееся с '*' указывает на расширенное регулярное выражение, соответствие которому будет искаться. В случае соответствия быдет выполнена команда в последней строке [action line]. Для того, чтобы перенаправить сообщение на другой адрес, используйте символ '!'. Если строка с командой не начинается ни с этих двух символов, ни с символа '{', то предполагается, что это имя директории или файла, в которые должно быть доставлено сообщение, как это показано в примере.

Еще один пример рассеет туман.

 :0 c
 * ^Subject:.*discuss
 discuss

 :0
 * ^Subject:.*discuss
 ! [email protected]

Этот рецепт "форвардит" почту на адрес [email protected] и сохраняет копию в директории discuss. Флаг 'c' в первой строфе указывает Procmail'у продолжить чтение рецептов даже после нахождения соответствия. Обычно Procmail прекращает обработку после нахождения первого соответствия. Руководство по procmailrc сообщает, что 'c' создает копию [carbon copy] сообщения, но легче думать, что 'c' означает "continue" -- продолжить. И то и другое приводит к одинаковому результату. Еще один полезный, но неверно названный флаг -- 'D', который указывает, что поиск соответствия должно быть чуствительно к регистру.

Следующий пример показывает использование '|':

 :0
 * ^Subject:.*discuss
 | formail -I "" >> index.html

Если поступает сообщение с темой discuss, выполняется formail: небольшая утилита, используемая для форматирования почты. Приведенная action line выделяет из сообщения тело и добавляет его к файлу index.html.

Готовы приступить?

Вы увидели несколько основных примеров. В Сети можно найти множество информации по рецептам Procmail. Ссылки можно найти в секции, посвещенной дополнительным ресурсам. В следующих абзацах мы покажем, как можно использовать Procmail для обновления бегущей строки на веб-странице.

В .procmailrc мы добавим следующие строки. В текстовом формате этот файл можно взять на http://gazette.linux.ru.net/lg73/articles/misc/padala/procmailrc.txt.
 SHELL=/bin/sh
 PATH=/bin:/usr/bin:/usr/local/bin

 :0
 * ^Subject:.*announce
 | formail -s parse.pl announce;

 :0
 * ^Subject:.*notice
 | formail -s parse.pl notice;

Первые строки устанавливают некоторые переменные для того, чтобы Procmail правильно работал. За деталями обращайтесь к руководству по procmail.

Сообщения, содержащие "announce" или "notice" в поле subject, перенаправляются formail, который проводит разбор сообщений и каждое отдельное сообщение передается скрипту parse.pl. Скрипт на Perl заменяет текст бегущей строки на строку из тела сообщения. Сам скрипт можно взять на http://gazette.linux.ru.net/lg73/articles/misc/padala/parse.pl.txt.

#!/bin/perl

$option = $ARGV[0];                                 # Получим опцию
$my_html_dir = "/cise/homes/ppadala/public_html";   # Моя веб-директория
$tmp_file = "/tmp/tmp.out";
$start = 0;     #start равняется false(0) до того момента, пока мы не достигнем начала сообщения
$line = "";     #Текст бегущей строки

if($option eq "announce") {
    $line = "ANNOUNCEMENTS:";
}
elsif($option eq "notice") {
    $line = "NOTICE:";
}
else {
    exit(1);
}

#Читаем вход. В данном случае это сообщения
#Находим тело сообщения и добавляем его тело к строке

while()
{ chomp;

 if(/From.*/) {
  $start = 0;
 }
 if($start == 1) {
  chomp;
  $line = $line . $_;
 }
 if($_ eq "") {
  $start = 1;
 }
}

#Открываем веб-страницу с бегущей строкой
#и обновляем ее

$my_homepage_file = $my_html_dir . "/procmail.html";
open(MY_FILE, "<$my_homepage_file") || die("Cannot open input file");
open(TMP, ">$tmp_file");

$replace = 0;

#Замена производится сразу после строки
# //Replace strStreamer .....

while()
{ if($replace == 1) {
  print TMP "var strStreamer = '${line}';\n";
  $replace = 0;
  next;
 }

 if(/\/\/Replace str.*/) {
  $replace = 1;
  print TMP $_;
 }
 else  {
  print TMP $_;
 }
}

close(TMP);
close(MY_FILE);
system("mv $tmp_file $my_homepage_file");
system("chmod go+r $my_homepage_file");

Все, что делает скрипт -- обновление на веб-странице переменной strStreamer. Страница содержит бегущую строку, реализованную на javascript. Вы можете проверить это, послав сообщение mailto:[email protected]?subject=announce?body=LinuxGazetteTest. Это можно будет увидеть на http://www.cise.ufl.edu/~ppadala/procmail.html. Страница волшебным образом обновится, как только вы mailto:[email protected]?subject=announce?body=LinuxGazetteTest с темой "annonce" или "notice". Текст тела сообщения станет бегущей строкой.

Заключение

Мы показали маленький пример Управления Контентом. Собственно, управление содержанием [content management] -- это очень обширная тема с множеством направлений и ответвлений. Для обновления веб-страниц требуются хорошо спланированные процедуры, сохраняющие нетронутыми таблицы стилей и т.д. Пример лишь показывает, насколько легко создать элементарную систему управления контентом с помощью Procmail. Возможности изменений и развития этой схемы безграничны. Как сказал Декарт: "Недостаточно иметь хороший ум. Главное -- хорошо его использовать".

Дополнительные ресурсы


Прадип Падала [Pradeep Padala]

Я учусь на мастерской программе в Флоридском Университете. Я люблю "хачить" и обожаю Linux. Еще я люблю разгадывать головоломки и играть в шахматы и т.д. Связаться со мной можно по адресу [email protected] или через мою веб-страницу.

Пракаш Булусу [Prakash Bulusu]

Я тоже учусь на мастерской программе во Флоридском Университете.


Copyright (C) 2001, Pradeep Padala and Prakash Bulusu.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 73 of Linux Gazette, December 2001

Команда переводчиков:

Владимир Меренков, Александр Михайлов, Иван Песин, Сергей Скороходов, Александр Саввин, Роман Шумихин