WebMoney: WMZ Z294115950220 WMR R409981405661 WME E134003968233 |
Visa 4274 3200 2453 6495 |
Перевод выполнен Алексеем Паутовым в рамках
некоммерческого проекта RussianLDP
(http://www.rldp.ru/). Именно на этом сайте
и надлежит искать новые версии, если таковые будут.
Exim спроектирован для работы на системах,
постоянно связанных с интернетом и обрабатывающих значительный поток писем.
В таких условиях большинство сообщений можно доставить немедленно.
Следовательно, exim не поддерживает независимые очереди сообщений
для специфических доменов или хостов, хотя в действительности пробует послать
несколько сообщений в течение одного SMTP-соединения, после того как хост был
в дауне (отключен, недоступен и т.п.), это поддерживается в
информации повторов по хостам. Управление политиками это важная особенность
MTA, связанных с интернетом. Возможно, их самое важное назначение
это не допустить использование MTA в качестве открытого релея людьми,
отсылающими много спама, и желающими замаскировать его источник.
Exim предоставляет гибкие средства для управления политиками, применяемыми
ко входящей почте:
В обычной конфигурации exim пользователи могут запускать
частные (собственные) фильтры, устанавливая соответствующие файлы
.forward в своих домашних каталогах. Смотрите раздел
22 (о переадресовывающем маршрутизаторе) для
конфигурации, поддерживающей это, и отдельный документ интерфейсы
фильтрации почты exim (Exim's interfaces to mail filtering)
для получения дополнительных деталей. Доступны два различных вида фильтрации:
Пользовательские фильры выполняются как часть
процесса маршрутизации, описанного ниже. Каждому сообщению, обрабатываемому exim, даётся
message id длиной в шестнадцать символов. Они разделяются на три
части с дефисом в качестве разделителя, например 16VDhn-0001bo-D3.
Каждая часть представляет собой последовательность букв и цифр, обычно число,
кодированное по основанию 62. Однако, в операционной системе Darvin
(Mac OS X) и когда exim собран для запуска в Cygwin, взамен
используется основание 36 (уход от использования строчных букв),
поскольку для создания имени используется идентификатор сообщения, однако
в этих операционных системах строчные и прописные буквы в именах файлов
не всегда различаются.
Детали содержимого идентификатора сообщения изменились,
поскольку exim развивался. Более ранние версии полагались на
операционную систему не использующую заново идентификатор процесса (PID)
в течение одной секунды. На современных операционных системах
такое предположение более не может быть сделано, таким образом, алгоритм
должен был быть изменён. Для сохранения обратной совместимости был изменён
формат идентификатора сообщения, поэтому следующие
правила несколько эксцентричны:
Exim может получать почту с других хостов
лишь единственным способом, с использованием SMTP через TCP/IP,
когда адреса отправителя и получателя передаются через команды SMTP.
Однако, из локально работающих процессов (таких, как пользовательские MUA),
есть несколько вариантов:
В трёх случаях, когда не используется 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) запускается для всех входящих сообщений. Когда exim принимает сообщение, он
записывает его в два файла в spool-каталоге. Первый содержит информацию
конверта, текущий статус сообщения и строки заголовка, второй содержит тело
сообщения. Имена обоих файлов состоят из идентификатора сообщения
с добавлением -H для файла с заголоками и с конвертом и -D
для файла с данными.
По умолчанию все эти файлы содержатся в одном каталоге,
называемом input, внутри главного spool-каталога exim.
Некоторые операционные системы не очень хорошо работают, когда число файлов в
каталоге становится большим: для улучшения производительности в таких случаях
может использоваться опция split_spool_directory.
Она заставляет exim распределять файлы входящих писем по 62 каталогам с
именами в виде одиночных цифр и букв. Когда это сделано,
очередь обрабатывает один субкаталога вместо всех за раз, это может улучшить
производительность даже когда немного файлов в каждом каталоге
понижают производительность файловой системы. Информация конверта состоит
из адреса отправителя сообщения и адреса получателя. Эта информация является
обособленной от любых адресов содержащихся в строках заголовков.
Статус сообщения включается в список получателей,
которые уже получили сообщение. Формат первого файла
spool-каталога описан в разделе 52.
Перезапись адресов, если она задана в конфигурационной
секции rewrite (смотрите раздел 31),
сделана однократно для всех поступающих адресов в строках заголовков
и в конверте, во время приёма сообщения. Если во время доставки сгенерированы
новые адреса (например, через алиасинг), эти новые адреса перезаписываются в
тот момент, когда они генерируются. Во время фактической доставки сообщения
может быть дальнейшая перезапись: поскольку это транспортная опция,
она может быть различной для разных типов доставки. Также возможно задать
добавление или удаление определённых строк заголовков во
время доставки сообщения (смотрите разделы 15 и
24). Сообщение остаётся в 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-файл до обработки.
Это минимизирует возможность двойной доставки, вызванную сбоями. Главную доставку обрабатывают элементы exim,
называемые роутеры (routers) и транспорты (transports), а вместе они известны
как драйверы (drivers). Их код распространяется с исходным дистрибутивом и
опции компиляции задают, какие из них включаются в двоичный файл.
Опции выполнения (во время выполнения) определяют, какие из них фактически
используются для доставки сообщения. Каждый драйвер, который задан в
выполняемой конфигурации, экземпляр (instance) того
специфического типа драйвера. Многократное использование одного роутера
разрешается: например, Вы можете задать несколько различных транспортов
smtp, каждый с различными значениями опций, которые могли бы
определять иные порты или иные таймауты. В дальнейшем обычно будет
использоваться само название драйвера (то есть, одна определённая
конфигурация) и общее название драйвера при обсуждении
общих особенностей драйвера.
Роутер (router или маршрутизатор)
драйвер, работающий с адресами, также определяет, каким образом должна
произойти его доставка, задавая определённый транспорт или преобразуя адрес
в один или несколько новых адресов (например, через файл алиасов).
Маршрутизатор также может явно вызвать ошибку адреса,
вызывая доставку сообщения о недоставке.
Транспорт (transport) драйвер, который
передаёт копию сообщения из spool-каталога exim в другое место назначения.
Есть два вида транспортов: локальный, с местоназначением в файле или в
канале на локальном хосте, и удалённый, с местом назначения на иных хостах.
Сообщение передаётся определённому транспорту как
результат успешной маршрутизации. Если у сообщения несколько получателей,
оно может быть передано нескольким различным транспортам.
Адрес обрабатывается передачей его каждому
сконфигурированному роутеру по очереди, подчиняясь определённым условиям,
пока роутер примет адрес или определит, что надо вызвать ошибку адреса.
Скоро этот процесс будет описан в деталях. Вначале, как простой пример,
рассмотрим, как каждый адрес получателя в сообщении обрабатывается в
небольшой конфигурации из трёх роутеров.
Для того, чтобы сделать это более конкретным примером,
описание сделано в терминах некоторых актуальных роутеров, но помните, что
это лишь пример. Вы можете сконфигурировать роутеры exim несколькими разными
способами и может быть любое число роутеров в конфигурации.
Первый маршрутизатор, определённый в конфигурации,
обычно, который обрабатывает адреса в доменах, которые не распознаны как
относящиеся к локальному хосту. Обычно это адреса
произвольных доменов интернета. Установлено предварительное условие,
ищущее домены, относящиеся к локальному хосту, и маршрутизатор выполняется
для адресов не соответствующих условию. Обычно этот роутер ищет
домены в DNS для нахождения хостов, к которым направляется этот адрес.
Если поиск успешен, адрес передаётся подходящему SMTP-транспорту,
если неуспешен, роутер сконфигурирован на отказ адреса
(генерируется сообщение о недоставке).
Второй роутер достигается лишь в случае,
если домен распознан как принадлежаший локальной машине. Этот роутер делает
редирект, также он известен как алиасинг и форвардинг. Когда он генерирует
один или больше новых адресов из оригинального,
каждый из них роутится независимо от начального. Иначе маршрутизатор может
вызвать отказ адреса или просто отказаться обрабатывать его,
передав следующему роутеру.
Последний роутер во многих конфигурациях проверяет,
принадлежит ли адрес локальным почтовым ящикам. Предварительное условие может
содержать проверку является ли локальная часть именем логина пользователя
или он ищет её в файле или базе данных. Если эти предварительные
условия не выполнены, роутер отклоняется, и
на этом маршрутизаторы заканчиваются. Когда такое происходит
(адрес не ушёл ни по одному из маршрутизаторов), происходит рикошет
(шлётся письмо отправителю с сообщением, что не удалось доставить письмо). Роутеры exim используются для
принятия решения о том, как доставлять почту, а также для
проверки адреса (address verification).
Проверка может быть как одна из проверок в ACL для входящих сообщений,
для обоих адресов (отправителя и получателя) и она может быть проверена с
использоваием опций -bv и -bvs командной строки.
Когда адрес проверяется, роутеры
работают в режиме проверки (verify mode). Это не затрагивает принцип работы
роутеров, но это состояние, которое может быть обнаружено.
Это значит, что роутер может быть пропущен или вынужден вести себя
иначе при проверке. В обычном примере конфигурации, в
котором первый маршрутизатор посылает все сообщения программе,
сканирующей сообщения, если они не были просканированы ранее.
Таким образом, первый роутер принимает все адреса без каких бы то ни было
проверок, делая его бесполезным для проверки. Обычно для таких
маршрутизаторов установливается опция no_verify, заставляя его быть
пропущенным в проверяющем режиме. Как объяснено в примере выше, несколько предварительных
условий проверяются до запуска роутера. Если любое условие не встречается,
роутер пропускается, и адрес передаётся следующему маршрутизатору.
Когда все предварительные условия маршрутизатора встречаются,
маршрутизатор выполняется. Что происходит дальше, зависит от результата,
являющигося одним из следующих:
Как только маршрутизация завершена,
exim просматривает адреса, предназначенные для
локальных и удалённых транспортов, и отбрасывает любые
найденные дубликаты (повторения). В процессе этой проверки локальные части
обрабатываются с учётом регистра. Предварительные условия, проверяемые на каждом
маршрутизаторе, перечислены ниже, в порядке их проверки.
Индивидуальные конфигурационные опции описаны более подробно в разделе
15.
Когда необходимо доставить сообщение,
последовательность событий такова:
Механизм exim для повтора сообщения предназначен для
повтора сообщений, которые не удалось доставить с первой
попытки обработчика очереди. Вы должны запустить демона exim,
использующего опцию -q с интервалом времени для запуска обработчика
очереди с регулярными интервалами времени или использовать другие средства
(например, cron?), чтобы запустить его. Если Вы не будете предпринимать мер
к запуску обработчика очереди, сообщения, не доставленные
при первой попытке, навсегда останутся в очереди.
Обработчик очереди обрабатыает очередь, одно сообщение за раз,
пробуя каждую доставку с прошедшим временем повторения. Вы можете запустить
несколько обработчиков очереди одновременно. Exim использует набор
конфигурационных правил для определения, когда следующий повтор ошибочного
адреса (смотрите раздел 32). Эти же правила
определяют, когда exim должен прекратить попытки доставки адреса и до каких
пор генерировать рикошет. Если для частного хоста, адреса или комбанации
ошибок не установлены правила повтора, то временные ошибки
обрабатываются как постоянные. Существует много причин, по которым сообщение не
доставляется немедленно по частному адресу. Сбой подключения к удалённой
машине (поскольку хост или подключение к нему отключились)
одна из самых распространённых. Временные ошибки могут быть обнаружены в
процессе роутинга, а также в течение транспортной стадии доставки.
Локальные доставки могут быть задержаны, если недоступны NFS-файлы, или
почтовый ящик находится в файловой системе, в которой у пользователя
превышена квота. Exim может быть сконфигурирован для использования
собственных квот на локальные почтовые ящики: где системные квоты применяются,
они также применяются. Если хост недоступен некоторое время,
множество сообщений может ожидать его, к тому времени, когда он станет
доступен, и их отправка в течение одного SMTP-соедиенения явно выгодна.
Всякий раз, когда доставка на удалённый компьютер задерживается,
exim делает примечание в своей БД хинтов и всякий раз,
когда происходит успешная SMTP-доставка, он смотрит, есть ли другие
сообщения для этого же хоста. Если они найдены, они отправляются по тому же
самому SMTP-соединению, ограниченные указанным в конфигурации числом
максимальных сообщений через одно соединение. Когда сообщение невозможно доставить к нескольким или
всем его получателям, генерируется сообщение рикошета.
Временные ошибки доставки превращаются в постоянные ошибки, когда истекает их
время ожидания. Все адреса, которые ошибочны в данной попытке доставки,
перечисляются в одном сообщении. Если у оригинального сообщения много
получателей, возможно что некоторые адреса не доставлены в первую попытку,
а другие были неудачны в последующие попытки, породив более одного рикошета.
Формулировка сообщения рикошета может быть настроена администратором.
Для дополнительных деталей смотрите раздел 45.
Сообщения рикошета содержат строку заголовка
X-Failed-Recipients:, содержащую список неудачных адресов
для программ, которые автоматически анализируют такие сообщения.
Рикошет обычно отправляется отправителю оригинального
сообщения, полученному из адреса конверта. Для входящих SMTP-сообщений это
адрес, заданный в команде MAIL. Однако, когда раскрывается через
форвардинг или алиасинг, может быть задан альтернативный адрес для
доставки рикошетов от сгенерированных адресов. Для раскрытия списков рассылки
(смотрите раздел 46.2)
обычно направляется сообщение рикошета менеджеру списка рассылки. Если с рикошетом (сгенерированным локально или пришедшим с
удалённого хоста) происходит сбой доставки, сообщение остаётся в очереди,
но оно заморожено в ожидании уведомления администратора.
Существуют опции, которые могут использоваться для того,
чтобы заставить exim отбросить такие сообщения или хранить их
короткий период времени (смотрите опции timeout_frozen_after и
ignore_bounce_errors_after).
3. Как еxim получает и доставляет почту
3.1. Полная философия
3.2. Управление политиками
3.3. Пользовательские фильтры
3.4. Идентификация сообщений
После получения сообщения exim ждёт для присвоения разрешения до
обработки на случай, если другое сообщение получено тем же процессом
или другим процессом с тем же (заново использованным) pid
для гарантирования, что время будет отличаться. В большинстве случаев время
уже отмечено, когда сообщение получалось.3.5. Получение почты
3.6. Обработка входящих сообщений
3.7. Жизнь сообщения
3.8. Обработка адреса для доставки
3.9. Обработка адреса для проверки
3.10. Работа отдельного роутера
3.11. Двойные адреса
3.12. Предварительные условия роутера
3.13. Доставка в деталях
3.14. Механизм повтора
3.15. Временные ошибки доставки
3.16. Постоянные ошибки доставки
3.17. Сбой доставки рикошета
Найди своих коллег! |