Для того, что бы доставлять сообщения в почтовый ящик пользователя, в ZMailer существует mailbox LDA. Но у него есть ряд ограничений:
- он умеет работать только с mailbox ящиками (не умеет maildir или dbox)
- он не имеет почтовых фильтров (и не умеет доставлять куда-либо, кроме INBOX)
- квота может быть только на файловой системе (только fs_quota)
- никак не учитывает того, кто дальше работает с этим ящиком (pop/imap)
Если же вы уже используете в качестве pop/imap сервера dovecot, то использование dovecot LDA выглядит хорошей идеей.
Тогда вы получаете:
- индексирование ящика в момент доставки, что ускоряет доступ к нему через pop/imap
- использование разных тип квот, которые умеет dovecot (fs, dirsize, dict, maildir)
- язык фильтров sieve (переадресация, авто-ответ, доставка в любые папки)
- ящик может быть не только mailbox типа (mbox, maildir, dbox)
Для установки в ZMailer'е dovecot LDA в качестве доставщика сообщений в ящик пользователя надо:
1. Установить dovecot LDA
2. Добавить описание LDA в: zmailer/sm.conf
# dovecot LDA dovecot SPfne /usr/local/libexec/dovecot/deliver deliver -e -n -d $u
3. И добавить доставку через этот LDA в: zmailer/scheduler.conf
(доставку в file* и pipe* надо оставить через штатный mailbox)
local/file*
local/pipe*
interval=1m
idlemax=9m
expiry=5d
maxchannel=10
maxring=10
# zmailer local delivery transport agent
command="mailbox -8HS -l ${LOGDIR}/mailbox"
local/*
interval=1m
idlemax=9m
expiry=5d
maxchannel=10
maxring=10
# DOVECOT as the local delivery agent:
command="sm -8Hc $channel dovecot"
И как всегда, есть небольшая, но исправимая проблема. При доставке я использую параметр «-e». Этот параметр позволяет dovecot deliver'у сообщить о проблеме доставки ZMailer'у, а не генерировать ответ самому. При такой работе deliver завершается с кодом: EX_NOPERM. Такой код ответа приводит к пугающему сообщению: (this is abnormal, investigate!) в ZMailer'е.
Для исправления можно или изменить реакцию на этот код у ZMailer'а:
zmailer/transports/libta/diagnostic.c
- case EX_NOPERM:
case EX_PROTOCOL:
case EX_USAGE:
strcat(message,
" (this is abnormal, investigate!)");
s += strlen(s);
/* fall through */
+ case EX_NOPERM:
case EX_NOUSER:
case EX_NOHOST:
case EX_UNAVAILABLE:
Или изменить код возврата у deliver'а:
dovecot-1.2.6/src/deliver/deliver.c
if (stderr_rejection) - return EX_NOPERM; + return EX_UNAVAILABLE;









Оставить комментарий