Exim 23 Среда для работы локальных транспортов

Материал из wiki.lissyara.su
Перейти к: навигация, поиск

Среда для работы локальных транспортов

Локальные транспорты обрабатывают доставки в файлы и трубы (pipe). (О транспорте “autoreply” можно думать как о доставке в трубу.) Exim всегда выполняет транспорты в субпроцессах, под заданным gid и uid. Типичная доставка в локальные почтовые ящики выполняется под gid и uid локального пользователя.

Также, exim устанавливает специфическую текущую директорию, когда работает транспорт; для некоторых транспортов, также уместна установка домашней директории. Единственный транспорт, устанавливающий переменные окружения - “pipe”; для получения дополнительных деталей, смотрите раздел 29.4.

Значение, используемое для uid, gid, и директорий может приходить из нескольких различных мест. Во многих случаях, роутер, обрабатывающий адрес, ассоциирует настройки этого адреса как результат его опций “check_local_user”, “group” или “user”. Однако, значения также можно задать в собственной конфигурации транспорта, и они перезадают любые приходящие из роутера.

Одновременные доставки

Если одновременно приходят два различных сообщения, для одного и того же пользователя, то, вероятно, два процесса доставки выполнятся одновременно. Когда для записи в файл используется транспорт “appendfile”, exim применяет правила блокировки, чтобы помешать одновременным процессам записывать в один файл одновременно.

Однако, когда вы используете транспорт “pipe”, вам решать, как упорядочивать необходимую блокировку. Вот, глупый пример:

my_transport:
  driver = pipe
  command = /bin/sh -c 'cat >>/some/file'

Он, должен записывать сообщение в конце файла. Однако, если придут два сообщения одновременно, в файле будет свалка. Вы можете использовать утилиту “exim_lock” (смотрите раздел 49.15), для блокировки файла с использованием того же алгоритма, который использует exim.

Uid`ы и gid`ы

У всех транспортов есть опции “group” и “user”. Если установлена “group”, она перезадаёт любую группу, заданную маршрутизатором в адресе, даже если для транспорта не задана опция “user”. Это позволяет, например, производить локальную доставку почты под uid получателя (установленного роутером), но в специальной группе (установленной транспортом). Например:

# Routers ...
# User/group are set by check_local_user in this router
local_users:
  driver = accept
  check_local_user
  transport = group_delivery

# Transports ...
# This transport overrides the group
group_delivery:
  driver = appendfile
  file = /var/spool/mail/$local_part
  group = mail

Если для транспорта установлена опция “user”, её значение переопределяет, то, что установлено маршрутизатором в адресе. Если “user” задано не в виде числа, и незадана “group”, gid ассоциируется с используемым пользователем. Если “user” в виде числа, “group” должна быть задана.

Когда uid берётся из конфигурации транспорта, для связанных с этим uid групп вызывается функция “initgroups()”, если для транспорта установлена опция “initgroups”. Когда uid не задан транспортом, но ассоциирован роутером с адресом, опция для вызова “initgroups()” берётся из конфигурации роутера.

Транспорт “pipe” содержит специальную опцию - “pipe_as_creator”. Если она задана, и не задана “user”, используется uid процесса, вызвавшего exim для передачи сообщения, и если не задана “group”, также используется оригинальный gid.

Это - предпочтительный детализованный порядок получения gid; используется первый из установленных:

  • Установка “group” транспорта;
  • Установка “group” роутера;
  • Gid ассоциированный с пользовательской настройкой роутера, или как результат “check_local_user”, или явной нечисловой установки “user”;
  • Группа, ассоциированная с нечисловой установкой “user” транспорта;
  • В транспорте “pipe”, gid создателя, если “deliver_as_creator” установлена, и uid - uid создателя;
  • Gid exim`a, если по дефолту используется uid exim`a.

Если, например, пользователь определён в роутере в цифровой форме, и в нём нет установок группы, нет доступного gid. В этой ситуации, происходит ошибка. Это отличается от uid, для которого всегда есть дефолтовое значение. Используется первая из установленных настроек:

  • Установка “user” транспорта;
  • В транспорте “pipe”, uid создателя, если установлена “deliver_as_creator”;
  • Установка “user” роутера;
  • Установка роутера - “check_local_user”;
  • Uid exim`a.

Разумеется, всё равно будет ошибка, если выбранный uid в списке “never_users”.

Текущая и домашняя директории

Роутеры могут устанавливать текущую и домашнюю директории для локальных транспортов путём опций “transport_current_directory” и “transport_home_directory”. Однако, если для транспорта установлены опции “current_directory” и “home_directory”, они переопределяют значения роутера. В деталях, домашняя директория для локального транспорта берётся из первого установленного значения:

  • Опции “home_directory”, в транспорте;
  • Опции “transport_home_directory” в роутере;
  • Данных пароля, если в роутере установлена “check_local_user”;
  • Опции “router_home_directory”, в роутере.

Текущая директория берётся из первого установленного значения:

  • Опции транспорта “current_directory”;
  • Опции “transport_current_directory”, роутера.

Если ни роутер, ни транспорт не устанавливают текущую директорию, exim использует значение домашней директории, если оно установлено. Иначе, до работы локального транспорта, он устанавливает текущую директорию в “/”.

Переменные раскрытия произведённые из адреса

Обычно, локальная доставка обрабатывает один адрес, и в этом случае, переменные типа “$domain” и “$local_part” установлены в течение локальных доставок. Однако, в некоторых обсоятельствах, может быть обработано более одного адреса за раз (например, при записи пакетного SMTP для дальнейшей передачи другими средствами). В этом случае, переменные, ассоциированные с локальной частью, никогда не устанавливаются, “$domain” устанавливается лишь если адреса имеют одинаковый домен, “$original_domain” не устанавливается никогда.


translated by lissyara