Настройка exim + procmail
На новом VDS в качестве MTA стоит exim.
Так как на старом я использовал procmail для сортировки почты по папкам, то решил настроить также и на новом. При этом, подружив его с ISPmanager.
Настройка dovecot аналогична прошлой. В конфиге ISPmanager дописать
Option MailDir и Option Procmail
Теперь собственно о exim.
Для начала просто о maildir.
По умолчанию транспорт (то что после begin transports) local_delivery выглядел так:
local_delivery:
driver = appendfile
file = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}/mbox
delivery_date_add
envelope_to_add
return_path_add
mode = 0660
quota = ${extract{3}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}M
quota_warn_threshold = 75%
use_lockfile = no
no_mode_fail_narrower
user = ${extract{1}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}
group = ${extract{2}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}
Собственно, убрал строку file = … и добавил вместо неё следующее:
maildir_format = true
create_directory = true
directory_mode = 700
directory = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}/.maildir
В итоге секция приняла такой вид (решение не моё, а коллеги):
local_delivery:
driver = appendfile
maildir_format = true
create_directory = true
directory_mode = 700
directory = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}/.maildir
delivery_date_add
envelope_to_add
return_path_add
mode = 0660
quota = ${extract{3}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}M
quota_warn_threshold = 75%
use_lockfile = no
no_mode_fail_narrower
user = ${extract{1}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}
group = ${extract{2}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}
Итак, maildir есть. Теперь procmail.
В ходе настройки выяснилось несколько особенностей работы procmail. Все эти особенности, правда, описаны в man`е, но некоторые неявно.
- Если procmail запускать без параметров, и без указания конфигурационного файла, то procmail вначале читает глобальный конфиг(для FreeBSD это /usr/local/etc/procmailrc). Затем читает файл .procmailrc в директории пользователя, от которого запущен.
В sendmail ISPmanager для каждого ящика создаёт отдельного системного пользователя. Поэтому проблем нету. Но в exim этого нету. И procmail`у надо как-то прочитать файл .procmailrc в директории ящика плюс некоторые глобальные настройки (ISPmanager для определения отправителя/получателя и т.д. использует макросы) - Если указать конкретный файл procmailrc, то глобальный конфиг не будет читаться
- Если procmail запустить без параметров, то все переменные окружения обнуляются.
- Если запустить procmail с ключом -p (сохранить переменные окружения) то procmail`у необходимо указать конфиг файл, со всеми вытекающими
- Если передать какой-либо параметр или макрос через -m , то опять же должен быть указан конфиг файл
Из-за этих особенностей, после нескольких часов мучений, пришлось в итоге отказаться от глобального конфиг файла вообще
А всё, что там должно было быть, передавать в командной строке через -m
Итого:
В секции роутеров (begin routers) перед роутером localuser нужно добавить роутер procmail
procmail:
driver = accept
transport = procmail_pipe
condition = ${if exists{${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}/.procmailrc} {yes} {no}}
transport_home_directory = ${extract{4}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}
no_verify
А в секцию транспортов добавить
procmail_pipe:
driver = pipe
command = "/usr/local/bin/procmail $home/.procmailrc -m HOME=$home -m MAILDIR=$home/.maildir -m ORGMAIL= -m ISP_from='^(From|Return-Path): ?' -m ISP_to='^(To|CC|BCC): ?' -m ISP_address='^(From|Return-Path|To|CC|BCC): ?' -m ISP_subject='^(XX-)?Subject: ?' -m DEFAULT='$home/.maildir/'"
return_path_add
delivery_date_add
envelope_to_add
check_string = "From "
escape_string = ">From "
user = ${extract{1}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}
group = ${extract{2}{:}{${lookup{$local_part@$domain}lsearch{/usr/local/etc/exim/passwd}}}}
Опять же эти секции придуманы не мной, а всё тем же коллегой. За исключением основного: строки command
Теперь всё работает как и раньше на sendmail. Добавлять/удалять фильтры procmail для ящика можно в ISPmanager



Есть две проблемы в этой реализации:
1)Как быть с квотами в таком случае? Procmail на квоты совсем не смотрит и будет складывать почту в ящик до тех пор пока системные квоты не кончатся(вероятно).
2) И ещё одна провлемка. В maildir есть файлик один – maildirsize, кто его будет обновлять вместо procmaila(он этого не умеет в отличии от exima)? Webmail-ы будут неправильно показывать занятость ящика.
@ Andryu:
1) Да, действительно, есть проблема. Можно, наверное, придумать дополнительную проверку.
2) Никогда не было проблем с webmail. Впрочем, и пользуюсь им раз в год