Для админов, делающих щастье своим юзерам, маленькая заметка о том, как совместить Cyrus-IMAP и qmail.
Два дня выбирал, какой сервер IMAP поставить на работе. Испытал bincimap, UW-IMAP, Dovecot, Courier, Cyrus. Проблема в том, что очень нужны общие папки (Shared Folder) с механизмом контроля доступа к ним. Все названные сервера, кроме последнего, или вообще не поддерживают общие папки, или делают это через задницу. Cyrus-IMAP понравился всем, кроме того, что он закрытый. Т.е., он использует свое собственное хранилище сообщений, куда грязными руками соваться не следует. В частности, нельзя просто положить письмо в нужный каталог, надо еще прописать его в индексных файлах, одному cyrus'у известно в каких. Поэтому доставка письма производится либо через юниксовый сокет по протоколу LMTP, либо с помощью прилагаемой утилиты deliver, которая в итоге пишет в тот же сокет. В сопроводительной документации подробно рассказано, как заставить sendmail запихивать письма в Cyrus, вскользь упомянут exim, но ни слова о qmail, а именно он у меня базовый MTA. Пришлось придумывать самому.
Вообще, все тривиально. Составляем usertable, где перечисляем особенных пользователей, а в качестве шаблона по умолчанию пишем
+:cyrus:104:8:/var/spool/cyrus:-::
В данном случае 104 и 8 - uid и gid пользователя cyrus в моей системе. В домашнем каталоге этого пользователя создаем файл .qmail-default с единственной строчкой
|preline -fr deliver -r "$SENDER" -m INBOX -- $DEFAULT
Задача решена. Ну, почти решена. Команда preline из пакета qmail дополнит заголовок сообщения строкой Delivered-To:, содержащей получателя из конверта (envelope recipient). Без флагов -fr она добавила бы также Return-Path: (отправитель из конверта) и строку From, пришедшую из эпохи UUCP и ныне разделяющую письма в стандарном UNIX mailbox. Почему бы не добавить Return-Path:? Дело в том, что программа deliver добавит точно такую же строку, но, если не указать иного, сформирует ее по своему: возьмет имя текущего пользователя и имя текущего хоста. Текущий пользователь в данном случае cyrus, так что на машине mail.example.com вы всегда получите в заголовке любого письма
Return-Path: <
cyrus@mail.example.com>
Информация об изначальном отправителе будет потеряна. Поэтому с помощью параметра -r и переменной окружения $SENDER, устанавливаемой qmail-local, сохраняется исходный отправитель.
В моем случае новая почта всегда доставляется в папку "Входящие", об этом говорит параметр -m INBOX. Переменная $DEFAULT - имя почтового ящика, которое у меня совпадает именем пользователя Cyrus-IMAP. Если у вас не совпадает, нужно поправить usertable (см. man qmail-users).
А как поместить письмо в общую папку, скажем office? Так же просто. Если этой папке соответствует адрес
office@example.com, просто добавьте в домашний каталог cyrus файл .qmail-office, содержащий строку
|preline -fr cyrdeliver -r "$SENDER" -m office
Следующий этап - подружить qmail и UUCP, а также UUCP и Microsoft Exchange. Когда справлюсь, расскажу.