47. Использование exim`a как клиента без очереди сообщений
На перрсональном компьютере, обычным требованием является отсылка почты на “умный хост” (“smart host”). Существует множество MUA, которые могут быть сконфигурированы для работы таким образом, под все популярные операционные системы. Однако, некоторые MUA для UNIX-подобных систем, которые не могут сконфигурированы: они посылают сообщения используя интерфейс командной строки “/usr/sbin/sendmail”. Кроме того, таким способом сообщения посылают утилиты типа “cron”.
Если персональный компьютер работает непрерывно, нет никаких проблем, поскольку он может работать как обычный MTA, обрабатывающий доставку на умный хост, и обрабатывая любые задержки через механизм очередей. Однако, если компьютер не работает постоянно, или в резное время управляется разными операционными системами, организация почтовых очередей - нежелательна.
Поэтому, существуют требования для предоставления интерфейса “/usr/sbin/sendmail”, но доставки сообщений к умному хосту без средств организации очередей и повторов. Кроме того, доставка на умный хост должна быть синхронной, чтобы в случае её неудачи немедленно послать информацию MUA. Другими словами, нам необходимо что-то, что расширяет MUA, который передаёт на локальный MTA через командную строку, таким образом, чтобы оно вело себя подобно удалённому умному хосту, использующему TCP/SMTP.
Есть множество приложений (например, одно называется “ssmtp”), которые проделывают эту работу. Однако, люди находят их в разной степени недосточными. Например, вы могли бы желать завершения альясинга и форвардинга до отсылки сообщения на умный хост.
Exim уже имеет необходимую инфраструктуру для выполнения этой работы. Чтобы заставить его вести себя как требуется, необходимо немного настройки, хотя, это - что то вроде забивания гвоздей микроскопом, - использовать полноценный MTA для этой цели.
Есть глобальная булева опция, называемая “mua_wrapper”, по дефолту установленная в ложь. Установка “mua_wrapper” в истину вызывает работу exim`a в специальном режиме, в котором он, как предполагается, используется для “обёртки” командной строки MUA в вышеописанной манере. При установке “mua_wrapper”, также необходимо предоставить совместимую конфмгурацию роутера и транспорта. Чаще всего, бывает лишь один роутер, и один транспорт, отсылающий всё на умный хост.
Когда exim работает в режиме обёртки MUA, его поведение меняется следующим образом:
Даемон не может быть запущен, также exim не может принимать входящие сообщения от “inetd”. Другими словами, есть лишь один способ приёма сообщений - через командную строку.
Каждое сообщение синхронно доставляется как только оно принято (предполагается “-odi”). Все опции какаяющиеся организации очередей (“queue_only”, “queue_smtp_domains”, “control” в ACL, и т.п.) - тихо игнорируются. Принимающий процесс exim`a не завершается, пока не завершится попытка доставки. Если доставка успешна, выдаётся нулевой код возврата.
Переадресация адресов разрешена, но финальный роутинг для всех адресов должен приводить к одному и тому же удалённому транспорту, и к тому же самому списку хостов. Кроме того, адрес возврата (отправитель конверта) должен быть одним и тем же для всех получателей, как и любые добавленные или удалённые строки заголовков. Другими словами, должно быть возможным доставить сообщения в одной SMTP-транзакции, несмотря на множество получателей.
Если эти условия не выполняются, или если роутинг любого адреса приводит к ошибке, или статусу отсрочки, или если exim не в состоянии успешно доставить всех получателей на один из умных хостов, доставка всего сообщения - неудачна.
Поскольку очереди не разрешены, все ошибки рассматриваются как постоянные; между кодами 5xx и 4xx выданными в SMTP ответе умного хоста, различий не делается. Более того, поскольку вызывающему можно дать лишь один ответ yes/no, неврзможно доставить одних получателей и не доставить других. Если происходит ошибка (временная или постоянная) для любого получателя, все они - неудачны.
Если перечилен более чем один умный хост, exim будет пробовать обычным способом другой хост, после ошибки соединений или таймаута. Однако, если этот вид ршибки происходит для всех хостов, доставка неудачна.
Когда доставка неудачна, сообщение о ошибке пишется в стандартный поток ошибок (так же как и в лог exim`a), и exim выходит, возврашая вызвавшему код возврата 1. Сообщение вычёркивается из файлов спула exim`a. Рикошет не генерится.
Данные повторов не обслуживаются, и любые правила повторов игнорируются.
Множество опций exim`a игнорируется: “deliver_drop_privilege” - принудительно успешна, “max_rcpt” в транспорте “smtp” - принудительно приводится к “unlimited”, “remote_max_parallel” - принудительно приводится к единице, и запасные хосты - игнорируются.
Общий эффект - что exim создаёт одну синхронную попытку доставки сообщения, приводя к неудаче при любом виде проблем. Поскольку локальные доставки не производятся, и даемон не может быть запущен, exim не нуждается в root`овых привилегиях. По возможности, он должен работать как setuid “exim”, вместо setuid “root”. Смотрите раздел 51.3, для обсуждения о примуществах и неуобствах запуска без root`овых привилегий.