messarge(1)

NAME
messarge - ведение индексов почтовых ящиков

SYNOPSIS
mesdbc -c [-f <mailbox>] [-z <string's space>] [-N <N>] [-L <list quantity>] [-l <list number>]... [-u] [-n] [-v] <file IDX>
mesdbc -m [-f <mailbox>] [-z <string's space>] [-N <N>] [-L <list quantity>] [-l <list number>]... [-u] [-n] [-v] <file IDX> <old file IDX>
mesdbc -u [-m] [-v] <file IDX>
mesdbc -a [-m] [-v] <file IDX>
mesarc [-v] [-w] [-u] [-t] [-i] [-c] [-b] [-s <secs>] [-f <format>] [-L <string>] [-R <string>] [-T <string>] [-B <string>] [-E <string>] [-l <list number>]... <file IDX> [<message numbers>]...
mestun [-v] -t <window size> <file IDX>
mestun [-v] -m <file IDX>
mestun [-v] -c <file IDX> <file IDX with new indexing times>
mestun [-v] -l <list number> <file IDX> [<message numbers>]...
mestun [-v] -p <file IDX> <message numbers>...
mesraw [-]? [-n] [-q] [-f] [-s] [-t] [-c] [-b] [-d] [-r] [-i]

DESCRIPTION
Messarge - это комплект программ для индексирования почтовых ящиков с тем, что бы потом можно было быстро получить выборку, или оглавление, или письмо, или содержимое аттача в декодированном виде.

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

mesarc предназначен для вывода информации из индекса и из индексированного почтового ящика.

mestun используется для модификации параметров в отдельных записях индекса

mesraw вспомогательная программа, предназначена для исследования почтовых ящиков. Ее можно использовать для разметки писем из ящика на основе каких либо признаков писем.

Первым применением messarge стал WWW интерфейс к списку рассылки.

Индексы строятся программой mesdbc , которая в зависимости от параметров может построить новый файл индексов, достроить уже существующий, перестроить ссылки во всем индексном файле, или полностью пересобрать индекс. В индексе хранится информация о том, к каким спискам принадлежит письмо, таким образом, один почтовый ящик может быть использован для нескольких списков, и HTTP клиент (например Netscape) при просмотре очередного списка писем отмечает письма, уже виденные в предыдущем списке. К одному и тому же почтовому ящику может быть несколько индексов, что может заменить раскладывание писем по ящикам, особенно это эффективно если несколько человек получают похожую почту и ведут каждый свой архив.

Индекс может быть устроен так, что бы при каждом вызове программы просмотра проверялись даты модификации почтового ящика и индекса, и если почтовый ящик свежЕе, то происходило бы доиндексирование ящика. В индексе ведется время занесения каждого письма в индекс, и поэтому может быть нужно вызывать процедуру обновления индекса по cron , иначе даты попадания в индекс могут сильно отличаться от даты прихода письма в ящик. Для уменьшения этой задержки можно mesdbc вызывать непосредственно для помещения каждого письма в индекс с немедленным его индексированием. Попытка вызвать одновременно несколько процессов добавления почты и попытки чтения одновременно с записью обрабатываются корректно.

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

В комплекте messarge дата из заголовка письма используется только в качестве комментария.

Когда mesdbc вызывается для уже существующего индекса, то все параметры могут быть взяты из этого файла.

Индекс состоит из заголовка и записей фиксированной длины. Размер заголовка кратен размеру записи. В заголовке содержится следующая информация
смещение нумерации писем
    номера писем в почтовом ящике могут начинаться не только с единицы, но и с бОльшего номера. Это можно использовать для сплошной нумерации писем в нескольких ящиках
размер места для строк в каждой записи
    в этом месте хранятся декодированный заголовок, адрес отправителя и имя его
флаг make on wakeup
    если этот флаг установлен, по при каждом обращении mesarc к индексу проверяется, не изменился ли почтовый ящик с момента последней сборки индекса. Если изменился, то тогда автоматически происходит доиндексирование ящика
количество списков, которым могут принадлежать письма
размер битовой маски членства в списках
    каждое письмо может принадлежать некоторому количеству списков
абсолютный путь к своему почтовому ящику

В индексе содержатся по одной записи для каждого письма в почтовом ящике, в каждой записи содержится следующая информация:
4 64-х разрядных хеш функции
    в них содержатся хеши от Subject: , Message-Id: , In-Reply_To: заголовков письма или им аналогичных (в RFC-822 есть некоторая свобода по этому поводу) и хеш от всего тела письма и части его заголовков. Этот последний хеш собирается так, что бы одно и то же письмо, пришедшее по разным путям, имело бы один и тот же хеш. Процедура подсчета сделана так, что бы практически все вероятные ошибки были вида "одно письмо имеет разные хеши" а вероятность ошибки вида "разные письма получили одинаковый хеш" была бы пренебрежимо мала.
смещение начала письма в почтовом ящике
длинна заголовков в этом письме
общая длинна письма
смещение к началу строки boundary
    указано относительно начала письма, если в письме есть аттачи, иначе 0
длина строки boundary
charset, использованный в письме
Content-Transfer-Encoding этого письма
дата из заголовка письма
дата индексирования письма
информация для вывода с сортировкой по темам
    указатели на предыдущее и следующее письма, уровень и роль в дереве. Уровень обычно зависит от длины цепочки ответ_на_ответ_на_... и обычно изображается отступом. Роль в дереве используется для того, что бы новое письмо в теме было правильно расположено в дереве и для ускорения размещения нового письма в уже существующем дереве.
битовая маски принадлежности спискам
    Размер этой маски задан в заголовке
Subject: письма
    хранится здесь в декодированном виде
адрес автора
    берется из Reply-To: или других заголовков
имя автора

SEE ALSO
mesdbc(1), mesarc(1), mestun(1), mesraw(1), RFC-822, RFC-2045, RFC-2046, RFC-2047, RFC-2048, RFC-2049

BUGS
Не реализована еще возможность в качестве почтового ящика определить трубу (pipe - флаг -p <имя команды>)

Существенно ориентирована именно на русский язык, не проработан механизм переноса в среду с другим языком

Версия для Solaris 2.5.1 несколько беднее оригинала (FreeBSD) по следующим причинам:

-   Время модификации ведется только с точностью 1 сек, поэтому в течение этой секунды могут происходить напрасные потери времени на доиндексацию.

-   в отладочной печати выводится только половина содержимого хеша

-   из-за отсутствия режима REG_STARTEND в regexec() приходится ограничивать область поиска расставлением ' '. Это мало влияет на эффективность, т.к. дублирование mmap()ированных страниц из-за private модификации как правило все равно возникает из-за перемещения строк, но в этом месте легко ошибиться при дальнейших модификациях

AUTHOR
Aleksandr A. Babaylov (aka @BABOLO) .@babolo.ru http://www.links.ru/~babolo/