SWRUS Shareware Russia

Проект новой технической базы рассылок SWRUS

 
drawing_image.jpg (9.67 KB)
Изначально предполагалось, что данный проект будет осуществлен "спонсорским порядком", т.е. нанятыми спонсором людьми. Однако поступило несколько предложений на предмет того, что разработку следует вести открыто и силами добровольцев из числа Сврус. В связи с этим проект здесь и публикуется. Если вы хорошо разбираетесь в PHP/MySQL и хотели бы принять участие в разработке, пожалуйста, отмечайтесь в комментариях.

Почему вообще что-то нужно писать? Для тех, кто все пропустил, вкратце повторяем содержание предыдущих серий. Часть подписчиков предпочитает получать рассылку почтой, часть - через NNTP, остальные - в виде форума или другого веб-интерфейса. Соответственно, идеальным решением является предоставление всех этих вариантов одновременно. Никаких принципиальных проблем тут нет. Тем не менее, в ходе проведенных исследований было выяснено, что готовых решений, удовлетворяющих нашим требованиям просто не существует. Мы даже рассылки не смогли бы сделать, используя готовый софт, хотя бы в том виде, как они у нас сейчас работают на yahoogroups.

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

Таким образом мы приходим к тому, что во всех отношениях лучше иметь собственное ядро, интерфейсами к которому будут служить любые движки рассылок, NNTP, форумы и проч. Но модерирование, редактирование профиля, управление подпиской будет происходить с помощью единой контрольной панели. А все сообщения будут фильтроваться и переправляться на различные ресурсы единым мейл-гейтом.


ТЗ

PHP5/MySQL 4.1.x

Стркутура базы данных.

Кодировка всех данных - UTF8.

Users. Таблица содержит профили пользователей, предпочтения, статусы, идентификаторы групп, инф-ию о подписке и публичный ключ для идентификации.

Groups. Таблица содержит названия групп пользователей и их идентификаторы.

Lists. Таблица содержит информацию о списках рассылки.

Messages. Таблица содержит тела сообщений и некоторую доп. информацию, взятую из заголовков: отправитель, сабжект, время получения, референсы и т.д.

ClosedThreads. Таблица содержит инф-ию о тредах, закрытых модераторами.


Оболочка WEB-интерфейса.

Авторизация через куки. Предоставление остальным скриптам экземпляра объекта User. Форма регистрации (captcha). Валидация e-mail (отсылка на указанный адрес кастомной ссылки). Форма сброса пароля.

Пользовательская контрольная панель.

Редактирование профиля. Просмотр списка Lists и управление подпиской. Подписаться/отписаться, тип подписки (отдельные письма|дайджест|не e-mail).

Модераторская контрольная панель.

Пользователь считается модератором определенного листа, если принадлежит к группе вида GroupID-Moderator.

Просмотр списка Lists, на модерирование которых у данного пользователя есть права. Просмотр списка подписчиков каждого списка рассылки. Наложение взысканий из списка допустимых: ban, read-only(неделя, месяц). При наложении read-only в соотв. поле таблицы Users записывается дата окончания.

При саморегистрации на сайте, подписчику присваивается группа "Registered", которая позволяет читать открытые рассылки в режиме рид-онли. Модераторы проверяют профиль нового подписчика и в случае, если он удовлетворяет требованиям для подписки, переводят его в группу "Members", которая дает доступ к member-only ресурсам, а также права на постинг.

Просмотр списка тредов (выборка из таблицы Messages согласно references). Операции "Close Thread" и "Delete Thread". В тред, закрытый модератором, невозможно больше ничего написать. Он становится read-only для всех. Удаленный тред удаляется вообще из архива сообщений как не несущий смысловой нагрузки, либо как порочащий чью-то репутацию через распространение неправдивых сведений и т.п.

Гейт

Это консольный скрипт, который на входе получает письмо из stdin. Письмо парсится на mime составляющие штатными методами.

Определяется List назначения. Отправитель идентифицируется либо цифровой подписью, либо тем, что письмо отправлено через Web-интерфейс, либо (в особо тяжелых случаях, когда оба метода недоступны) верификацией адреса отправителя (высылается письмо с одноразовым паролем и нужно просто reply нажать для подтверждения).

Проверяются права отправителя на постинг в данный List. Если есть взыскание, срок которого истек, взыскание автоматически снимается.

Проверяется оформление письма. Если явно указана какая-нибудь кириллическая кодировка, то письмо конвертируется из этой кодировки в UTF8. Если кодировка не указана, считается что это KOI8. Отрезается подпись. Проверка на оверквотинг (макс. кол-во подряд идущих строк со значком ">" в первых пяти позициях). Проверка на соотв. сабжекта референсам и наоборот (чтобы треды не "ломались").

Проверяются аттачи на допустимые типы и размер.

Письмо проверяется на наличие комманд. Если письмо подписано модератором листа назначения (идентификация цифр. подписью) и содержит комманду в установленном формате, то выполняется комманда. Например, модератор нажимает Reply на каком-то письме и пишет:

From: Moderator <petya@gmail.com>
To: Vasiliy Pupkin <swrus-general@swrus.com>
Subject: Re: Ацтой!

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

Предупреждение за двусмысленные намеки, которые могут быть неверно истолкованы.[READONLY(7)]


Получив такое сообщение, гейт ставит неделю рид-онли на того, чье имя указано в To.

После того, как письмо прошло все проверки, оно заносится в базу. Далее гейт существляет постинг в лист, nntp и пр. Письмо в список рассылки формируется на основе записи из таблицы Messages. Оно перекодируется из UTF8 в KOI8. From формируется на основании полного имени, указанного в профиле, независимо от того, что подставляет во From текущий почтовый клиент подписчика. Аналогично с подписью. Вначале вставляется полное имя и ссылка на сайт, а затем несколько произвольных строк, заданных подписчиком в профиле. Возможен вывод некоторой доп. инф-ии, как на форумах. Например, дата регистрации, кол-во постингов и пр.

Понятно, что перечисленное - это еще не окончательный вариант. Необходим еще целый ряд доп. функций. Но это тот минимум, который нам необходим для переезда на новую платформу.