# Обработка сообщений

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

## Ввод сообщений

Сообщения поступают в обработчик в виде стандартного ввода. Обработчик не предполагает выполнение поиска в стандартном вводе.

Ввод содержит заголовки сообщения, пустую строку и тело сообщения. Сообщение заканчивается, когда обнаружен индикатор конца потока. Информация из конверта сюда не входит.

Строки сообщения разделены простым переносом строки.

## Вывод обработчика

Обработчик может выдавать следующий вывод при возникновении стандартной ошибки:

- `PASS`

  Сообщение должно быть отправлено дальше. Обработчик должен записать сообщение, возможно, с изменениями, в стандартный вывод.

- `STOP`

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

- `DEFER`

  Сообщение не должно быть отправлено дальше. Должны быть указаны детали временной ошибки. Последующие обработчики при этом не вызываются.

- `REJECT`

  Сообщение не должно быть отправлено дальше. Должны быть указаны детали постоянной ошибки. Последующие обработчики при этом не вызываются.

- `LOG text`

  Строка текста должна быть рассмотрена как предупреждение или сообщение об ошибке и добавлена в соответствующий журнал.

- `SKIP`

  Обработчик не должен обрабатывать и передавать сообщение в свой вывод. Сообщение должно быть отправлено дальше без каких-либо изменений.

Каждая строка вывода при возникновении стандартной ошибки должна оканчиваться переводом строки. После первой строки `PASS`, `STOP`, `DEFER`, `REJECT` или `SKIP` дальнейший вывод не принимается, таким образом, любые строки LOG могут предшествовать этой строке.

Код завершения работы обработчика должен быть равен 0 при возникновении строки `PASS` или `STOP` и не равен 0 – в остальных случаях.

## Вывод сообщения

Обработчик должен записывать данные в свой стандартный вывод только после записи `PASS` или `REJECT` при возникновении стандартной ошибки.

Для `PASS` вывод должен представлять собой сообщение в том же формате, что и на входе.

## Код завершения

Код завершения работы обработчика должен быть равен `0` при возникновении строки `PASS` или `STOP` и не равен 0 – в остальных случаях.

## Контекст вызова

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

Текущая рабочая папка не определена.

Большая часть переменных среды удалена, оставлены только самые необходимые: `PATH` и `LANG`. Для последней будет установлено значение `C`.