Nobody about something

Настройка exim + procmail

Написано 28 апреля 2010 в 22:38 - Рубрики: *nix

На новом 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

Метки: , , ,

Комментарии (2) на запись “Настройка exim + procmail”

  1. Andryu пишет 8 января 2011 в 7:03

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

  2. reonaydo пишет 16 января 2011 в 21:00

    @ Andryu:
    1) Да, действительно, есть проблема. Можно, наверное, придумать дополнительную проверку.
    2) Никогда не было проблем с webmail. Впрочем, и пользуюсь им раз в год

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