FreeBSD: Использование общих папок на сервере Courier-IMAP
Постановка задачи
Эта статья предназначена для всех, кто использует The Courier IMAP server в качестве IMAP4/IMAP4S-сервера почтовой системы. Courier-IMAP поддерживает такую возможность протокола IMAP, как общие папки (англ. shared folders) - механизм, позволяющий использовать почтовые ящики совместно. Как известно, для одновременной доставки сообщений нескольким пользователям можно использовать механизм алиасов, однако, этот подход далеко не оптимален, т.к. заставляет хранить по несколько копий сообщений на сервере, следить за содержанием алиасов, настраивать сортировщики почтовых клиентов. В отличие от алиасов общие папки лишены перечисленных недостатков. Courier-IMAP поддерживает два вида общих папок - виртуальные общие папки (virtual shared folders) и общие папки на основе прав доступа файловой системы (filesystem permissions-based shared folders). Первые применяются в тех случаях, когда учетные записи пользователей почтовой системы хранятся в специальной базе данных, администрируемой, например, с помощью PostfixAdmin, вторые, когда в качестве учетных записей пользователей почтовой системы используются учетные записи пользователей операционной системы. В своей почтовой системе я использую виртуальные общие папки, которым и посвящена данная статья.
Исходные данные
Имеется сервер с FreeBSD, на котором кроме всего прочего развернута почтовая система на базе Postfix, использующая учетную информацию, хранящуюся в базе данных MySQL. Для администрирования этой базы данных применяется PostfixAdmin. Роль IMAP4/IMAP4S-сервера выполняет Courier-IMAP, использующий учетную информацию, получаемую из вышеупомянутой базы данных MySQL посредством Courier-Authlib. Почтовые ящики имеют формат maildir и находятся в папке /var/spool/vmail/company.com. IMAP-папки с именем INBOX являются корневыми IMAP-папками почтовых ящиков и соответствуют корневым папкам почтовых ящиков в файловой системе. Более подробное описание конфигурации почтовой системы не имеет смысла, т.к. для рассматриваемого вопроса она абсолютно не принципиальна.
Индекс общих папок
В связи с ограничениями безопасности серверный процесс Courier-IMAP, созданный для подключившегося пользователя, не может получать данные о почтовых ящиках, доступных на сервере, непосредственно из базы данных, содержащей учетную информацию. Для получения таких данных используется индекс общих папок - текстовый файл, описание формата которого имеется в документе virtual shared folders. Не следует создавать и обновлять индекс общих папок вручную. Лучше использовать для этих целей специальный скрипт, имеющий следующее содержимое (все имена папок соответствуют значениям, выбираемым по умолчанию при установке программного обеспечения из портов):
#!/bin/sh sbindir="/usr/local/sbin" sysconfdir="/usr/local/etc/courier-imap" rm -rf $sysconfdir/shared.tmp mkdir $sysconfdir/shared.tmp || exit 1 $sbindir/authenumerate -s > $sysconfdir/shared.tmp/index || exit 1 $sbindir/sharedindexinstall
Данный скрипт удаляет и вновь создает временную папку shared.tmp, создает в папке shared.tmp индекс общих папок index, а затем устанавливает его его в папку shared. В моем и в большинстве других случаев используется единственный файл, содержащий индекс общих папок, однако, на сильно нагруженных серверах таких файлов может быть несколько. Подробная информация по этому поводу имеется в документе virtual shared folders. Рассмотренный скрипт следует запускать после добавления или удаления пользователей почтовой системы.
Списки контроля доступа общих папок
С каждой общей папкой IMAP связан соответствующий ей список контроля доступа (ACL), содержащий списки прав доступа (rights) для всех пользователей и групп (identifiers), которым разрешен доступ к общей папке. ACL общей папки хранится в текстовом файле с именем courierimapacl, находящимся в ее корне. Каждая строка файла courierimapacl имеет формат identifier rights и определяет список прав доступа к общей папке rights для пользователя или группы identifier.
Могут быть установлены такие такие права доступа к общим папкам, как:
a - возможность изменения ACL общей папки; c - возможность создания подпапок в общей папке; e - возможность удаления сообщений, помеченных на удаление, из общей папки; i - возможность добавления (выгрузки / перемещения) сообщений в общую папку; l - возможность отображения общей папки в списке общих папок; r - возможность просмотра содержимого общей папки (даже если разрешение 'l' не установлено); s - возможность изменения флага "Прочитано" у сообщений, находящихся в общей папке; t - возможность изменения флага "Помечено на удаление" у сообщений, находящихся в общей папке; w - возможность изменения атрибутов состояния сообщений, находящихся в общей папке; x - возможность удаления общей папки.
Перечисленные права доступа могут быть установлены для таких пользователей и групп, как:
owner - владелец почтового ящика; anyone/anonymous - кто угодно; user=loginid - пользователь с логином loginid; group=name - группа с именем name; administrators - группа с именем administrators.
Для прояснения ситуации рассмотрим пример ACL, приведенный в документации Courier-IMAP:
owner aceilrstwx anyone lr user=john w -user=mary r administrators aceilrstwx
Данный ACL обеспечивает следующие права доступа пользователей и групп к общей папке (построчно):
1. Владельцу разрешен полный доступ к общей папке;
2. Всем разрешено видеть папку в списке общих папок и просматривать ее содержимое;
3. Пользователю john разрешено изменять атрибуты состояния сообщений, находящихся в общей папке;
4. Пользователю mary запрещено просматривать содержимое общей папки (запрещающие права называются "негативными");
5. Администраторам разрешен полный доступ к общей папке.
Внимание, не зависимо ни от каких обстоятельств владелец общей папки должен иметь права доступа не менее al, а администраторы - исключительно aceilrstwx (полный доступ). Нарушение данного правила может привести к некорректной работе сервера Courier-IMAP.
Управление ACL общих папок
Официальная документация сервера Courier-IMAP рекомендует использовать для управления ACL общих папок команду maildiracl(1). Естественно, можно редактировать файлы courierimapacl вручную, однако, использование команды maildiracl является гораздо более корректным подходом, т.к. позволяет избежать большинство возможных ошибок.
Команда maildiracl имеет пять вариантов использования:
maildiracl {-reset} {maildir}
maildiracl {-list} {maildir} {INBOX[.folder]}
maildiracl {-set} {maildir} {INBOX[.folder]} {[-]identifier} {[+/-]rights}
maildiracl {-delete} {maildir} {INBOX[.folder]} {[-]identifier}
maildiracl {-compute} {maildir} {INBOX[.folder]} {identifier...}
Команда maildiracl -reset предназначена для сброса ACL общей папки, если она была удалена, но информация о ней осталась в кеше сервера (если все работает нормально, использование данной команды не потребуется). Допустим, что необходимо сбросить ACL общей папки info@company.com. Для этого следует выполнить команду:
maildiracl -reset /var/spool/vmail/company.com/info@company.com
Команда maildiracl -list предназначена для отображения ACL общей папки. Допустим, что необходимо посмотреть ACL папки INBOX общей папки info@company.com. Для этого следует выполнить команду:
maildiracl -list /var/spool/vmail/company.com/info@company.com INBOX
Команда maildiracl -set предназначена для изменения ACL общей папки посредством добавления и удаления разрешающих и негативных прав доступа. Для задании негативных прав доступа перед идентификатором пользователя или группы должен стоять символ '-', для удаления заданного разрешения перед удаляемым разрешением должен стоять символ '-'. Допустим, что необходимо разрешить всем кроме пользователя user1@company.com видеть в списке общих папок папку INBOX общей папки info@company.com и просматривать ее содержимое, а пользователю user2@company.com необходимо запретить удалять сообщения, помеченные на удаление, из этой папки. Для этого следует выполнить три команды:
maildiracl -set /var/spool/vmail/company.com/info@company.com INBOX anyone lr maildiracl -set /var/spool/vmail/company.com/info@company.com INBOX -user=user1@company.com lr maildiracl -set /var/spool/vmail/company.com/info@company.com INBOX user=user2@company.com -e
Команда maildiracl -delete предназначена для изменения ACL общей папки посредством удаления разрешающих и негативных прав доступа. Допустим, что из ACL для папки INBOX общей папки info@company.com необходимо удалить разрешающие права доступа для группы anyone, и негативные права доступа для пользователя user@company.com. Для этого следует выполнить две команды:
maildiracl -delete /var/spool/vmail/company.com/info@company.com INBOX anyone maildiracl -delete /var/spool/vmail/company.com/info@company.com INBOX -user=user@company.com
Команда maildiracl -compute предназначена для вычисления прав доступа к общей папке. Допустим, что необходимо вычислить права доступа группы anyone и пользователя user@company.com к папке INBOX общей папки info@company.com. Для этого следует выполнить команду:
maildiracl -compute /var/spool/vmail/company.com/info@company.com INBOX anyone user=user@company.com
Заключение
Кажется, я рассказал все, что вспомнил про использование общих папок на сервере Courier-IMAP. Выполнив несложную последовательность действий, описанных в статье, Вы расширите функциональность своей почтовой системы и сможете сэкономить время, затрачиваемое на ее поддержку. Заранее отвечу на вопрос о том, какие почтовые клиенты понимают общие папки. В идеале - любые почтовые клиенты, поддерживающие протокол IMAP. Лично я использую Mozilla Thunderbird, который обеспечивает отличную работу по протоколу IMAP в том числе и с общими папками.
Похожие статьи в рубриках ‘FreeBSD’ и ‘Почтовые системы’
- FreeBSD: Дополнительные возможности PostfixAdmin
- FreeBSD: Простейший POP3/POP3S-сервер на базе popa3d и stunnel
- FreeBSD: Почтовая система среднего офиса на базе Postfix
- FreeBSD: Интеграция Kaspersky Anti-Virus for Unix File Servers и Amavisd-New
- FreeBSD: DKIM верификация средствами Amavisd-new и SpamAssassin


Добрый день.
Сделал общие папки и они вполне работают. Но начальство озадачило следующим требованием: “Сделать что бы флаг о прочтении был для каждого свой”, т.е. в нашем случае один отметил что письмо прочитано то и у всех так покажет.
Сама структура maildir, как я понимаю не дает такой возможности…
Стоит postfix + courier + mysql (для хранения пользователей)
Есть ли вариант такую задачу решить?
Добрый вечер. Общая папка одна на всех, поэтому после прочтения сообщения первым абонентом, имеющим право
s, сообщение становится прочитанным. Если Вам нужна дистрибьюция непрочитанного сообщения в несколько ящиков, придется создавать алиасы и настраивать фильтры на всех нужных компьютерах. Если не хочется заморачиваться, оставьте правоsтолько соответствующему руководителю, чтобы сообщение становилось прочитанным только после его визита. У меня сделано именно так.[...] подробную информацию можно посмотреть в оригинальной статье. Tagged with: Courier-IMAP • [...]
Чет у меня не получилось
Есть ящик, например
all@company.com, на который приходит вся рабочая почта, и есть ящикиname1@company.com,name2@company.comи т.д. Нужно чтобы папкаINBOXящикаall@company.comбыла доступна всем пользователям./usr/local/etc/courier-imap/shared/indexу меня такой:all@company.com 1111 1111 /var/spool/mail company.com/all
name1@company.com 1111 1111 /var/spool/mail company.com/name1
name2@company.com 1111 1111 /var/spool/mail company.com/name2
/var/spool/mail/company.com/all/courierimapaclтак:owner aceilrstwx
anyone lr
administrators aceilrstwx
Thunderbird не видит общую папку.
У меня была такая же проблема с последними версиями Courier-IMAP. Откатил Courier-IMAP до версии 4.8.1,2.
Собственно все заработало после отката. Задаюсь вопросом – для чего выпускать новые версии, если в них ничего не работает? А за статью огромное спасибо, единственная хорошая статья в рунете, что нашел. Инфы по этой теме на русском языке очень мало.
Я тоже несколько раз обновлял, а потом приходилось откатываться. При этом инструкции на официальном сайте не менялись.
Скорее всего, разработчики стали уделять меньше внимания своему детищу или не совсем корректно портировали его под FreeBSD. Как только доберусь до обновления почтовой системы, обязательно попробую Dovecot.
Спасибо, что читаете
Такой вопрос еще не по теме: у каждого менеджера свой ящик и общая папка на которую приходит основная масса писем, как сделать так что бы все письма, приходящие лично менеджерам, копировались бы в общую папку?
Это вопрос не по теме. Он касается настройки MTA (Exim, Postfix, Sendmail, QMail), а не IMAP-сервера