Background
Встала у меня задача организовать в конторе shared folders. Точнее я её себе сам поставил, для решения двух других :) Это:
- организация наиболее удобного интерфейса для blacklisting и whitelisting писем (спам/не спам). Конечно самым удобным способом было бы написание софтинки, через которую они, на основе анализа этой софтинкой принимаемых писем, редактировали бы access tables? в ldap. Но я решил просто прикрутить существющие программы, и не плодить сущностей :). Проблема стоит только одна: перевести всех, кому мешает спам, с pop3 на imap интефейс.
- доступ к общим ящикам вида service@, support@, sales@, etc нескольким людям одновременно с сохранением дискуссий. Если делать это через aliases, то при ответе, как минимум, ломается тред. В общем – так было бы удобней, особенно если бы посланные письма помещались в ту же папку.
Так как у меня стоял courier-imap, то конечно заводил это дело я на нём. И на одном из срезов AltLinux Sysiphus
Shared Folders в почтовом клиенте
В почтовом клиенте такие каталоги выглядят следующим образом:
<Имя ящика>
Имя shared в данном случае – общий каталог для всех shared folders, и имеет такое название по той же причине, что и INBOX – стандарт.
Его подкаталог spam – это сам shared folder. Именно это имя и прописывается в index'ных файлах courier'а. Проблема – это каталог, а не реальтный maildir. Чтение и запись возможна только в его подкаталоги – blacklist и whitelist в данном случае.
Натройка
Первым делом я конечно начал с чтения подходящей документации: /usr/share/doc/courier-imap-4.0.3/README.sharedfolders.txt. Прочитал, проникся. Заснул...
Как я понял, есть два механизма работы с shared folders: Virtual shared folders и Filesystem permissions-based shared folders. Когда-то я реализовывал Filesystem permissions-based shared folders, так как это оказалось наиболее просто: они организовываются в ящиках пользователей. Сейчас же сделал менее понятный (и усыпляющий :)) вариант.
Какой механизм поиска shared folders?
И вот здесь я так и не понял существующую в alt linux документацию: механизм поиска Virtual shared folders по документу /usr/share/doc/courier-imap-4.0.3/README.sharedfolders.txt следующий:
- в файле с одним из имён
- Courier-IMAP: /usr/lib/courier-imap/etc/shared/index
- Courier: /usr/lib/courier/etc/shared/index
- Courier (Red Hat/Fedora build): /etc/courier/shared/index
- SqWebMail (standalone build): /usr/local/share/sqwebmail/shared/index
courier ищёт эти самые shared каталоги.
- файл имеет следующее содержание:
<name> <system userid> <system groupid> <virtual home directory> <maildir path relative to the virtual home directory> <optionally, account options>
где name – имя пользователя, под которым imap сервер будет читать этот folder,
system userid, system groupid – его системные идентификаторы,
virtual home directory – каталог, где будут находится эти folder'ы,
maildir path relative to the virtual home directory – сам shared folder.
Оказывается, courier под altlinux глубоко наплевал на указанные в документации пути к index'у каталогов, и только через strace я выяснил, что
- ему нужен файл /etc/courier-imap/maildirshared, и больше ничего похожего на shared folder либо index он не и не пытается искать.
- этот файл имеет немного другой формат:
<foldername> <folderpath>
- где foldername – имя подкаталога корневой папки shared, что находится в почтовом клиенте на одном уровне с INBOX и, как и INBOX, является одним их корневых катлогов IMAPv4
- folderpath – каталог, где сами shared folders. То есть если там будет только cur-new-tmp, то никаких shared фолдеров вы не увидете. folderpath должен быть в maildir формате, то есть создаваться командой maildirmake.
Для приведенного выше примера это будет строка
spam /var/spool/mail/shared/spam/
maildir'ом folderpath (e.g. /var/spool/mail/shared/spam/) как ящиком пользоваться не получится – это просто контейнер для общих каталогов.
Непоредственная настройка
Поэтому для создания shared folder вида shared.spam.blacklist (в imap нотации) нам надо:
- создать /var/spool/mail/shared/ или где там у вас будет это валяться:
- создать /etc/courier-imap/maildirshared и вписать в него
- важно создать maildir подкаталог нашего фолдера:
- проследить за правами – пользователь, от которого работает courier должен иметь права туда писать, а courier всегда делает смену uid/gid на залогиневшегося пользователя, каким виртуальным он не был.
Повторяю, пользоваться каталогом shared.folder как ящиком не получится – courier, или IMAPv4 – я так и не разобрался – такого не позволяет. Этот каталог – контейнер и указывается на серверной стороне.
В принципе всё.
Диагностика
Сочувствую, но courier я так и не заставил выдавать мне более-менее подробную информация. Поэтому диагностику я проводил через strace.
- То есть, ищем процесс imapd, работающий от вашего пользователя, и смотрим его pid. Этот процесс появляется только, если вы уже проверяете почту. Если же нет, то его не будет. По крайнере мере с вашим пользователем. Если это так, тогда ищем pid процесса courier-imapd.
- натравливаем на полученный pid strace (натравливать от root'а):
Здесь -p – подключится к pid'у, -f – следовать за fork'нувшимися процессами, что нам нужно, если imapd не был запущен, зато был courier-imapd – последний запустит imapd, который и будет искать shared folders. А без -f strace этот fork не будет проверять.
- Читаем. Или ищем строчки с /var/spool/mail/shared/ и его подкаталогами и смотрим, что нам выдала функция open.
Кстати, благодаря strace я таже выяснил, что процесс imapd считывает /etc/courier-imap/maildirshared почти при каждом обращении к нему :)
Ссылок на эту страницу нет