RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

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

3. Как еxim получает и доставляет почту

3.1. Полная философия

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

3.2. Управление политиками

Управление политиками это важная особенность MTA, связанных с интернетом. Возможно, их самое важное назначение это не допустить использование MTA в качестве открытого релея людьми, отсылающими много спама, и желающими замаскировать его источник. Exim предоставляет гибкие средства для управления политиками, применяемыми ко входящей почте:

  • Exim4 (в отличие от предыдущих версий exim) применяет управление политиками к входящей почте путём Access Control Lists (ACL). Каждый список является серией утверждений, могущих предоставлять или запрещать доступ. ACL могут использоваться в нескольких местах диалога SMTP при получении сообщения с удалённого хоста. Однако, обычное их местоположение после каждой команды RCPT и в самом конце сообщения. Системный администратор может определить условия для приёма или отклонения индивидуальных получателей или всего сообщения целиком, соответственно, в этих двух точках (смотрите раздел 39). Отказ в доступе приводит к коду ошибки SMTP.
  • Также ACL доступны для сгенерированного локально сообщения, не полученного по SMTP. В этом случае единственные доступные действия должны принять или отклонить сообщение.
  • Когда exim собран с расширением контентного сканирования, в механизме ACL обеспечиваются средства для передачи сообщения внешней антивирусной или антиспамовой программе. Результат просмотра сообщения возвращается в ACL, которая может его использовать для решения, что делать с сообщением.
  • Когда сообщение получено с удаленного или локального хоста, но до отсыла финального подтверждения может быть выполнена локальная функция С, называемая local_scan(), для анализа сообщения и принятия решения о его приёме или отклонении (смотрите раздел 41). Если сообщение принимается, функция может изменить список получателей.
  • Использование механизма local_scan() это другой способ вызвать внешнее сканирующее программное обеспечение. Добавочный пакет SA-Exim использует этот путь. Эта опция не требует, чтобы exim был собран с поддержкой контентного сканирования.
  • После того, как сообщение было принято, дальнейшие проверяющие механизмы доступны в виде системного фильтра (system filter, смотрите раздел 42). Он выполняется в начале каждого процесса доставки.

3.3. Пользовательские фильтры

В обычной конфигурации exim пользователи могут запускать частные (собственные) фильтры, устанавливая соответствующие файлы .forward в своих домашних каталогах. Смотрите раздел 22 (о переадресовывающем маршрутизаторе) для конфигурации, поддерживающей это, и отдельный документ интерфейсы фильтрации почты exim (Exim's interfaces to mail filtering) для получения дополнительных деталей. Доступны два различных вида фильтрации:

  • Фильтры Sieve, написанные на стандартном языке фильтров, как определнно в RFC 3028.
  • Фильтры exim, написанные в уникальном синтаксисе exim, являющемся более мощным, чем Sieve, которому он предшествует.

Пользовательские фильры выполняются как часть процесса маршрутизации, описанного ниже.

3.4. Идентификация сообщений

Каждому сообщению, обрабатываемому exim, даётся message id длиной в шестнадцать символов. Они разделяются на три части с дефисом в качестве разделителя, например 16VDhn-0001bo-D3. Каждая часть представляет собой последовательность букв и цифр, обычно число, кодированное по основанию 62. Однако, в операционной системе Darvin (Mac OS X) и когда exim собран для запуска в Cygwin, взамен используется основание 36 (уход от использования строчных букв), поскольку для создания имени используется идентификатор сообщения, однако в этих операционных системах строчные и прописные буквы в именах файлов не всегда различаются.

Детали содержимого идентификатора сообщения изменились, поскольку exim развивался. Более ранние версии полагались на операционную систему не использующую заново идентификатор процесса (PID) в течение одной секунды. На современных операционных системах такое предположение более не может быть сделано, таким образом, алгоритм должен был быть изменён. Для сохранения обратной совместимости был изменён формат идентификатора сообщения, поэтому следующие правила несколько эксцентричны:

  • Первые шесть символов идентификатора сообщения задают время, в которое началось получение сообщения с детализацией до одной секунды. Таким образом, это поле содержит число секунд с начала эпохи (нормальное представление даты и времени в UNIX).
  • После первого дефиса следующие шесть символов кодируют идентификатор процесса, получившего сообщение.
  • Для двух заключительных символов есть два варианта:
    • 1. Если localhost_number не установлен, это значение дробная часть времени приёма, обычно в частях 1/2000 секунды, но для систем, которые должны использовать основание 36 вместо основания 62 (из-за нечувствительных к регистру файловых систем), модуль 1/1000 секунды.
    • 2. Если localhost_number установлена, то она умножается на 200 (соответственно на 100) и добавляется к дробной части времени, которое в этом случае находится в частях 1/200 (или 1/100) секунды.
    После получения сообщения exim ждёт для присвоения разрешения до обработки на случай, если другое сообщение получено тем же процессом или другим процессом с тем же (заново использованным) pid для гарантирования, что время будет отличаться. В большинстве случаев время уже отмечено, когда сообщение получалось.

3.5. Получение почты

Exim может получать почту с других хостов лишь единственным способом, с использованием SMTP через TCP/IP, когда адреса отправителя и получателя передаются через команды SMTP. Однако, из локально работающих процессов (таких, как пользовательские MUA), есть несколько вариантов:

  • Если процесс запускает exim с опцией -bm, сообщение читается неинтерактивно (обычно через канал) с получателями, взятыми из командной строки или из тела сообщения, если также используется опция -t.
  • Если процесс запускает exim с опцией -bS, сообщение также читается неинтерактивно, но в этом случае получатели перечислены в начале сообщения в ряде команд SMTP RCPT, завершаемых командой DATA. Это так называемый пакетный SMTP (batch SMTP) формат, но реально это не SMTP. Команды SMTP это лишь иной способ передать адреса конверта в неинтерактивном представлении.
  • Если процесс запускает exim с опцией -bs, сообщение читается интерактивно с использованием протокола SMTP. Двухсторонний канал обычно используется для прохождения данных между локальным процессом и процессом exim. Это реальный SMTP и обрабатывается он таким же образом, как SMTP через TCP/IP. Например, ACL для SMTP-команд используются в этой форме подачи сообщения.
  • Локальный процесс может сделать вызов TCP/IP к кольцевому интерфейсу (127.0.0.1) хоста или любому другому из его IP-адресов. Получая сообщения, exim не обрабатывает адрес кольцевого интерфейса особо. Он обрабатывает такие подключения таким же образом, как и подключения с других хостов.

В трёх случаях, когда не используется TCP/IP, адрес отправителя составляется из логина пользователя, вызывавшего exim и полного (квалифицированного) имени хоста (которое может быть задано конфигурационной опцией qualify_domain). Для локального или пакетного SMTP адрес отправителя, передаваемый командой SMTP MAIL, игнорируется. Однако, системный администратор может позволить определённым пользователям (trusted users) безусловно задать другой адрес отправителя, или всем пользователям задавать определённую форму иного адреса отправителя. Опция -f или команда SMTP MAIL используется для задания этих адресов. Смотрите раздел 5.2 для получения деталей о trusted users и опцию untrusted_set_sender для подробностей о способе как изменить адрес недоверенным пользователям.

Сообщения, полученные любым неинтерактивным механизмом, проверяются не-SMTP ACL, если они заданы. Сообщения, полученные с использованием SMTP (по TCP/IP или по локальному протоколу), могут быть проверены многими ACL, работающими в разные моменты времени сеанcа SMTP. Может быть отклонено всё сообщение или индивидуальные получатели, если они не отвечают требованиям локальных политик. Функция local_scan() (смотрите раздел 41) запускается для всех входящих сообщений.

3.6. Обработка входящих сообщений

Когда exim принимает сообщение, он записывает его в два файла в spool-каталоге. Первый содержит информацию конверта, текущий статус сообщения и строки заголовка, второй содержит тело сообщения. Имена обоих файлов состоят из идентификатора сообщения с добавлением -H для файла с заголоками и с конвертом и -D для файла с данными.

По умолчанию все эти файлы содержатся в одном каталоге, называемом input, внутри главного spool-каталога exim. Некоторые операционные системы не очень хорошо работают, когда число файлов в каталоге становится большим: для улучшения производительности в таких случаях может использоваться опция split_spool_directory. Она заставляет exim распределять файлы входящих писем по 62 каталогам с именами в виде одиночных цифр и букв. Когда это сделано, очередь обрабатывает один субкаталога вместо всех за раз, это может улучшить производительность даже когда немного файлов в каждом каталоге понижают производительность файловой системы. Информация конверта состоит из адреса отправителя сообщения и адреса получателя. Эта информация является обособленной от любых адресов содержащихся в строках заголовков. Статус сообщения включается в список получателей, которые уже получили сообщение. Формат первого файла spool-каталога описан в разделе 52.

Перезапись адресов, если она задана в конфигурационной секции rewrite (смотрите раздел 31), сделана однократно для всех поступающих адресов в строках заголовков и в конверте, во время приёма сообщения. Если во время доставки сгенерированы новые адреса (например, через алиасинг), эти новые адреса перезаписываются в тот момент, когда они генерируются. Во время фактической доставки сообщения может быть дальнейшая перезапись: поскольку это транспортная опция, она может быть различной для разных типов доставки. Также возможно задать добавление или удаление определённых строк заголовков во время доставки сообщения (смотрите разделы 15 и 24).

3.7. Жизнь сообщения

Сообщение остаётся в spool-каталоге до полной доставки получателям, ошибочному адресу (адресу куда шлют сообщения об ошибках) или до уничтожения администратором или пользователем, изначально создавшим его. В случае, когда доставка не может быть произведена, например, когда сообщение не может быть доставлено получателю и не может быть возвращено отправителю, то оно отмечается как замороженное в spool и больше не предпринимается попыток его доставки.

Администратор может разморозить такие сообщения, когда проблема исправлена, а также может вручную заморозить отдельные сообщения. Кроме того, администратор может в ызывать принудительную ошибку доставки, вызвав отсылку сообщения о недоставке (рикошет). Эти опции, называемые ignore_bounce_errors_after и timeout_frozen_after, отбрасывают замороженные сообщения после определённого времени. Первая применяется только к замороженным сообщениям о недоставке, вторая к любым замороженным сообщениям. Когда exim работает с сообщением, он записывает информацию о каждой попытке доставки в свой протокол. Туда включаются успешные, неуспешные и отложенные доставки для каждого получателя (смотрите главу 48). Строки протоколов также пишутся в отдельные файлы message log для каждого сообщения. Эти протоколы исключительно для использования администратором и обычно удаляются вместе с файлами spool, когда обработка сообщения завершена. Использование индивидуальных протоколов сообщений может быть отключено установкой опции no_message_logs: это может дать прирост производительности на очень загруженных системах.

Вся информация, необходимая exim для доставки, сохраняется в первом spool-файле, наряду со строками заголовка. Когда происходит успешная доставка, адрес немедленно вписывается в конец журнального файла, имя которого: идентификатор сообщения с добавленным -J. В конце выполненной доставки, если остались адреса, которые необходимо доставить позднее, первый spool-файл (-H-файл) обновляется для указания, какой момент доставки сейчас, а журнальный файл удаляется. Обновление spool-файла завершается записью нового фала и переименовыванием его для минимизации возможной потери данных.

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

3.8. Обработка адреса для доставки

Главную доставку обрабатывают элементы exim, называемые роутеры (routers) и транспорты (transports), а вместе они известны как драйверы (drivers). Их код распространяется с исходным дистрибутивом и опции компиляции задают, какие из них включаются в двоичный файл. Опции выполнения (во время выполнения) определяют, какие из них фактически используются для доставки сообщения. Каждый драйвер, который задан в выполняемой конфигурации, экземпляр (instance) того специфического типа драйвера. Многократное использование одного роутера разрешается: например, Вы можете задать несколько различных транспортов smtp, каждый с различными значениями опций, которые могли бы определять иные порты или иные таймауты. В дальнейшем обычно будет использоваться само название драйвера (то есть, одна определённая конфигурация) и общее название драйвера при обсуждении общих особенностей драйвера.

Роутер (router или маршрутизатор) драйвер, работающий с адресами, также определяет, каким образом должна произойти его доставка, задавая определённый транспорт или преобразуя адрес в один или несколько новых адресов (например, через файл алиасов). Маршрутизатор также может явно вызвать ошибку адреса, вызывая доставку сообщения о недоставке.

Транспорт (transport) драйвер, который передаёт копию сообщения из spool-каталога exim в другое место назначения. Есть два вида транспортов: локальный, с местоназначением в файле или в канале на локальном хосте, и удалённый, с местом назначения на иных хостах. Сообщение передаётся определённому транспорту как результат успешной маршрутизации. Если у сообщения несколько получателей, оно может быть передано нескольким различным транспортам.

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

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

Первый маршрутизатор, определённый в конфигурации, обычно, который обрабатывает адреса в доменах, которые не распознаны как относящиеся к локальному хосту. Обычно это адреса произвольных доменов интернета. Установлено предварительное условие, ищущее домены, относящиеся к локальному хосту, и маршрутизатор выполняется для адресов не соответствующих условию. Обычно этот роутер ищет домены в DNS для нахождения хостов, к которым направляется этот адрес. Если поиск успешен, адрес передаётся подходящему SMTP-транспорту, если неуспешен, роутер сконфигурирован на отказ адреса (генерируется сообщение о недоставке).

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

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

3.9. Обработка адреса для проверки

Роутеры exim используются для принятия решения о том, как доставлять почту, а также для проверки адреса (address verification). Проверка может быть как одна из проверок в ACL для входящих сообщений, для обоих адресов (отправителя и получателя) и она может быть проверена с использоваием опций -bv и -bvs командной строки.

Когда адрес проверяется, роутеры работают в режиме проверки (verify mode). Это не затрагивает принцип работы роутеров, но это состояние, которое может быть обнаружено. Это значит, что роутер может быть пропущен или вынужден вести себя иначе при проверке. В обычном примере конфигурации, в котором первый маршрутизатор посылает все сообщения программе, сканирующей сообщения, если они не были просканированы ранее. Таким образом, первый роутер принимает все адреса без каких бы то ни было проверок, делая его бесполезным для проверки. Обычно для таких маршрутизаторов установливается опция no_verify, заставляя его быть пропущенным в проверяющем режиме.

3.10. Работа отдельного роутера

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

  • accept: маршрутизатор принимает адрес, передаёт его транспорту или генерирует один или более дочерних адресов. Обработка оригинального адреса прекращается, если опция unseen не установлена на маршрутизаторе. Эта опция может использоваться для многократных доставок с различной маршрутизацией (например, для сохранения архивных копий сообщений). Когда опция unseen установлена, адрес передаётся следующему роутеру. Однако, обычно accept означает конец роутинга. Любой дочерний адрес, сгенерированный роутером, обрабатывается независимо, начиная с первого маршрутизатора по умолчанию. Можно изменить это установкой опции redirect_router для определения, с какого маршрутизатора начинается обработка дочерних адресов. В отличие от опции pass_router (см. ниже), роутер, определённый redirect_router, может быть в любом месте конфигурации.
  • pass: Роутер распознаёт адрес, но не может сам его обработать. Этим он передаёт адрес следующим маршрутизаторам. По умолчанию адрес передаётся следующему роутеру, но это может быть изменено установкой опции pass_router. Однако, (в отличие от redirect_router) названный маршрутизатор должен быть ниже текущего роутера (для избежания циклов).
  • decline: Роутер отказывается принимать адрес, поскольку вообще отказывается принимать их все. По умолчанию адрес передаётся следующему маршрутизатору, но это может быть предотвращено установкой опции no_more. Когда no_more установлена, все последующие роутеры пропускаются. В действительности, no_more преобразует decline в fail.
  • fail: Роутер решает, что адрес неудачен и ставит его в очередь на рикошет. Дальнейшая обработка адреса отсутствует, если опция unseen не установлена на роутере.
  • defer: В настоящее время роутер не может обработать адрес. Может быть недоступна БД или таймаут DNS. Дальнейшие обработки не осуществляются во время этой попытки доставки. Будут попытки в следующий раз, когда сообщения рассматриваются на предмет доставки.
  • error: В маршрутизаторе какая-то ошибка (например, ошибка конфигурации). Действие такое же, как и для defer. Если адрес достигает конца маршрутизаторов и не принимается ни одним из них, он срывается как unrouteable. Ошибка по умолчанию в такой ситуации: unrouteable address, но можно установить своё сообщение, используя опцию cannot_route_message. Она может быть установлена для любого роутера, используется значение из последнего роутера, видевшего адрес. Иногда при роутинге Вы хотите сделать ошибку доставки вместо передачи адреса для дальнейшей маршрутизации, когда одни условия совпадают, а другие нет. Вы можете сделать это при наличии второго маршрутизатора, который явно делает доставку неудачной, когда необходимые условия выполняются. Роутер redirect для этой цели имеет средство fail.

3.11. Двойные адреса

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

3.12. Предварительные условия роутера

Предварительные условия, проверяемые на каждом маршрутизаторе, перечислены ниже, в порядке их проверки. Индивидуальные конфигурационные опции описаны более подробно в разделе 15.

  • Опции local_part_prefix и local_part_suffix могут определять, что локальные части, обработанные маршрутизатором, могут или должны иметь префикс и/или суффикс. Если принудительный аффикс (префикс или суффикс) отсутствуют, роутер пропускается. Это условие проверяется первым. Когда аффикс есть, он удаляется из локальной части до последующей обработки, включая оценку любых других условий.
  • Маршрутизаторы могут назначаться для использования только когда не проверяется адрес, то есть только когда письмо маршрутизируется для доставки (или проверяется маршрутизация доставки). Eсли опция verify установлена в false, при проверке адреса роутер пропускается. Установка опции verify реально устанваливает две опции: verify_sender и verify_recipient, которые независимо управляют использованием роутера для проверки отправителя и получателя. Вы можете установить эти опции непосредственно, если хотите чтобы роутер использовал только один тип проверки.
  • Если опция address_test установлена в false, роутер пропускается, когда exim запущен с опцией -bt для проверки маршрутизации адреса. Это может быть полезным, когда первый роутер посылает все новые сообщения для сканирования: это позволяет использовать -bt для проверки последующей маршрутизации доставки без необходимости моделировать эффект сканера.
  • Маршрутизаторы могут назначаться для использования только когда проверяется адрес, в противоположность маршрутизации адреса для доставки. Это контролируется опцией verify_only.
  • Отдельные роутеры могут быть явно пропущены при работе роутеров, проверяющих адрес, переданный командой SMTP EXPN (смотрите опцию expn).
  • Если установлена опция domains, домен адреса должен быть в списке заданных доменов.
  • Если установлена опция local_parts, локальная часть адреса должна быть в списке заданных локальных частей. Если используются local_part_prefix или local_part_suffix, префикс или суффикс удаляются из локальной части перед проверкой. Если Вы хотите произвести проверку предварительного условия на локальной части со включенными аффиксами, можете сделать это включением опции condition (см. ниже), которая использует переменные $local_part, $local_part_prefix и $local_part_suffix по мере необходимости.
  • Если уставновлена опция check_local_user, локальная часть должна быть именем учётной записи на локальном хосте. Если эта проверка успешна, uid и gid локального пользователя помещаются в $local_user_uid и $local_user_gid, пользовательский домашний каталог в $home: эти значения могут использоваться в оставшихся предварительных условиях.
  • Если установлена опция router_home_directory, это раскрывается в этой точке, поскольку оно отменяет значение $home. Если бы раскрытие откладывали на более позднее или раннее время, то значение $home, установленное check_local_user, использовалось бы в последующих проверках. Наличие двух различных значений $home в одном и том же роутере может привести к беспорядку.
  • Если установлена опция senders, адрес отправителя конверта должен быть задан в наборе адресов.
  • Если установлена опция require_files, проверяется существование или отсутствие указанных файлов.
  • Если установлена опция condition, то условие оценивается и проверяется. Эта опция использует раскрытие строк для разрешения возможности установить собственные предварительные условия. Раскрываемые строки описаны в разделе 11. Отметьте, что require_files находится в конце списка, таким образом, Вы не можете использовать её для проверки существования файлов, в которых ищется домен, локальная часть или отправитель. Однако, поскольку все эти опции раскрыты, Вы можете использовать раскрытие условия exists для создания проверок внутри условий. Опция require_files предназначена для проверки файлов, которые роутер может собираться использовать внутри себя или которые необходимы определённым транспортам (например, .procmailrc).

3.13. Доставка в деталях

Когда необходимо доставить сообщение, последовательность событий такова:

  • Если определён общесистемный фильтр, сообщение передаётся ему. Фильтр может добавить в сообщение получателей, заменить получателей, отказать сообщению, сгенерировать новое сообщение или сделать вынужденную невозможность доставки сообщения. Формат файла системного фильтра такой же, как у пользовательских фильтров exim, описан в отдельном документе, называющемся Exim's interfaces to mail filtering. Отметьте: Sieve не может использоваться в файлах системного фильтра. Некоторые дополнительные особенности доступны в системном фильтре: смотрите раздел 42 для получения дополнительной информации. Заметьте, что сообщение передаётся системному фильтру только один раз за попытку доставки, однако он установлен у многих получателей. Однако, если происходит несколько попыток доставки при невозможности доставить немедленно один или несколько адресов, системный фильтр выполняется каждый раз. Условие first_delivery может использоваться для обнаружения первого запуска системного фильтра.
  • Каждый адрес получателя предлагается по очереди каждому сконфигурированному роутеру, следуя его предварительным условиям, пока один не сможет его обработать. Если ни один маршрутизатор не может обработать адрес, то есть они все отклоняются, адрес неверный. Поскольку роутеры могут быть целями разных доменов, несколько разных локальных доменов можно обработать независимо друг от друга.
  • Роутер, принимающий адрес, может назначить его локальному или удалённому транспорту. Однако, в это время транспорт не выполняется. Вместо этого адрес помещается в список специфического транспорта, который будет выполнен позже. Альтернативно, маршрутизатор может генерировать один или несколько новых адресов (обычно из алиасов, форвардов или файлов фильтров). Новые адреса возвращаются назад к началу процесса, но во избежание циклов, маршрутизатор игнорирует любой адрес, имеющий одноимённого предка, обрабатывающегося отдельно.
  • Когда вся маршрутизация завершена, успешно обработанные адреса передаются назначенным им транспортам. Когда локальные транспорты делают действительно локальные доставки, они обрабатывают только один адрес за раз, но если локальный транспорт используется как псевдоудалённый (например, для сборки пакетов SMTP-сообщений, для передачи каким-то другим средствам), могут быть обработаны несколько адресов. Удалённые транспорты всегда могут обрабатывать более одного сообщения за раз, но они могут быть сконфиигурированы не делать так или ограничены в нескольких одновременных обращениях к некоторым доменам.
  • Каждая локальная доставка в файл или в канал запускается отдельным процессом под непривелигированным uid, и выполняются они по одной. Удалённые доставки также выполняются отдельными процессами, обычно под частным uid exim (пользователь exim), но в этом случае несколько удалённых доставок могут выполняться параллельно. Максимальное число одновременных удалённых доставок для любого сообщения устанавливается опцией remote_max_parallel. Порядок, в котором производятся доставки, не определён, за тем исключением, что все локальные доставки происходят до удалённых.
  • Если происходит встреча с локальной доставкой в течение работы очереди, exim проверяет базу повторов для поиска: была ли временная ошибка ранее для адреса перед выполнением работы локального транспорта. Если ранее была ошибка, exim не делает новую попытку доставки, пока для этого адреса не достигнуто время повторения. Однако, это случается лишь для попыток доставки, являющихся частью работающей очереди. Локальные доставки всегда предпринимаются, когда доставка следует сразу за приёмом сообщения, даже если для них установлено время повтора. Это делается для улучшения поведения в случае, если одно сообщение вызывает проблемы (например, вызывает переполнение квоты или ошибку в фильтре).
  • Удалённые транспорты выполняют собственную обработку повторов, так как адрес может доставляться к одному из множества хостов, каждый из которых может иметь различное время повтора. Если были предыдущие временные сбои, и никакой хост не достиг своего времени повтора, попытка доставки не предпринимается, независимо от того, работала очередь или нет. Смотрите раздел 32 для деталей о стратегии повторения.
  • Если были какие-то постоянные ошибки, рикошет возвращается к соответствующему адресу (отправитель в общем случае) с подробностями об ошибке для каждого ошибочного адреса. Exim может быть сконфигурирован для отправки копий сообщений рикошета на другие адреса.
  • Если один или несколько адресов потерпели временный сбой, сообщение остаётся в очереди для дальнейших попыток. Доставка этих адресов, как говорят, задержана (deferred).
  • Когда все адреса получателей доставлены или сорвались, обработка сообщения завершена. Файлы спула и протоколы сообщения удаляются, хотя протокол опционально может быть сохранён в случае необходимости.

3.14. Механизм повтора

Механизм exim для повтора сообщения предназначен для повтора сообщений, которые не удалось доставить с первой попытки обработчика очереди. Вы должны запустить демона exim, использующего опцию -q с интервалом времени для запуска обработчика очереди с регулярными интервалами времени или использовать другие средства (например, cron?), чтобы запустить его. Если Вы не будете предпринимать мер к запуску обработчика очереди, сообщения, не доставленные при первой попытке, навсегда останутся в очереди. Обработчик очереди обрабатыает очередь, одно сообщение за раз, пробуя каждую доставку с прошедшим временем повторения. Вы можете запустить несколько обработчиков очереди одновременно. Exim использует набор конфигурационных правил для определения, когда следующий повтор ошибочного адреса (смотрите раздел 32). Эти же правила определяют, когда exim должен прекратить попытки доставки адреса и до каких пор генерировать рикошет. Если для частного хоста, адреса или комбанации ошибок не установлены правила повтора, то временные ошибки обрабатываются как постоянные.

3.15. Временные ошибки доставки

Существует много причин, по которым сообщение не доставляется немедленно по частному адресу. Сбой подключения к удалённой машине (поскольку хост или подключение к нему отключились) одна из самых распространённых. Временные ошибки могут быть обнаружены в процессе роутинга, а также в течение транспортной стадии доставки. Локальные доставки могут быть задержаны, если недоступны NFS-файлы, или почтовый ящик находится в файловой системе, в которой у пользователя превышена квота. Exim может быть сконфигурирован для использования собственных квот на локальные почтовые ящики: где системные квоты применяются, они также применяются. Если хост недоступен некоторое время, множество сообщений может ожидать его, к тому времени, когда он станет доступен, и их отправка в течение одного SMTP-соедиенения явно выгодна. Всякий раз, когда доставка на удалённый компьютер задерживается, exim делает примечание в своей БД хинтов и всякий раз, когда происходит успешная SMTP-доставка, он смотрит, есть ли другие сообщения для этого же хоста. Если они найдены, они отправляются по тому же самому SMTP-соединению, ограниченные указанным в конфигурации числом максимальных сообщений через одно соединение.

3.16. Постоянные ошибки доставки

Когда сообщение невозможно доставить к нескольким или всем его получателям, генерируется сообщение рикошета. Временные ошибки доставки превращаются в постоянные ошибки, когда истекает их время ожидания. Все адреса, которые ошибочны в данной попытке доставки, перечисляются в одном сообщении. Если у оригинального сообщения много получателей, возможно что некоторые адреса не доставлены в первую попытку, а другие были неудачны в последующие попытки, породив более одного рикошета. Формулировка сообщения рикошета может быть настроена администратором. Для дополнительных деталей смотрите раздел 45.

Сообщения рикошета содержат строку заголовка X-Failed-Recipients:, содержащую список неудачных адресов для программ, которые автоматически анализируют такие сообщения.

Рикошет обычно отправляется отправителю оригинального сообщения, полученному из адреса конверта. Для входящих SMTP-сообщений это адрес, заданный в команде MAIL. Однако, когда раскрывается через форвардинг или алиасинг, может быть задан альтернативный адрес для доставки рикошетов от сгенерированных адресов. Для раскрытия списков рассылки (смотрите раздел 46.2) обычно направляется сообщение рикошета менеджеру списка рассылки.

3.17. Сбой доставки рикошета

Если с рикошетом (сгенерированным локально или пришедшим с удалённого хоста) происходит сбой доставки, сообщение остаётся в очереди, но оно заморожено в ожидании уведомления администратора. Существуют опции, которые могут использоваться для того, чтобы заставить exim отбросить такие сообщения или хранить их короткий период времени (смотрите опции timeout_frozen_after и ignore_bounce_errors_after).

Поиск

 

Найди своих коллег!