Сервер Cyrus IMAP является открытым (лицензия BSD-like) сервером
базы почтовых сообщений с поддержкой протоколов POP3, IMAP4rev1 (RFC 3501) и NNTP
(в т.ч. через TLS).
В отличие от упрощённых серверов POP3 Cyrus IMAP не вынуждает
заводить владельцев почтовых ящиков, как полноценных пользоватей системы,
а обеспечивает собственные средства авторизации (с помощью библиотеки
Cyrus SASL: механизмы KERBEROS_V4,
GSSAPI, CRAM-MD5, DIGEST-MD5, OTP и PLAIN, команда STARTTLS)
и хранения почтовых сообщений.
Допускается одновременный доступ к одному почтовому ящику.
Имеются средства управления списками доступа (ACL) и ограничения
размера почтового ящика (QUOTA). Прочие расширения: LITERAL+, NAMESPACE,
UIDPLUS, ID, NO_ATOMIC_RENAME, UNSELECT, CHILDREN, MULTIAPPEND, SORT,
THREAD=ORDEREDSUBJECT, THREAD=REFERENCES, ANNOTATEMORE, IDLE, STARTTLS.
Поддерживается протокол фильтрации почты SIEVE.
Разработка ведётся под SPARC Solaris.
Ориентирован на крупные частные сети (типа университета, так что тяжеловат).
Последняя версия - 2.3.16 (декабрь 2009).
Иерархическое пространство имён почтовых ящиков аналогично
пространству имён newsgroups
(простые имена, выстроенные в иерархию через точку; прописные и строчные
буквы различаются).
Почтовые ящики первого уровня иерархии могут создаваться только администратором,
остальные в соответствии с правами (ACL) родительского почтового ящика.
Корнем иерархии пользовательских почтовых ящиков является user.
Все почтовые ящики пользвателя test имеют префикс "user.test.".
Создание ящика user.test равнозначно созданию пользователя test,
в него кладёт новые почтовые сообщения агент местной доставки (local delivery
agent),
он же служит почтовым ящиком INBOX пользователя test, поэтому почтовый
ящик user.test.junk выглядит для пользователя test как INBOX.junk,
а для прочих пользователей как user.test.junk. Имя пользователя
в стандартном иерархическом пространстве имён не может содержать точку.
Относительные имена почтовых ящиков начинаются с точки.
Сервер может работать в альтернативном пространстве имён, в котором
почтовый ящик user.test.junk выглядит для пользователя test
просто как junk (ящик user.test по-прежнему INBOX).
Русские имена почтовых ящиков можно декодировать
с помощью "iconv -f utf-7", если заменить '&' на '+'.
Доступ к каждому почтовому ящику определяется ACL,
содержащим список элементов управления доступом. При создании ящика
ACL копируется от родительского ящика (или defaultacl для ящиков первого
уровня). При создании пользователя
его корневому ящику устанавливается ACL, дающий пользователю все права над этим
ящиком. Каждый элемент ACL имеет
идентификатор пользователя (специальное имя для неавторизованного пользователя
- anonymous; для любого, включая анонимного, пользователя - anyone) или
группы пользователей (перед идентификатором может стоять знак отрицания
"-") и набор прав доступа (администратор неявно имеет права
"la" на всех ящиках; пользователь неявно имеет права
"la" на всех своих ящиках):
l - имя почтового ящика будет показываться в списках (lsub, list, unseen)
r - право на чтение (select, check, fetch, partial, search, источник для copy)
s - для данного пользователя будут храниться личные флаги "Seen" и "Recent"
(STORE \SEEN)
w - право на изменение флагов, кроме "Seen" и "Deleted"
i - право добавлять сообщения в ящик (append, назначение copy)
p - право добавлять сообщения в ящик (добавляется трассировочная строка)
c - право создавать подчинённые ящики, удалять и переименовывать этот
ящик
d - право на запись флага "Deleted" и производить очистку (expunge)
a - право на изменение ACL
anonymous неявно имеет права "p" на корневых
ящиках пользователей. Пользователь неявно имеет права на ящики
внутри своей иерархии (или только "la"?). В общем, бардак с правами.
Механизмы авторизации (не аутентификации!):
Unix-style. Идентификатор - это имя пользователя или строка
вида group:имя-группы
Kerberos 4.
Kerberos 5.
внешний процесс авторизации (ptloader).
Механизмы аутентификации (используется
библиотека Cyrus SASL):
анонимный пользователь (опция allowanonymouslogin файла настройки):
текстовый механизм аутентификации с именем пользователя anonymous
и произвольным паролем и любой механизм аутентификации Cyrus SASL,
позволяющий анонимный вход
текстовый пароль передаётся через IMAP LOGIN или SASL PLAIN (TLS),
и проверяется с помощью PAM, Kerberos v4, /etc/passwd и /etc/shadow
(sasl_auto_transition) библиотекой Cyrus SASL (sasl_pwcheck_method)
KERBEROS_V4
разделяемый секрет (CRAM-MD5, DIGEST-MD5), необходимо предоставить
источник этих секретов (sasldb)
Механизм ограничения размера почтового ящика
учитывает только сумму размеров почтовых сообщений (в килобайтах),
но не учитывает размер служебной информации. Ограничение может накладываться
на любое поддерево иерархии ящиков, за вычетом подподдеревьев, имеющих
свои ограничения. В расширении к протоколу IMAP имеется команда
установить ограничение (setquota), но не имеется команд для его снятия.
При вставке сообщения (права "i") остаток места проверяется перед
вставкой, при отправке сообщения (права "p") проверяется что лимит уже
не превышен. При превышении лимита доставка прерывается с сообщением
о временной проблеме.
База почтовых сообщений может быть распределена
на несколько разделов, размещённых в различных файловых системах.
Администратор может указать имя раздела при создании почтового ящика
(раздел наследуется или берётся из defaultpartition). Раздел может
быть изменён при переименовании почтового ящика (имя при этом можно не менять).
Cyrus IMAP может экспортировать
Usenet через IMAP или IMAP через NNTP.
Cyrus IMAP обеспечивает обслуживание корневых
почтовых ящиков пользователей по протоколу POP3 (только один клиент
для ящика одновременно, включая IMAP клиентов).
WARNING - ошибки аутентификации и авторизации клиентов
NOTICE - успешная и неуспешная аутентификация
INFO - открытие ящиков
Файл mailboxes.db (в /var/lib/imap) хранит список всех ящиков с их лимитами и ACL.
/var/lib/imap/db.backup1 и /var/lib/imap/db.backup2 - старые копии.
Поддиректория quota содержит по файлу на каждое ограничиваемое
поддерево иерархии: имя, текущий размер, ограничение.
Чтобы удалить ограничение достаточно удалить этот файл и сделать под пользователем cyradm
"/usr/lib/cyrus-imapd/quota -f".
Поддиректория user содержит для каждого пользователя файл
(имя состоит из имени пользователя и суффикса ".sub"),
содержащий сортированный список ящиков, на которые он подписан.
Поддиректория log может хранить протокол работы определённого пользователя.
Достаточно создать в ней поддиректорию с именем этого пользователя (без имени раздела user).
Поддиректория proc хранит по файлу на каждый активный процесс:
имя хоста клиента, имя пользователя, имя выбранного почтового ящика.
Поддиректория msg может содержать файлы:
shutdown - соединение отвергается с выдачей сообщения
motd - первая строка посылается клиенту при соединении
Для каждого почтового ящика в разделе создаётся отдельная
директория, в которой каждое почтовое сообщение хранится в отдельном файле
с именем, состоящем из UID и точки на конце. В этой же директории
хранятся служебные файлы: cyrus.header, cyrus.index, cyrus.cache, cyrus.seen.
Sendmail, Postfix,
Exim кладут почтовые сообщения в базу с помощью
протокола LMTP, демон lmtpd предоставляется (TCP/IP или Unix-сокет).
При работе по TCP/IP необходимо использовать LMTP AUTH (SASL).
Сервер пытается хранить только одну копию
сообщения, если письмо было получено сразу в несколько ящиков
(жёсткие ссылки, отключается singleinstancestore).
При перемещении сообщения внутри иерархии файл не перемещается (mv),
а делается жёсткая ссылка (ln), что увеличивает счётчик inode-ов.
Имеется механизм удаления повторных (по Message-Id) писем
(отключается duplicatesuppression).
Программа master представляет собой гибрид xinetd и cron.
Запускает остальные программы пакета при наступлении оговоренного события
(сетевое соединение или момент времени). Инициализирует БД.
При получении сигнала SIGTERM убивает подчинённые процессы, потом себя.
Файл cyrus-master.pid не удаляется, файлы блокировки не удаляются.
При аварийном завершении подчинённого процесса запускает его ещё раз
для того же соединения, потом ещё и ещё.
При получении сигнала SIGHUP перечитывает конфигурационный файл,
Подчинённые процессы об этом не узнают, так что рекомендуется restart.
Переменная окружения CYRUS_VERBOSE позволяет увеличить уровень журнализации
(по умолчанию - 1). Параметры:
-C имя-конфигурационного-файла-imapd.conf (/etc/imapd.conf; не действует
на запускаемые процессы!)
-d (уходить в фоновый раздел и освобождать терминал)
-D (отладочный режим)
-l размер-очереди-listen (32)
-j rps (1; сколько раз в секунду чистить таблицу порождённых процессов)
-p имя-pid-файла (/var/run/cyrus-master.pid)
Главный конфигурационный файл (/var/imap/cyrus.conf)
для программы master состоит из именованных секций,
содержимое секции заключается в фигурные скобки, комментарий начинается с
символа '#'. Содержимое секции состоит из элементов, каждый элемент расположен
на отдельной строке и состоит из имени (используется как имя процесса в
hosts_access(5) для ограничения доступа) и списка аргументов (через пробел).
Программы ищутся в директории установки. master понимает три секции:
START - определяет какие программы должны запускаться в начале работы
до запуска первого сервиса; аргумент имеет вид:
cmd="имя-программы-с-параметрами"
SERVICES - определяет какие порты и сокеты слушать и какие программы
запускать при соединении; аргументы элементов:
imapd - сервер IMAP4rev1. Общается с клиентом через
стандартный ввод/вывод, т.е. должен запускаться с помощью
master.
Ключи:
-C имя-конфигурационного-файла
-U число-обслуживаемых-клиентов (250; потом процесс будет перезапущен)
-T секунд (60; ждать следующего соединения)
-D (запуск под отладчиком, который задаётся в debug_command)
-s (включить SSL)
-p фактор-защиты (признак наличия внешнего слоя защиты;
1 - обеспечение целостности, 2 и выше - шифрование)
Конфигурационный файл состоит из строк вида
(комментарии начинаются с символа '#'):
имя-опции: значение
Опции (логические значения: yes, on, true, t, 1)
admins (; список администраторских идентификаторов через пробел;
рекомендуется использовать данный идентификатор только для
управления сервером; получать почту на него не рекомендуется)
allowallsubscribe (0; разрешать подписку на несуществующие
ящики; рекомендуется при необходимости работать с MS Outlook)
allowanonymouslogin (0; разрешать аутентификацию пользователя
anonymous с любым паролем, а также использование механизма
SASL ANONYMOUS
allowapop (1; использование команды APOP; SASL потребуются
открытые пароли)
allownewnews (0; обработка команды NNTP NEWNEWS)
allowplaintext (1; разрешить передавать пароли в открытом виде
по сети)
allowplainwithouttls (false; не работает!)
allowusermoves (0; разрешить переименовывать пользователей
командами RENAME и XFER; требуется обеспечить блокировку
доступа на время перемещения внешними средствами)
altnamespace (0; дополнительные персональные ящики представляются
клиентам на уровне INBOX, а не под ним; действует только
на imapd, но не на LMTP и административные утилиты - cyradm,
quota и др.)
auth_mech (unix; механизм авторизации: unix, pts, krb, krb5)
autocreateinboxfolders (; список создаваемых вложенных ящиков, при автоматическом
создании INBOX при получении письма (createonpost) или входе пользователя
(autocreatequota))
autocreatequota (0; разрешать пользователям создавать
собственные учётные записи, создавая INBOX; положительное число
задаёт максимальный размер таких ящиков; отрицательное значение
отключает проверку размера ящика)
autocreate_users (; список имён пользователей и групп, для которых разрешено
автоматическое создание ящиков)
autosubscribe_all_sharedfolders (false; подписывать на все разделяемые
ящики, при автоматическом
создании INBOX при получении письма (createonpost) или входе пользователя
(autocreatequota))
autosubscribeinboxfolders (; список подписываемых вложенных ящиков, при автоматическом
создании INBOX при получении письма (createonpost) или входе пользователя
(autocreatequota))
autosubscribesharedfolders(; список подписываемых разделяемых ящиков, при автоматическом
создании INBOX при получении письма (createonpost) или входе пользователя
(autocreatequota))
berkeley_cachesize (512; размер кеша для bdb в КБ)
berkeley_locks_max (50000)
berkeley_txns_max (100; число транзакций)
client_timeout (10; в секундах)
configdirectory (; каталог, в котором всё хранится; /var/lib/imap)
createonpost (false; автоматическое создание ящика по приходу письма)
defaultacl (anyone lrs; ACL по умолчанию для
создаваемого ящика верхнего уровня)
defaultdomain (; для подержки виртуальных доменов)
defaultpartition (default; имя раздела по умолчанию для новых ящиков)
deleteright (c; какие права требуются для удаления ящика; устарело;
теперь для удаления ящика требуются права 'x')
duplicate_db (berkeley-nosync; формат БД для хранения информации
о дублированных сообщениях: berkeley,
berkeley-nosync, berkeley-hash, berkeley-hash-nosync, skiplist
duplicatesuppression (1; хранить message-id в БД и блокировать
повторную доставку сообщений)
expunge_mode (immediate; режим удаления сообщений и записей в кеше по команде
EXPUNGE; immediate - немедленно, как раньше; delayed - из индекса удаляются
сразу, а сами файлы позже, утилитой cyr_expire)
flushseenstate (false; отключить кеширование записи состояний "прочитанности"
сообщений, может потребоваться для Microsoft Outlook
foolstupidclients (0; запрос LIST "*" обрабатывается как LIST "INBOX*")
fulldirhash (0; улучшенный алгоритм разнесения каталогов
пользователей по различным директориям для ускорения доступа
к файловой системе; нельзя менять на ходу, см. утилиту rehash)
hashimapspool (0; разносить по подкаталогам не только управляющие
файлы, но и каталоги с данными пользователей)
idlesocket (базовый-каталог/socket/idle; сокет для сервиса idled)
ignorereference (0; игнорировать первый аргумент команд LIST и LSUB)
imapidlepoll (60; интервал - в секундах - опроса ящика на наличие
изменений при обработке команды IDLE, а сервис idled недоступен;
0 запрещает использование опроса для реализации IDLE)
imapidresponse (1; выдавать на команду ID сведения о себе)
imapmagicplus (0; обработка "плюсового" пространства имён:
имя-пользователя+имя-ящика
@include (; интерпретировать содержимое файла как часть конфигурации)
lmtp_downcase_rcpt (false; конвертировать адрес получателя к строчным буквам)
lmtp_fuzzy_mailbox_match (false; попытаться подбрать подходящее имя вложенного ящика
для "плюсового" пространства имён)
lmtp_over_quota_perm_failure (false; при переполнении ящика выдавать
не временный код ошибки, а постоянный)
lmtp_strict_quota (false; не допускать переполнения ящика)
lmtpsocket (${configdirectory}/socket/lmtp)
loginrealms (; ?)
loginuseacl (0; любой, у кого есть права на ящик пользователя INBOX
могут входить под именем этого пользователя; ?!)
logtimestamps (0; заносить в протоколы (см. каталог log) временные
интервалы)
mailnotifier (; метод извещения о поступлении почты; см. notifyd(8))
maxmessagesize (0; максимальный размер сообщения по LMTP)
mboxkey_db (skiplist; формат БД для ключей: berkeley, skiplist)
mboxlist_db (skiplist; формат БД для имён ящиков: berkeley, skiplist)
metapartition_files (; список метаданных, которые хранить не вместе
с письмами пользователя, а в отдельном разделе:
header, index, cache, expunge, squat)
metapartition-name (; имя раздела для хранения метаданных)
md5_dir (/var/lib/imap/md5; кеш для make_md5)
md5_user_map (?)
munge8bit (true; заменять запрещённые RFC822 символы со взведённым
8-м битом в заголовках на 'X')
netscapeurl (http://asg.web.cmu.edu/cyrus/imapd/netscape-admin.html;
URI для HTTP-управления почтовым сервером)
normalizeuid (false; приводить идентификатор пользователя
к строчным буквам и удалять пробелы)
notifysocket (базовый-каталог/socket/notify; сокет, используемый
сервером извещений о новой почте notifyd)
partition-имя_раздела (; имя каталога, в котором лежат все файлы
данного раздела)
plaintextloginpause (0; секунд паузы после успешной аутентификации
открытым паролем, чтобы раздолбаям жизнь мёдом не казалась)
plaintextloginalert (текст сообщения для них)
popminpoll (0; минимальный интервал в минутах между входами в режиме POP)
popsubfolders (false; позволяет доступ к вложенным ящикам в режиме POP3
(имя-пользователя+имя-ящика))
poptimeout (10; в минутах)
popuseacl (false; использовать ACL в режиме POP3:
r - право на чтение, d - право на удаление сообщений)
postuser (""; какое псевдоимя использовать для посылки в разделяемые ящики;
по умолчанию пустое - "+имя-ящика.имя-вложенного-ящика")
proxyservers (; список пользователей и групп через пробел,
которым позволено
аутентифицироваться от имени любых других пользователей
(при аутентификации проверяется их имя/пароль, а при авторизации
используются права указанного пользователя))
tls_session_timeout (1440; кешировать TLS сессию указанное число минут;
максимальное значение - 1440)
umask (077)
username_tolower (1; преобразовывать имена пользователей к строчным буквам;
для LDAP - обязательно)
userprefix ("Other Users"; префикс чужих ящиков при использовании
альтернативного пространства имён)
unix_group_enable (1; )
unixhierarchysep (0; использовать '/' вместо '.' в качестве разделителя
простых имён в иерархии)
virtdomains (off; поддержка виртуальных доменов: userid - имя домена
извлекается из имени пользователя после '@' или '%'; on - имя домена определяется по
IP адресу клиента)
параметры для использования SASL: любые опции
Cyrus SASL с добавлением префикса "sasl_"
к имени опции
параметры для использования LDAP как средства аутентификации: ldap_*
lmtpd - сервер LMTP. Общается с клиентом через
стандартный ввод/вывод, т.е. должен запускаться с помощью
master. Требуется аутентификация администратора.
Ключи:
-C имя-конфигурационного-файла
-U число-обслуживаемых-клиентов (250; потом необходимо перезапустить
процесс)
-T секунд (60; ждать следующего соединения)
-a (не требовать LMTP AUTH)
Разделяет конфигурационный файл с imapd.
Специфические опции:
lmtp_downcase_rcpt (0; lmtpd преобразует идентификаторы получателей
к строчным буквам)
lmtp_over_quota_perm_failure (0; при переполнении ящика возвращать
сообщение о постоянной ошибке (5xx) вместо сообщения о временной
ошибке (4xx))
lmtpsocket (базовый-каталог/socket/lmtp; сокет для сервиса lmtpd,
используется deliverб должен совпадать с указанным в cyrus.conf)
maxmessagesize (0)
reject8bit (0; отвергать письма с 8-битными символами в заголовках
или всего лишь заменять такие символы на 'X')
singleinstancestore (1; сообщение нескольким получателям хранится в одном
экземпляре)
soft_noauth (1; возвращать код временной ошибки (4xx) при неверной аутентификации)
Утилита deliver может использоваться почтовым сервером для
раскладки приходящей почты по ящикам (предпочтительно использование
lmtpd). Общается с клиентом через
стандартный ввод/вывод, в качестве параметров указываются идентификаторы
получателей. Ключи:
-C имя-конфигурационного-файла
-d (игнорируется; присутствует для совместимости с /bin/mail)
-r адрес (вставлять Return-Path:)
-f адрес (вставлять From)
-a идентификатор-авторизации-отправителя (по умолчанию - anonymous)
-m имя-ящика (сообщение кладётся в ящик с именем:
"user.идентификатор-получателя.имя-ящика", если у отправителя есть право "p",
иначе в "user.идентификатор-получателя.INBOX")
cyradm представляет собой оболочку для perl-модуля администрирования
сервера Cyrus::IMAP::Shell. Можно использовать непосредственно в интерактивном
режиме (возможно, необходимо установить переменную окружения PERL5LIB равной
/usr/local/lib/perl5/site_perl/5.8.0) или в скриптах на perl:
perl -MCyrus::IMAP::Shell -e 'run("имя-скрипта")'
Команды в интерактивном режиме можно разделять в строке
символами ';'. Ввод/вывод команд может быть переназначен аналогично /bin/sh
(pipe не реализован). Редактирование строки реализовано средствами readline
(история и т.д.). Команды:
help
exit
connect [--noauthenticate] имя-сервера (аутентификация происходит с именем
unix-пользователя)
setinfo атрибут значение (значение "none" удаляет атрибут;
атрибуты сервера:
motd
comment
admin (email администратора)
shutdown
expire (через какое число дней после поступления удалять сообщение)
squat (?)
version
createmailbox [--partition имя-раздела] имя-ящика
mboxconfig имя-ящика атрибут значение (значение "none" удаляет атрибут;
атрибуты:
comment
expire (через какое число дней после поступления удалять сообщение)
squat (?)
news2mail (на этот адрес будут приходить сообщения по NNTP?)
listmailbox [--subscribed] [шаблон [ссылка]] (в шаблоне можно использовать
'*' и '%' (всё, кроме); ссылку можно рассматривать как начальную точку
в иерархии имён)
deletemailbox имя-ящика (предварительно необходимо назначить себе права
для удаления ящика (обычно "c") командой setaclmailbox)
setaclmailbox имя-ящика идентификатор-пользователя права ...
(права могут задаваться в виде набора прав доступа или мнемонических
обозначений - none, read (lrs), post (lrsp), append (lrsip),
write (lrswipcd), all)
В комплекте поставляются средства тестирования и они вам понадобятся.
imtest позволяет не только тестировать указанный сервер
(протокол IMAP),
но и администрировать его вместо cyradm
(простейшие команды).
Ключи:
-t имя-файла (STARTTLS; файл должен содержать публичные и приватные ключи клиента в формате PEM
(как их делать?);
можно указать "" для включения TLS без аутентификации клиента)
-p порт
-m SASL-механизм (по умолчанию - сильнейший из имеющихся; можно также
указать механизм login)
-a идентификатор-аутентификации (по умолчанию имя unix-пользователя)
-u идентификатор-авторизации (по умолчанию имя unix-пользователя)
-f имя-файла (после авторизации читать команды из файла)
-n число-попыток-аутентификации (клиент будет пытаться повторно использовать
TLS сессию или упрощённую аутентификацию DIGEST-MD5)
-s (SSL, imaps)
-x имя-сокета (использовать сокет для интерактивной части)
-X имя-сокета (использовать сокет для интерактивной части, закрыть
дескрипторы файлов и уйти в фоновый режим)
-I имя-файла (для режима -X, записать pid в файл)
-o опция=значение (установить SASL опцию)
-v (болтливость)
-z (измерение временных параметров; после аутентификации imtest
пытается создать ящик inbox.imtest и что-то с ним сделать,
т.е. в альтернативном пространстве имён
работать заведомо не будет)
pop3test позволяет соединиться с сервером используя протокол
POP3 и выдавать произвольные команды. Ключи те же самые, что и у imtest
(в качестве механизма можно указать user (обычные имя/пароль) или apop),
кроме ключа -z.
lmtptest позволяет соединиться с сервером используя протокол
LMTP и выдавать произвольные команды. Ключи те же самые, что и у pop3test.
Механизм PLAIN без шифрования в тестовых программах не работает, несмотря на указание "-k 0"
fud - сервер, позволяющий удалённо извлекать
информацию о пользователе (сколько сообщений получено в ящик, когда было
последнее сообщение, когда было последнее чтение).
pop3proxyd -?.
smmapd - проверка наличия почтового ящика и места в нём.
mupdate - синхронизация нескольких серверов Cyrus IMAP.
timsieved - позволяет управлять скриптами sieve
(антиспам фильтр) удалённо.
tls_prune - очистка кеша TLS. Запускается раз в сутки
программой master. Параметр: -C имя-конфигурационного-файла (/etc/imapd.conf).
Опция конфигурационного файла - tls_session_timeout.
cyr_expire - удаление старых данных из БД дубликатов
и старых писем. Запускается раз в сутки программой master.
Параметры: -C имя-конфигурационного-файла (/etc/imapd.conf);
-v (болтливость); -E дней. Время хранения может определяться отдельно
для поддерева с помощью аннотации /vendor/cmu/cyrus-imapd/expire (?).
ctl_cyrusdb - создание контрольных точек и восстановление
баз данных. Запускается программой master в начале работы (-r) и с определённым
интервалом (-c). Параметры: -C имя-конфигурационного-файла (/etc/imapd.conf);
-r - восстановление и очистка баз данных; -x - только восстановление (без
очистки); -c - создание контрольной точки (и сколько их?).
ctl_deliver - обслуживание БД дупликатов.
Параметры: -C имя-конфигурационного-файла (/etc/imapd.conf);
-d (выдача содержимого в текстовом виде на stdout);
-f имя-файла-БД (deliver.db).
ctl_mboxlist - обслуживание БД списка почтовых ящиков.
Общий параметр: -C имя-конфигурационного-файла (/etc/imapd.conf).
Операции:
-d (выдача содержимого в текстовом виде на stdout);
-f имя-файла-БД (mailboxes.db); -p раздел (ограничиться разделом);
-x (удалить распечатанные ящики)
-u (загрузить со stdin; предполагается результат предыдущего дампа);
-f имя-файла-БД (mailboxes.db)
-m (синхронизация списка с mupdate); -f имя-файла-БД (mailboxes.db)
Например, если при запуске главного процесса он не может развернуть
БД из mailboxes.db
DBERROR: skiplist recovery /var/lib/imap/mailboxes.db: BE2C should be ADD or DELETE
reconstruct - не реализована самая важная функция (восстановление всей БД - ключ "m").
mbpath - определить по имени ящика имя в файловой системе.
Параметры: -C имя-конфигурационного-файла (/etc/imapd.conf);
-q (не сообщать об ошибках); -s (останавливать обработку при ошибке).
cvt_cyrusdb - преобразовать БД сервера из одного
формата в другой. Необходимо указать старый файл, формат старого файла,
новый файл, формат нового файла. Параметр: -C имя-конфигурационного-файла
(/etc/imapd.conf). Если вызвать без аргументов, то показывает список
форматов (berkeley, berkeley-nosync, flat, skiplist, quotalegacy).
Настройка БД лежит в файле /var/lib/imap/db/DB_CONFIG
устанавливаем пакеты cyrus-imapd, cyrus-imapd-perl и cyrus-imapd-utils (пользователь cyrus (76)
в группы mail (12) и saslauth (76), сюда также входят nntp и mupdate)
/etc/cyrus.conf, /etc/imapd.conf
/etc/logrotate.d/cyrus-imapd
/etc/cron.daily/cyrus-imapd (ежедневное копирование оглавления базы почтовых ящиков)
устанавливаем пакеты cyrus-imapd, cyrus-imapd-perl и cyrus-imapd-utils (пользователь cyrus (76)
в группы mail (12) и saslauth (76), теперь сюда входят nntp и mupdate)
/etc/cyrus.conf, /etc/imapd.conf
/etc/logrotate.d/cyrus-imapd
/etc/cron.daily/cyrus-imapd (ежедневное копирование оглавления базы почтовых ящиков)
Berkeley DB той же версии,
что использовалась для сборки Cyrus SASL
Perl 5 (для скриптов установки и cyradm)
OpenSSL, 0.9.4 (STARTTLS и imaps:, pop3s:)
libwrap
Net-SNMP (для мониторинга сервера)
MTA с поддержкой LMTP (и AUTH)
копируем и распаковываем архив с исходными текстами, полученными
на сайте разработчика; заходим внутрь
makedepend (если его нет)
cd makedepend
./configure
make
cp makedepend /usr/local/bin/
cd ..
как был глюкодром 10 лет назад, так и остался:
родная директория д.б. /var/imap;
монитор SNMP не собирается;
разработчики пользуются для аутентификации Kerberos
(кстати, нужен CPPFLAGS=-I/usr/kerberos/include),
а остальные методы реализованы "для галочки";
конфигурационные файлы (cyrus.conf и imapd.conf) ищутся в /etc,
несмотря на установку /usr/local
[правим imap/message.c (message_copy_strict), чтобы
разрешал русские буквы в заголовке] или достаточно reject8bit?
правим вызов telemetry_log в imap/pop3d.c, imap/lmtpengine.c,
imap/nntpd.c и imap/imapd.c (по нескольку раз,
последний параметр д.б. 1, чтобы имя файла содержало время)
make depend
make all CFLAGS=-O2
создаём группу cyrusimapd (79, с нужными членами) и
пользователя cyrusimapd (79, по аналогии с exim)
/etc/rc.d/init.d/cyrus-imapd можно взять из FC3
(поправить под свою конфигурацию, при остановке удалить
/var/run/cyrus-master.pid и /var/imap/socket/?;
root:root 755)
правим imap/login_unix.c, так чтобы он читал
пароли из того же файла, что и мой
sendmail
правим lib/auth_unix.c (auth_canonifyid), чтобы разрешал
подчеркивания в именах пользователей
правим imap/message.c (message_copy_strict), чтобы
разрешал русские буквы в заголовке
правим imap/pop3d.c (cmdloop):
lcase( popd_userid ); после ввода имени пользователя
в имя log-файла вставляем вместо getpid() время
создания (imap/pop3d.c и imap/imapd.c - в двух местах)
добавил опцию autosetquota в файл
конфигурации и поправил imap/imapd.c (cmd_create);
создал программу для локального
администрирования bog_admin (на входе файл,
каждая строка задает команду: первое слово имя
команды, пока только create, второе слово
почтовое имя, третье параметр - для create размер ящика);
в фильтре против спамеров указываем, что cyrus - это
локальный почтовый агент
make RANLIB=touch (я не знаю что делает ranlib, но
после него ld грохается)
make install (root) (/usr/local/lib/libcyrus.a, куча
документации, /usr/local/include/cyrus, collectnews syncnews imapd pop3d
arbitron reconstruct quota updateimsp deliver feedcyrus в /usr/local/cyrus/bin)
добавляем в /etc/syslogd
local5.debug /var/log/imapd.log
и говорим на него touch (syslogd не забудь перезапустить)
заполняем /usr/local/etc/imapd.conf
configdirectory: /var/imapd
defaultpartition: default
partition-default: /var/imapd/partition-default
umask: 077
allowanonymouslogin: no
quotawarn: 90
timeout: 30
poptimeout: 10
popminpoll: 0
admins: bog
defaultacl: anyone l
autocreatequota: 10000000
plaintextloginpause: 0
создаем директорию /var/imapd с правами bog:mail (750)
в ней создаем пустой файл mailboxes и
директории user quota proc log msg с аналогичными правами
создаем директорию для раздела по
умолчанию: /var/imapd/partition-default и права аналогично
в /etc/services добавляем
pop3 110/tcp
imap 143/tcp
в /etc/inetd.conf добавляем (с поправкой на
существующую конфигурацию) и перезапускаем inetd
imap stream tcp nowait bog /usr/local/cyrus/bin/imapd imapd
pop3 sream tcp nowait bog /usr/local/cyrus/bin/pop3d pop3d
из rmnews делаем bog_rmarticles для
удаления писем (убирая лишнее и исправляя ошибки);
делаем процедуру bog_delete_old_mail.sh,
которая ищет find'ом старые письма и
подсовывает их адреса bog_rmarticles;
вставляем вызов этой процедуры в crontab
ежедневно из-под своего имени
Для преобразования почтового ящика в формате maildir (каждое письмо в отдельном файле)
в формат mbox для чтения её локальными почтовыми клиентами (например Thunderbird):
for i in /var/spool/imap/user/имя-пользователя-cyrus/Sent/*.; do cat $i|formail -s procmail; done
cp /var/spool/mail/имя-пользователя ~/.thunderbird/XYZ.default/Mail/Local\ Folders/имя-ящика
> /var/spool/mail/имя-пользователя
повторить для каждого вложенного ящика