Роутер REDIRECT

Перевод выполнен Алексеем Паутовым в рамках некоммерческого проекта RussianLDP (http://www.rldp.ru/). Именно на этом сайте и надлежит искать новые версии, если таковые будут.

22. Роутер REDIRECT

Роутер redirect обрабатывает несколько видов переназначения адресов. Его самое частое использование для разрешения локальной части алиаса по центральному файлу алиасов (обычно это /etc/aliases) и для обработки пользовательского файла .forward, но также есть много других потенциальных использований. Входящий адрес может быть переадресован несколькими различными способами:

  • Он может быть заменён одним или более новым адресом, которые будут роутится самостоятельно.
  • Он может быть маршрутизирован для доставки в файл или в каталог.
  • Он может быть доставлен в специфический канал (pipe).
  • Можно сделать автоматический ответ.
  • Он может принудительно стать неудачным (fail) с самостоятельным сообщением об ошибке.
  • Он может быть временно задержан.
  • Он может быть отброшен.

Общая опция transport не должна быть установлена для роутера redirect. Однако, есть некоторые частные опции с заданным транспортом для доставки в канал и файлы, а также для генерации автоответов. Смотрите описания file_transport, pipe_transport и reply_transport ниже.

22.1. Данные для перенаправления

Роутер функционирует путем интерпретации текстовой строки, которая получается либо в результате преобразования содержимого опции data, либо в результате чтения содержимого файла, чье имя определено опцией file. Эти две опции являются взаимоисключающими. Первая из них часто используется для обработки системных псевдонимов в конфигурации, наподобие данной:

system_aliases:
    driver = redirect
    data = ${lookup{
$local_part}lsearch{/etc/aliases}}

Если поиск завершился неудачно, то раскрываемая строка в этом примере пустая. В случае неудачного раскрытия опции data, роутер пропускается. Принудительное завершение преобразования также ведет к пропуску роутера, другие ошибки раскрытия приводят к тому, что доставка временно откладывается.

Конфигурация с опцией file часто используется для обработки пользовательских файлов .forward, например таким образом:

userforward:
    driver = redirect
    check_local_user
    file = $home/.forward
    no_verify

Если файл не существует или не содержит никаких инструкций по выполнению (например, файл пуст или содержит только комментарии), то роутер пропускается. Внимание: это не тот случай, когда файл содержит синтаксически допустимые элементы, которые могут иногда выдавать пустые адреса, например элементы, содержащие только адресные комментарии в соответствии с RFC 2822.

22.2. Файлы пересылки (forward files) и проверка адреса

Обычной практикой является установка опции no_verify на роутерах redirect, обрабатывающих пользовательские файлы .forward, как в вышеописанном примере. Для этого существуют 2 причины:

  • Когда Exim принимает входящее SMTP-сообщение от удаленного узла, он запускается от имени пользователя Exim (Exim uid), а не от имени суперпользователя (root). При этом не устанавливается никаких дополнительных групп, даже если пользовательский идентификатор (uid) Exim является членом других групп (то есть, функция initgroups() не вызывается). Exim не может изменить uid для чтения файла, чтобы прочитать его как владелец, а также возможно файл не будет доступен для чтения пользователю Exim. Таким образом, на практике роутер может не функционировать.
  • Однако, даже когда роутер может работать, существование файла .forward неважно в то время, когда адрес проверяется. Должно быть проверено только является ли локальная часть адреса допустимым именем пользователя или нет. Если убрать обработку перенаправления в данном случае, то это сохранит некоторые ресурсы.

22.3. Обработка данных перенаправления

Содержимое строки данных полученное либо через data, либо через file, может быть интерпретировано двумя разными способами:

  • Если опция allow_filter установлена в истинное значение, и данные начинаются со строки #Exim filter или #Sieve filter, то содержимое интерпретируется как список фильтрующих инструкций в форме фильтров Exim или Sieve соответственно. Подробности синтаксиса и семантики файлов фильтров описаны в отдельном документе "Интерфейсы Exim к фильтрации почты", предназначенном конечным пользователям.
  • В противном случае данные должны представлять собой список элементов перенаправления (redirection items), разделенных запятыми, как описано в следующей секции. Когда сообщение перенаправляется в файл (почтовая папка), имя файла, описанного в списке перенаправления, не являющимся фильтром, должно быть абсолютным (до него указан полный путь). Фильтр может генерировать относительный путь: то, как это обрабатывается, зависит от конфигурации транспорта. См. секцию 26.1 для описания этой темы для транспорта appendfile.

22.4. Элементы списка перенаправления

Если данные перенаправления не являются фильтрами Exim и Sieve, например, если они были получены из файла псевдонимов или файла .forward, то они содержат список адресов, имен файлов, конвейерных команд или специальных элементов (см. секцию 22.6 ниже). Эти специальные элементы могут быть индивидуально включены или отключены посредством опций, начинающихся с allow_ или forbid_, в зависимости от значений по умолчанию. Элементы в списке разделены запятыми или новыми строками. Если в элементе требуется символ "запятая", то весь элемент должен быть заключен в двойные кавычки. Строки, начинающиеся с символа #, являются комментариями и игнорируются, также может встретиться символ # с последующей запятой, в этом случае все, что находится между # и следующим символом новой строки, игнорируется.

Если элемент целиком заключен в двойные кавычки, то они опускаются. В противном случае они остаются потому, как некоторые формы почтовых адресов требуют их использования (но никогда в кавычки не берется адрес целиком). В следующем описании под элементом понимается то, что остается после опускания кавычек.

Внимание: Если Вы используете преобразование Exim для построения адреса перенаправления и преобразование содержит ссылку на $local_part, то Вы должны использовать оператор раскрытия quote на случай, если локальная часть почтового адреса содержит спецсимволы. Например, чтобы перенаправить всю почту для домена obsolete.example, оставив неизменным существующую локальную часть адреса, можете использовать такую конструкцию:

data = ${quote:$local_part}@newdomain.example

22.5. Перенаправление в локальный почтовый ящик

Элемент в списке перенаправления может быть в точности самим адресом. Это не вызовет зацикливания маршрутизации, потому что роутер автоматически пропускается, если родительский адрес обрабатываемого адреса совпадает с ним, и обрабатывался он текущим роутером. Далее адрес передается следующим роутерам, таким образом он обрабатывается как будто бы не было никакого перенаправления. В процессе проверки зацикливания используется полная локальная часть почтового адреса, включая префиксы и суффиксы.

Указание той же локальной части почтового адреса без указания домена в персональных файлах фильтров является обычной практикой в том случае, если пользователь хочет, чтобы сообщения доставлялись в локальный почтовый ящик, а также перенаправлялись еще куда-нибудь. Например, пользователь с учетной записью cleo может иметь файл .forward, содержащий такую запись:

cleo, cleopatra@egypt.example

Для совместимости с другими MTA такие локальные части могут быть предварены символом \, но это не является требованием для предотвращения зацикливания. Однако, это дает разницу, если таким образом обрабатывается более одного домена.

Если элемент начинается с символа \ и остальная часть его является адресом, соответствующим RFC 2822, не включающим в себя домен, то этот элемент дополняется доменом входящего адреса. В отсутствие предшествующего символа \ неполные адреса дополняются, используя значение опции qualify_recipient, но Вы можете принудительно изменить входящий домен, используя опцию qualify_preserve_domain.

Если существуют псевдонимы для локальных пользователей, то нужно быть осторожным. Рассмотрим MTA, обрабатывающий простой локальный домен, где системный файл псевдонимов содержит:

Sam.Reman: spqr

Теперь предположим, что Сэм (чей идентификатор spqr) хочет сохранять копии сообщений в локальном почтовом ящике, а также перенаправлять копии куда-либо еще. Он создает такой файл перенаправления:

Sam.Reman, spqr@reme.elsewhere.example

С подобными настройками входящее сообщение для Sam.Reman отклоняется. Роутер redirect для системных псевдонимов не обрабатывает Sam.Reman второй раз, потому как он уже маршрутизировал его, и следующие роутеры, по-видимому, тоже не смогут обработать псевдоним. Файл перенаправления должен на самом деле содержать:

spqr, spqr@reme.elsewhere.example
но так как это распространенная ошибка, то существует опция check_ancestor (см. ниже) для ее обхода. Обычно она определяется в роутере, обрабатывающем пользовательские файлы .forward.

22.6. Специальные конструкции в списках перенаправления

Вдобавок к адресам в списках перенаправления (не являющихся фильтрами) могут быть следующие типы конструкций:

  • Элемент рассматривается как команда перенаправления, если он начинается с символа | и не распознается как адрес, соответствующий RFC 2822. Транспорт для запуска этой команды должен быть определен опцией pipe_transport. Обычно пользователь и группа, от имени которых выполняется доставка, определяются роутером или транспортом. По умолчанию используются пользователь и группа, отведенные для Exim. Одинарные или двойные кавычки могут использоваться для заключения аргументов команды перенаправления, причем для одинарных кавычек интерполяция содержимого внутри не производится. Если команда содержит запятую, то ее необходимо поместить в двойные кавычки, например:
    "|/some/command ready,steady,go"
    
    так как элементы в списках перенаправления оканчиваются запятыми. Однако, недопустимо помещать в кавычки только команду. Например,
    |"/some/command ready,steady,go"
    
    интерпретируется как перенаправление вывода с довольно странным именем команды без аргументов.
  • Элемент интерпретируется как путь, если он начинается с / и не распознается как адрес, соответствующий RFC 2822. Например,
    /home/world/minbari
    
    трактуется как имя файла, но
    /s=molari/o=babylon/@x400gate.way
    
    распознается как адрес. Для файла должен быть определен транспорт при помощи опции file_transport. Однако, если путь оканчивается символом /, то он интерпретируется как имя каталога, а не файла, и в этом случае используется опция directory_transport. Обычно пользователь и группа, от имени которых выполняется доставка, определяются роутером или транспортом. По умолчанию используются пользователь и группа, из-под которых работает Exim. Однако, если перенаправление производится в /dev/null, то доставка в него передается на высокий уровень, а запись в протоколе выглядит как **bypassed** вместо имени транспорта. В этом случае пользователь и группа не используются.
  • Если элемент выглядит таким образом:
    :include:<path name>
    
    то он представляет собой список дальнейших элементов, которые берутся из файла, находящегося по данному пути. Замечание: этот файл не может быть файлом фильтров, он является просто добавлением к списку. Элементы во включаемом списке разделяются запятыми или новыми строками. Если это первый элемент в списке псевдонимов в файле, то имя псевдонима должно отделяться двоеточием. Следующий пример неверен:
    list1    :include:/opt/lists/list1
    

    Должно быть так:

    list1:   :include:/opt/lists/list1
    
  • Иногда Вы хотите выбрасывать почту с определенной локальной частью почтового адреса. Способ преобразования опции data в пустую строку не работает, потому как он заставляет роутер отклонять сообщение. Вместо этого используется специальный элемент:
    :blackhole:
    
    То, что он делает, видно из его названия. Не происходит никакой доставки и не генерируется сообщения об ошибке. Это приводит к такому же эффекту, что и указание /dev/null, однако это может быть избирательно выключено. Внимание: Если :blackhole: указано где-либо в списке перенаправления, то доставка для исходной локальной части почтового адреса не выполняется, даже если присутствуют другие элементы перенаправления. Если Вы создаете многоэлементный список (например, путем чтения из базы данных) и Вам нужна возможность обеспечить элемент такого, который не выполняет доставку, то Вы должны использовать /dev/null.
  • Попытка доставки почты для определенного адреса может быть отложена или принудительно завершена неудачно при помощи элементов (соответственно):
    :defer:
    :fail:
    
    Если список перенаправления содержит такой элемент, то он применяется ко всему списку, другие элементы в списке игнорируются (кроме :blackhole:). Любой текст следующий за :fail: или :defer:, помещается в сообщение об ошибке, ассоциированное с этой неудачной доставкой. Например, файл псевдонимов может содержать:
    X.Employee:  :fail: Gone away, no forwarding address
    
    В случае адреса, проверяемого из ACL или командой VRFY, текст включается в сообщение об SMTP-ошибке по умолчанию. В ACL явно описанное сообщение об ошибке перекрывает сообщение по умолчанию, но то в свою очередь доступно в переменной $acl_verify_message. Exim посылает код SMTP 451 для :defer: и 550 для :fail:. В не-SMTP случаях текст включается в формируемое Exim сообщение об ошибке. Обычно текст сообщения об ошибке располагается в конце списка перенаправления, символ запятой не завершает его, но символ новой строки действует как завершение списка. Новые строки обычно не присутствуют в списках псевдонимов. В поисках типа lsearch они удаляются в процессе преобразования, но они могут существовать в других типах поиска и в файлах :include:. Во время маршрутизации сообщения (в отличие от проверки) перенаправление, содержащее элемент :fail:, вызывает немедленное отклонение входящего адреса в то время как :defer: указывает сообщению оставаться в очереди так, что последующая попытка доставки может произвестись позже. Если адрес откладывается слишком долго, он может в конечном счете отклониться полностью, так как срабатывают правила повтора.
  • Иногда полезно использовать одноключевой (single-key) тип поиска (см. главу 9) для поиска псевдонимов. Однако, может быть потребность для исключений из этого. Они могут быть обработаны путем псевдонимизации их к:
    :unknown:
    
    Отличие от :fail: состоит в том, что это заставляет роутер redirect отклонять сообщение в то время, как :fail: маршрутизацию принудительно завершает неудачно. Поиск, результатом которого является пустой список перенаправления, имеет тот же эффект.

22.7. Дублирование адресов

Exim убирает дублированные адреса из списка адресов, к которым совершается доставка, так что для каждого адреса доставляется только одна копия. Это правило не применяется к доставкам, перенаправляемым в потоки (pipes) различными родительскими адресами, однако непрямая схема псевдонимизации:

pipe:       |/some/command $local_part
localpart1: pipe
localpart2: pipe
не работает с сообщением, адресуемым обеим локальным частям, потому как когда второй из них ссылается на pipe, он отбрасывается, как уже обработанный. Однако, схема
localpart1: |/some/command $local_part
localpart2: |/some/command $local_part
выполнит доставку в различные потоки, так как родители потоков различны.

22.8. Повторяющееся преобразование перенаправления

В случае, если сообщение не может быть доставлено всем адресатам за несколько попыток, то преобразование перенаправления проводится каждый раз заново для адресов, к дочерним адресам которых доставка не произошла. Если перенаправление используется как список рассылки, то это может привести к тому, что новые подписчики получат копии старых сообщений. Опция one_time может помочь этого избежать.

22.9. Ошибки в списках перенаправления

Если установлена опция skip_syntax_errors, то неправильно написанный адрес, вызывающий ошибку разбора строки, пропускается, и в главный протокол делается соответствующая запись. Это может быть полезно для автоматических списков рассылки. В любом случае, если в процессе генерации списка новых адресов обнаруживается ошибка, то родительский исходный адрес откладывается. См. также опцию syntax_errors_to.

22.10. Частные опции роутера redirect

опция
использование
тип
По умолчанию
allow_defer redirectboolean false

Установка этой опции позволяет использовать :defer: в данных перенаправления (не в фильтрах), либо команду defer в файле фильтров Exim.

опция
использование
тип
по умолчанию
allow_fail redirectboolean false

Если данная опция истинна, то элемент :fail: можно использовать в списке перенаправления, и команда fail может использоваться в файле фильтров.

опция
использование
тип
По умолчанию
allow_filter redirectboolean false

Установка этой опции позволяет Exim интерпретировать данные перенаправления, начинающихся с #Exim filter или #Sieve filter как множество инструкций по фильтрации. Есть несколько свойств файлов фильтров Exim, которые некоторые администраторы могут захотеть запретить: см. опции forbid_filter_xxx ниже. Фильтр запускается от имени пользователя и группы, определенных общими опциями user и group. Они берут свои умолчательные значения из файла паролей, если установлена опция check_local_user, так что в случае наличия пользовательских файлов фильтров, фильтр запускается от имени соответствующего пользователя. Если опция allow_filter истинна, то Exim требует, чтобы была выставлена опция check_local_user или user.

опция
использование
тип
По умолчанию
allow_freeze redirectboolean false

Установка этой опции позволяет использовать команду freeze в фильтре Exim. Эта команда чаще встречается в системных фильтрах и выключена по умолчанию для фильтров перенаправления, так как это не то, что Вы бы хотели позволить делать обычным пользователям.

опция
использование
тип
По умолчанию
check_ancestor redirectboolean false

Эта опция связана с обработкой сгенерированных адресов, которые могут совпадать с некоторыми родительскими адресами в списке перенаправления для текущего адреса. Хотя данная опция по умолчанию выключена в исходном коде, она включается в файл конфигурации по умолчанию для обработки пользовательских файлов .forward. Данная опция рекомендуется для подобного использования роутера redirect.

Если установлена опция check_ancestor, и если сгенерированный адрес (включая домен) такой же, как и родительский адрес текущего адреса, то он заменяется копией текущего адреса. Это помогает в случае, ко гда локальная часть почтового адреса А псевдонимизируется на B, а B имеет файл .forward, указывающий обратно на А. Например, внутри домена локальная часть Joe.Bloggs псевдонимизируется на jb, а ~jb/.forward содержит:

\Joe.Bloggs, <other item(s)>

Без установки опции check_ancestor любая из локальных частей почтового адреса (jb или Joe.Bloggs) обрабатывается каждым роутером один раз. Если jb имя реального почтового ящика, почта для jb доставляется (перенаправленная на Joe.Bloggs в файле .forward и обратно на jb как псевдоним), но почта на Joe.Bloggs не проходит. Установка check_ancestor на роутере redirect, который обрабатывает файл .forward, позволяет избежать переопределения jb обратно в Joe.Bloggs, если это был оригинальный адрес. См. ниже опцию repeat_use.

опция
использование
тип
По умолчанию
check_group redirectboolean смотрите ниже

Если используется опция file, то группа-владелец файла проверяется только, если установлена эта опция. Разрешенные группы это те, которые перечислены в опции owngroups вместе с пользовательской группой по умолчанию в случае, если установлена опция check_local_user. Если файл принадлежит неверной группе, то маршрутизация откладывается. Значение по умолчанию для этой опции истина в случае, если установлена опция check_local_user, и опция modemask дает права на запись для группы, либо установлена опция owngroups. В любом другом случае она ложна, и никаких проверок группы не выполняется.

опция
использование
тип
По умолчанию
check_owner redirectboolean смотрите ниже

Если используется опция file, то владелец файла проверяется только, если установлена эта опция. Если установлена check_local_user, то локальный пользователь получает разрешение, в другом случае владелец должен быть одним из перечисленных в опции owners. Значение по умолчанию для этой опции истина, если установлены опции check_local_user или owners. В противном случае значение по умолчанию ложь, и никаких проверок владельца не производится.

опция
использование
тип
По умолчанию
data redirectstring† unset

Эта опция является взаимоисключающей с опцией file. Одна из них должна быть определена, но не обе одновременно. Содержимое опции data может преобразовываться и затем использоваться как список элементов перенаправления или как множество инструкций фильтров. Если преобразование выполняется неудачно или результатом является пустая строка или строка без эффекта (состоящая из комментариев), роутер отклоняется. Если используются инструкции фильтров, то строка должна начинаться с #Exim filter, и все комментарии в строке, включая этот, должны оканчиваться символом новой строки. Например:

data = #Exim filter\n\
   if $h_to: contains Exim then save $home/mail/exim endif

Если вы читаете данные из базы, где символы новой строки не могут быть включены, можете использовать элемент преобразования ${sg} для преобразования шаблона строки последовательности в символ новой строки.

опция
использование
тип
По умолчанию
directory_transport redirectstring† unset

Роутер redirect устанавливает прямую доставку в каталог, если путь, оканчивающийся символом /, определяется как новый адрес. Транспорт для доставки определяется этой опцией, который после преобразования должен быть именем сконфигурированного транспорта. Обычно им является транспорт appendfile.

опция
использование
тип
По умолчанию
file redirectstring† unset

Данная опция определяет имя файла, содержащего данные для перенаправления. Она является взаимоисключающей с опцией data. Строка перед использованием преобразуется, если преобразование завершается неудачно, роутер отклоняется. Другие ошибки преобразования ведут к откладыванию доставки. Результатом успешного преобразования должен быть абсолютный путь. Файл читается целиком и используется как данные для перенаправления. Если данные представляют собой пустую строку или строку, состоящую из комментариев, то роутер отклоняется.

Если попытка открыть файл завершается неудачно вследствие того, что файл не существует, Exim выполняет проверку содержимого каталога, если только опция ignore_enotdir не установлена в истинное значение (см. ниже). Если каталог не существует, то доставка откладывается. Это может произойти в случае, если пользовательские файлы .forward монтируются по NFS, и если существует проблема монтирования. Если каталог существует, а файл нет, роутер отклоняется.

опция
использование
тип
По умолчанию
file_transport redirectstring† unset

Роутер redirect устанавливает прямую доставку в файл, если имя пути, не оканчивающееся /, определено как новый адрес. Используемый транспорт в данном случае определяется этой опцией, которая после преобразования должна содержать имя сконфигурированного транспорта. Обычно таким транспортом является транспорт appendfile. В процессе его работы имя файла содержится в переменной $address_file.

опция
использование
тип
По умолчанию
forbid_blackhole redirectboolean false

Если данная опция истинна, то элемент :blackhole: не может быть указан в списке перенаправления.

опция
использование
тип
По умолчанию
forbid_exim_filter redirectboolean false

Если данная опция истинна, то только фильтры Sieve разрешены, когда опция allow_filter истинна.

опция
использование
тип
По умолчанию
forbid_file redirectboolean false

Если данная опция истинна, то роутер не может генерировать новый адрес, осуществляющий доставку в локальный каталог или файл посредством фильтра, либо шаблонного файла пересылки (forward). Эта опция принудительно устанавливается в истину, если установлена опция one_time. Она применяется как к фильтрам Sieve, так и к фильтрам Exim, но если она истинна, то она блокирует возможность keep Sieve.

опция
использование
тип
По умолчанию
forbid_filter_dlfunc redirectboolean false

Если данная опция истинна, расктытию строки в фильре exim не позволяется использовать средство раскрытия dlfunc для выполнения динамически загружаемых функций.

опция
использование
тип
По умолчанию
forbid_filter_existstest redirectboolean false

Если данная опция истинна, то преобразования строк в фильтрах Exim не разрешаются для использования в условии exists.

опция
использование
тип
По умолчанию
forbid_filter_logwrite redirectboolean false

Если данная опция истинна, то использовать протоколирование в фильтрах Exim не разрешено. Протоколирование в любом случае доступно, если фильтр запускается от имени непривилегированного пользователя (что является нормальным для пользовательских файлов .forward).

опция
использование
тип
По умолчанию
forbid_filter_lookup redirectboolean false

Если данная опция истинна, то преобразования строк для использования элементов lookup в фильтрах Exim не разрешаются.

опция
использование
тип
По умолчанию
forbid_filter_perl redirectboolean false

Эта опция доступна только в случае, если Exim скомпилирован с поддержкой встроенного Perl. Если это так, то преобразования строк для использования встроенного Perl не разрешены.

опция
использование
тип
По умолчанию
forbid_filter_readfile redirectboolean false

Если эта опция истинна, то преобразования строк в файлах фильтров Exim для использования элементов readfile не разрешены.

опция
использование
тип
По умолчанию
forbid_filter_readsocket redirectboolean false

Если эта опция истинна, то преобразования строк в файлах фильтров Exim для использования элементов readsocket не разрешены.

опция
использование
тип
По умолчанию
forbid_filter_reply redirectboolean false

Если эта опция истинна, то данный роутер не может генерировать автоматический ответ. Автоответы могут генерироваться только из файлов фильтров Exim, но не из традиционных файлов перенаправления или фильтров Sieve. Данная опция автоматически становится истинной, если определена опция one_time.

опция
использование
тип
По умолчанию
forbid_filter_run redirectboolean false

Если эта опция истинна, то преобразования строк в файлах фильтров Exim для использования элементов run не разрешены.

опция
использование
тип
По умолчанию
forbid_include redirectboolean false

Если данная опция истинна, то элементы вида:

:include:<path name>
запрещены в списках перенаправления, не являющихся фильтрами.
опция
использование
тип
По умолчанию
forbid_pipe redirectboolean false

Если данная опция истинна, то роутер не может генерировать новый адрес, определяющий доставку в канал (pipe), равно как из фильтра Exim, так и из обычного файла перенаправления. Если установлена опция one_time, то данная опция автоматически становится истинной.

опция
использование
тип
По умолчанию
hide_child_in_errmsg redirectboolean false

Если данная опция истинна, то она вынуждает Exim скрывать дочерний адрес в случае, если генерируется сообщение об отказе в доставке или о задержке. Вместо этого подставляется адрес, генерируемый как <родительский адрес>. Конечно, это применимо только к генерируемым локально сообщениям об отказе в доставке. Если сообщение перенаправляется на другой хост, то сообщение об отказе может быть послано на генерируемый адрес.

опция
использование
тип
По умолчанию
ignore_eacces redirectboolean false

Если эта опция установлена, а попытка открыть файл перенаправления вызывает ошибку EACCES (доступ запрещен), то роутер redirect ведет себя, как будто файл не существует.

опция
использование
тип
По умолчанию
ignore_enotdir redirectboolean false

Если данная опция определена, а попытка открыть файл перенаправления вызывает ошибку ENOTDIR (что-либо в пути не является каталогом), то роутер ведет себя, как будто файл не существует.

Установка ignore_enotdir имеет другой эффект: когда роутер redirect, имеющий опцию file, обнаруживает, что данный файл не существует (ошибка ENOENT), он пытается выполнить функцию stat() для родительского каталога, например, при проверке на отмонтированные NFS-каталоги. Если функция возвращает ненулевое значение, то доставка откладывается. Однако, неверно выполнять такую проверку когда установлена опция ignore_enotdir, потому что эта опция заставляет Exim игнорировать в пути то, что не является каталогом (ошибка ENOTDIR). Это вопрос неоднозначный, потому как некоторые операционные системы выдают ошибку ENOENT, а некоторые ENOTDIR.

опция
использование
тип
По умолчанию
include_directory redirectstring unset

Если установлена эта опция, пути любых элементов :include: в списке перенаправления должны начинаться с этого каталога.

опция
использование
тип
По умолчанию
modemask redirectoctal integer 022

Опция определяет биты режима, которые не должны быть установлены для файла, определенного опцией file. Если установлен любой из этих битов, то доставка откладывается.

опция
использование
тип
По умолчанию
one_time redirectboolean false

Иногда факт, что Exim перечитывает файл псевдонимов и заново обрабатывает файлы перенаправления каждый раз, когда он пытается доставить сообщение, вызывает проблему, когда один или несколько сгенерированных адресов не могут быть доставлены с первой попытки. Это не является проблемой повторной доставки: Exim способен это обработать кроме ситуаций, когда список перенаправления меняется во время, когда сообщение находится в очереди. Это особенно справедливо в случае списков рассылки, когда новые подписчики могут получить копии сообщений в случае, если они были посланы до того, как они подписались на рассылку.

Если опция one_time установлена, и любые адреса, сгенерированные роутером, не удается обработать с первой попытки, то эти адреса добавляются к сообщению как адреса верхнего уровня (top level) и родительский адрес, который их сгенерировал, помечается как delivered. То есть, перенаправление на следующей попытке доставки не происходит.

Замечание 1: Это означает, что любое добавление или удаление заголовков, определяемое роутером, будет утеряно, если доставка не будет произведена успешно с первой попытки. В этом случае когда установлена опция one_time, опции headers_add и headers_remove не разрешены.

Замечание 2: Для обеспечения того, чтобы роутер генерировал только адреса (в отличие от каналов (pipes), доставок в файлы (file deliveries) или автоответов (auto-replies)), опции forbid_file, forbid_pipe и forbid_filter_reply принудительно устанавливаются в значение истина, когда установлена опция one_time.

Изначальный адрес верхнего уровня (top-level) запоминается с каждым из сгенерированных адресов и выводится во всех записях в протоколах. Однако, любые промежуточные адреса не записываются. Это вносит различия только если установлен селектор all_parents. Считается, что one_time будет использоваться как правило в списках рассылки, где обычно используется один уровень преобразования.

Замечание 3: Общий роутер unseen не может быть задан с one_time. Оригинальный адрес верхнего уровня запоминается с каждым из сгенерированных адресов и выводится в любых протоколах. Однако, промежуточные адреса на записываются. Это создаёт различие только если селектор all_parents установлен. Ожидается, что обычно one_time будет использоваться для списка адресатов, где есть лишь один уровень раскрытия.

опция
использование
тип
По умолчанию
owners redirectstring list unset

Это определяет список разрешённых владельцев для файла, заданного как file. Этот список дополнение к локальному пользователю, когда установлена опция check_local_user. Смотрите check_owner ниже.

опция
использование
тип
По умолчанию
owngroups redirectstring list unset

Это определяет список разрешённых групп для файла, заданного как file. Этот список дополнение к локальной группе, когда установлена опция check_local_user. Смотрите опцию check_group выше.

опция
использование
тип
По умолчанию
pipe_transport redirectstring† unset

Роутер redirect задаёт прямую доставку в канал, когда строка, начинающаяся с |, задана как новый адрес. Используемый транспорт определён этой опцией, которая, после раскрытия, должна быть названа именем сконфигуренного транспорта. Когда транспорт запущен, команда pipe в $address_pipe.

опция
использование
тип
По умолчанию
qualify_domain redirectstring† unset

Если эта опция установлена и сгенерирован неполный адрес (без домена), а в нормальных условиях этот адрес был бы квалифицирован (дополнен доменным именем) по глобальной опции qualify_recipient, но вместо этого он квалифицируется доменом, содержащимся в этой строке после раскрытия. Если раскрытие неудачно, маршрутизатор пропускается. Если Вы хотите вернуться к значению по умолчанию, то можно раскрыть $qualify_recipient.

Эта опция применяется ко всем неполным адресам, сгенерированным фильтрами exim, но для традиционных файлов .forward это применяется лишь для адресов не предварённых обратным слешем. Фильтры Sieve не могут генерировать неполные адреса.

опция
использование
тип
По умолчанию
qualify_preserve_domain redirectboolean false

Если установлена эта опция, то локальная опция qualify_domain не должна быть задана (будет ошибка конфигурации, если задать обе). Если генерируется неполный адрес (без домена), он дополняется доменом род ительского адреса (предыдущий предок), вместо глобального домена из qualify_recipient. В случае традиционнго файла .forward это применяется вне зависмости от того, был ли перед адресом обратный слэш.

опция
использование
тип
По умолчанию
repeat_use redirectboolean true

Если эта опция установлена в false, то роутер пропускается для дочерних адресов, предки которых были обработаны именно этим роутером. Это проверяется до проверки других предварительных условий. Правила exim по умолчанию против зацикливания пропускаются лишь в случае, если предок с таким же адресом, как и текущий. Смотрите также опции check_ancestor и redirect_router.

опция
использование
тип
По умолчанию
reply_transport redirectstring† unset

Роутер redirect устанавливает автоответ, когда в фильтре используются команды mail или vacation. Используемый транспорт определяется этой опцией, которая после раскрытия должна быть именем сконфигурированного транспорта. Обычно это транспорт autoreply. Другие транспорты вряд ли смогут принести какую-то пользу.

опция
использование
тип
По умолчанию
rewrite redirectboolean true

Если эта опция установлена в false, адреса сгенерированные маршрутизатором, не являются объектами для перезаписи адреса. Иначе они будут обработаны как новые адреса и перезаписаны в соответствии с глобальными правилами перезаписи.

опция
использование
тип
По умолчанию
sieve_subaddress redirectstring† unset

Значение этой опции передаётся фильтру Sieve для задания части адреса :subaddress.

опция
использование
тип
По умолчанию
sieve_useraddress redirectstring† unset

Значение этой опции передаётся фильтру Sieve для задания части адреса :user. Если она не задана, для :user используется оригинальная локальная часть адреса (включая префикс и суффикс).

опция
использование
тип
По умолчанию
sieve_vacation_directory redirectstring† unset

Для включения расширения vacation для фильров Sieve, Вы должны задать sieve_vacation_directory в каталог, где находятся БД vacation (больше ничего не помещайте в этот каталог), и гарантировать, что опция reply_transport относится к транспорту autoreply. Каждому пользователю необходим собственный каталог, exim создаст их в случае необходимости.

опция
использование
тип
по умолчанию
skip_syntax_errors redirectboolean false

Если установлена опция skip_syntax_errors, синтаксически неправильные адреса в переназначении вне фильтра пропускаются, и каждый неудачный алрес записывается в лог. Если установлена опция syntax_errors_to, то сообщение посылается по заданному в ней адресу с подробностями о неудаче. Если установлена опция syntax_errors_text, её содержимое раскрывается и помещается в начале сообщения об ошибке, сгенерированного syntax_errors_to. Обычно она принудительно устанавливает syntax_errors_to к тому же адресу, что и общая опция errors_to. Опция skip_syntax_errors часто используется для обработки листов рассылки.

Если все адреса в списке редиректа пропущены из-за ошибок синтаксиса, роутер отказывается обрабатывать оригинальный адрес, и он передаётся последующим маршрутизаторам.

Если опция skip_syntax_errors установлена при интерпретации фильтра exim, любые синтаксические ошибки в фильтре вызывают пропуск без предпринятия какого-либо действия. Инцидент записывается, а маршрутизатор отказывается обрабатывать адрес, и адрес передаётся следующим роутерам.

Любые синтаксические ошибки в фильтрах Sieve, повод для действия keep. Это действие определено RFC 3028. Значения skip_syntax_errors, syntax_errors_to и syntax_errors_text не используются.

Опция skip_syntax_errors может использоваться для задания тех ошибок в пользовательских списках перенаправления или файлах фильтра, используемых с адресом, который не переадресуется, могут быть использованы для уведомления пользователей об этих ошибках с помощью такого маршрутизатора:

userforward:
  driver = redirect
  allow_filter
  check_local_user
  file = $home/.forward
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply
  no_verify
  skip_syntax_errors
  syntax_errors_to = real-$local_part@$domain
  syntax_errors_text = \
     Это автоматически сгененрированное сообщение. В Вашем файле .forward \n\
     системой выявлена ошибка, подробности ниже. До устанения ошибки Вы \n\
     Вы будете получать копии этого сообщения для всех писем Вам. \n\
     Если Ваш файл .forward является фильтром или если он хранит \n\
     недопустимые для пересылки адреса, не являясь фильтром, копии всех \n\
     входящих писем будут сохранены в Вашем почтовом ящике. Если файл не \n\
     фильтр и хранит минимум один адрес, пригодный для пересылки, \n\
     пересылка на него будет нормальной.

Вам необходим роутер, чтобы гарантировать, что локальные адреса у которых распознан префикс real-, не форвардятся и не фильтруются. Для примера, его можно поместить сразу перед маршрутизатором userforward:

real_localuser:
   driver = accept
   check_local_user
   local_part_prefix = real-
   transport = local_delivery

опция
использование
тип
по умолчанию
syntax_errors_text redirectstring† unset

Смотрите выше, опцию skip_syntax_errors.

опция
использование
тип
по умолчанию
syntax_errors_to redirectstring unset

Смотрите выше опцию skip_syntax_errors.