Версия для печати
Архив документации на OpenNet.ru /
Раздел "Электронная почта"
(Многостраничная версия)
Перевод спецификации по MTA Exim
Автор перевода: Aleksey L Keda (lissyara)
Оригинал: http://www.lissyara.su/?id=1200
Philip Hazel
Copyright ╘ 2006 University of Cambridge
Revision 4.62 27 April 2006 PH
--------------------------------------------------------------------------------
Содержание
1. Введение
1.1. Документация exim
1.2. FTP и WEB сайты
1.3. Листы рассылки
1.4. Курсы exim
1.5. Сообщения об ошибках
1.6. Где найти дистрибутив exim
1.7. Список пожеланий
1.8. Материалы содействия
1.9. Ограничения
1.10. Рабочая (выполняемая) конфигурация
1.11. Интерфейс вызова
1.12. Терминология
2. Включенный код
3. Как еxim получает и доставляет почту
3.1. Полная философия
3.2. Управление политиками
3.3. Пользовательские фильтры
3.4. Идентификация сообщений
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. Сбой доставки рикошета
4. Сборка и инсталляция Exim
4.1. Распаковка
4.2. Разнообразие архитектур и операционных систем
4.3. DBM библиотеки
4.4. Предсборочная конфигурация
4.5. поддержка
“
iconv()
”
4.6. Включение TLS/SSL шифрования
4.7. Использование tcpwrappers
4.8. Включение поддержики IPv6
4.9. Процесс сборки
4.10. Выходные данные после
“make
”
4.11. Отмена опций при сборке Exim
4.12. OS-cпецифические заголовки
4.13. Отмена опций при сборке монитора
4.14. Установка бинарных файлов и скриптов Exim'а
4.15. Инсталляция документации
4.16. Определение директории spool
4.17. Тестирование
4.18. Замещение другого MTA, Exim'ом
4.19. Обновление Exim
4.20. Остановка демона Exim на Solaris'е
5. Командная строка Exim
5.1. Установка опций именем программы
5.2. Доверенные и административные пользователи
5.3. Опции командной строки
6. Конфигурационный файл exim во время выполнения
6.1. Использование иного конфигурационного файла
6.2. Формат конфигурационного файла
6.3. Включения файлов в конфигурационый файл
6.4. Макросы в конфигурационном файле
6.5. Макроподстановка
6.6. Переопределение макроса
6.7. Отмена значения макроса
6.8. Пример использования макроса
6.9. Условные пропуски в конфигурационном файле
6.10. Общий синтаксис опции
6.11. Булевы опции
6.12. Целочисленные значения
6.13. Целочисленные восьмеричные значения
6.14. Числовые значения с фиксированной точкой
6.15. Значения временных интервалов
6.16. Строковые значения
6.17. Раскрытие строк
6.18. Имена пользователей и групп
6.19. Построение списков
6.20. Пустые элементы в списках
6.21. Формат конфигурации драйвера
7. Дефолтовый конфигурационный файл
7.1. Главные конфигурационные настройки
7.2. Конфигурация ACL
7.3. Конфигурация роутера (маршрутизатора)
7.4. Транспортная конфигурация
7.5. Дефолтовые правила повторов
7.6. Конфигурация перезаписи
7.7. Конфигурация аутентификаторов
8. Регулярные выражения
8.1. Tестирование регулярных выражений
9. Поиски в файлах и базах данных
9.1. Примеры различных синтаксисов поиска
9.2. Типы поиска
9.3. Одноключевые типы поиска
9.4. Типы поиска в стиле запроса
9.5. Временные ошибки в поисках
9.6. Дефолтовые значения в одноключевых поисках
9.7. Частичное совпадение в одноключевых поисках
9.8. Кэширование поиска
9.9. Квотирование (помещение в двойные кавычки) данных поиска
9.10. Дополнительные сведения о dnsdb
9.11. Псевдо-
“dnsdb
” типы записей
9.12. Множественные поиски
“dnsdb
”
9.13. Дополнительные сведения о LDAP
9.14. Формат запросов LDAP
9.15. Квотирование (использование двойных кавычек и спецсимволов) в LDAP
9.16. Соединения LDAP
9.17. Аутентификация LDAP и управляющая информация
9.18. Формат данных возвращённых LDAP
9.19. Дополнительные сведения о NIS+
9.20. Поиски SQL
9.21. Дополнительные сведения о MySQL, PostgreSQL, Oracle, и Interbase
9.22. Специальные возможности MySQL
9.23. Специальные возможности PostgreSQL
9.24. Дополнительные сведения о SQLite
10. Списки доменов, узлов, адресов и локальных частей [почтового] адреса
10.1. Раскрытие списков
10.2. Отрицаемые элементы в списках
10.3. Имена файлов в списках
10.4. Файл
“lsearch
” не нелинейный список
10.5. Именованные списки
10.6. Сравнение именованных списков с макросами
10.7. Кэширование именованных списков
10.8. Списки доменов
10.9. Списки хостов
10.10. Специальные паттерны списка хостов
10.11. Паттерны списка хостов, совпадающие с IP-адресом
10.12. Паттерны списка хостов для одноключевого поиска по имени хоста
10.13. Паттерны списка хостов совпадающие по имени хоста
10.14. Поведение, когда IP-адрес не может быть найден
10.15. Список шаблонов хостов для одноключевого поиска по имени хоста
10.16. Список шаблонов хостов для поиска в стиле запросов
10.17. Смешивание безразличных имён хостов и адресов в списках хостов
10.18. Списки адресов
10.19. Регистр букв в списках адресов
10.20. Списки локальных частей
11. Раскрытие строк
11.1. Дословный текст в раскрываемых строках
11.2. Последовательности с обратным слэшем, в расширенных строках
11.3. Тестирование раскрываемых строк
11.4. Принудительный отказ от раскрытия строки
11.5. Элементы раскрытия
11.6. Операторы раскрытия
11.7. Условия раскрытия
11.8. Комбинирование условий раскрытия
11.9. Переменные раскрытия
12. Встроенный perl
12.1. Настройка использования perl
12.2. Вызов подпрограмм perl
12.3. Вызов функций exim`a из perl`a
12.4. Использование стандартного вывода и ошибок perl`ом
13. Запуск даемона, и использование сетевых интерфейсов
13.1. Запуск слушающего даемона
13.2. Специальный IP слушающий адреса
13.3. Отмена
“local_interfaces
” и
“daemon_smtp_ports
”
13.4. Поддержка устаревшего протокола SSMTP (или SMTPS)
13.5. Области адресов IPv6
13.6. Отключение IPv6
13.7. Примеры запуска слушающего даемона
13.8. Распознание локального хоста
13.9. Доставка к удалённому хосту
14. Главная конфигурация
14.1. Разное
14.2. Параметры exim
14.3. Настройки привелегий
14.4. Логгинг
14.5. Замороженные сообщения
14.6. Поиск данных
14.7. Идентификаторы сообщений
14.8. Запуск встроенного perl`a
14.9. Даемон
14.10. Контроль ресурсов
14.11. Управление политиками
14.12. Кэш обратных вызовов
14.13. TLS
14.14. Локальная обработка пользователей
14.15. Все входящие сообщения (SMTP и не-SMTP)
14.16. Входящие не-SMTP сообщения
14.17. Входящие не-SMTP сообщения
14.18. Расширения SMTP
14.19. Обработка сообщений
14.20. Системный фильтр
14.21. Роутинг и доставка
14.22. Рикошеты и предупрждающие сообщения
14.23. Алфавитный список главных опций
15. Общие опции для роутеров
16. Роутер ACCEPT
17. Роутер dnslookup
17.1. Проблемы с поиском в DNS
17.2. Частные опции для dnslookup
17.3. Эффект опций qualify_single и search_parents
18. Роутер ipliteral
19. Роутер iplookup
20. Роутер manualroute
20.1. Частные (private) опции manualroute
20.2. Правила маршрутизации в опции
“route_list
”
20.3. Правила маршрутизации в опции
“route_data
”
20.4. Формат списка узлов
20.5. Формат одного элемента хоста
20.6. Как используется список узлов
20.7. Как используются опции
20.8. Примеры
“manualroute
”
21. Роутер queryprogram
22. Роутер redirect
22.1. Данные для перенаправления
22.2. Файлы пересылки (forward files) и проверка адреса
22.3. Обработка данных перенаправления
22.4. Элементы списка перенаправления
22.5. Перенаправление в локальный почтовый ящик
22.6. Специальные конструкции в списках перенаправления
22.7. Дублирование адресов
22.8. Повторяющееся преобразование перенаправления
22.9. Ошибки в списках перенаправления
22.10. Частные опции роутера
“redirect
”
23. Среда для работы локальных транспортов
23.1. Одновременные доставки
23.2. Uid`ы и gid`ы
23.3. Текущая и домашняя директории
23.4. Переменные раскрытия произведённые из адреса
24. Общие опции для транспортов
25. Группировка адресов в локальных транспортах
26. Транспорт appendfile
26.1. Опции
“file
” и
“directory
”
26.2. Частные опции для
“appendfile
”
26.3. Операционные детали для добавления
26.4. Операционные детали для доставки в новый файл
26.5. Доставка
“maildir
”
26.6. Использование тэгов для записи размера сообщений
26.7. Использование файла
“maildirsize
”
26.8. Доставка
“mailstore
”
26.9. Неспециальная доставка в новый файл
27. Транспорт autoreply
27.1. Частные опции для
“autoreply
”
28. Транспорт lmtp
29. Транспорт
“pipe
”
29.1. Конкурирующие доставки
29.2. Возвращаемый статус и данные
29.3. Как выполняется команда
29.4. Переменные окружения
29.5. Частные опции для
“pipe
”
29.6. Использование внешнего (стороннего) агента локальной доставки
30. Транспорт SMTP
30.1. Несколько сообщений в одном соединении
30.2. Использование переменной
“
$host
”
30.3. Частные опции для
“smtp
”
30.4. Как ограничить число хостов используемых для проверки
31. Перезапись адресов
31.1. Явно сконфигурированная перезапись адресов
31.2. Когда происходит перезапись?
31.3. Тестирование правил перезаписи применяемых на входе
31.4. Правила перезаписи
31.5. Шаблоны перезаписи
31.6. Перезапись замен
31.7. Флаги перезаписи
31.8. Флаги, определяющие какие заголовки и адрес конверта перезаписывать
31.9. Флаг перезаписи во время SMTP
31.10. Флаги контролирующие процесс перезаписи
31.11. Примеры перезаписи
32. Конфигурация повторов
32.1. Правила повторов
32.2. Выбор, какие правила используются для ошибок адреса
32.3. Выбор, какое правило используется для хоста и сообщения о ошибке
32.4. Правила повтора для специфических ошибок
32.5. Правила повторов для специфических отправителей
32.6. Параметры повтора
32.7. Примеры правил повтора
32.8. Таймаут для данных повторов
32.9. Долгосрочные ошибки
32.10. Доставки работающие с перерывами
33. SMTP-аутентификация
33.1. Общие опции для аутентификаторов
33.2. Параметр AUTH в команде MAIL
33.3. Аутентификация на сервере exim
33.4. Проверка серверной аутентификации
33.5. Аутентификация exim`a как клиента
34. Аутентификатор plaintext
34.1. Использование plaintext в сервере
34.2. Аутентификационный механизм PLAIN
34.3. Аутентификационный механизм LOGIN
34.4. Поддержка для иных видов аутентификации
34.5. Использование
“plaintext
” как клиента
35. Аутентификатор cram_md5
35.1. Использование cram_md5 как сервера
35.2. Использование cram_md5 как клиента
36. Аутентификатор cyrus_sasl
36.1. Использование cyrus_sasl в качестве сервера
37. Аутентификатор spa
37.1. Использование spa как сервера
37.2. Использование
“spa
” как клиента
38. Шифрование соединений с использованием TLS/SSL
38.1. Поддержка для наследственного
“ssmtp
” (или
“smtps
”) протокола
38.2. OpenSSL против GnuTLS
38.3. Вычисление параметра GnuTLS
38.4. Требование специфических шифров в OpenSSL
38.5. Специфические шифры требующиеся в GnuTLS
38.6. Конфигурирование сервера exim для использования TLS
38.7. Запрос и проверка клиентских сертификатов
38.8. Отменённые сертификаты
38.9. Конфигурирование клиента exim`a для использования TLS
38.10. Несколько сообщений через одно шифрованное TCP/IP соединение
38.11. Сертификаты и всё такое
38.12. Цепочки сертификатов
38.13. Самоподписанный сертификаты
39. Списки Контроля Доступа
39.1. Тестирование ACL
39.2. Определение, когда используются ACL
39.3. Не-SMTP ACL
39.4. ACL подключения
39.5. ACL DATA
39.6. ACL MIME
39.7. ACL QUIT
39.8. Нахождение ACL для использования
39.9. Коды возврата ACL
39.10. Незаданные опции ACL
39.11. Данные для ACL сообщений
39.12. Данные для ACL не-сообщений
39.13. Формат ACL
39.14. Команды ACL
39.15. Переменные ACL
39.16. Обработка условий и модификаторов
39.17. Модификаторы ACL
39.18. Использование модификатора
“control
”
39.19. Добавление строк заголовков в ACL`ах
39.20. Условия ACL
39.21. Использование списков DNS
39.22. Задание IP-адреса для поиска в списках DNS
39.23. DNS-списки основанные на именах доменов
39.24. Поиски в DNS основанные на нескольких ключах
39.25. Данные возвращаемые списками DNS
39.26. Переменные устанавливаемые из списков DNS
39.27. Дополнительные совпадения условий для списков DNS
39.28. Отрицательные условия сравнения DNS
39.29. Списки DNS и IPv6
39.30. Ограничение нормы отправителей
39.31. Проверка адресов
39.32. Проверка обратным вызовом
39.33. Дополнительные параметры для обратных вызовов
39.34. Кэширование обратных вызовов
39.35. Отчёты проверки адресов отправителя
39.36. Перенаправление при проверке
39.37. Клиентская SMTP-авторизация (CSA)
39.38. Проверка тега адреса рикошета
39.39. Использование ACL для упавления релеингом
39.40. Проверка конфигурации релея
40. Контентное сканирование во время ACL
40.1. Сканирование на вирусы
40.2. Сканирование с SpamAssassin
40.3. Вызов SpamAssassin из ACL exim`a
40.4. Сканирование частей MIME
40.5. Сканирование с регулярными выражениями
40.6. Условие
“demime
”
41. Добавляем функцию local scan в Exim
41.1. Сборка Exim с использованием функции local scan
41.2. API для local_scan()
41.3. Опции конфигурации для local_scan()
41.4. Доступные переменные Exim
41.5. Структура header_line
41.6. Структура recipient_item
41.7. Доступные функции Exim
41.8. Больше об обработке памяти Exim'ом
42. Системная фильтрация сообщений
42.1. Установка системного фильтра
42.2. Тестирование системного фильтра
42.3. Содержимое системного фильтра
42.4. Дополнительные переменные для системных фильтров
42.5.
“Defer
”,
“freeze
”, и
“fail
” команды системного фильтра
42.6. Добавление и удаление заголовков в системном фильтре
42.7. Установка адреса ошибок в системном фильтре
42.8. Фильтрация по адресам
43. Обработка сообщения
43.1. Режим передачи для нелокальных сообщений
43.2. Завершения строк
43.3. Неквалифицированные адреса
43.4. Строка
“From
” UUCP
43.5. Строки заголовков
“Resent-
”
43.6. Строка заголовка
“Auto-Submitted:
”
43.7. Строка заголовка
“Bcc:
”
43.8. Строка заголовка
“Date:
”
43.9. Строка заголовка
“Delivery-date:
”
43.10. Строка заголовка
“Envelope-to:
”
43.11. Строка заголовка
“From:
”
43.12. Строка заголовка
“Message-ID:
”
43.13. Строка заголовка
“Received:
”
43.14. Строка заголовка
“References:
”
43.15. Строка заголовка
“Return-path:
”
43.16. Строка заголовка
“Sender:
”
43.17. Добавление и удаление заголовков в роутерах и транспортах
43.18. Конструирование адресов
43.19. Регистры локальных частей
43.20. Точки в локальных частях
43.21. Перезапись адресов
44. Обработка SMTP
44.1. Исходящий SMTP и LMTP через TCP/IP
44.2. Ошибки в исходящем SMTP
44.3. Входящие SMTP сообщения через TCP/IP
44.4. Нераспознанные SMTP-команды
44.5. Синтаксис и ошибки протокола в командах SMTP
44.6. Использование непочтовых SMTP команд
44.7. Команды VRFY и EXPN
44.8. Команда ETRN
44.9. Входящий локальный SMTP
44.10. Исходящий пакетный SMTP
44.11. Входящий пакетный SMTP
45. Настройка рикошетов и предупреждающих сообщений
45.1. Настройка рикошетов
45.2. Настройка предупреждающих сообщений
46. Некоторые общие конфигурационые опции
46.1. Отсылка почты на
“умный
” хост
46.2. Использование exim для обработки списков рассылки
46.3. Синтаксические ошибки в списках рассылки
46.4. Повторное раскрытие списков рассылки
46.5. Закрытые списки рассылки
46.6. Переменные пути возврата конверта (VERP)
46.7. Виртуальные домены
46.8. Многочисленные пользовательские почтовые ящики
46.9. Упрощённая обработка отпуска (vacation)
46.10. Отбор копий сообщений
46.11. Периодически подключенные хосты
46.12. Exim на вышестоящих серверных хостах
46.13. Exim на периодически подключаемом клиентском хосте
47. Использование exim`a как клиента без очереди сообщений
48. Файлы логов
48.1. Где пишутся логи
48.2. Логгинг в локальные файлы, которые периодически ротируются
48.3. Штамп даты на файлах логов
48.4. Логгинг в syslog
48.5. Флаги строк логов
48.6. Логирование приёма сообщений
48.7. Логгинг доставок
48.8. Доставки от которых отказались
48.9. Отсроченные доставки
48.10. Ошибки доставки
48.11. Поддельные доставки
48.12. Завершение
48.13. Краткое изложение полей в строках логов
48.14. Другие записи логов
48.15. Сокращение или увеличение того, что логгируется
48.16. Лог сообщения
49. Утилиты exim`a
49.1. Поиск, что делают процессы exim`a (exiwhat)
49.2. Селективный просмотр очереди (exiqgrep)
49.3. Подведение итогов очереди (exiqsumm)
49.4. Извлечение специфической информации из лога (exigrep)
49.5. Отбор сообщений по различным критериям (exipick)
49.6. Ротация лог-файлов (exicyclog)
49.7. Почтовая статистика (eximstats)
49.8. Проверка политики доступа (exim_checkaccess)
49.9. Создание файлов DBM (exim_dbmbuild)
49.10. Нахождение индивидуальных времён повторов (exinext)
49.11. Обслуживание БД подсказок
49.12. exim_dumpdb
49.13. exim_tidydb
49.14. exim_fixdb
49.15. Обслуживание почтового ящика (exim_lock)
50. Монитор exim`a
50.1. Запуск монитора
50.2. Графики
50.3. Кнопки главного действия
50.4. Показ логов
50.5. Отображение очереди
50.6. Меню очереди
51. Обсуждение безопасности
51.1. Сборка более
“защищённого
” exim`a
51.2. root`овые привилегии
51.3. Работа exim без привилегий
51.4. Доставка в локальные файлы
51.5. Источник роутинга IPv4
51.6. Команды VRFY, EXPN, и ETRN в SMTP
51.7. Привелигированные пользователи
51.8. Файлы спула
51.9. Использование argv[0]
51.10. Использование форматирования %f
51.11. Встроенные пути exim`a
51.12. Использование
“
sprintf()
”
51.13. Использование
“
debug_printf()
” и
“
log_write()
”
51.14. Использование
“
debug_printf()
” и
“
log_write()
”
52. Формат файлов спула
52.1. Формат файла
“-H
”
53. Добавление новых драйверов или типов поисков
54. Возможности Exim для фильтрации почты
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
Часть перевода взята отсюда
12. Встроенный perl
Exim может быть собран с встроенным интерпретатором perl. Когда это сделано, подпрограммы perl можно вызывать как часть процесса раскрытия. Для использования поддержки perl, вам ружна установленная в системе версия 5.004, или более поздняя. Для включения встроенного интерпретатора perl в бинарный файл exim`a, включите строку
в ваш
“
Local/Makefile
”, и затем соберите exim обычным способом.
12.1 Настройка использования perl
Доступ к подпрограммам perl осуществляется через глобальную конфигурационную опцию
“
perl_startup
”, и опреатор раскрытия
“
${perl ...}
”. Если опция
“
perl_startup
” отсутствует в конфигурационном файле exim, тогда интерпретатор perl не запускается, и для exim почти нет накладных расходов (т.к. ни одна библиотек perl не использует страницы памяти). Если опция
“
perl_startup
” присутствует, тогда ассоциированное значение берётся чтобы быть кодом perl, выполняемым во вновь созданном интерпретаторе perl.
Значение
“
perl_startup
” не раскрывается в смысле exim`a, таким образом, вам не нужно добавлять символ обратного слэша перед символами имеющими специальное значение. Опция, обычно, выглядит так
perl_startup = do '/etc/exim.pl'
|
где
“
/etc/exim.pl
” - код perl, определяющий любые подрограммы, которые вы хотите использовать с exim. Exim может быть сконфигурирован или для запуска интерпретатора perl сразу, или ждать первого раза, когда он понадобиться. Старт интепретатора в начале, гарантирует, что действие будет сделано в то время, когда exim имеет setuid привилегии, но может вызвать ненужные накладные расходя, если perl, фактически, не используется в выполняемой части. Кроме этого, отметтьте, что это не означает, что exim работает от root`a, при вызове perl`a в более поздние моменты времени. По дефолту, интерпретатор запускается только когда он необходим, и это может быть изменено в двух местах:
Установкой опции
“
perl_at_start
” (булева опция) в конфигурации запрашивается запуск при начале работы exim`a.
Опция командной строки
“
-ps
”, также вызывает запуск вместе с exim`ом, отменяя установку
“
perl_at_start
”.
Также, есть опция командной строки
“
-pd
” (для задержки), подавляющая начальный запуск, даже если уставновлена
“
perl_at_start
”.
12.2 Вызов подпрограмм perl
Когда конфигурационный файл включает опцию
“
perl_startup
”, вы можете использовать элемен раскрытия строк для вызова подрограмм perl, заданных кодом
“
perl_startup
”. Оператор используется в любой из следующих форм:
${perl{foo}}
${perl{foo}{argument}}
${perl{foo}{argument1}{argument2} ... }
|
вызывающих подпрограмму
“
foo
” с заданными параметрами. Может быть передано, максимум, восемь параметров. Передача большего числа приводит к ошибке раскрытия, с сообщением об ошибке, такой формы:
Too many arguments passed to Perl subroutine "foo" (max is
8
)
|
Возвращаемое значение подрограммы perl оценивается в скалярных величинах до возвращения его exim`у, чтобы быть вставленным в раскрытую строку. Если возвращённое значение -
“
undef
”, раскрытие терпит принудительную неудачу таким же образом, как и явный
“fail
” в элементе
“if
” или
“lookup
”. Если подпрограмма прерывается повинуясь функции perl`a
“
die
”, раскрытие неудачно, с сообщением об ошибке, которое переданно
“
die
”.
12.3 Вызов функций exim`a из perl`a
Внутри любого кода perl, вызыванного из exim, доступна функция
“
Exim::expand_string()
”, для обратного вызова в функцию раскрытия exim. Для примера, код perl
my $lp = Exim::expand_string('$local_part');
|
сделает текущую переменную exim`a
“
$local_part
”, доступной в переменной perl
“
$ip
”. Отметтьте, что тут одиночные кавычки, а не двойные, для предотвращения интепретации
“
$local_part
” как переменной perl.
Если раскрытие строки принудительно сделано неуспешным, элементом
“fail
”, результат
“
Exim::expand_string()
” -
“
undef
”. Если в строке раскрытия есть синтаксическая ошибка, из оригинального раскрытия строки вызывается ошибка perl, с соотвествующим сообщением об ошибке, таким же образом как будто использовалось
“
die
”.
Внутри кода perl доступны две другие функции exim.
“
Exim::debug_write()
” записывает строку в стандартный поток ошибок, если включена отладка exim. Если вы хотите добавлять в конец строки символ новой строки, вы его должны подставить.
“
Exim::log_write()
” пишет строки в основной лог exim`a, добавляя в начале метку времени. В этом случае, вам не нужно добавлять перевод строки.
12.4 Использование стандартного вывода и ошибок perl`ом
Вы не должны записывать в стандартный поток ошибок, или стандартный вывод изнутри вашего кода perl, поскольку не заданы их установки. В версиях exim до 4.50, это возможно для стандартного вывода или стандартного потока ошибок, для ссылки на SMTP-соединение в течение приёма сообщения даемоном.Запись в этот поток вызывает хаос. С exim 4.50, прогресс, стандартные потоки ошибок и вывода соединены с
“
/dev/null
”, в даемоне. Хаос отсутствует, но вывод потерян.
Утверждение perl
“
warn
”, по умолчанию, пишется в стандартный поток ошибок. Вызовы
“
warn
” могут быть встроены в модули perl, которые вы используете, но которые не контролируете. Когда exim запускает интерпретатор perl, он принимает меры для записи вывода утверждений
“
warn
” в главный лог exim`a. Вы можете изменить это, путём включения соответсвующей perl`овой феньки, где-то внутри его кода. например, чтобы полностью отказаться от вывода
“
warn
”, вам необходимо это:
$SIG{__WARN__} = sub { };
|
Всякий раз, когда появляется
“
warn
”, вызывается безымянная программа. В этом примере, код программы пуст, таким образом, она ничего не делает, но вы можете включить любой код perl, который вам нравится. Текст сообщения
“
warn
” передаётся как первый параметра подпрограммы.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
19. IPLOOKUP ROUTER
“Iplookup
” роутер был написан для выполнения специальных требований в Кэмбриджском университете. По этой причине, он не включен в бинарный файл Exim по умолчанию. Если вы хотите включить его, то вы должны указать
в конфигурационном файле
“
Local/Makefile
”.
“Iplookup
” роутер маршрутизирует адрес путем посылки его посредством TCP или UDP соединения одному или нескольким особым узлам. Затем узел может возвратить либо тот же самый, либо другой адрес - в действительности переписав адрес получателя в конверте сообщения. Затем новый адрес передается последующим роутерам, или доставка может быть задержана.Так как
“iplookup
” - только маршрутизатор перезаписи, транспорт(транспортировка) не должен быть определен для этого.
hosts
|
Use: iplookup
|
Type: string
|
Default: unset
|
|
Эта опция должна быть установлена. Ее значение - это список имен узлов, разделенный двоеточиями. Разрешение IP-адресов узлов осуществляется при помощи функций
“
gethostbyname()
” (или
“
getipnodebyname()
” если доступна). Затем адреса пробуются по очереди, до тех пор пока один из них не ответит на запрос. Если ни один узел не ответил, то дальнейшие действия управляются опцией
“optional
”.
optional
|
Use: iplookup
|
Type: boolean
|
Default: false
|
|
Если
“optional
” истинна (true), и если ни от одного узла не поступил ответ, то адрес передается следующему роутеру, перекрывая опцию
“no_more
”. Если
“optional
” ложна (false), то доставка на этот адрес откладывается.
port
|
Use: iplookup
|
Type: integer
|
Default: 0
|
|
Эта опция должна быть установлена. Она определяет номер TCP- или UDP-порта назначения.
protocol
|
Use: iplookup
|
Type: string
|
Default: udp
|
|
Эта опция может быть установлена либо в
“udp
”, либо в
“tcp
” для определения какой из этих двух протоколов использовать.
query
|
Use: iplookup
|
Type: string†
|
Default: $local_part@$domain $local_part@$domain
|
|
Опция определяет содержание запроса, посылаемого на удаленные узлы. Повтор служит как способ проверки, что ответ на корректный запрос приходит в регистре по умолчанию (см. опцию
“response_pattern
” ниже).
reroute
|
Use: iplookup
|
Type: string†
|
Default: unset
|
|
Если эта опция не определена, то адрес измененного маршрута (rerouted address) есть строка байтов, возвращенная удаленным узлом до первого пробела. Она может включать в себя фрагменты, полученные в ответ на опцию
“response_pattern
”, ссылаясь на них посредством числовых переменных, таких как
“
$1
”,
“
$2
” и т.д. Переменная
“
$0
” ссылается на целую входную строку, независимо от использования шаблона. Во всех случаях, адрес измененного маршрута должен оканчиваться в виде
“local_part@domain
”.
response_pattern
|
Use: iplookup
|
Type: string
|
Default: unset
|
|
Эта опция может быть определена как регулярное выражение, которое применяется к строке, возвращаемой удаленным узлом. Если шаблон не совпадает с ответом, роутер отклоняется. Если опция
“response_pattern
” не определена, то проверки ответа не происходит, пока запрос не выполнен, в этом случае проверяется что текст, возвращенный после первого пробела, является исходным адресом. Этим проверяется, что полученный ответ является откликом на корректный вопрос. К примеру, если ответ это просто новый домен, то может быть использована следующая конструкция:
response_pattern = ^([^@]+)$
reroute = $local_part@$1
|
timeout
|
Use: iplookup
|
Type: time
|
Default: 5s
|
|
Эта опция определяет время ожидания ответа удаленного узла. Таймаут с этим же значением используется функцией
“
connect()
” в случае TCP-соединения. Опция к протоколу UDP неприменима.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
20. Роутер MANUALROUTE
Роутер
“manualroute
” назван таким образом потому что он предоставляет возможность
“ручной
” маршрутизации (manual routing) адреса в соответствии с его доменом. Главным образом он используется в случае, когда вы хотите маршрутизировать почту на удаленные узлы по собственным правилам, в обход обыкновенной DNS-маршрутизации, механизм которой выполняет поиск MX-записей. Однако, роутер
“manualroute
” также может выполнять маршрутизацию на локальные транспорты, такая возможность может оказаться полезной, если вы хотите сохранять сообщения для входящих (dial-in) узлов в локальных файлах.
Роутер
“manualroute
” сравнивает список доменных шаблонов с доменной частью адреса, который он пытается маршрутизировать. Если совпадения не найдено, то роутер отклоняется. Каждый шаблон, ассоциированный с роутером представляет собой список узлов, а также другую дополнительную информацию, в которую может входить транспорт. Комбинация шаблона и других его данных называется
“правилом маршрутизации
”. Для шаблонов, не имеющих ассоциированного с ними транспорта, общая опция роутеров
“transport
” должна определять соответствующий транспорт, если только роутер не используется исключительно для проверки (verification) (см. опцию
“verify_only
”).
В случае, если роутер используется для проверки, то совпадения с доменным
шаблоном достаточно для того, чтобы роутер принял адрес. В действительности, при маршрутизации адреса для доставки, доменная часть которого совпала с доменным шаблоном, адрес помещается в очередь ассоциированного с роутером транспорта. Если транспорт не является локальным, то с шаблоном должен быть ассоциирован список узлов (host list); выполняется разрешение имен в IP-адреса, которые затем передаются транспорту вместе с почтовым адресом. Для локального транспорта список узлов (host list) является опциональным. Если он присутствует, то он передается в переменной
“
$host
” как простая текстовая строка.
Список правил маршрутизации может быть определен как строка, включенная (inline string) в опцию
“route_list
”, либо как данные, полученные путем поиска домена в файле или базе данных, определенных опцией
“route_data
”. Только одна из них может быть определена в пределах одного экземпляра роутера manualroute. Формат правил маршрутизации описан ниже, вслед за списком частных опций
“manualroute
”.
Частные опции для
“manualroute
” таковы:
опция
|
использование
|
тип
|
по-умолчанию
|
host_find_failed
|
manualroute
|
string
|
freeze
|
|
Эта опция управляет тем, что происходит когда
“manualroute
” пытается найти IP-адрес узла, а его не существует. Опции могут быть даны значения:
decline
defer
fail
freeze
pass
|
Значение по умолчанию предполагает, что данное состояние - серьезная конфигурационная ошибка. Разница между значениями
“pass
” и
“decline
” состоит в том, что предыдущий пункт принудительно передает адрес следующему роутеру (либо роутеру, указанному в опции
“pass_router
”), перекрывая опцию
“no_more
”, тогда как в недавнем прошлом адрес передавался следующему роутеру только в случае истинности опции
“more
”.
Эта опция применима только к определенному состоянию
“не существует
” (
“does not exist
” state); если поиск узла выдает врeменную ошибку, то доставка откладывается, только если не установлена общая опция
“pass_on_timeout
”.
опция
|
использование
|
тип
|
по-умолчанию
|
hosts_randomize
|
manualroute
|
boolean
|
false
|
|
Если установлена эта опция, то порядок элементов в списке узлов внутри правила маршрутизации каждый раз при обращении к нему выбирается случайным образом, если не перекрывается опцией в самом правиле маршрутизации (см. ниже). Выбор порядка узлов в списке случайным образом может быть использован для первичного распределения нагрузки. Однако, если один и тот же роутер маршрутизирует более одного почтового адреса на один и тот же список узлов, то списки предполагается должны быть одинаковыми (даже если они расположены в случайном порядке) для решения помещать ли несколько доставок в одну SMTP-транзакцию.
В случае если опция
“hosts_randomize
” истинна, список узлов может быть разделен на группы, порядок которых отдельно устанавливается случайным образом. Это делает возможным установить MX-подобное поведение. Границы между группами помечаются символом
“+
” в списке узлов. Например,
route_list = * host1:host2:host3:+:host4:host5
|
Порядок, в котором сортируются первые три узла и порядок сортировки последних двух выбирается случайным образом при каждом использовании, но первая группа всегда располагается перед второй. Если опция
“hosts_randomize
” не установлена, символ разделителя
“+
” в списке игнорируется. Если такой список узлов со случайной внутренней сортировкой, предается транспорту smtp, который также имеет подобную опцию
“hosts_randomize set
”, то список заново не сортируется.
опция
|
использование
|
тип
|
по-умолчанию
|
route_data
|
manualroute
|
string†
|
unset
|
|
Если эта опция определена, то ее значение должно раскрываться, т.к. она определяет данные правила маршрутизации. Обычно, раскрываемая строка включает в себя поиск на основе домена. Например:
route_data = ${lookup{
$domain}dbm{/etc/routes}}
|
Если раскрытие строки принудительно завершилось неудачей, либо результатом явилась пустая строка, то роутер пропускается. Другие причины неудачного раскрытия ведут к откладыванию доставки.
опция
|
использование
|
тип
|
по-умолчанию
|
route_list
|
manualroute
|
string
|
unset
|
|
Эта строка является списком правил маршрутизации в форме, определенной ниже. Обратите внимание, что в отличие от большинства списков строк, элементы здесь разделяются символом
“;
”. Так сделано, потому что данный список может содержать разделенные символом
“:
” списки узлов.
опция
|
использование
|
тип
|
по-умолчанию
|
same_domain_copy_routing
|
manualroute
|
boolean
|
false
|
|
Обычно, адреса с одинаковой доменной частью маршрутизируются роутером
“manualroute
” на один и тот же список узлов. Однако, это не может быть допустимо, поскольку опции и предусловия роутера могут использовать локальную часть адреса. Поэтому по умолчанию Exim независимо маршрутизирует каждый адрес в сообщении. DNS-серверы используют кэши, поэтому повторяющиеся DNS-запросы не являются помехой, и в любом случае личные сообщения редко имеют много получателей.
Если у вас функционируют списки рассылки с большим количеством подписчиков из одного домена, и вы используете роутер
“manualroute
”, который не зависит от локальной части почтового адреса, то вы можете установить опцию
“same_domain_copy_routing
” во избежание повторяющихся DNS-запросов для одного и того же домена получателя в сообщении. В этом случае, если роутер
“manualroute
” маршрутизирует адрес удаленному транспорту, то все оставшиеся несмаршрутизированные адреса в сообщении, имеющие тот же домен получателя, перенаправляются автоматически без независимой обработки. Однако, это выполняется только в том случае, если не установлены опции
“headers_add
” и
“headers_remove
”.
Значением опции
“route_list
” является строка, состоящая из последовательности правил маршрутизации, разделенных символом
“;
”. Если
“;
” указыватся внутри самого правила, то оно должно быть представлено как
“;;
”. Пустые правила игнорируются. Формат каждого правила - следующий:
<шаблон домена> <список узлов> <опции>
|
Следующий пример состоит из двух правил, каждое из которых содержит простой доменный шаблон и не содержит опций:
route_list = \
dict.ref.example mail-
1
.ref.example:mail-
2
.ref.example ; \
thes.ref.example mail-
3
.ref.example:mail-
4
.ref.example
|
Три части правила разделяются пробелами. Шаблон домена и список узлов могут быть, если это необходимо, заключены в кавычки, и если это так, то применяются обычные правила для кавычек (quoting rules). Каждое правило опции
“route_list
” должно начинаться с шаблона домена (domain pattern), единственного обязательного элемента в правиле. Шаблон должен быть указан в том же формате, что и элемент в доменном списке (domain list) (см. секцию 10.8), за тем исключением, что он не может быть именем включаемого файла. То есть, он может содержать просто шаблон, либо регулярное выражение, либо поиск в файле или базе данных (с двойным символом
“;
”, из-за использования
“;
” как разделителя в опции
“route_list
”).
Правила в
“route_list
” просматриваются до первого совпадения доменного шаблона
с маршрутизируемым доменом. Затем, как описано ниже, используются список узлов
и опции. Если совпадений не найдено, то роутер пропускается. Если установлена
опция
“route_list
”, то не должна быть определена опция
“route_data
”.
Использование опции
“route_list
” подходит в случае использования небольшого количества правил маршрутизации. Для больших объемов проще использовать файл или базу данных для хранения информации о маршрутах и вместо нее использовать опцию
“route_data
”. Значением опции
“route_data
” является список узлов со следующими за ним необязательными опциями. Чаще всего
“route_data
” определяется как строка, содержащая раскрываемый поиск (expansion lookup). Например, представьте что вы поместили 2 правила маршрутизации в файл:
dict.ref.example: mail-
1
.ref.example:mail-
2
.ref.example
thes.ref.example: mail-
3
.ref.example:mail-
4
.ref.example
|
Эти данные могут быть доступными путем установки:
route_data = ${lookup{
$domain}lsearch{/the/file/name}}
|
Неувенчавшийся успехом поиск возвращает пустую строку, вследствие этого роутер пропускается. Однако, не стоит использовать поиск в
“route_data
”. Единственное требование здесь, это то, что результатом преобразования строки должен быть список узлов, возможно со следующими за ним опциями, разделенные пробелами. Если список узлов содержит пробелы, то он должен быть заключен в кавычки.
Список узлов, полученный либо через
“route_data
”, либо через
“route_list
”, всегда раскрыватся отдельно перед использованием. Если раскрытие завершается неудачно, то роутер пропускается. Результат преобразования должен быть списком имен и/или IP-адресов. IP-адреса в скобки не помещаются.
Если список узлов получен из опции
“route_list
”, то во время преобразования устанавливаются следующие переменные:
Если домен удовлетворяет регулярному выражению, то могут быть установлены
числовые переменные
“
$1
”,
“
$2
”, и т.д.
“
$0
” всегда содержит имя домена целиком.
“
$1
” также устанавливается в случае неполного совпадения при поиске в файле.
Если шаблон, с которым совпал домен, был элементом поиска (lookup item), то данные, поиск которых производился, доступны в переменной
“
$value
”.
Каждый элемент в списке хостов является или именем хоста или адресом IP, опционально, с номером порта. При отсутствии номера порта, адрес даётся без квадратных скобок. Когда порт задан, то это отменяет спецификацию порта на транспорте. Порт отделяется от адреса двоеточием. Это приводит к некоторым осложнениям:
Поскольку двоеточие - дефолтовый разделитель списка хостов, то либо необходимо удвоить двоеточия отделяющие номер порта, или изменён разделитель списка. Следующие два примера одинаковы:
route_list = * "host1.tld::
1225
: host2.tld::
1226
"
route_list = * "<+ host1.tld:
1225
+ host2.tld:
1226
"
|
Когда используются адреса IPv6, всё станвиться ещё хуже, т.к. в них используются двоеточия. Чтобы облегчить такие случаи, разрешено помещать адрес IPv6 или IPv4 в квадратные скобки, если за ним следует номер порта. Например:
route_list = * "</ [
10
.
1
.
1
.
1
]:
1225
/ [::
1
]:
1226
"
|
В процессе маршрутизации адреса на транспорт smtp при помощи
“manualroute
”, пробуется каждый из узлов в определенном порядке. Однако, порядок может быть изменен опцией
“hosts_randomize
” либо в конфигурации роутера (см. секцию 20.1 выше), либо в конфигурации транспорта.
Узлы могут быть перечислены по именам или по IP-адресам. Имя в списке узлов интерпретируется как имя узла. Имя с последующим за ним суффиксом
“/MX
” интерпретируется как косвенная ссылка на подсписок узлов, полученный путем поиска MX-записей в DNS. Например,
route_list = * x.y.z:p.q.r/MX:e.f.g
|
Если установлена опция
“hosts_randomize
”, то перед любым поиском порядок элементов в списке сортируется случайным образом. Затем Exim просматривает список; для всех имен без суффикса
“/MX
”, он выполняет поиск IP-адреса. Если им оказывается адрес интерфейса локальной машины и элемент в списке не стоит первым, то поведение определяется опцией роутера
“self
”.
Имя в списке с суффиксом
“/MX
” заменяется списком узлов, полученных в результате поиска MX-записей для имени. Это всегда выполняется посредством DNS-запроса; опции
“bydns
” и
“byname
” здесь неуместны. Порядок этих узлов определяется, как обычно, по значениям приоритета MX-записей. Поскольку случайная сортировка выполняется перед MX-поиском, то она не влияет на порядок, определенный MX-записями DNS.
Если локальная машина присутствует в подсписке, полученном путем просмотра MX-записей, но не является наиболее предпочитаемым узлом в нем, то она и узлы равного и меньшего приоритета удаляются из подсписка перед тем, как он вставляется в главный список.
Если локальная машина - наиболее предпочтительный узел в MX-списке, то все зависит от того, где в главном списке узлов стоит элемент
“/MX
”. Если он не является в нем первым элементом (потому как в списке перед ним есть узлы), то Exim отвергает это имя, а также все последующие элементы в главном списке.
Если MX-элемент стоит первым в списке, и локальная машина является наиболее предпочтительным узлом, то все зависит от опции роутера
“self
”.
Неудачные результаты поиска MX-записей в DNS обрабатываются так же как и при поиске IP-адресов: там где это необходимо используются опции
“pass_on_timeout
” и
“host_find_failed
”.
Общая опция
“ignore_target_hosts
” применяется ко всем узлам в списке, независимо получены ли он путем поиска MX-записей или нет.
Опции - это последовательность слов; на практике - присутствует не более трех. Одно из слов может быть именем транспорта, перекрывая опцию роутера
“transport
” лишь для данного правила маршрутизации. Другие слова управляют случайной сортировкой списка узлов по каждому правилу отдельно., а также тем как ищутся IP-адреса узлов в процессе маршрутизации на удаленный транспорт. Эти опции следующие:
“randomize
”: случайно сортировать порядок узлов в списке, перекрывая опцию
“hosts_randomize
” только для этого правила маршрутизации.
“no_randomize": не сортировать случайным образом порядок узлов в списке, перекрывая опцию
“hosts_randomize
” только для этого правила маршрутизации.
“byname
”: использовать
“
getipnodebyname()
” (
“
gethostbyname()
” на старых системах) для поиска IP-адресов. Эта функция может в конечном счете сделать DNS-запрос, хотя она может выполнить поиск в
“/etc/hosts
” или в других источниках подобной информации.
“bydns
”: искать адресные запиcи для узлов в DNS, неудачный исход - в случае отсутствмя таковых. Если существует временная ошибка DNS (например, таймаут), то доставка откладывается.
Например:
route_list = domain1 host1:host2:host3 randomize bydns;\
domain2 host4:host5
|
Если ни опция
“byname
”, ни опция
“bydns
” не определены, то Exim ведет себя следующим образом: Сначала выполняется DNS-запрос. Если возвращается что-либо отличное от HOST_NOT_FOUND, то используется этот результат. В противном случае, Exim пытается вызвать
“
getipnodebyname()
” или
“
gethostbyname()
”, и результатом поиска становится результат, возвращенный этим вызовом.
Внимание: На некоторых системах обнаружено, что если в результате DNS-запроса, производимого через функцию
“
getipnodebyname()
”, происходит таймаут, то возвращается HOST_NOT_FOUND вместо TRY_AGAIN. Вот почему по умолчанию сначала выполняется DNS-запрос. Локальная функция вызывается только в том случае, если ответом на него является
“no such host
”.
Если для узла не найдено IP-адреса, то дальнейшие действия управляются опцией
“host_find_failed
”.
В случае, когда адрес маршрутизируется на локальный транспорт, поиск IP-адресов не производится. Список узлов передается транспорту в переменной
“
$host
”.
В некоторых из нижеследующих примеров подразумевается присутствие транспорта
“remote_smtp
”, как это определено в файле конфигурации по умолчанию:
Роутер
“manualroute
” может быть использован для перенаправления всей входящей почты на т.н.
“быстрый узел
” (
“smart host
”). Если в главной части конфигурации описан именованный список доменов (named domain list), содержащий к примеру,
domainlist local_domains = my.domain.example
|
то вы можете указать для всех остальных доменов отправлять почту на смартхост, при этом ваш первый роутер будет выглядеть примерно так:
smart_route:
driver = "manualroute"
domains = !+local_domains
transport = remote_smtp
route_list = * smarthost.ref.example
|
В результате этого все адреса, не входящие в список local_domains, будут направляться на узел
“smarthost.ref.example
”. Если указан разделенный
“:
” список узлов, то они пробуются все по порядку (однако вы можете использовать опцию
“hosts_randomize
” для того, чтобы изменять порядок каждый раз). Другой способ конфигурации той же самой задачи таков:
smart_route:
driver = "manualroute"
transport = remote_smtp
route_list = !+local_domains smarthost.ref.example
|
Разницы в поведении между этими роутерами нет. Однако, они ведут себя по-разному если добавить к обоим роутерам опцию
“no_more
”. В первом примере, роутер будет пропущен, если если домен не совпадает с предусловием
“domains
”; и пробуется всегда следующий роутер. Если роутер запускается, то он всегда совпадает с доменом и поэтому никогда не может быть быть отклонен. Поэтому
“no_more
” не будет иметь эффекта в данном случае. Во втором случае роутер никогда не пропускается; он всегда выполняется. Однако, если совпадения с доменом не происходит, то роутер отклоняется. В этом случае опция
“no_more
” предотвратит запуск последующих роутеров.
“Почтовый концентратор
” - это узел, который получает почту для нескольких доменов через MX-записи в DNS и доставляет их через свой механизм маршрутизации. Часто пункты назначения находятся за брандмауэром, с
“почтовым концентратором
” располагающимся на одной машине, которая может соединяться с машинами внутри и снаружи брандмауэра. Роутер
“manualroute
” обычо используют на
“почтовом концентраторе
” для маршрутизации входящих сообщений на корректные узлы. Для небольшого количества доменов маршрутизация может быть включением (inline) в опцию
“route_list
”, но для большого количества доменов проще управлять поиском в файле и базе данных.
Если имена доменов фактически являются именами машин, на которые отправляется почта почтовым концентратором, то конфигурация может быть простой. Например,
hub_route:
driver = "manualroute"
transport = remote_smtp
route_list = *.rhodes.tvs.example $domain
|
Эта конфигурация маршрутизирует домены, совпадающие с шаблоном
“*.rhodes.tvs.example
” на узлы, чьи имена такие же как и почтовые домены. Похожий результат может быть получен если имя узла извлекается из имени домена путем манипуляции со строкой. Как альтернативный вариант, можно использовать поиск узла на основе домена:
through_firewall:
driver = "manualroute"
transport = remote_smtp
route_data = ${lookup {$domain} cdb {/internal/host/routes}}
|
Результатом поиска должно быть имя узла(узлов) или его IP-адрес на который должен быть смаршрутизирован проверяемый адрес. Если поиск завершается неудачей, то данные о маршрутах оказываются пустыми, в результате чего роутер отклоняется. Затем адрес передается следующему роутеру.
Вы можете использовать
“manualroute
” для доставки сообщений в трубы (pipes) или в файлы в пакетном формате SMTP для дальнейшей транспортировки по каким-либо причинам. Это способ хранения почты для входящего (dial-up) узла в течение времени когда он не подключен к сети. Запись
“route_list
” может быть просто доменным именем, например так:
save_in_file:
driver = "manualroute"
transport = batchsmtp_appendfile
route_list = saved.domain.example
|
Хотя часто шаблон используется для описания более одного домена. Если есть несколько доменов или групп доменов с различными транспортными требованиями, то разные транспорты могут быть перечислены в информации о маршрутах:
save_in_file:
driver = "manualroute"
route_list = \
*.saved.domain1.example $domain batch_appendfile; \
*.saved.domain2.example \
${lookup{
$domain}dbm{/domain2/hosts}{$value}fail} \
batch_pipe
|
Первый из них просто передает домен в переменную
“
$host
”, которая не очень полезна (т.к. домен находится также в переменной
“
$domain
”), но второй шаблон выполняет поиск в файле для нахождения переменной для передачи, заставляя роутер отклонять обработку адреса если поиск завершится неудачно.
Маршрутизация почты прямиком на программный пакет UUCP - это особый вариант использования
“manualroute
” в роли шлюза в другое почтовое окружение. Вот пример способа как можно это сделать:
# Transport
uucp:
driver = pipe
user = nobody
command = /usr/local/bin/uux -r - \
${substr_-
5
:$host}!rmail ${local_part}
return_fail_output = true
# Router
uucphost:
transport = uucp
driver = "manualroute"
route_data = \
${lookup{
$domain}lsearch{/usr/local/exim/uucphosts}}
|
Файл
“/usr/local/exim/uucphosts
” состоит из записей вида:
darksite.ethereal.example: darksite.UUCP
|
Можно описать это проще без добавления и удаления
“.UUCP
” но этот способ показывает различие между именем домена
“darksite.ethereal.example
” и именем UUCP-станции
“darksite
”.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
28. Транспорт lmtp
Транспорт
“
lmtp
” выполняет протокол LMTP (RFC2033) через трубу (pipe) к указанной команде, или взаимодействуя с сокетом UNIX. Этот транспорт - нечто между транспортами
“
pipe
” и
“
smtp
”. Также, у exim`a есть поддержка для использования LMTP через TCP/IP; это осуществлено как опция для транспорта
“
smtp
”. Поскольку, ожидается, что LMTP будет не очень интересен, в дефолтовом скрипте
“configure
”, в
“
src/EDITME
” он закомментрован. Вы должны гарантировать, что
присутствует в вашем
“
Local/Makefile
”, для включения транспорта
“
lmtp
” в бинарник exim`a. Частные опции транспорта
“
lmtp
” таковы:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
batch_id
|
lmtp
|
string†
|
незадана
|
|
Смотрите описание пакетной локальной доставки в разделе 25.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
batch_max
|
lmtp
|
integer
|
1
|
|
Эта опция ограничивает число адресов, которые могут быть обработаны в одной доставке. Большинство серверов LMTP могут обрабатывать сразу несколько адресов, таким образом, обычно, увеличение этого числа - хорошая идея. Смотрите описание пакетной локальной доставки в разделе 25.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
command
|
lmtp
|
string†
|
незадана
|
|
Эта опция должна быть задана, если не задана опция
“
socket
”. Строка - команда, которая запускается в отдельном процессе. Она разделяется на имя команды и список аргументов, каждый из которых отдельно раскрывается (таким образом, раскрытие не может изменить число аргументов). Команда выполняется напрямую, не через shell. Сообщение передаётся новому процессу, используя стандартный ввод и вывод для управления протоколом LMTP.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ignore_quota
|
lmtp
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, в команды RCPT добавляется строка
“IGNOREQUOTA
”, при условии что сервер LMTP информировал о поддержке
“IGNOREQUOTA
” в его ответе на команду LHLO.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
socket
|
lmtp
|
string†
|
незадана
|
|
Эта опция должна быть задана, если не задана опция
“
command
”. Результат раскрытия должен быть именем UNIX-сокета. Транспорт соединяется с сокетом и доставляет в него сообщение, используя протокол LMTP.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
timeout
|
lmtp
|
time
|
5m
|
|
Транспорт отменяется, если создание процесса или сокета UNIX не отвечает на команды LMTP, или происходит этот таймаут при передаче сообщения.
Это - пример типичного транспорта LMTP:
lmtp:
driver = lmtp
command = /some/local/lmtp/delivery/program
batch_max =
20
user = exim
|
Он доставялет до 20 адресов одновременно, если необходимо, в смешанные домены, работая как пользователь
“
exim
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
Транспорт "pipe"
Транспорт
“
pipe
” использует доставку через трубу (pipe) к команде, выполняющейся в ином процессе. Один пример - использование
“
pipe
” как псевдоудалённого транспорта для передачи сообщений какому-то иному механизму доставки (типа UUCP). Другой - использование отдельными пользователями для автоматической обработки их входящих сообщений. Транспорт
“
pipe
” может использоваться одним из следующих способов:
Маршрутизатор направляет один адрес на транспорт обычным способом, и транспорт сконфигурен как транспорт
“
pipe
”. В этом случае,
“
$local_part
” содержит локальную часть адреса (как обычно), и запускаемая команда задана в транспорте, опцией
“
command
”.
Если опция
“
batch_max
” установлена более чем в 1 (значение по умолчанию - 1), транспорт может обработать более одного адреса за один запуск. В этом случае, когда к транспорту роутится более одного адреса,
“
$local_part
” не установлена (поскольку она не уникальна). Однако, псевдопеременная
“
$pipe_addresses
” (описанная в разделе 29.3) содержит все адреса которые роутятся к транспорту.
Роутер переадресует адрес напрямую к команде pipe (например, из файла альясов или форвардов). В этом случае,
“
$address_pipe
” содержит текст команды pipe, и опция
“
command
” в роутере - игнорируется. Если транспортируется лишь один адрес (
“
batch_max
” более одного, или лишь один адрес был передаресован к команде трубы),
“
$local_part
” содержит переадресованную локальную часть.
Транспорт
“
pipe
” - неинтерактивный метод доставки. Также, exim может доставлять сообщения через трубы, используя интерактивный протокол LMTP. Это осуществляется транспортом
“
lmtp
”.
В случае, когда
“
pipe
” работает как следствие совпадения в локальном пользовательском файле
“
.forward
”, команда запускается под uid и gid этого пользователя. В других случаях, uid и gid должны быть заданы явно, или в транспорте, или в маршрутизаторе обрабатывающем адрес. Текущая и
“домашняя
” директории также управляемы. Для получения дополнительных деталей о окружении долальной доставки, смотрите раздел 23, и раздел 25 для обсуждения пакетной локальной доставки.
29.1 Конкурирующие доставки
Если два сообщения приходят почти одновременно, и оба роутятся на доставку pipe, два транспорта
“
pipe
” могут быть запущены одновременно. Вы должны гарантировать, что любые команды pipe, установленные вами, являются корректными для этого случая. Есди команда пишет в файл, может быть полезна утилита
“
exim_lock
”.
29.2 Возвращаемый статус и данные
Если команда выходит со статусом отличным от нуля, доставка считается неудачной, если не установлена опция
“
ignore_status
” (в этом случае код возврата обрабатывается как ноль), или возвращаемый код - один из перечисленных в опции temp_errors
”, которые интерпретируются со смыслом
“попробуйте позднее
” (
“try again later
”). В этом случае, доставка задерживается. Детали постоянной ошибки логгируются, но не включаются в рикошет, просто содержащий
“local delivery failed
”.
Если код возврата более чем 128, и выполняемая команда - shell-скрипт, это, обычно, означает, что скрипт был уничтожен сигналом, чьё значение равно - код возврата минус 128ю
Если exim не может запустить команду (т.е. - если
“
execve()
” неудачна), код возврата устанавливается равным 127. Это - значение, возвращаемое shell`ом, если запрашивают о запуске невыполняемой команды. Формулировка для логов наводит на мысль, что проблемой может быть несуществующая команда.
Опция
“
return_output
” может затрагивать результат доставки. Если она установлена, и команда производит какой-либо вывод на своём стандартном выводе, или в стандартном потоке ошибок, предполагается, что произошла ошибка команды, даже если она вернула нулевой код возврата, или установлена опция
“
ignore_status
”. Вывод команды включается как часть сообщения рикошета. Опция
“
return_fail_output
” подобна вышеописанной, за исключением что вывод возвращается лишь когда команда выходит с ошибочным кодом возврата, т.е. значениями кроме нуля или совпадающим с
“
temp_errors
”.
29.3 Как выполняется команда
Командная строка (по умолчанию) разбирается в имя команды и аргументы непосредственно транспортом
“
pipe
”. Опции
“
allow_commands
” и
“
restrict_to_path
” могут использоваться для ограничения команд, которые могут быть запущены.
Элементы не помещённые в кавычки разделяются по пробелам. Если аргумент помещён в двойные кавычки, обратный слэш интерпретируется как обычно, - как специальный символ. Если аргумент фигурирует в одинарных кавычках, интерпретации специальных символов не производится (имеются ввиду символы начинающиеся с обратного слэша - прим. lissyara).
К командной строке применяется раскрытие строки, кроме случаев когда она приходит из традиционного файла
“
.forward
” (команды из файла фильтра раскрываются). Раскрытие применяется по очереди, к каждому аргументу, а не ко всей строке. Поэтому, любой любой элемент раскрытия, содержащий пробелы, должен быть помещён в кавычки таким образом, чтобы он был внутри одного аргумента. Установка типа
command = /some/path ${if eq{$local_part}{postmaster}{xx}{yy}}
|
работать не будет, поскольку элемент раскрытия разбивается на несколько аргументов. Вы должны написать
command = /some/path "${if eq{$local_part}{postmaster}{xx}{yy}}"
|
для гарантирования, что всё это в одном аргументе. Раскрытие производится этим способом, аргумент за аргументом, таким образом, число аргументов не может быть изменено в результате раскрытия, и кавычки или обратные слэши во вставленных параметрах не взаимодействуют с внешними кавычками. Однако, это приводит к проблемам - если вы хотите генрировать много параметров (или имя команды, плюс аргументы) из одного раскрытия. В этой ситуации, самое простое решение - использовать shell. Например:
command = /bin/sh -c ${lookup{
$local_part}lsearch{/some/file}}
|
Имеет место специальная обработка, когда аргумент состоит в точности из текста
“
$pipe_addresses
”. Это - не общая переменая раскрытия; единственное место, где распознаётся эта строка, - когда она появляется как парметр для трубы, или команды транспортного фильтра. Она вызывает каждый обрабатываемый адрес для вставки в список аргументов, в этой точке, как отдельный параметр. Это позволяет избежать любых проблем с пробелами или метасимволами shell, и используется когда транспорт
“
pipe
” обрабатывает группу адресов в пакете.
После разделения на параметры и раскрытие, результирующая команда запускается в субпроцессе напрямую от транспорта, не под shell`ом. Доставляемое сообщение предоставялется на стандартном вводе, и оба - стандартный вывод, и стандартный вывод для ошибок, связаны с одной трубой, читаемое exim`ом. Опция
“
max_output
” - контролирует,как много вывода может произвести команда, и опции
“
return_output
” и
“
return_fail_output
” - управляют, что с ним делается.
Невыполнение команды под shell`ом (по умолчанию), уменьшает риск безопасности в случаях, когда команда из пользовательского фильтра строится из данных взятых из входящего сообщения. Если shell требуется, он, разумеется, может быть явно определён как оамнда, которая выполнится. Однако, существуют обстоятельства, когда существующие команды (например, в файлах
“
.forward
”) ожидают своего выполнения под shell`ом,и не могут быть легко модифицированы. Для разрешениия этих случаев, есть опция, называемая
“
use_shell
”, которая изменяет способ работы транспорта
“
pipe
”. Вместо описанной разбивки командной строки, она раскрывает её как одну строку, и передаёт результат
“
/bin/sh
”. Опция
“
restrict_to_path
” и средство
“
$pipe_addresses
” не могут использоваться с
“
use_shell
”, и весь механизм - менее безопасен.
29.4 Переменные окружения
Перечисленные ниже переменные окружения устанавливаются при вызове команды. Список - компромисс, для максимальной совместимости с другими MTA. Отметтьте, что для добавления дополнительных переменных окружения может использоваться опция
“
environment
”.
имя
|
значение
|
DOMAIN
|
домен адреса
|
HOME
|
домашняя директория; если задана
|
HOST
|
имя хоста при вызове из роутера (смотрите ниже)
|
LOCAL_PART
|
смотрите ниже
|
LOCAL_PART_PREFIX
|
смотрите ниже
|
LOCAL_PART_SUFFIX
|
смотрите ниже
|
LOGNAME
|
смотрите ниже
|
MESSAGE_ID
|
локальный идентификатор сообщения exim`a
|
PATH
|
как задано путём опции “path ”
|
QUALIFY_DOMAIN
|
квалификационный домен отправителя
|
RECIPIENT
|
полный адрес получателя
|
SENDER
|
отправитель сообщения (пустой - если рикошет)
|
SHELL
|
/bin/sh
|
TZ
|
значение опции “timezone ”; если установлена
|
USER
|
смотрите ниже
|
|
Когда транспорт
“
pipe
” вызывается непосредственно из (например) роутера
“
accept
”, LOCAL_PART устанавливается в локальную часть адреса. Когда он вызывается как результат раскрытия форварда или альяса, LOCAL_PART устанавливается в локальную часть адреса, который был раскрыт. В обоих случаях, любые аффиксы удаляются из локальной части, и становятся доступны в LOCAL_PART_PREFIX и LOCAL_PART_SUFFIX, соответственно. LOGNAME и USER устанавливаются в тоже значение, что и LOCAL_PART, для совместимости с другими MTA.
HOST - устанавливается лишь когда транспорт
“
pipe
” вызывается из роутера, который ассоциирует хосты с адресами, типично используя
“
pipe
” как псевдоудалённый транспорт. HOST устанавливается в первое имя хоста заданное роутером.
Если установлена общая транспортная опция
“
home_directory
”, её значенеи используется для переменной окружения HOME. Иначе, домашняя директория может быть установлена роутером, путём опции
“
transport_home_directory
”, иеющей дефолтовое значение на домашнюю директорию пользователя, если установлена
“
check_local_user
”.
29.5 Частные опции для
“pipe
”
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
allow_commands
|
pipe
|
string list†
|
незадана
|
|
Строка раскрывается, и, затем, интерпретируется как раздёлённый двоеточиями список допустимых команд. Если
“
restrict_to_path
” не установлена, разрешены лишь команды перечисленные в списке
“
allow_commands
”. Они не должны быть абсолютными путями; опция
“
path
” продолжает использоваться для относительных путей. Если
“
restrict_to_path
” установлена с
“
allow_commands
”, команда должна быть в списке
“
allow_commands
”, или именем без каких-либо слэшей наёденным в путях. Другими словами, если не установлена ни
“
allow_commands
”, ни
“
restrict_to_path
” - нет никаких ограничений на команды, но иначе, разрешены лишь команды допускаемые той или другой опциеями. Например, если
allow_commands = /usr/bin/vacation
|
и
“
restrict_to_path
” не установлена, разрешена лишь команда
“
/usr/bin/vacation
”. Опция
“
allow_commands
” не может быть установлена, если установлена
“
use_shell
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
batch_id
|
pipe
|
string†
|
незадана
|
|
Смотрите описание пакетной локальной доставки в разделе 25.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
batch_max
|
pipe
|
integer
|
1
|
|
Эта опция ограничивает число адресов, которые могут быть обработаны в одной доставке. Смотрите описание пакетной локальной доставки в разделе 25.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_string
|
pipe
|
string
|
незадана
|
|
Когда
“
pipe
” пишет сообщение, начало каждой строки проверяется на совпадение с
“
check_string
”, и если оно происходит, начальные совпавшие символы заменяются содержимым
“
escape_string
”, если обе установлены. Значение
“
check_string
” - литеральная строка, а не регулярное выражение, и регистр букв имеет значение. Когда установлена
“
use_bsmtp
”, содержимое
“
check_string
” и
“
escape_string
” приводится к значениям, которые оформлены протоколом экранирования SMTP (? - невкурил... - прим. lissyara). Любые настройки сделанные в конфигурационном файле - игнорируются.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
command
|
pipe
|
string†
|
незадана
|
|
Эта опция не должна быть установлена, когда
“
pipe
” используется для доставки в трубы, полученные непосредственно от переназначения адресов. В других случаях, опция должна быть установлена, для предоставления команды, которая будет выполнена. Она не нуждается в абсолютном пути (смотрите ниже, опцию
“
path
”). Команда разделяется exim`ом на отдельные параметры, и каждый аргумент отдельно раскрывается, как описано выше, в разделе 29.3.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
environment
|
pipe
|
string†
|
незадана
|
|
Эта опция используется для добавления дополнительный переменных к среде окружения, в которой выполняется команда (смотрите раздел 29.4, для получения списка дефолтовых значений). Ее значение - строка, которая вначале раскрывается, и затем интерпретируется, как список, разделённый двоеточиями, установок среды окружения в форме
“
<name>=<value>
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
escape_string
|
pipe
|
string
|
незадана
|
|
Смотрите выше, опцию
“
check_string
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
freeze_exec_fail
|
pipe
|
boolean
|
ложь
|
|
Ошибка выполнения команды в транспорте
“
pipe
”, по умолчанию, обрабатывается как любая другая ошибка при запуске команды. Однако, если установлена опция
“
freeze_exec_fail
”, ошибка выполнения обрабатывается особым образом, и вызывает заморозку сообщения вне зависисмости от установки
“
ignore_status
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ignore_status
|
pipe
|
boolean
|
ложь
|
|
Если эта опция истинна, статус возвращаемый субпроцессом запустившим команду - игнорируется, и exim ведёт себя так, как будто был возвращён ноль. Иначе, ненулевой статус или завершение по сигналу вызывают ошибку из транспорта, если статус - не одно из значений перечисленных в
“
temp_errors
”; они вызывают задержку доставки и дальнейшие, более поздние попытки доставки.
Отметтьте: Эта опция не касается таймаутов, которые не возвращают статус. Смотрите опцию
“
timeout_defer
”, для информации о обработке таймаутов.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log_defer_output
|
pipe
|
boolean
|
ложь
|
|
Если эта опция установлена, и статус возвращаемый командой - один из кодов перечисленных в
“
temp_errors
” (т.е. доставка была задержана), и её был сгенерён какой-либо вывод, его первая строка записывается в главный лог.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log_fail_output
|
pipe
|
boolean
|
ложь
|
|
Если эта опция установлена, и команда возвращает какой-либо вывод, и, также, завершается с кодом возврата не равным ни нулю, ни кодам перечисленным в
“
temp_errors
” (т.е. - доставка неудачна), первая строка вывода записывается в главный лог. Эта опция, и
“
log_output
” - взаимоисключаемы. Лишь одна из них может быть установлена.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log_output
|
pipe
|
boolean
|
ложь
|
|
Если эта опция установлена, и команда возвращает какой-либо вывод, первая строка вывода записывается в главный лог вне зависимости от возвращённого кода. Эта опция, и
“
log_fail_output
” - взаимоисключаемы. Лишь одна из них может быть установлена.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
max_output
|
pipe
|
integer
|
20K
|
|
Эта опция определяет максимальное количество вывода, который команда может сгенерить на своём стандартном выводе и объединённом стандартном файле ошибок. Если лимит исчерпан, процесс, выполняющий команду, уничтожается. Это - мера безопасности, для поимки неудержиморастущих процессов. Ограничение применяется независимо от настроек опций контролирующих что происходит с этим выводом (например,
“
return_output
”). Из-за эффекта буферизации, объём вывода может немного превысить ограничение, до того, как exim это заметит.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_prefix
|
pipe
|
string†
|
смотрите ниже
|
|
Заданная строка раскрывается, и выводится в начале каждого сообщения. По умолчанию, она незадана, если установлена опция
“
use_bsmtp
”. Иначе, она
message_prefix = \
From ${if def:return_path{$return_path}{MAILER-DAEMON}}\
${tod_bsdinbox}\n
|
Обычно, это требуется для программы
“
/usr/bin/vacation
”. Однако, она не должна присутствовать, если производится доставка на Cyrus IMAP server, или локальному агенту доставки
“
tmail
”. Преффикс может быть запрещён путём установки
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_suffix
|
pipe
|
string†
|
смотрите ниже
|
|
Заданная строка раскрывается, и выводится в начале каждого сообщения. По умолчанию, она незадана, если установлена опция
“
use_bsmtp
”. Иначе, она - одна новая строка. Суффикс может быть запрещён путём установки
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
path
|
pipe
|
string
|
/bin:/usr/bin
|
|
Эта опция определяет строку, которая устанавливается в переменную окружения PATH, субпроцесса. Если опция
“
command
” не приводит к абсолютному пути к имени, команда разыскивается в директориях PATH обычным способом. Предупреждение: Это не применяется к команде, заданной как транспортный фильтр.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
pipe_as_creator
|
pipe
|
boolean
|
ложь
|
|
Если незадана общая опция
“
user
”, и эта опция истинна, процесс доставки запускается под uid, который был у exim при при изначальном вызове для приёма сообщения. Если не установлен идентификатор группы (через общую опцию
“
group
”), в силе gid, который был у exim при при изначальном вызове для приёма сообщения.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
restrict_to_path
|
pipe
|
boolean
|
ложь
|
|
Когда эта опция установлена, любое имя команды не перечисленное в
“
allow_commands
” не должно содержать какихбы-то ни было слэшей. Команда ищется лишь в директориях перечисленных в опции
“
path
”. Эта опция предназначена для случая, когда команда трубы была сгенерена из пользовательского файла
“
.forward
”. Обычно, это обрабатывается транспортом
“
pipe
”, называемым
“
address_pipe
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
return_fail_output
|
pipe
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, и команда производит какой-либо вывод, и завершается с кодом возврата не равным нулю или несодержащимся в кодах перечисленных в
“
temp_errors
” (т.е. ошибка доставки), вывод возвращается в рикошете. Однако, если сообщение имеет пустого отправителя (т.е. оно само по себе рикошет), вывод команды отбрасывается. Эта опция и
“
return_output
” - взаимоисключаемы. Лишь одна из них может быть установлена.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
return_output
|
pipe
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, и команда производит какой-либо вывод, доставка считается неудачной вне зависмости от кода возврата, и вывод возвращается в рикошете. Иначе, вывод просто игнорируется. Однако, если сообщение имеет пустого отправителя (т.е. оно само по себе рикошет), вывод всегда команды отбрасывается, вне зависимости от установки этой опции. Эта опция и
“
return_fail_output
” - взаимоисключаемы. Лишь одна из них может быть установлена.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
temp_errors
|
pipe
|
boolean
|
незадана
|
|
Эта опция содержит или список, разделённый двоеточиями, или единственную звёздочку. Если опция
“
ignore_status
” - ложна, и
“
return_output
” - незадана, и команда выходит с ненулевым кодом, ошибка обрабатывается как временная, и доставка задерживается - если код возврата совпадает с одним из чисел, или если стоит звёздочка. Иначе, ненулевые коды возврата обрабтываются как постоянные ошибки. Значение по умолчанию сожержит коды заданные EX_TEMPFAIL и EX_CANTCREAT в
“
sysexits.h
”. Если exim скомпилен на системе не задающей эти макросы, они принимают значения 75 и 73, соответственно.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
timeout
|
pipe
|
time
|
1h
|
|
Если команда не смогла завершится в течение этого времени, она уничтожена. Обычно, это вызывает ошибку доставки (но, посмотрите опцию
“
timeout_defer
”). Нулевой интервал времени задаёт, что нет таймаута. Для гарантии, что любые созданные командой субпроцессы также уничтожены, exim делает начальный процесс лидером группы процессов, и по таймауту всю группу процессов. Однако, это может быть обойдено, если один из процессов начинает новую группу процессов.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
timeout_defer
|
pipe
|
boolean
|
ложь
|
|
Таймаут в транспорте
“
pipe
”, или в команде, запускаемой транспортом, или в ассоциированном с ним транспортном фильтре, по дефолту обрабтывается как жёсткая ошибка, и доставка неудачна. Однако, если
“
timeout_defer
” установлена в истину, оба вида таймаута становятся временными, вызывая задержку доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
umask
|
pipe
|
octal integer
|
022
|
|
Эта опция определяет установку umask для субпроцесса выполняющего команду.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_bsmtp
|
pipe
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, транспорт
“
pipe
” пишет сообщения в формате
“пакетного SMTP
”, с отправителем конверта и получателем (получателями) включенными как SMTP-команды. Если вы хотите включить начальную команду HELO с каждым сообщением, вы можете сделать это, путём установки опции
“
message_prefix
”. Для получения дополнительных деталей о пакетном SMTP, смотрите раздел 44.10.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_classresources
|
pipe
|
boolean
|
ложь
|
|
Эта опция доступна лишь в случае, если exim работает на FreeBSD, NetBSD, или BSD/OS (FreeBSD - форева; - извините, прим. lissyara :)). Если она установлена в истину, функция
“
setclassresources()
” используется для установки ограничений ресурсов, когда транспорт
“
pipe
” производит доставку. Лимиты для uid, под которым работает труба, лолучаются из БД классов логинов (/etc/login.conf - прим. lissyara).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_crlf
|
pipe
|
boolean
|
ложь
|
|
Эта опция заставляет завершаться строки двухсимвольной CRLF последовательностью (возврат каретки, новя строка), вместо одного символа перевода строки. В случае пакетного SMTP, записанная в трубу последовательность байтов - точное подобие того, что было бы послано в реальном SMTP-подключении.
Содержимое опций
“
message_prefix
” и
“
message_suffix
” пишется дословно, таким образом, они должны содержать свои символы возврата каретки, если они им необходимы. Так как сдефолтовое значение для обоих -
“
message_prefix
” и
“
message_suffix
” содержит один перевод строки, их значения должны быть изменены, чтобы они завершались
“\r\n
”, если задана опция
“
use_crlf
”.
29.6 Использование внешнего (стороннего) агента локальной доставки
Транспорт
“
pipe
” может использоваться для передачи всех сообщений, которым требуется локальная доставка, отдельному локальному агенту доставки, типа
“
procmail
”. Когда это делается, нужно быть осторожным, чтобы гагантировать, что труба выполняется под соответствующими uid и gid. В некоторых конфигурациях, требуется, чтобы это был uid, которому доверяет агент доставки, для предоставления корректного отправителя сообщения. Может потребоваться повторно пересобрать или переконфигурировать агента доставки таким образом, чтобы он доверял соответтсвующему пользователю. Далее - пример конфигурации транспорта и роутра, для
“
procmail
”:
# transport
procmail_pipe:
driver = pipe
command = /usr/local/bin/procmail -d $local_part
return_path_add
delivery_date_add
envelope_to_add
check_string = "From "
escape_string = ">From "
user = $local_part
group = mail
# router
procmail:
driver = accept
check_local_user
transport = procmail_pipe
|
В этом примере, труба запускается как локальный пользователь, но с установленнной группой
“
mail
”. Как альтернатива - запускать трубу под определённым пользователем, типа
“
mail
” или
“
exim
”, но в этом случае вы должны принять меры, чтобы
“
procmail
” доверял этому пользователю для предоставления корректного адреса отправителя. Если вы не задаёте или опцию
“
group
” или опцию
“
user
”, команда трубы запускается под локальным пользователем. Домашняя директория - дефолтовая домашняя директория пользователя.
Отметтьте: Команда, которая запускает транспорт
“
pipe
”, не начинается с
как показано в некоторой документации на
“
procmail
”, поскольку exim, по умолчанию, не использует shell для запуска команд канала.
Следующий пример показывает транспорт и роутер для систем, где локальные доставки обрабатываются Cyrus IMAP server.
# transport
local_delivery_cyrus:
driver = pipe
command = /usr/cyrus/bin/deliver \
-m ${substr_1:$local_part_suffix} -- $local_part
user = cyrus
group = mail
return_output
log_output
message_prefix =
message_suffix =
# router
local_user_cyrus:
driver = accept
check_local_user
local_part_suffix = .*
transport = local_delivery_cyrus
|
Отметтьте, что незаданы
“
message_prefix
” и
“
message_suffix
”, и использование
“
return_output
”, для того, чтобы любой текст, записанный Cyrus`ом, был возвращён отправителю.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
38. Шифрование соединений с использованием TLS/SSL
Поддержка для TLS (Transport Layer Security), прежде известной как SSL (Secure Sockets Layer), осуществлена с использованием библиотеки OpenSSL или библиотеки GnuTLS (exim требует GnuTLS, релиза 1.0 или более позднего). В дистрибутиве exim`a нет никакого кода для непосредственного осуществления TLS. Для его использования, вы должны инсталлировать OpenSSL или GnuTLS, и, затем, собрать версию exim`a в которую включена поддержка TLS (смотрите раздел 4.6). Также, вы должны понимать базовые концепции шифрования на организационном уровне, и, в частности, способы использования публичных ключей, частных ключей, и сертификатов.
RFC3207 задаёт, как SMTP-соединения могут использовать шифрование. Как только установлено подключение, клиент даёт команду STARTTLS. Если сервер её принимает, клиент и сервер договариваются о механизме шифрования. Если договорённость успешна, данные, впоследствии передаваемые между ними, - зашифрованы.
ACL exim`a позволяют детектировать, зашифрован текущий сеанс, или нет, и, таким образом, какой метод шифрования используется, предоставил ли клиент сертификат, и был ли сертификат проверен. Это позволяет серверу exim принимать или отклонять определённые команды основанные на состоянии шифрования.
Warning: Определённые типы файрволлов и определённые типы антивирусных продуктов могут прерывать TLS-соединения. Вам необходимо выключить SMTP-сканирование для этих продуктов, чтобы TLS заработало.
38.1 Поддержка для наследственного
“ssmtp
” (или
“smtps
”) протокола
Ранние воплощения шифрованного SMTP использовали иной порт TCP, вместо обычного, и ожидали, что переговоры о шифровании начнутся немедленно, вместо ожидания команды клиента STARTTLS, использующего стандартный SMTP-порт. Протокол назывался
“ssmtp
” или
“smtps
”, и для этой цели был выделен 465 порт.
Этот подход был оставлен, когда было стандартизовано шифрованное SMTP, но, всё ещё есть клиенты, использующие его по наследству. Exim поддерживает этих клиентов путём глобальной опции
“
tls_on_connect_ports
”. Её значение должно быть списком номеров портов; обычное использование - таково:
tls_on_connect_ports =
465
|
Номер порта, определяемый этой опцией, применяется ко всем SMTP-соединениям, и через даемона, и через
“
inetd
”. Вам всё ещё необходимо задавать все порты используемые даемоном (путём установки
“
daemon_smtp_ports
” или
“
local_interfaces
” или опции командной строки
“
-oX
”), поскольку
“
tls_on_connect_ports
” не добавляет дополнительного порта, скорее, она определяет иное поведение на порту определённом в другом месте.
Также, есть опция командной строки
“
-tls-on-connect
”. Она переопределяет
“
tls_on_connect_ports
”; она вызывает наследование поведения для всех портов.
38.2 OpenSSL против GnuTLS
Первая поддержка TLS в exim`e была осуществлена с использованием OpenSSL. Поддержка GnuTLS последовала позднее, когда была выпущена первая версия GnuTLS. Для сборки exim`a с использованием GnuTLS, вам необходимо установить
в
“
Local/Makefile
”, в дополнение к
Также, вы должны установить TLS_LIBS и TLS_INCLUDE соответственно, так, чтобы были найдены включаемые файлы и библиотеки GnuTLS.
Есть некоторые отличия при использовании GnuTLS вместо OpenSSL:
Опция
“
tls_verify_certificates
” должна содержать имя файла, а не имя директории (для OpenSSL - это может быть любым).
Опция
“
tls_dhparam
” - игнорируется, поскольку ранние версии GnuTLS не имели средств для изменения параметров Diffie-Hellman. Я понимаю, что это изменилось, но exim не был обновлён для предоставления этого средства.
Строка
“выдающегося имени
” (DN) сообщаемая библиотекой OpenSSL использует слэш для разделения полей; GnuTLS использует использует запятые, в соответствии с RFC2253. Это вызываeтся значением переменной
“
$tls_peerdn
”.
OpenSSL идентифицирует шифр используя дефисы, как разделители, например: DES-CBC3-SHA. GnuTLS использует подчёркивания, например: RSA_ARCFOUR_SHA. Что хуже - OpenSSL жалуется на пристутствие символов подчёркивания в списке шифров. Чтобы упростить жизнь, exim заменяет подчёркивания на дефисы для OpenSSL, и дефисы на подчёркивания для GnuTLS при обработке списков шифров в опциях
“
tls_require_ciphers (глобальная опция и транспортная опция
“
smtp
”).
Опции
“
tls_require_ciphers
” работают иначе, как описано в разделе 38.4 и 38.5.
38.3 Вычисление параметра GnuTLS
GnuTLS использует параметры RSA и D-H, которые требуют для вычисления существенного времени. Неблагоразумно вычислять их заново для каждой сессии TLS. Поэтому, exim сохраняет эти данные в файле, в своей директории спула, называемой
“
gnutls-params
”. Файл принадлежит пользователю exim`a и читаем лишь его владельцем. Каждый процесс exim`a, который запускает GnuTLS читает параметры RSA и D-H из этого файла. Если файл не существует, первый процесс exim`a, которому он нужен, вычисляет данные и записывает их во временный файл, переименовываемый по завершении. Не имеет значения, если несколько процессов exim`a делают это одновременно (кроме траты некоторых ресурсов). Как только файл помещён на место, новый процессы exim`a немедленно начинают его использовать.
Для максимальной безопастности, параметры, которые сохраняются в этом файле, периодически, должны быть повторно вычислены, частота зависит от уровня вашей параноидальности. Упорядочивание этого - принципиально просто; просто удалите файл, когда вы хотите вычислить новое значение. Однако, могут быть проблемы. Для вычисления новых параметров необходимы случайные числа, и они берутся из
“
/dev/random
”. Если система не очень активна,
“
/dev/random
” может задержать возврат данных, пока не будет доступно достаточно хаоса. Это может вызывать зависание exim`a на довольно существенное время, вызывая таймауты для входящих соединений.
Решение - генерировать параметры снаружи exim`a. Они сохраняются в
“
gnutls-params
” в формате PEM, что означает, что они могут быть сгенерированы внешне, используя команду
“
certtool
”, которая является частью GnuTLS.
Для замены параметров новыми, вместо удаления файла и разрешения exim`y пересоздать его, вы можете генерировать новые параметры используя
“
certtool
”, и, после завершения, заменить файл кэша exim`a путём переименования. Уместные команды - что то типа этого:
# rm -f new-params
# touch new-params
# chown exim:exim new-params
# chmod 0400 new-params
# certtool --generate-privkey --bits 512 >new-params
# echo "" >>new-params
# certtool --generate-dh-params --bits 1024 >> new-params
# mv new-params gnutls-params
|
Если exim никогда не генерирует параметры самостоятельно, возможность остановки - удалена (наверное, имеется ввиду задержка при генерации - прим. lissyara).
38.4 Требование специфических шифров в OpenSSL
В библиотеке OpenSSL есть функция, которая может передавать список наборов шифров до того, как имеет место переговор о шифре. Этим определяется, какие шифры доступны. Список - разделён двоеточиями, и может содержать имена типа DES-CBC3-SHA. Exim передаёт раскрытое значение
“
tls_require_ciphers
” напрямую этому вызову функции. Следующее циторование документации OpenSSL определяет, какие формы элементов допустимы в строке шифра:
Он может состоять из одного шифра, типа RC4-SHA.
Он может представлять список шифров содержащих определённый алгоритм, или шифры определённого типа. Например, SHA1 представляет все шифры используя алгоритм SHA1 и SSLv3 представляет все алгоримы SSL v3.
Списки наборов шифров могут быть объединены в одну строку шифра, используя символ
“+
”. Это используется как логическая операция
“и
”. Например, SHA1+DES представляет все наборы шифров содержащие алгоритмы SHA1 и DES.
Каждой строке шифра, произвольно, может предшествовать один из символов
“!
” или
“-
” или
“+
”.
Если используется
“!
” - шифр удаляется из списка. Удалённые шифры не могут вновь появляться в списке, даже если они явно заявлены.
Если используется
“-
”, шифр удаляется из списка, но некоторые, или все шифры могут быть добавлены последующими позднее опциями.
Если используется
“+
”, шифр перемещается в конец списка. Эта опция не добавляет новых шифров; она лишь перемещает существующие.
Если не присутствует ни один из этих символов, строка интерпретируется как список шифров, который будет добавлен к текущему привелигированному списку. Если список включает какие-то шифры, которые уже пристутсвуют, они будут проигнорированы: т.е. они не будут перемещены в конец списка.
38.5 Специфические шифры требующиеся в GnuTLS
Библиотека GnuTLS не имеет комбинированной функции, как OpenSSL. Вместо этого, она позволяет вызывающему задать отдельные списки методов обмена ключей, главных алгоритмов шифрования, и алгоритмов MAC. К сожалению, эти списки - числовые, и библиотека не имеет функции для превращения имён в номера. Следовательно, список распознаваемых имён должен быть встроен в приложение.
В настоящее время, exim разрешает изменять лишь список главных алгоритмов шифрования. Опция
“
tls_require_ciphers
” - имет такой же формат, что и у OpenSSL. Exim ищет каждый элемент для имени доступного алгоритма. Например, если список содержит RSA_AES_SHA, тогда распознаётся AES.
Список шифровальных алгоритмов отправляется с дефолтовой установкой алгоритмов. Если первый элемент в
“
tls_require_ciphers
” не начинается с восклицательного знака, все дефолтовые элементы удаляются. Таким образом, могут использоваться лишь заданные значения. Если первый элемент в
“
tls_require_ciphers
” действительно начинается с восклицательного знака, дефолтовые начения остаются в списке.
Тогда, любой элемент, начинающийся с восклицательного знака, вызывает удаление релевантных алгоритмов из списка, и любой элемент, не начинающийся с восклицательного знака, вызывает добавление релевантных алгоритмов в список. Таким образом,
tls_require_ciphers = !RSA_ARCFOUR_SHA
|
разрешают все дефолтовые значения, кроме использующих ARCFOUR, тогда как
tls_require_ciphers = AES : 3DES
|
разрешает лишь шифрование использующее AES и 3DES. В настоящее время, распознаются алгоритмы: AES_256, AES_128, AES (оба из предшествовавших), 3DES, и ARCFOUR_128. Нераспознанные алгоритмы - игнорируются. В сервере, порядок списка не имеет значения; сервер будет извещать о доступность всех допустимых методов шифрования. Однако, в клиенте, порядок списка определяет порядок для алгоритма. Первым пробуется первый из клиентского списка, о котором, также, извещал сервер. Порядок значений по умолчанию - пеерчислен выше.
38.6 Конфигурирование сервера exim для использования TLS
Когда exim собран с поддержкой TLS, он извещает клиентские хосты, совпадающие с
“
tls_advertise_hosts
” о доступности команды STARTTLS, но не какие-либо другие хосты. Дефолтовое значение этой опции - незадано, что означает, что о STARTTLS никто не извещается. Такое значение по умолчанию выбрано поскольку вы должны привести в порядок некоторые другие опции, чтобы сделать доступным TLS, и, также, это разумно для систем, которые хотят использовать TLS лишь в роли клиента.
Если клиент выдаёт команду STARTTLS, и на сервере существует какая-то конфигурационная проблема, команда отклоняется с ошибкой 454. Если клиент упорствует в попытках подавать команды SMTP, все они, кроме QUIT, отклняются с ошибкой:
Если команда STARTTLS подаётся в пределах существующей TLS-сессии, она отклоняется с кодом ошибки 554.
Для включения операций TLS на сервере, вы должны установить опцию
“
tls_advertise_hosts
” в соответствие каким-то хостам. Вы можете, разумеется, установить её в
“*
” - для соответствия всем хостам. Однако, это не всё, что вы должны сделать. TLS-сессии на сервере не будут работать без некоторого дальнейшего конфигурирования в конце сервера.
По слухам известно, что все существующие клиенты, которые поддерживают TLS/SSL, используют шифрование RSA. Чтобы это работало, вам необходимо установить в сервере:
tls_certificate =/some/file/name
tls_privatekey =/some/file/name
|
Фактически, эти опции - раскрываемые строки,таким образом, вы можете сделать их зависимыми от подключенного клиента, если захотите. Первый файл содержит серверный сертификат X509, и, второй, содержит частный ключ, который с ним идёт. Эти файлы должны быть читаемы пользователем exim`a, и, всегда должны быть даны с полным путём. Это может быть один и тот же файл, если в нём содержатся сертификат и ключ. Если опция
“
tls_privatekey
” не задана, или если раскрытие принудительно неудачно, или результат - пустая строка, предполагается такой случай. Файл сертификата также может содержать промежутчный сертификаты, которые необходимы для отсылки клиенту, с целью аутентифицировать сертификаты сервера.
Если вы непонимаете о ключах и сертификатах, пожалуйста, попробуйте найти источник этой вводной информации, которая не является специфической для exim`a. (Есть несколько комментариев ниже, в разделе 38.11.)
Отметьте: Эти опции не применяются когда exim работает как клиент - они применяются лишь в случае сервера. Если вам необходимо использовать сертификат в exim`e в роли клиента, вы должны установить опции с теми же самыми названиями в транспорте
“
smtp
”.
Только с этими опциями, сервер exim`a способен использовать TLS. Этим не требуется, чтобы клиент обладал сертификатом (но, смотрите ниже, как настоять на этом). Существует одна иная опция, которая бывает необходима в других ситуациях. Если опция
tls_dhparam = /some/file/name
|
установлена, библиотека SSL инициализируется для использования шифрования Diffie-Hellman, с параметрами, содержащимися в файле. Это увеличивает набор методов шифрования, поддерживаемых сервером. Смотрите команду
для способа генерации этих данных. В настоящее время,
“
tls_dhparam
” используется лишь когда exim слинкован с OpenSSL. При использовании GnuTLS, она игнорируется.
Строки, предоставляемые для этих трёх опций, раскрываются при каждом подключении клиентского хоста. Поэтому возможно использовать различные сертификаты и ключи для разных хостов, если вы этого желаете, для управления раскрытием, путём использования клиентского IP-адреса в переменной
“
$sender_host_address
”. Если строка раскрытия принудительно неудачна, exim ведёт себя так, будто эта опция неустановлена.
В переменную
“
$tls_cipher
” устанавливается метод шифрования, о котором договорились для входящего соединения TLS. Это включается в заголовок
“
Received:
” входящего сообщения (по умолчанию - разумеется, вы можете это изменить), и, также, включается в в строку лога прибывающего сообщения, с ключом
“X=
”, если не выключен лог селектор
“
tls_cipher
”. Кондишен
“
encrypted
” может использоваться для тестирования специфического шифрования в ACL.
ACL`ы, которые запускаются для последующих команд SMTP могут проверить имя метода шифрования и изменить свои действия соответствующим образом. Имена методов шифрования - используемые OpenSSL. Они могут отличаться от имён используемых в других местах. Например, OpenSSL использует имя DES-CBC3-SHA для шифрования, известного в других контекстах как TLS_RSA_WITH_3DES_EDE_CBC_SHA. Для дополнительных деталей проверьте документацию OpenSSL.
38.7 Запрос и проверка клиентских сертификатов
Если вы хотите, чтобы сервер exim`a запросил сертификат при переговорах о TLS-сессии с клиентом, вы должны установить или
“
tls_verify
” или
“
tls_try_verify_hosts
”. Разумеется, вы можете установить любой из них в
“*
”, для применения ко всем соединениям TLS. Для любого хоста, который совпадает с этими опциями, exim запрашивет сертификат как часть установки сессии TLS. Содержимое сертификата проверяется путём его сравнения со списком ожидаемых сертификатов. Они должны быть доступны в файле, или, только для OpenSSL (не для GnuTLS), каталоге, идентифицируемом путём
“
tls_verify_certificates
”.
Файл может содержать много сертфикатов, связанных конец к концу. Если используется директория (только для OpenSSL), каждый сертификат должен быть в отдельном файле, с именем (или символической ссылкой) формы
“
<hash>.0
”, где
“
<hash>
” - значение хэша созданное из сертификата. Вы можете вычислить релевантный кэш путём запуска команды
openssl x509 -hash -noout -in /cert/file
|
где
“
/cert/file
” - содержит один сертификат.
Различие между
“
tls_verify_hosts
” и
“
tls_try_verify_hosts
” - в том, что происходит если клиент не предоставляет сертификат, или если сертификат не совпадает ни с одним из сертификатов в коллекции из
“
tls_verify_certificates
”. Если клиент совпадает с
“
tls_verify_hosts
”, попытка установить TLS-сессию прерывается, и входящее соединение обрыватся. Если клиент совпадает с
“
tls_try_verify_hosts
”, продолжается (шифрованная) SMTP-сессия. ACL`ы, запускаемые для последующих команд SMTP, могут детектировать факт, что сертификат не был проверен, и соотвтественно изменить свои действия. Например, вы можете настаивать на сертификате до принятия сообщения для релея, но не когда сообщения предназначено для локальной доставки.
Когда клиент предоставляет сертификат, (проверенный, или нет), значение DN сертификата становится доступным в переменной
“
$tls_peerdn
” в процессе последующей обработки сообщения.
Поскольку часто это - длинная текстовая строка, по умолчанию она не включается в строку лога или заголовок
“
Received:
”. Вы можете принять меры для её логгирования, установив ключ
“DN=
”,в лог селекторе
“
tls_peerdn
”, и вы можете использовать
“
received_header_text
” - для изменения заголовка
“
Received:
”. Когда сертификат не предоставлен, переменная
“
$tls_peerdn
” пуста.
38.8 Отменённые сертификаты
Издатели сертификатов выпускают Списки Аннулированных Сертификатов (Certificate Revocation Lists - CRLs), когда сертификаты отменяются. Если у вас есть такой список, вы можете передать его серверу exim`a используя глобальную опцию
“
tls_crl
”, и клиенту exim`a, используя опцию с идентичным названием для транспорта
“
smtp
”. В каждом случае, значение опции раскрывается, и должно быть именем файла содержащего CRL в формате PEM.
38.9 Конфигурирование клиента exim`a для использования TLS
Лог селекторы
“
tls_ciphe
” и
“
tls_peerdn
” применяются к исходящим SMTP-доставкам также, как и ко входящим, последние вызывают логгирование серверных DN сертификатов. Оставшаяся клиентская конфигурация для TLS - вся в транспорте
“
smtp
”.
Нет необходимости устанавливать какие-либо опции для работы TLS в транспорте
“
smtp
”. Если exim собран с поддержкой TLS, и сервер оповестил о поддержке TLS, транспорт
“
smtp
”.всегда пробует запустить TLS-сессию. Однако, это может быть предотвращено установкой
“
hosts_avoid_tls
” (транспортная опция) в список серверных хостов, с которыми не используется TLS.
Если вы не хотите чтобы exim пытался отправить сообщения незашифрованными, когда попытка установки шифрованного соединения была неудачной, вы можете установить опцию
“
hosts_require_tls
” в список хостов, для которых шифрования является обязательным. Для этих хостов, доставка всегда задерживается, если не может быть установлено шифрованное соединение. Если для адреса есть другие хосты, они пробуются обычным способом.
Когда хост сервера не находится в
“
hosts_require_tls
”, exim может попробовать доставить сообщение незашифрованным. Он всегда так делает, если ответ на STARTTLS - код 5xx. Для временного кода ошибки, или для ошибки переговоров о сессии TLS после успешного кода ответа, происходящее контролируется путём опции
“
tls_tempfail_tryclear
” транспорта
“
smtp
”. Если она ложна, доставка к хосту задерживается, и пробуются другие хосты (если доступны). Если она истинна, exim пытается доставить нешифрованное сообщение после 4xx ответа на STARTTLS, и, если STARTTLS принимается, но последующие переговоры о TLS неудачны, exim закрывает текущее соединение (поскольку оно в неизвестном состоянии), открывает новое к тому же самому хосту, и, затем, пытается доставить сообщение нешифрованным.
Опции
“
tls_certificate
” и
“
tls_privatekey
” транспорта
“
smtp
” предоставляют клиенту сертификат, который он передаёт на сервер, если тот его запрашивает. Если сервер - exim, то он будет просить сертификат лишь если клиент совпадает с опцией
“
tls_verify_hosts
” или
“
tls_try_verify_hosts
”. Отметтьте: Эти опции должны быть заданы в транспорте
“
smtp
” exim`a для использования TLS, когда он работает как клиент. Exim не предполагает, что серверный сертификат (установленный путём глобальной опции с тем же самым именем) также должен использоваться при работе в роли клиента.
Если установлена опция
“
tls_verify_certificates
”, она должна быть именем файла, или, только для OpenSSL (не для GnuTLS), директорией, которая, как ожидается, содержит коллекцию серверных сертификатов. Клиент проверяет сертификат сервера со своей коллекцией, принимая во внимание любые отозванные сертификаты, которые находятся в списке, заданном опцией
“
tls_crl
”.
Если для транспорта
“
smtp
” установлена опция
“
tls_require_ciphers
”, она должна содержать список разрешённых методов шифрования. Если любая из этих проверок неудачна, доставка к текущему хосту прекращается, и транспорт
“
smtp
” пробует доставить на альтернативный хост, если он есть.
Все опции TLS, в транспорте
“
smtp
”, раскрываются до использования, с
“
$host
” и
“
$host_address
” содержащими имя и адрес сервера, на который подконнектился клиент. Принудительная ошибка раскрытия заставляет exim вести себя так, как будто соответствующая опция незадана.
38.10 Несколько сообщений через одно шифрованное TCP/IP соединение
Exim посылает много сообщений по одному TCP/IP соединению путём запуска нового процесса для каждого сообщения, передавая сокет от одного процесса следующему. Эта реализация не очень хорошо для работы с TLS, поскольку есть много информации о состоянии, ассоциированной с соединением TLS, а не только идентификатор сокета. Передача всей информации о состоянии другому процессу - невыполнима. Следовательно, exim завершает существующую сессию TLS до передачи сокета новому процессу. Новый процесс может попробовать запустить сеанс TLS, и, в случае успеха, может попробовать заново аутентифицироваться, если используется AUTH, до посылки следующего сообщения.
Из RFC неясно, действительно или нет, SMTP сессия продолжается в чистом виде после закрытия TLS, или же TLS может быть перезапущен позже, как было описано. Однако, если сервер - exim, эта остановка и реинициализация - работает. Неизвестно, каким (или обоими) образом себя ведут другие сервера, если клиент закрывает сеанс TLS, и продолжает с нешифрованным SMTP, но, разумеется, есть те, которые не работают. Для таких серверов, exim не должен передавать сокет другому процессу, поскольку неудача последующей попытки его использования заставила бы exim записать в логи временную ошибку хоста, и задержать иные доставки на этот хост.
Для тестирования этого случая, exim посылает команду EHLO на сервер после закрытия TLS сессии. Если она удачна, то соединение закрывается вместо пеердачи новому новому процессу доставки, но информация о повторе не записывается.
Также есть ручная отмена; вы можете установить опцию
“
hosts_nopass_tls
” транспорта
“
smtp
” в совпадение с этими хостами, для которых exim не должен передавать соединение новому процессу, если используется TLS.
38.11 Сертификаты и всё такое
Для полного понимания работы TLS, вам необходимо знать о сертификатах, подписании сертификатов, и авторизаторах сертификатов. Это - не место для обучения (имеется ввиду - этот документ - прим. lissyara), тем более, что я не очень много знаю об этом. Некоторое полезное введение может быть найдено в FAQ дополнения SSL к Apache, в настоящее время:
http://www.modssl.org/docs/2.7/ssl_faq.html#ToC24
Другие части документации по
“
modssl
” - также полезны, и имеют ссылки на дальнейшие файлы. Книга Eric`a Rescorla`a -
“
SSL and TLS
”, опубликованная Addison-Wesley (ISBN 0-201-61598-3), содержит введение и дополнительные всесторонние описания. Некотрые типовые программы, взятые из книги, доступны по адресу:
http: // www.rtfm.com/openssl-examples/
38.12 Цепочки сертификатов
Файл указанный в
“
tls_certificate
” может содержать более одного сертификата. Это полезно в случае, когда посылаемый сертификат проверяется промежуточным сертификатом, которого не имеет другая сторона. Несколько сертификатов должны быть в правильном порядке в файле. Вначале, хост сертифицирует сам себя, затем, следующий сертификат для проверки выданного хостом, затем следующее - для проверки предыдущего, и так далее, до (опционально) - корневого сертификата. Корневой сертификат уже должен быть доверенным у получателя, для успешной проверки, разумеется, если он заранее не установлен, посылка корневого сертификата вместе с остальными делает его доступным пользователю для установки, если конечный получатель - пользовательский MUA, коотрый может взаимодействовать с пользователем.
38.13 Самоподписанный сертификаты
Вы можете создать самоподписанный сертификат, используя команду
“
req
”, предоставляемую OpenSSL, например так:
openssl req -x509 -newkey rsa:
1024
-keyout file1 -out file2 \
-days
9999
-nodes
|
“
file1
” и
“
file2
” могут быть одним и тем же файлом; ключ и сертификат разграничены, и могут быть идентифицированы независимо. Опция
“
-days
” период, в течение которого сертификат действителен. Опция
“
-nodes
” - важна: если вы её не зададите, ключ шифруется с запрашиваемой у вас парольной фразой, и любое использование ключа вызывает запрос парольной фразы. Это бесполезно, если вы собираетесь использовать ключ в MTA, где запрос невозможен.
Самоподписанный сертификат, сделанный таким образом, вполне достаточен для тестирования, и может быть адекватен для всех ваших требований, если вы, главным образом, интересуетесь шифрованием передачи, а не секурной идентификацией.
Однако, многие клиенты требуют чтобы предоставленный сервером сертификат был пользовательским (также назваемый
“leaf
” or
“site
”) сертификатом, и не самоподписанным сертификатом. В этой ситуации, самоподписанный сертификат, должен быть установлен на клиентском хосте как доверенный корневой
“
авторитативный сертификат
” (CA), и сертификат используемымй exim`ом, должен быть пользовательским сертификатом, подписанным с этим самоподписанным сертификатом.
Для информации о создании самоподписанных сертификатов и использовании их для подписания пользовательских сертификатов, смотрите часть
“
General implementation overview
” книги
“Open-source PKI
”, доступной в онлайне http://ospkibook.sourceforge.net/.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
39. Списки Контроля Доступа
Списки Контроля Доступа (Access Control Lists - ACL) заданы в отдельной секции рабочего конфигурационного файла, озаглавленной
“begin acl
”. Каждое определение ACL начинается с имени, завершённого двоеточием. Это - полная секция ACL, коотрая содержит лишь одну, очень маленькую ACL:
begin acl
small_acl:
accept hosts = one.host.only
|
Вы можете иметь так много списков, как вы хотите в секции ACL, и порядок их появления не имеет значения. Списки заканчиваются автоматически.
Большинство ACL используются для контроля поведения exim`a, когда он получает определённые SMTP-команды. Это применяется к обоим - входящим TCP/IP соединениям, и, когда локальный процесс передаёт сообщения используя SMTP через задание опции
“
-bs
”. Самое обычное использование - для контроля каких получателей принимать во входящих сообщениях. Кроме того, вы можете задать ACL которые используются для проверки не-SMTP сообщений. Дефолтовый конфигурационный файл содержит примеры реалистичных ACL для проверки команд RCPT. Это обсуждается в главе 7.
39.1 Тестирование ACL
Опция командной строки
“
-bh
” - предоставляет способ тестирования вашей конфигурации ACL локально, путём запуска поддельной сессии SMTP, с которой вы взаимодействуете. Хост
“
relay-test.mail-abuse.org
” предоставляет сервис для проверки вашей релейной конфигурации (для получения дополнительных деталей, смотрите раздел 39.40).
39.2 Определение, когда используются ACL
Для использования ACL, вы должны назвать их в одной из релевантных опций, в главной части конфигурации. Эти опции:
Опция
|
Где используется
|
acl_not_smtp
|
ACL для не-SMTP сообщений
|
acl_smtp_auth
|
ACL для AUTH
|
acl_smtp_connect
|
ACL для начала SMTP соединения
|
acl_smtp_data
|
ACL после завершения DATA
|
acl_smtp_etrn
|
ACL для ETRN
|
acl_smtp_expn
|
ACL для EXPN
|
acl_smtp_helo
|
ACL для HELO или EHLO
|
acl_smtp_mail
|
ACL для MAIL
|
acl_smtp_mailauth
|
ACL для параметра AUTH команды MAIL
|
acl_smtp_mime
|
ACL для контентного сканирования MIME-частей
|
acl_smtp_predata
|
ACL в начале команды DATA
|
acl_smtp_quit
|
ACL для QUIT
|
acl_smtp_rcpt
|
ACL для RCPT
|
acl_smtp_starttls
|
ACL для STARTTLS
|
acl_smtp_vrfy
|
ACL для VRFY
|
|
Например, если вы устанавливаете
acl_smtp_rcpt = small_acl
|
то небольшой ACL, определённый выше, используется каждый раз когда exim получает команду RCPT в диалоге SMTP. Большинство тестов политик для входящих сообщений может быть сделано по прибытии команды RCPT. Отклонение RCPT должно вызвать ошибку адреса получателя содержащегося в команде RCPT, тогда как отклонение в другой момент времени может вызвать дальнейшие попытки MTA доставить сообщение. Поэтому, рекомендуется, чтобы вы делали как можно больше тестов во время RCPT.
39.3 Не-SMTP ACL
Не-SMTP ACL применяется ко всем входящим неинтерактивным сообщениям, т.е. к пакетному SMTP он применяется также как и к не-SMTP сообщениям. Эта ACL работает лишь до функции
“
local_scan()
”. Любые виды отклонения сообщений рассматриваются как постоянные, поскольку нет способа послать код временнной ошибки для этих видов сообщений. Многие условия ACL (например, проверки хостов, и проверки состояния SMTP-соединения - типа шифрования и аутентификации) неуместны и запрещены в этой ACL.
39.4 ACL подключения
Проверка ACL заданная путём
“
acl_smtp_connect
” происходит после теста заданного
“
host_reject_connection
” (который, теперь, является аномалией) и любых сконфигурированных тестов TCP Wrappers.
39.5 ACL DATA
Две ACL ассоциированны с командой DATA, поскольку это - двухстадийная команда, с двумя ответами посылаемыми клиенту. Когда получена команда DATA, обрабатывается ACL заданная путём
“
acl_smtp_predata
”. Это даёт вам контроль после всех команд RCPT, но до получения самого сообщения. Этим даётся возможность дать отрицательный ответ на команду DATA до того, как переданы даные. Строки заголовков добавляемые путём MAIL или RCPT ACL невидимы в это время, но любые, которые тут заданы, видимы при работе ACL
“
acl_smtp_data
”.
Вы не можете проверить содержимое сообщения, например, для проверки адресов в заголовках во время RCPT, или когда получена команда DATA. Такие тесты должны быть в ACL которая работает после получения сообщения, до посылки финального ответа на DATA.
Для обоих этих ACL, невоозможно отклонить индивидуальных получателей. Ответ о ошибке отклоняет всё сообщение. К сожалению, известны MTA, которые некорректно обрабатывают жёсткий (5xx) ответ на команду DATA (до или после данных) - они пытаются оставить сообщение в своей очереди, и пробуют доставить его позже, но - это их проблема, хотя они впустую тратят ваши ресурсы.
39.6 ACL MIME
Опция
“
acl_smtp_mime
” доступна лишь когда exim собран с расширением контентного сканирования. Для деталей, обратитесь к главе 40.
39.7 ACL QUIT
ACL для SMTP-команды QUIT, является аномальной, результат ACL не затрагивает код ответа на QUIT, который всегда 221. Таким образом, фактически, ACL не управляет каким-либо доступом. Поэтому, разрешены лишь имена команд
“
accept
” и
“
warn
”.
Эта ACL может быть использована для задач типа специального логгинга конца SMTP-сессии. Например, вы можете использовать переменные ACL в другом ACL для подсчёта числа сообщений, получателей и т.п., и логгировать общее время QUIT используя один или более модификаторов
“
logwrite
” в команде
“
warn
”.
Предупреждение: Для этого могут использоваться лишь переменные
“
$acl_c
x
”, поскольку переменные
“
$acl_m
x
” сбрасываются после каждого входящего сообщения.
Вам не нужно ставить в конце
“
accept
”, но если вы так поступаете, вы можете использовать модификатор
“
message
”, для задания собственного текста, который посылается как часть 221 ответа на QUIT.
Эта ACL запускается лишь для
“нормального
” QUIT. Для определённых случаев катастрофических ошибок (например, ошибки открытия лог-файла, или когда exim паадет в результате катастрофической ошибки), все SMTP команды от клиента получают ответ о временной ошибке, пока не будет передана команда QUIT, или соединение не закроется. В этих специальных случаях, ACL QUIT не запускается.
39.8 Нахождение ACL для использования
Значение опции
“
acl_smtp_
xxx
” раскрывается перед использованием, таким образом, вы можете использовать различные ACL для разных ситуаций. Результирующая строка не должна бфть именем ACL в конфигурационном файле; есть другие возможности. Раскрыв строку, exim ищет ACL в следующим образом:
Если строка начинается со слэша, exim использует её как имя файла, и читает его содержимое как ACL. Строки обрабатываются таким же образом, как строки в конфигурационном файле exim`a. В частности, поддерживается продолжение строк, пустые строки игнорируются, как и строки, чей первый символ, не являющийся пробелом -
“#
”. Если файл не существует, или не может быть прочитан, происходит ошибка (типично - вызывается временная ошибка любой вызываемой для запуска ACL). Например:
acl_smtp_data = /etc/acls/\
${lookup{
$sender_host_address}lsearch\
{/etc/acllist}{$value}{default}}
|
В примере ищется используемый файл ACL на основе IP-адреса хоста, в случае неудачи поиска, используется дефолтовое значение. Если ACL успешно прочитана из файла, она сохраняется в памяти при работе процесса exim`a, таким образом, она может быть повторно использована, без необходимости перечитывать файл.
Если строка не начинается со слэша, и не содержит каких-либо пробелов, exim ищет секцию ACL в конфигурации ACL чьё имя совпадает со строкой.
Если имя ACL не найдено, или строка содержит пробелы, exim обрабатывает строку как ACL. Это может сэкономить ввод (в смысле - меньше букавок набирать - прим. lissyara) в случаях, когда вы хотите сделать что-то типа этого:
для разрешения свободного использования команды VRFY. Такая строка может содержать символы новой строки; она обрабатывается таким же способом, как и ACL читаемая из файла.
39.9 Коды возврата ACL
Исключая ACL QUIT, которая не затрагивает код возврата SMTP (смотрите выше, секцию 39.7), результат работы ACL - или
“accept
” или
“deny
”, или, проверка не может быть завершена (например, упала БД) -
“defer
”. Эти результаты вызывают использование кодов ответа
“2xx
”,
“5xx
”, и
“4xx
” в диалоге SMTP, соответственно. Четвёртое возвращаемое значение,
“error
”, происходит при ошибках, типа неправильного синтаксиса в ACL. Она также вызывает
“4xx
” код возврата.
Для не-SMTP ACL,
“defer
” и
“error
” - рассматриваются также как и
“deny
”, поскольку не существует механизма для передачи временных ошибок отправителям не-SMTP сообщений.
ACL, которые релевантны приёму сообщений, также могут вернуть
“discard
”. Это имеет тот же самый эффект что и
“accept
”, но, вызывает отбрасываение всего сообщения, или адреса отдельного отправителя. Другими словами - это, средство для органицации чёрной дыры (имеется ввиду - сообщения уходят вникуда - прим. lissyara). Используйте это с осторожностью.
Если ACL для MAIL возвращает
“discard
”, и все получатели отбрасываются, и для последующих команд RCPT не запускается никаких ACL. Эффект
“discard
” в ACL RCPT - отбрасывание лишь одного адреса получателя. Если не осталось получателей сообщения, когда получены данные сообщения, ACL DATA не запускается. Если
“discard
” возвращается из DATA, или не-SMTP ACL, - отбрасываются все получатели. Не разрещается возвращать
“discard
” для ACL
“
acl_smtp_predata
”.
Функция
“
local_scan()
” запускается всегда, даже если не осталось получателей; она может создать новых получателей.
39.10 Незаданные опции ACL
Дефолтовые действия, когда незадана любая из опций
“
acl_
xxx
” - не одинаковы для всех. Отметтьте: Эти умолчания применяются лишь когда релевантная ACL вообще не определена. Для любых определёных ACL, дефолтовое действие, когда контроль достигает конца утверждения ACL -
“deny
”.
Для
“
acl_not_smtp
”,
“
acl_smtp_auth
”,
“
acl_smtp_connect
”,
“
acl_smtp_data
”,
“
acl_smtp_helo
”,
“
acl_smtp_mail
”,
“
acl_smtp_mailauth
”,
“
acl_smtp_mime
”,
“
acl_smtp_predata
”,
“
acl_smtp_quit
” и
“
acl_smtp_starttls
”, действие при незаданной ACL -
“accept
”.
Для других (
“
acl_smtp_etrn
”,
“
acl_smtp_expn
”,
“
acl_smtp_rcpt
” и
“
acl_smtp_vrfy
”), действие, когда ACL не определена -
“deny
”. Это означает, что
“
acl_smtp_rcpt
” должна быть определена, для получения любых сообщений через SMTP-соединение. Для примера, смотрите ACL в дефолтовом конфигурационном файле.
39.11 Данные для ACL сообщений
Когда работают MAIL или RCPT ACL, или любые из DATA ACL, установлены переменные, которые содержат информацию о хосте и отправителе сообщения (например,
“
$sender_host_address
” и
“
$sender_address
”), и могут использоваться в утверждения ACL. В случае RCPT (но не MAIL или DATA),
“
$domain
” и
“
$local_part
” установлены из аргументов адреса. Полная команда SMTP доступна в
“
$smtp_command
”.
Когда работает ACL для параметра AUTH команды MAIL, переменные, которые содержат информацию о хосте - установлены, но
“
$sender_address
” ещё не установлена. Раздел 33.2 содержит обсуждение этого параметра и как его использовать.
Переменная
“
$message_size
” установлена в значение параметра SIZE, команды MAIL, во время MAIL, RCPT и до данных, или в
“-1
”, если параметр не был задан. Значение обновляется до истинного размера сообщения во время работы финальной ACL DATA (после получения сообщения).
Переменная
“
$rcpt_count
” увеличивается на единицу для каждой полученной команды RCPT. Переменная
“
$recipients_count
” увеличивается на единицу для каждой принятой команды RCPT, таким образом, когда обрабатывается RCPT ACL, она содержит число предыдущих принятых получателей. Во время DATA (для обоиз DATA ACL),
“
$rcpt_count
” содержит общее число команд RCPT, и
“
$recipients_count
” содержит общее число принятых получателей. (в данном абзаце - есть разница между числом принятых команд и числом принятых получателей, поскольку получатель может не существовать - тогда команда RCPT принята, а вот получатель - нет. - прим. lissyara)
39.12 Данные для ACL не-сообщений
Когда ACL работает для AUTH, EHLO, ETRN, EXPN, HELO, STARTTLS, или VRFY, оставшаяся строка SMTP-команды помещается в
“
$smtp_command_argument
”, и вся команда SMTP доступна в
“
$smtp_command
”. Эти переменные могут быть протестированы используя условие
“
condition
”. Например, вот - ACL для использования с AUTH, которая настаивает на том, чтобы сессия была или зашифрована, или использовался метод CRAM-MD5. Другими словами, она не разрешает аутентификационные методы, которые используют пароль в открытом виде для нешифрованных соединений.
acl_check_auth:
accept encrypted = *
accept condition = ${if eq{${uc:$smtp_command_argument}}\
{CRAM-MD5}}
deny message = TLS encryption or CRAM-MD5 required
|
(Иной способ применения этих ограничений - переделать аутентификаторы использующие пароли в открытом виде, чтобы о них не оповещалось, когда соединение не шифрованное. Для этого, вы можете использовать общую аутентификационную опцию
“
server_advertise_condition
”.)
39.13 Формат ACL
Индивидуальная ACL содержит множество утверждений. Каждое утверждение начинается с команды, опционально сопровождаемой множеством условий и
“модификаторов
” (
“modifiers
”). Модификаторы могут изменять работу команд, задавать сообщения о ошибках и логи, устанавливать переменные, вставлять задержки, и изменять обработку принятых сообщений.
Если выполняются все условия, выполняется команда. Одни и те же условия могут использоваться (с различными аргументами) более одного раза в одном и том же утверждении. Это предоставляет средство задания соединения
“and
” между условиями. Например:
deny dnslists = list1.example
dnslists = list2.example
|
Если нет условий, команда всегда выполняется. Exim останавливает оценку условия и модификаторов когда он достигает условия которое неуспешно. Что происходит потом, звисит от команды (и в одном случае, от специального модификатора). Не все условия имеют смысл в каждой тестируемой точке. Например, вы не можете проверить адрес отправителя в ACL которая запускается для команды VRFY.
39.14 Команды ACL
Команды ACL таковы:
“
accept
”: Если все условия удовлетворяются, ACL возвращает
“accept
”. Если любое из условий не выполняется, происходящее зависит от того, есть ли среди условий
“
endpass
” (синтаксис смотрите ниже). Если неуспешное условие до
“
endpass
”, управление передаётся слудующему утверждению ACL; если оно после
“
endpass
”, ACL возвращает
“deny
”. Рассмотрите эо утверждение, используемое для проверки команды RCPT:
accept domains = +local_domains
endpass
verify = recipient
|
Если домен получателя не совпадает с условием
“
domains
”, управление передаётся следующему утверждению. Если оно совпадает, проверяется получатель, и команда принимается в случае успешной проверки. Однако, если проверка неудачна, ACL приводит к
“deny
”, поскольку неудачный кондишен после
“
endpass
”.
“
defer
”: Если все условия удовлетворяются, ACL возвращает
“defer
”, который вызывает в SMTP-сессии выдачу ответа
“4xx
”. Для не-SMTP ACL,
“defer
” - то же самое, что и
“deny
”, поскольку в этом случае нет способа дать временную ошибку. Для команды RCPT,
“defer
” - почти также использует роутер
“
redirect
” и
“:defer:
” при проверке, но команда
“defer
” может использоваться в любом ACL, и для получателя это может быть более простым подходом.
“
deny
”: Если все условия удовлетворяются, ACL возвращает
“deny
”. Если любое из условий не выполняется, управление передаётся следующему утверждению ACL. Например:
deny dnslists = blackholes.mail-abuse.org
|
отклоняет команды от хостов, которые в чёрных списках DNS (блэк-листах).
“
discard
”: Эта команда ведёт себя также как и
“accept
”, исключая, что она возвращает из ACL
“discard
” вместо
“accept
”. Это разрешается только для ACL которые имеют отношение к получению сообщений, и они вызывают отказ от получателя. Если модификатор
“
log_message
” установлен при работе
“discard
”, его содержимое добаляется к строке, автоматически записываемой в лог.
Если
“
discard
” используется в ACL для RCPT, отказываются лишь от одного получателя; если используется для MAIL, DATA или в не-SMTP ACL, отказываются от всех получателей сообщения. Получатели, от которых отказались до DATA, не фигурируют в строках логов, когда установлен лог-селектор
“
log_recipients
”.
“
drop
”: Эта команда ведёт себя также как и
“
deny
”, исключая, что соединения SMTP принудительно закрываются после отсылки 5xx сообщения об ошибке. Например:
drop message = I don't take more than
20
RCPTs
condition = ${if > {$rcpt_count}{20}}
|
Нет никаких отличий между
“
deny
” и
“
drop
” во время ACL соединения. Соединения всегда разрываются после посыла ответа 550.
“
require
”: Если выполняются все условия, управление передаётся следующему утверждению ACL. Если любое из условий не выполняется, ACL возвращает
“
deny
”. Например, при проверке команды RCPT
управление передаётся следующему утверждению лишь если отправитель сообщения может быть проверен. Иначе, оно отклонит команду.
“
warn
”: Если все условия выполняются, во входящее сообщение добавляются строки заголовков, и/или в главный лог exim`a пишутся строки. Во всех случаях, управление передаётся следующему утверждению ACL. Текст добавляемый в заголовки, и строки логов, задаются путём модификаторов; если их нет, команда
“
warn
” лишь проверяет своё условие, и подчиняется любым
“immediate
” (
“непосредственным
”) модификаторам, типа
“
set
” и
“
logwrite
”. Дополнительная информация о добавлении строк заголовков в секции 39.19.
Если любое условие в утверждении
“
warn
” не может быть завершено (т.е. своего рода отсрочка), строки заголовков не добавляются, и сконфигурированные строки логов не записываются. Никакие дальнейшие условия или модификаторы в утверждении
“
warn
” не обрабатываются. Инцидент логгируется, но ACL продолжает обрабатываться, со следующего утверждения.
Если в ACL которая не тестирует входящее сообщение, в команде
“
warn
”, присутствует модификатор
“
message
”, он игнорируется и инцидент логгируется.
Утверждение
“
warn
” может использовать модификатор
“
log_message
” для записи строки в главный лог, когда условия утверждения верны. Если идентичную строку запрашивают несколько раз в одном сообщении, фактически, лишь одна копия пишется в лог. Если вы хотите принудительно записывать дубликаты, вместо этого, используйте модификатор
“
logwrite
”.
Когда одно из условий
“
warn
” - неудачная проверка адреса, текст сообщения о неудаче проверки находится в
“
$acl_verify_message
”. Если вы хотите его логгировать, вы должны установить это явно. Например:
warn !verify = sender
log_message = sender verify failed: $acl_verify_message
|
В конце каждой ACL присутствует неявное, безоговорочное,
“
deny
”.
Как вы видели из примеров выше, условия и модификаторы пишутся в одну линию, на первом месте, в той же строке - команда, и последующие на дальнейших строках. Если у вас очень длинное условие, вы можете продолжить его на нескольких строках, путём обычного механизма обратного слэша. Обычно, условия выравниваются вертикально.
39.15 Переменные ACL
Есть некоторые специальные переменные, которые могут быть установлены в течение обработки ACL. Они могут использоваться для передачи информации между различными ACL`ами, различными вызовами одной и той же ACL в одном и том же SMTP-соединении, и между ACL и роутерами, транспортами, и фильтрами, которые используются для доставки сообщения. Есть два набота этих переменных:
Значения от
“
$acl_c0
” до
“
$acl_c19
” сохраняются в течение SMTP-сессии. Они никогда не сбрасываются. Таким образом, значение которое установлено при получении одного сообщения, остаётся доступным при получении следующего сообщения в том же SMTP-соединении.
Значения от
“
$acl_m0
” до
“
$acl_m19
” сохраняются лишь когда сообщение получается. После этого они сбрасываются. Также, они сбрасываются MAIL, RSET, EHLO, HELO, и после начала сессии TLS.
Когда сообщение принято, текущие значения всех переменных ACL сохраняются с сообщением, и впоследствии становятся доступными во время доставки. Переменные ACL устанавливаются путём модификатора назваемого
“
set
”. Например:
accept hosts = whatever
set acl_m4 = some value
|
Отметтьте: Начальный символ доллара не используется при именовании устанавливаемой переменной. Если вы хотите установить переменную не предпринимая каких-либо действий, вы можете использовать команду
“
warn
” без любых других модификаторов или условий.
39.16 Обработка условий и модификаторов
Восклицательный знак предшествующий кондишену - отрицает его результат. Например:
deny domains = *.dom.example
!verify = recipient
|
заставляет ACL вернуть
“deny
”, если домен отправителя заканчивается на
“dom.example
” и адрес получателя не может быть проверен. Иногда отрицание может может использоваться на правой строне условия. Например, эти два утверждения эквивалентны:
deny hosts = !192.
168
.
3
.
4
deny !hosts =
192
.
168
.
3
.
4
|
Однако, для многих условий (
“
verify
” был хорошим примером), допустимо лишь левостороннее отрицание всего условия.
Аргументы условия и модификаторы раскрываются. Принудительный отказ раскрытия вызывает игнорирование условия, т.е. оно ведёт себя как будто условие истинно. Рассмотрите эти два утверждения:
accept senders = ${lookup{
$host_name}lsearch\
{/some/file}{$value}fail}
accept senders = ${lookup{
$host_name}lsearch\
{/some/file}{$value}{}}
|
Каждое пытается искать список приемлимых отправителей. Если поиск успешен, возврашённый список просматривается, но если поиск неудачен, поведение различается в этих двух случаях. В первом случае,
“
fail
” вызывает игнорирование условия, не рарешая никаких дальнейших кондишенов. Поэтому, команда
“
accept
” успешна. Однако, второе утверждение, генерит пустой список, когда поиск неудачен. Никакой отправитель не может совпасть с пустым списком, следовательно - условие неуспешно, и поэтому
“
accept
” также неудачен.
Модификаторы ACL кажутся смешанными с условиями в утверждениях ACL. Некоторые из них определяют действия, которые берутся как условия для проверки утверждений; другие определяют текст для сообщений, который используется при отказе в доступе, или при генерации предупреждения. Модификатор
“
control
” затрагивает способ обработки входящих сообщений.
Позиционирование модификаторов в утверждении ACL - важно, поскольку обработка команды прекрашается, как только известен её результат. В силу вступят лишь те модификаторы, которые успели вcтретиться. Например, рассмотрите использование модификатора
“
message
”:
require message = Can't verify sender
verify = sender
message = Can't verify recipient
verify = recipient
message = This message cannot be used
|
Если проверка отправителя неудачна, exim знает, что результат утверждения -
“deny
”, следовательно, он не движется дальше. Был просмотрен первый модификатор, таким образом, его текст используется как сообщение о ошибке. Если проверка отправителя успешна, но проверка получателя - неудачна, используется второе сообщение. Если проверка получателя успешна,
“текущим
” становиться третье сообщение, но оно никогда не используется, поскольку больше нет условий способных вызвать отказ.
Для команды
“deny
”, с другой строны, всегда используется последний модификатор
“
message
”, поскольку все условия должны быть истины, для того, чтобы случилось отклонение получателя. Задание более чем одного модификатора
“
message
” не имеет смысла, и сообщение может быть определено даже после всех условий. Например:
deny hosts = ...
!senders = *@my.domain.example
message = Invalid sender from client host
|
Результат
“deny
” не происходит, пока не будет достигнут конец утверждения, по достижении которого, exim установит сообщение.
39.17 Модификаторы ACL
Модификаторы ACL таковы:
“
add_header
” = <text>
Этот модификатор задаёт одну или более строк заголовков которые должны быть добавлены во входящее сообщение, предполагая, разумеется, что сообщение в конечном счёте принято. Для деталей, смотрите раздел 39.19.
“
control
” = <text>
Этот модификатор затрагивает последующую обработку SMTP-соединения, или входящего сообщения, которое принято. Эффект первого типа управления длится для всей продолжительности соединения, тогда как эффект второго типа длится лишь пока не получено текущее соединение. Специфические для сообщения средства управления всегда применяются ко всему сообщению, не к индивидуальным получателям, даже если модификатор
“
control
” появляется в RCPT ACL.
Eсть довольно много средств управления которые могут быть применены, они описываются отдельно, в секции 39.18. Модификатор
“
control
” может использоваться несколькими различными способами. Например:
Он может быть в конце утверждения
“
accept
”:
accept ...some conditions
control = queue_only
|
В этом случае, управление применяется когда это условие приводит к
“accept
”, другими словами, когда все кондишены верны.
Он может быть в середине утверждения
“
accept
”:
accept ...some conditions...
control = queue_only
...some more conditions...
|
Если первый набор условий истиннен, управление применяется, даже если утверждение не принимается поскольку одна из вторых установок условия - ложна. В этом случае, некоторое последующее утверждение должно уступить
“accept
” для релевантного управления.
Он может использоваться с
“
warn
”, для применения управления, оставляя решение о приёме или отказе следующей команде. Например:
warn ...some conditions...
control = freeze
accept ...
|
Этот пример
“
warn
” не содержит
“
message
”,
“
log_message
” или
“
logwrite
”, таким образом, он ничего не добавляет к сообщению и не пишет логов.
Если вы хотите безоговорочно применить управление, вы можете использовать его с командой
“
require
”. Например:
require control = no_multiline_response
|
“
delay
” = <time>
Этот модификатор заставляет exim ждать интервал времени до процедуры. Интервал даётся в обычной нотации exim`a. Этот модификатор может появиться в любой ACL. Задержка происходит срезу при обработке модификатора. Однако, когда exim тестируется с использование опции
“
-bh
”, задержка не применяется (вместо этого выводится соответствующее сообщение).
Как и
“
control
”,
“
delay
” может использоваться с
“
accept
” или
“
deny
”, например:
deny ...some conditions...
delay = 30s
|
Задержка происходит если все услоия истинны, до возвращения
“deny
”. Сравните с:
deny delay = 30s
...some conditions...
|
которое ждёт 30s до обработки условия. Модификатор
“
delay
” также может быть использован с
“
warn
” и вместе с
“
control
”:
warn ...some conditions...
delay = 2m
control = freeze
accept ...
|
“
endpass
”
Этот модификатор, у которого нет аргументов, распознаётся лишь в утверждении
“
accept
”. Он отмечет границу между условием чья неудача вызвает передачу управления слудующему утверждению, и условием, чья неудача заставляет ACL вернуть
“deny
”. Смотрите описание
“
accept
”, выше.
“
log_message
” = <text>
Этот модификатор устанавливает сообщение, которое используется как часть сообщения лога, если ACL запрещает доступ, или утверждение
“
warn
” истинно. Например:
require log_message = wrong cipher suite $tls_cipher
encrypted = DES-CBC3-SHA
|
Модификатор
“
log_message
” добавляется к любому основному сообщению о ошибке, которое может существовать, поскольку условие - неудачно. Например, когда проверяется адрес получателя, перенаправление :fail: могло уже установить сообщение. Хотя, обычно, сообщение задано до условия к которому оно применяется, раскрытие не происходит, пока exim не решает, что в доступе надо отказать. Это означает, что любые переменные, которые установлены путём кондишена, доступны для включения в сообщение. Например, переменные
“
$dnslist_
<xxx>[/color]
”, установлены после того, как был успешный поиск в чёрных списках DNS. Если раскрытие
“
log_message
” - неудачно, или если результат - пустая строка, модификатор игнорируется.
Если вы хотите использовать утверждение
“
warn
” для логгирования результата проверки адреса, вы можете использовать
“
$acl_verify_message
” для включения сообщения о ошибке проверки.
Если
“
log_message
” используется с утверждением
“
warn
”, в начало логгируемого сообщения добавляется
“Warning:
”. Если тоже самое логгируемое предупреждающее сообщение запрашивается более одного раза при получении одного почтового сообщения, лишь одна копия логгируется. Если вы хотите логгировать все копии, используйте
“
logwrite
” вместо
“
log_message
”. При отсутствии обоих,
“
log_message
” и
“
message
”, ничего не логгируется для успешного утверждения
“
warn
”.
Если отсутствует
“
log_message
” и нет основного сообщения о ошибке (например, из неудачи проверки адреса), но присутствует
“
message
”, текст
“
message
” используется для логгинга отказа. Однако, если како-либо текст для логгинга содержит символы новой строки, лишь первая строка логгируется. При отсутствии обоих,
“
log_message
” и
“
message
”, для логгирования отклонения используется дефолтовое встроенное сообщение.
“
logwrite
” = <text>
Этот модификатор пишет сообщение в лог-файл, как только с ним сталкиваются при обработке ACL. (Сравните с
“
log_message
”, который, исключая случай
“
warn
”, используется лишь если утвердление ACL отказывает доступе.) Модификатор
“
logwrite
” может использоваться для логгирования особых инцидентов в ACL. Например:
accept <some special conditions>
control = freeze
logwrite = froze message because ...
|
По дефолту, сообщение пишется в главный лог. Однако, оно может начинаться с двоеточия, сопровождаемого списком имён логов, разделённых двоеточиями, и, затем, иным двоеточием, точно определяющим, который лог будет записан. Например:
logwrite = :main,reject: text for main and reject logs
logwrite = :panic: text for panic log only
|
“
message
” = <text>
Этот модификатор устанавливает текстовую строку, которая раскрывается, и используется как сообщение о ошибке, если текущее утверждение заставляет ACL отказать в доступе. Раскрытие происходит в то время, когда exim принимает решение об отказе в доступе, не во время обработки
“
message
”. Если раскрытие неудачно, или генерит пустую строку, модификатор игнорируется. Для ACL, которые вызываются путём SMTP-команд, сообщение возвращается как часть SMTP ответа об ошибке.
Текст является буквальным; любые кавычки берутся как опечатки, но, поскольку строка раскрывается, экранирование обратным слэшом так или иначе обрабатывается. Если сообщение содержит символы новой строки, оно увеличивается до многострочного SMTP-ответа. Как и
“
log_message
”, содержимое
“
message
” не раскрывается до тех пор, пока кондишен не стал неуспешным.
Если
“
message
” используется в утверждении которое проверяет адрес, заданное сообщение перезадаёт любое сообщение, которое сгенерено путём процесса проверки. Однако, оригинальное сообщение доступно в переменной
“
$acl_verify_message
”, таким образом, вы можете включить его в ваше сообщение, если вы этого желаете. В частности, если вы хотите текст из элемента :fail: в роутере
“
redirect
”, для возвращения обратно как части ответа SMTP, вы не должны использовать модификатор
“
message
”, или использовать
“
$acl_verify_message
”.
Для совместимости с предыдущими релизами exim`a, модификатор
“
message
”, который используется с командой
“
warn
”, ведёт себя подобно модификатору
“
add_header
”, но это применение сейчас устарело. Однако,
“
message
” действует лишь когда все условия истинны, везде где он появляется в команде ACL, тогда как
“
add_header
” действует как только с ним сталкиваются. Если
“
message
” используется с
“
warn
” в ACL которая не имеет отношения к получению сообщения, он не имеет эффекта.
“
message
” <acl_name> = <value>
Этот модификатор помещает значение в одну из переменных ACL (смотрите раздел 39.15).
39.18 Использование модификатора
“control
”
Модификатор
“
control
” поддерживает следующие установки:
“
control
” =
“
allow_auth_unadvertised
”
Этот модификатор позволяет клиентскому хосту использовать команду SMTP AUTH, даже когда о ней не оповещалось в ответе на HELO. Кроме того, поскольку есть некоторые очень кривые клиенты, exim принимает AUTH после HELO (а не EHLO), когда этот контроль установлен. Это должно использоваться лишь если вам это действительно необходимо, и вы должны ограничить его использование теми кривыми клиентами, которые без этого не работают. Например:
warn hosts =
192
.
168
.
34
.
25
control = allow_auth_unadvertised
|
Обычно, когда сервер exim`a получает команду AUTH, он проверяет имя аутентификационного механизма который дан в команде на совпадение с механизмом о котором оповещалось. Когда эта установка установлена, проверка на оповещение о механизме обходится. Любые сконфигурированные механизмы могут быть использованы клиентом. Это управление разрешено лишь в соединениях и ACL`ах HELO.
“
control
” =
“
caseful_local_part
”
Смотрите ниже.
“
control
” =
“
caselower_local_part
”
Эти два средства управления разрешены лишь в ACL определённых путём
“
acl_smtp_rcpt
” (т.е. в течение обработки RCPT). По умолчанию, содержимое
“
$local_part
” приводится к нижнему регистру, до обработки ACL. Если задана
“caseful_local_part
”, любые заглавные буквы в оригинальной локальной части, восстановлены в
“
$local_part
” для остальной ACL, или пока не столкнётся с управлением установленным в
“caselower_local_part
”.
Эти средства управления применяются лишь к текущему получателю. Кроме того, они применяются лишь к обработке локальной части, которая имеет место непосредственно в ACL (например, как ключ в поисках). Если присутствует проверка получателя, регистрозависмая обработка локальной части, в процессе проверки, контролируется конфигурацией роутера (смотрите общую роутеров
“
caseful_local_part
”).
Это средство могло бы использоваться, например, для добавления спамерских очков к локальной части содержащей бувы верхнего регистра. Например, используя
“
$acl_m4
” для накопления спамерских очков:
warn control = caseful_local_part
set acl_m4 = ${eval:\
$acl_m4 + \
${if match{$local_part}{[A-Z]}{1}{0}}\
}
control = caselower_local_part
|
Заметтьте, что мы возвращаем назад версию в нижнем регистре, предполагая, что это потребуется для последующих тестов.
“
control
” =
“
enforce_sync
”
Смотрите ниже.
“
control
” =
“
no_enforce_sync
”
Эти средства управления дают возможность селективной SMTP синхронизации. Глобальная опция
“
smtp_enforce_sync
” задаёт начальное состояние переключателя (оно истинно по умолчанию). Смотрите описание этой опции в части 14, для дополнительной информации о проверке SMTP синхронизации.
Эффект этих двух средств управления длится до конца SMTP соединения. Они могут появиться в любой ACL, кроме одной для не-SMTP сообщений. Самое верное место их размещения - в ACL заданной путём
“
acl_smtp_connect
”, которая запускается после входящего SMTP соединения, до первой проверки синхронизации. Ожидаемое использование - для отключения проверок синхронизации для плохо себя ведущих хостов, с которыми вам надо работать.
“
control
” =
“
fakedefer/<message>
”
Это средство управления работает точно также как и
“
fakereject
” (описано ниже), исключая, что оно вызывает 450 SMTP ответ после получения данных, вместо 550 ответа. При использовании
“
fakedefer
” вы должны учесть, что она вызвает повтор сообщений, при наступлении времени повтора у отправителя. Поэтому, вы не должны использовать
“
fakedefer
”, если сообщение нужно доставить обычным образом.
“
control
” =
“
fakereject/<message>
”
Это средство управления разрешено лишь для ACL MAIL, RCPT, и DATA, другими словами, лишь когда получается SMTP сообщение. Если exim принимает сообщение, вместо финального ответа 250, посылается 550 отклонение сообщения. Однако, exim продолжает нормальную доставку сообщения. Средство управления применяется лишь к текущему сообщению, но не к любым последующим, которые могут быть получены в том же самом SMTP-соединении.
Текст для 550 ответа берётся из модификатора
“
control
”. Если сообщения не предоставлено, используется следующее:
550
-Your message has been rejected but is being
550
-kept for evaluation.
550
-If it was a legitimate message, it may still be
550
delivered to the target recipient(s).
|
Это средство должно использоваться с черезвычайной осторожностью.
“
control
” =
“
freeze
”
Это средство управления разрешено лишь для ACL MAIL, RCPT, DATA, и не-SMTP ACL, другими словами, лишь когда получается сообщение. Если сообщение принято, оно помещается очередь exim`a и замораживается. Средство управления применяется лишь к текущему сообщению, а не к любым последующим, которые могут быть получены в том же самом SMTP соединении.
Этот модификатор может, опционально, сопровождаться
“/no_tell
”. Если установлена глобальная опция
“
freeze_tell
”, она игнорируется для текущего сообщения (т.е. никому не сообщается о заморозке), при условии, что все модификаторы
“
control=freeze
” для текущего сообщения имеют опцию
“/no_tell
”.
“
control
” =
“
no_mbox_unspool
”
Это средство управления доступно когда exim скомпилен с поддержкой расширения контекстного сканирования. Контекстное сканирование может требовать копию текущего сообщения, или чистей его, для записи в формате
“mbox format
” в файл спула, для передачи к сканеру на вирусы или спам. Обычно, такие копии удаляются, когда они более не нужны. Если это средство управления установлено, копии не удаляются. Средство управления применяется лишь к текущему сообщению, а не к любым последующим, которые могут быть получены в том же самом SMTP соединении. Оно предоставялет средство отладки и врятли будет полезно в продакшене.
“
control
” =
“
no_multiline_response
”
Это средство управления разрешено для любых ACL, кроме одной для не-SMTP сообщений. Кажется, что существуют кривые клиенты, которые при использовании не могут обрабатывать многострочные SMTP-ответы, несмотря на то, что фактически, RFC821 определил их более 20 лет назад.
Когда эта установка установлена, подавляются многострочные SMTP ответы, о отклонении, из ACL. Один способ сделать это, состоял бы в том, чтобы сделать эти ответы одной длинной строкой. Однако, RFC2821 определяет максимум - 512 байт на ответ (там сказано -
“use multiline responses for more
” - ха!), и некоторые из ответов могли бы перекрыть это. Так, это средство, в конечном счёте являющееся лишь подачкой для кривых клиентов, осуществляется путём дву простых вещей:
Дополнительная информация, которая обычно выводится как часть отклонения вызванного ошибкой проверки отправителя, опускается. Посылается лишь финальная строка (обычно,
“sender verification failed
”).
Если модификатор
“
message
” предоставляет многострочный ответ, выводится лишь первая строка.
Установка переключателя может, размеется, быть сделанной зависимой от вызывающего хоста. Его эффект длится до конца SMTP подключения.
“
control
” =
“
queue_only
”
Это средство управления разрешено лишь для ACL MAIL, RCPT, DATA, и не-SMTP ACL, другими словами, лишь когда получается сообщение. Если сообщение принято, оно помещается очередь exim`a и осталяется там для доставки обработчиком очереди. Немедленный процесс доставки не запускается. Другими словами, оно имеет эффект глобальной опции
“
queue_only
”. Однако, средство управления применяется лишь к текущему сообщению, а не к любым последующим, которые могут быть получены в том же самом SMTP соединении.
“
control
” =
“
submission/<options>
”
Это средство управления разрешено лишь для ACL MAIL, RCPT, и начального DATA ACL (последний - заданный путём
“
acl_smtp_predata
”). Его установка говорит exim`y, что текущее сообщение передано от локального MUA. В этом случае, exim работвает в
“режиме передачи
” (
“submission mode
”), и, при необходимости, применяет определённые исправления к сообщению. Например, он добавляет строку заголовков
“
Date:
”, если её нет. Это средство управления не разрешено в ACL
“
acl_smtp_data
”, поскольку она слишком поздно (сообщение уже создано).
Часть 43 описывает обработку, которую exim применяет к сообщениям. Раздел 43.1 охватывает обработку, которая происходит в режиме передачи; доступные для этого средства управления опции, описаны там. Средство управления применяется лишь для текущего сообщения, а не к любым последующим, которые могут быть получены в том же самом SMTP соединении.
“
control
” =
“
suppress_local_fixups
”
Это средство управления применяется к локально переданным (не TCP/IP) сообщениям, и это - дополнение к
“
control
” =
“
submission/<options>
”. Оно отменяет исправления, которые обычно применяются к локально переданным сообщениям. Конкретно:
Любые заголовки
“
Sender:
” оставляются как есть (в этом отношении, это - динамическая версия
“
local_sender_retain
”).
Не добавляются заголовки
“
Message-ID:
”,
“
From:
” и
“
Date:
”.
Нет проверки, что
“
From:
” соответствует фактическому отправителю.
Эта особенность может быть полезной когда принято удалённо порождённое сообщение, переданно какой-то сканирующей программе, и затем повторно передано для доставки
Все четыре возможные исправления для сообщений могут быть заданы:
Локально переданное, применяются исправления: по умолчанию.
Локально переданное, не применяются исправления: использование
“
control
” =
“
suppress_local_fixups
”
Удалённо переданное, не применяются исправления: по умолчанию.
Удалённо переданное, применяются исправления:
“
control
” =
“
submission
”.
39.19 Добавление строк заголовков в ACL`ах
Модификатор
“
add_header
” может быть использован для добавления одного или более дополнительных строк заголовков во входящее сообщение, как в этом примере:
warn dnslists = sbl.spamhaus.org : \
dialup.mail-abuse.org
add_header = X-blacklisted-at: $dnslist_domain
|
Модификатор
“
add_header
” разрешается в MAIL, RCPT, PREDATA, DATA, MIME, и не-SMTP ACL (лругими словами, тех, которые имеют отношение к получению сообщения). Сообщение долюжно быть, в конечном счёте, принято, чтобы
“
add_header
” имел какой-то существенный эффект. Вы можете использовать
“
add_header
” с любыми ACL-командами, включая
“
deny
” (хотя, потенциално, это полезно лишь в ACL RCPT).
Если данные для модификатора
“
add_header
” содержат одну или более символов новой строки, которые не сопровождаются пустым местом или табами, предполагается, что это - несколько строк заголовков. Каждай из них проверена на правильность синтаксиса; в начале каждой строки не являющейся правильной строкой заголовка добавляется
“X-ACL-Warn:
”.
Добавленные строки накапливаются в течение ACL MAIL, RCPT и предданных. Они добавляются в сообщение до обработки ACL DATA и MIME. Однако, если идентичные строки запрошены более одного раза, фактически, в сообщение добавляется лишь одна копия. Последующие строки заголовков мгут быть накоплены в течение ACL DATA и MIME, после которых оди добавляются в сообщение, с такимже подавлением дубликатов. Таким образом, возможно добавить две идентичные строки в SMTP сообщение, но лишь если одна добавлена до DATA и одна - после. В случае не-SMTP сообщений, новые заголовки аккумулируются в течение не-SMTP ACL, и в конце добавляются в сообщение. Если сообщение отклоняется после DATA, или путём не-SMTP ACL. все добавленные строки заголовков включаются в запись производимую в лог отклонённых.
Строки заголовоков невидимы в раскрытии строк пока они не добавлены в сообщение. Из этого следует, что строки заголовоков заданные в ACL MAIL, RCPT и предданных не видимы до запуска DATA ACL и MIME ACL. Таким же образом, строки заголовков которые добавлены путём DATA или MIME ACL не видимы в этих ACL. Bp-pf этого ограничения, вы не можете использовать строки заголовков как способ передачи данных между (например) ACL MAIL и ACL RCPT. Если вы хотите это сделать, вы можете использовать переменные ACL, rfr описано в разделе 39.15.
Модификатор
“
add_header
” действует немедленно, как тока с ним столкнулись в процессе обработки ACL. Заметтьте различие между этими двумя случаями:
accept add_header = ADDED: some text
<some condition>
accept <some condition>
add_header = ADDED: some text
|
В первом случае, строки заголовоков всегда добавляются, вне завсимости от того, истинно условие или нет. Во втором случае, строки заголовков добавлятся лишь если условие истинно. Несколько
“
add_header
” могут быть в одном утверждении ACL. Все встречащиеся до неудачного условия - выполняются.
Для совместимости с предыдущими релизами exim`a, модификатор
“
message
” для команды
“
warn
” действует таким же образом как и
“
add_header
”, исключая что он вступает в силу лишь если все условия истинны, даже если он появляется до некоторых из них. Кроме того, выполянется лишь последнее появление
“
message
”. Это использование
“
message
”, теперь осуждается. Если в команде
“
warn
” представлены оба -
“
add_header
” и
“
message
”, оба обработаны согласно их спецификациям.
По умолчанию, новая строка заголовка добавляется в конце существующих строк. Однако, вы можете задать что любая особенная строка заголовка должна быть добавлена в начале (до всех строк
“
Received:
”), немедленно после первого блока строк
“
Received:
”, или немедленно до любой строки, которая не
“
Received:
” или
“
Resent-something:
”.
Это сделано путём определения
“:at_start:
”,
“:after_received:
”, или
“:at_start_rfc:
” (или, для завершения,
“:at_end:
”) до текста строки заголовка, соответственно. (Текст заголовка не может начинаться с двоеточия, поскольку вначале должно быть имя заголовка.) Например:
warn add_header = \
:after_received:X-My-Header: something or other...
|
Если более в одном модификаторе
“
add_header
” предоставляется более одной строки заголовка, каждая рассматривается независимо, и может быть помещена по другому. Если вы добавляете более одной строки в начале, или после блока
“Received:
”, они завершаются в обратном порядке.
Предупреждение: Это средство, сейчас, применяется лишь к строкам заголовков которые добавлены в ACL. Оно НЕ работает для строк заголовков которые добавлены в системном фильте, или в роутере, или в транспорте.
39.20 Условия ACL
Некотрые условия, перечисленые в этой секции, доступны лишь если exim cскомпилен с поддержкой расширения контентного сканирования. Они кратко включены здесь, для завершённости. Более детальное описание может быть наёдено в обсуждении контентного сканирования в части 40.
Не все условия уместны во всех обстоятельствах. Например, проверка отправителей и получателей не имеет смысла в ACL, которая запускается как результат прихода команды ETRN, и проверки заголовков сообщения могут быть сделаны лишь в ACL заданной путём
“
acl_smtp_data
” или
“
acl_not_smtp
”. Вы можете использовать некоторые условия (с иными параметрами) более чем в одном утверждении ACL. Этим предоставляется способ определения соединения
“and
” (
“и
”). Условия таковы:
“
acl
” =
“
<name of acl or ACL string or file name >
”
Возможные значнеия аргумента - такие же как и для опций
“
acl_smtp_xxx
”. Запускается именованная или встроенная ACL. Если она возвращает
“accept
”, условие истинно; если она возвращает
“deny
”, условие ложно. Если она возвращает
“defer
”, текущая ACL возвращает
“defer
”, исключая условия в команде
“
warn
”. В этом случае, возврат
“defer
” делает условие ложным. Это означает, что дальнейшая обработка команды
“
warn
” прекращается, но обработка ACL продолжается.
Если вложенные
“
acl
” возвращают
“drop
”, и внешнее условие отказывает в доступе, соединеие рвётся. Если они возвращают
“discard
”, команда должна быть
“
accept
” или
“
discard
”, и действие предпринимается немедленно - никакие дальнейшие условия не проверяются.
ACL могут быть вложены до 20 уровней; предел существует лишь для поимки петель. Это условие разрешает вам использовать различные ACL в различных условиях. Например, различные ACL могут быть использованы для обработки команд RCPT для различных локальных пользователей, или различных локальных доменов.
“
authenticated
” =
“
<string list>
”
Если SMTP соединение не аутентифицировано, условие ложно. Иначе, имя аутентификатора сверяется со списком. Для тестирования аутентификации путём любого аутентификатора, вы можете задать
“
condition
” =
“
<string>
”
Эта возможность позвоялет вам создавать нестандартные условия. Если результат раскрытия - пустая строка, число ноль, или одна из строка -
“no
” или
“false
”, условие ложно. Если результат - ненулевое число, или одна из строк -
“yes
” или
“true
”, условие истинно. Для любых других значений, предполагается что произошла какая-то ошибка, и ACL возвращает
“defer
”.
“
decode
” =
“
<location>
”
Этот кондишен доступен лишь если exim собран с расширением контентного сканирования, и он разрешён лишь в ACL заданной путём
“
acl_smtp_mime
”. Он вызывает декодирование текущей части MIME в файл. Для дополнительных деталей, смотрите раздел 40.
“
demime
” =
“
<extension list>
”
Этот кондишен доступен лишь если exim собран с расширением контентного сканирования. Его использование описано в части 40.6.
“
dnslists
” =
“
<list of domain names and other data>
”
Это условие проверяет записи в чёрных списках DNS. Они также известны как
“RBL lists
”, после оригинального Realtime Blackhole List, но отметтьте, что это использование списков в
“
mail-abuse.org
” сейчас приносит большую нагрузку. Есть очень много различных вариантов этого кондишена, для краткого описания. Для деталей, смотрите разделы 39.21-39.29.
“
domains
” =
“
<domain list>
”
Это условие уместно лишь после команды RCPT. Оно проверяет, что домен получателя - в списке доменов. Если включена обработка символа процента, она производится до этого теста. Если проверка поиском удачна, результат поиска помещается в
“
$domain_data
”, до слеующего теста
“
domains
”.
“
encrypted
” =
“
<string list>
”
Если SMTP соединение нешифрованное, условие ложно. Иначе, имя метода шифрования используется для проверки по списку. Для тестирования на шифрование без тестирования на определённый метод шифрования, установите
“
hosts
” =
“
< host list>
”
Это условие проверяет, что вызывающий хост совпадает со списком хостов. Если вы производите поиски имени, или шаблонов имён хостов и IP адресов в одном и том же списке хостов, обычно, вы должны вначале поместить IP адрес. Например, у вас могло бы быть:
accept hosts =
10
.
9
.
8
.
7
: dbm;/etc/friendly/hosts
|
Причина этого - в обработке exim`ом списков слева направо. Он может тестировать IP адреса без поиска в DNS, но, когда он достигает пункта требующего имени хоста, он завершается с неудачей если не может найти имя хоста для сравнения с шаблоном. Если вышеупомянутый список даётся в обратном порядке, утверждение
“
accept
” неудачно для хоста, чьё имя не может быть найдено, даже если его IP - 10.9.8.7.
Если вам действительно нужно вначале проверять имена, и всё ещё распознавать IP адреса, даже если поиск неудачен, вы можете переписать ACL так:
accept hosts = dbm;/etc/friendly/hosts
accept hosts =
10
.
9
.
8
.
7
|
Действие по умолчанию при провале попытки найти имя хоста - предположение, что хост не в списке, таким образом, первое утверждение
“
accept
” - неудачно. Тогда, второе утверждение может проверить IP адрес.
Если условие
“
hosts
” удовлетворяется путём поиска, результат поиска становится доступен в переменной
“
$host_data
”. Это позволяет вам, например, установить утверждение типа такого:
deny hosts = net-lsearch;/some/file
message = $host_data
|
которое позволяет вам сделать персональное сообщение о ошибке для каждого отказанного хоста.
“
local_parts
” =
“
<local part list>
”
Это условие доступно лишь после команды RCPT. Оно проверяет что локальная часть адреса получателя находится в списке. Если включена обработка символа процента, она завершется до этого теста. Если проверка успешна путём поиска, результат поиска помещается в
“
$local_part_data
”, которая остаётся установленной до следующего теста
“
local_parts
”.
“
malware
” =
“
<option>
”
Это условие доступно лишь когда exim скомпилен с поддержкой расширения контентного сканирования. Оно вызывает сканирование входящего сообщения на вирусы. Для дополнительных деталей, смотрите раздел 40.
“
mime_regex
” =
“
<list of regular expressions>
”
Это условие доступно лишь когда exim скомпилен с поддержкой расширения контентного сканирования, и оно разрешено лишь для ACL заданной путём
“
acl_smtp_mime
”. Она вызывает сканирование текeщей MIME части на совпадение с любым регулярным выражением. Для дополнительных деталей, смотрите раздел 40.
“
ratelimit
” =
“
<parameters>
”
Это условие может быть использовано для ограничения частоты, с которой пользователь или хост посылают сообщения. Детали даны в разделе 39.30.
“
recipients
” =
“
<address list>
”
Это условие уместно лишь после команды RCPT. Она проверяет входящий адрес получателя по списку получателей.
“
regex
” =
“
<list of regular expressions>
”
Это условие доступно лишь когда exim скомпилен с поддержкой расширения контентного сканирования, и оно доступно лишь в DATA, MIME, и не-SMTP ACL. Оно вызывает сканирование входящего сообщения на совпадение с любым регулярным выражением. Для дополнительных деталей, смотрите раздел 40.
“
sender_domains
” =
“
<domain list>
”
Это условие тестирует домен отправителя сообщения с заданным списком доменов. Отметтьте: домен адреса отправителя -
“
$sender_address_domain
”. Он не помещается в
“
$domain
” в процессе тестирования этого условия. Это - исключение из общего правила тестирования списков доменов. Так сделано для того, чтобы если это условие используется в ACL для команды RCPT, домен получателя (который находится в
“
$domain
”), мог влиять на проверку отправителя.
Предупреждение: Плохая идея, использовать это условие как контроль релеинга, поскольку адреса отправителя легко, и обычно, подделываются.
“
senders
” =
“
<address list>
”
Это условие тестирует отправителя сообщения по данному списку. Для тестирования рикошетов, у которых пустой отправитель, установите:
Предупреждение: Плохая идея, использовать это условие как контроль релеинга, поскольку адреса отправителя легко, и обычно, подделываются.
“
spam
” =
“
<username>
”
Это условие доступно лишь когда exim скомпилен с поддержкой расширения контентного сканирования. Оно вызывает сканирование входящего сообщения с помощью SpamAssassin. Для дополнительных деталей, смотрите раздел 40.
“
verify
” =
“
certificate
”
Это условие истинно если SMTP-сессия шифрована, и клиент передал сертификат, и сертификат был проверен. Сервер запрашивает сертификат лишь если клиент совпадает с
“
tls_verify_hosts
” или
“
tls_try_verify_hosts
” (смотрите часть 38).
“
verify
” =
“
csa
”
Это условие проверяет, авторизован ли хост (клиент) посылать почту. Детали, как это работает, даны в разделе 39.37.
“
verify
” =
“
header_sender/<options>
”
Это условие уместно лишь в ACL, которая запускается после получения сообщения, т.е. в ACL заданной путём
“
acl_smtp_data
” или
“
acl_not_smtp
”. Оно проверяет наличие адреса поддающегося проверке по крайней мере в одном из заголовков
“
Sender:
”,
“
Reply-To:
” или
“
From:
”. Каждый адрес предполагается адресом отправителя (следовательно, именем теста). Однако, адрес появляющийся в одном из этих заголовков, не должен быть адресом, принимающим рикошеты; лишь адрес отправителя в конверте должен принимать рикошеты. Поэтому, если вы используете опцию обратного вызова в этой проверке, вы могли бы хотеть переделать её для непустого адреса в команде MAIL.
Детали проверки адреса и опции даны позднее, начиная с секции 39.31 (обратные вызовы описаны в разделе 39.32). Вы можете комбиировать эти условия с условием
“
senders
”, для ограничения его лишь рикошетами:
deny senders = :
message = A valid sender header is required for bounces
!verify = header_sender
|
“
verify
” =
“
header_syntax
”
Это условие уместно лишь в ACL, которая запускается после приёма сообщения, т.е., в ACL заданных путём
“
acl_smtp_data
” или
“
acl_not_smtp
”. Она проверяет синтаксис всех строк заголовков, которые могут содержать адреса (
“
(Sender:
”,
“
From:
”,
“
Reply-To:
”,
“
To:
”,
“
Cc:
” и
“
Bcc:
”). Неквалифицированные адреса (локальные части без домена) разрешены лишь в локально-сгенерированных сообщениях и от хостов, которые совпадают с
“
sender_unqualified_hosts
” или
“
recipient_unqualified_hosts
”, соотвественно.
Отметтьте, что это условие - лишь проверка синтаксиса. Однако, обычная уловка спамеров - использовать для отправки синтаксически неверные заголовки, типа
и это условие может использоваться для отклонения таких сообщений, хотя они не очень часто используются.
“
verify
” =
“
helo
”
Это условие истинно, если команда HELO или EHLO была передана с клиентского хоста, и её содержимое было проверено. До него не было никаких попыток проверить содержимое HELO/EHLO, и оно выполняется как только встречаются с этим условием Смотрите описание опций
“
helo_verify_hosts
” и
“
helo_try_verify_hosts
”, для деталей о том, как запросить проверку незавсисмо от этого условия.
“
verify
” =
“
not_blind
”
Это условие проверяет, что в сообщении нет получателей скрытой копии (bcc). Каждый получатель конверта должен быть в строке заголовка
“
To:
” или в
“
Cc:
”, чтобы это условие было истинным. Локальная часть проверяется регистрозавсисмо; домен проверяется регистронезависимо. Если существуют строки
“
Resent-To:
” или
“
Resent-Cc:
”, они также проверяются. Это условие может использоваться лишь в DATA или не-SMTP ACL.
Конечно, есть множество законных сообщений, использующих скрытых получателей. Эта проверка не должна самостоятельно использоваться для блокировки сообщений.
“
verify
” =
“
recipient/<options>
”
Это условие уместно лишь после команды RCPT. Оно проверяет текущего получателя. Детали проверки адреса даны позднее, начиная с секции 39.31. После проверки получателя, значение
“
$address_data
” - последнее значение установленное прри роутинге адреса. Оно применяется даже если проверка была неуспешной. Когда проверенный адрес передаресован на один адрес, проверка продолжается с новым адресом, и в этом случае, последующее значение для
“
$address_data
” - значение дочернего адреса.
“
verify
” =
“
reverse_host_lookup
”
Это условие обеспечивает, что проверенное имя хоста было найдено из IP-адреса клиентского хоста. (Это, возможно уже случилось, если имя хоста необходимо для проверки списка хостов, или, если хост совпадает с
“
host_lookup
”.) Проверка обеспечивает, что имя хоста, полученное из обратного поиска DNS, или один из его алиасов, когда он самостоятельно ищется в DNS, действительно приводит к оригинальному IP-адресу.
Если это условие используется для логально сгенерированных сообщений (т.е. когда нет клиентского хоста), оно всегда успешно.
“
verify
” =
“
sender/<options>
”
Это условие уместно лишь после команды MAIL или RCPT, или после того, как сообщение было получено (ACL
“
acl_smtp_data
” или
“
acl_not_smtp
”). Если отправитель сообщения пустой (т.е. - это рикошет), условие истинно. Иначе, проверяется адрес отправителя.
Если есть данные в переменной конца роутинга
“
$address_data
”, её значение помещется в
“
$sender_address_data
” в конце проверки. Это значение может использовано в последующих условиях и модификаторах в том же самом утверждении ACL. Оно не сохраняется после окончания текущего утверждения. Если вы хотите сохранить значение надолго, вы можете сохранить его в переменной ACL.
Детали проверки адреса даны позднее, начиная с секции 39.31. Exim кэширует результат проверки отправителя, чтобы не делать его более одного раза на сообщение.
“
verify
” =
“
sender
” =
“
<address>/<options>
”
Это - вариант предыдущей опции, в котором модифицированный адрес проверен как отправитель.
39.21 Использование списков DNS
В самой его простой форме, условие
“
dnslists
” проверяет, находится ли вызывающий хост в по крайней мере одном из DNS списков, путём поиска инвертированного IP-адреса в одном или более DNS-домене. Например, если IP-адрес вызывающего хоста - 192.168.62.43, и утверждение ACL
deny dnslists = blackholes.mail-abuse.org : \
dialups.mail-abuse.org
|
ищется следующие записи:
43
.
62
.
168
.
192
.blackholes.mail-abuse.org
43
.
62
.
168
.
192
.dialups.mail-abuse.org
|
Как только exim находит существующую запись DNS, обработка списка останавливается. таким образом, многочисленные записи в списке связаны союзом
“or
”. Если вы хотите тестировать хост более чем одним списком (и союзом
“and
”), вы можете использовать два раздельных условия:
deny dnslists = blackholes.mail-abuse.org
dnslists = dialups.mail-abuse.org
|
Если происходит таймаут поиска в DNS, или иным образом невозможно дать окончательный ответ, exim ведёт себя, как будто хост не совпал с элементом списка, т.е., как будто запись DNS не существует. Если в списке DNS есть дальнейшие элементы, они обрабатываются.
Это - обычное необходимое действие, когда
“
dnslists
” используется с
“
deny
” (что является самым частым использованием), поскольку это препятствует ошибке DNS блокировать почту. Однако, вы можете изменить это поведение путём помещения одного из следующих специальных элементов в список:
+include_unknown behave as if the item is on the list
+exclude_unknown behave as if the item is not on the list (default)
+defer_unknown give a temporary error
|
Каждый из них применяется к любым последующим элементам списка. Например:
deny dnslists = +defer_unknown : foo.bar.example
|
Тестирование списка доменов останавливается как только найдено соответствие.Если вы хотите предупреждать для одного списка и блокировать для другого, вы можете задать два различных утверждения:
deny dnslists = blackholes.mail-abuse.org
warn message = X-Warn: sending host is on dialups list
dnslists = dialups.mail-abuse.org
|
Поиски в списках DNS кэшируются exim`ом на продолжительность сессии SMTP, таким образом, поиск основанный на IP адресе производится максимум один раз для любого входящего SMTP-соединения. Exim не разделяет информацию между несколькими входящими соединениями (но, ваш локальный кэширующий сервер имён должен быть активен).
39.22 Задание IP-адреса для поиска в списках DNS
По умолчанию, IP адрес, который используется в поиске по списку DNS - это IP-адрес вызывающего хоста. Однако, вы можете задать иной IP-адрес, путём перечисления его после доменного имени, отделённого слэшем. Например:
deny dnslists = black.list.tld/
192
.
168
.
1
.
2
|
Эта особенность не очень полезна с явными IP-адресами; она предназначена для использования с искомыми IP-адресами, например, IP-адресами MX-хостов, или серверов имён почтового адреса отправителя. Для примеров, смотрите ниже, секцию 39.24.
39.23 DNS-списки основанные на именах доменов
Есть некоторые списки, которые основаны на доменных именах, вместо инвертированных IP-адресов (например, смотрите ссылку domain based zones на http://www.rfc-ignorant.org/). С этими листами реверсирования компонентов не используется. Вы можете изменить имя, которое ищется в списках DNS, путём внесения его после имени домена, отделённое слэшем. Например:
deny message = Sender's domain is listed at $dnslist_domain
dnslists = dsn.rfc-ignorant.org/$sender_address_domain
|
Этот специфический пример полезен лишь в ACL которые обрабтываются после команд RCPT или DATA, rjulf доступен адрес отправителя. Если (например) отправитель сообщения -
“
user@tld.example
”, имя искомое этим примером:
tld.example.dsn.rfc-ignorant.org
|
Одиночное условие
“
dnslists
” может содержать в себе оба вхождения - для имён и для IP-адресов. Например:
deny dnslists = sbl.spamhaus.org : \
dsn.rfc-ignorant.org/$sender_address_domain
|
Первый элемент проверяет адрес отправляющего хоста; второй проверяет доменное имя. Всё условие верно, если успешен любой из поиков DNS.
39.24 Поиски в DNS основанные на нескольких ключах
Синтаксис описанный выше, для поиска в чёрных списках DNS по явно заданным значениям (или имени, или IP-адреса) - упрощение. В DNS-списке, после доменного имени сопровождаемого слэшом, фактически, может быть список элементов. Как и во всех списках exim`a, дефолтовый разделитель - двоеточие. Однако, поскольку это - подсписок в списке доменов чёрных списков DNS, необходимо удвоить разделители:
dnslists = black.list.tld/name.
1
::name.
2
|
или изменить символ разделителя, например так:
dnslists = black.list.tld/<;name.
1
;name.
2
|
Если элемент в списке - IP-адрес, он инвертируется до добавления области чёрного списка DNS. Если он - не IP-адрес, иныерсии не происходит.Рассмотрите это условие:
dnslists = black.list.tld/<;
192
.
168
.
1
.
2
;a.domain
|
Происходящие поиски в DNS:
2
.
1
.
168
.
192
.black.list.tld
a.domain.black.list.tld
|
Как только найдена запись в DNS (которая совпадает с заданным возвращаемым IP-адресом, если задано - смотрите раздел 39.27), дальнейший поиск не производится. Если происходит временная ошибка поиска в DNS, пробуется остальная часть списка доменов/IP-адресов. Временная ошибка для всего элемента списка DNS происходит лишь если безуспешны поискаи по остальным DNS подспискам. Другими словами, успешный поиск для любого элемента подсписка отменяет временную ошибку для предыдущего элемента.
Способность подставлять список элементов после слэша, в некотором смысле - лишь синтаксическое удобство. Следующие два примера, имеют один и тот же эффект:
dnslists = black.list.tld/a.domain : black.list.tld/b.domain
dnslists = black.list.tld/a.domain::b.domain
|
Однако, когда данные для списка получаются путём поиска, вторая форма, обычно, намного более удобна. Рассмотрите этот пример:
deny message = The mail servers for the domain \
$sender_address_domain \
are listed at $dnslist_domain ($dnslist_value); \
see $dnslist_text.
dnslists = sbl.spamhaus.org/<|${lookup dnsdb {>|a=<|\
${lookup dnsdb {>|mxh=\
$sender_address_domain} }} }
|
Отметтьте использование
“>|
” в поиске dnsdb, для задания сепаратора в нескольких DNS-записях. Внутриенний поиск dnsdb производит список хостов MX, и внешний dnsdb поиск находит IP-адреса этих хостов. Результат раскрытия условия мог бы быть чем-то вроде этого:
dnslists = sbl.spahmaus.org/<|
192
.
168
.
2
.
3
|
192
.
168
.
5
.
6
|...
|
Таким образом, этот пример проверяет, действительно ли IP-адрес почтового сервера отправителя находится в чёрном списке Spamhaus.
39.25 Данные возвращаемые списками DNS
DNS списки построены с использованием записей в DNS. Оригинальный RBL использовал лишь адрес 127.0.0.1 на правой стороне каждой записи, но списки RBL+ и некоторые другие списки используют несколько значений с различными значениями. Значения используемые списками RBL+ таковы:
127
.
1
.
0
.
1
RBL
127
.
1
.
0
.
2
DUL
127
.
1
.
0
.
3
DUL and RBL
127
.
1
.
0
.
4
RSS
127
.
1
.
0
.
5
RSS and RBL
127
.
1
.
0
.
6
RSS and DUL
127
.
1
.
0
.
7
RSS and DUL and RBL
|
Некоторые списки DNS могут возвращать более одной адресной записи.
39.26 Переменные устанавливаемые из списков DNS
Когда в списке DNS найдено вхождение, переменная
“
$dnslist_domain
” содержит имя совпавшего домена,
“
$dnslist_text
” содержит содержимое ассоциированной TXT записи. Если поиском DNS возвращено более одной записи, все IP адреса включённые в
“
$dnslist_value
” разделяются запятыми и пробелами.
Вы можете использовать эти переменные в модификаторах
“
message
” и
“
log_message
” - хотя они появляются до условия в ACL, они не раскрываются пока не произойдёт неудача. Например:
deny hosts = !+local_networks
message = $sender_host_address is listed \
at $dnslist_domain
dnslists = rbl-plus.mail-abuse.example
|
39.27 Дополнительные совпадения условий для списков DNS
Вы можете добавить символ равно и IP-адрес после доменного имени
“
dnslists
”, для ограничения его действия DNS-записями с соответствующей правой стороной. Например,
deny dnslists = rblplus.mail-abuse.org=
127
.
0
.
0
.
2
|
отклоняет лишь те хосты, которые приводят к 127.0.0.2. Без этих дополнительных данных, любая адресная запись предполагается совпадающей. Если в списке найдено более одной записи, они все проверяются на соответствие правой строны.
Для проверки можно задать более чем один IP-адрес, используя двоеточие как разделитель. Они - альтернативы, если совпадает любой из них, условие
“
dnslists
” - истинно. Например:
deny dnslists = a.b.c=
127
.
0
.
0
.
2
,
127
.
0
.
0
.
3
|
Если вы хотите задать ограниченный список адресов, и, также, определить имена или IP-адреса для поиска, ограниченный список адресов должен быть задан первым. Например:
deny dnslists = dsn.rfc-ignorant.org\
=
127
.
0
.
0
.
2
/$sender_address_domain
|
Если символ
“&
” используется вместо
“=
”, сравнение для каждого перечисленного IP-адреса завершается путём поразрядного
“and
” вместо теста равенства. Другими словами, перечисленные адреса используются как битовые маски. Сравнение истинно, если все биты в маске представлены в тестируемом адресе. Например:
dnslists = a.b.c&
0
.
0
.
0
.
3
|
совпадает с адресом
“
x.x.x.3
”,
“
x.x.x.7
”,
“
x.x.x.11
”, и т.д. Если вы хотите проверить, что представлен тот или иной бит (в противоположность представленным обоим), вы должны использовать несколько значений. Например:
dnslists = a.b.c&
0
.
0
.
0
.
1
,
0
.
0
.
0
.
2
|
совпадает, еслпи оследний компонент адреса - нечётное число, или удвоенное нечетное число.
39.28 Отрицательные условия сравнения DNS
Вы можете предоставлять отрицательный список IP-адресов, как часть условия
“
dnslists
”. Тогда как
deny dnslists = a.b.c=
127
.
0
.
0
.
2
,
127
.
0
.
0
.
3
|
средство
“запрет, если хост в чёрном списке домена a.b.c и IP-адрес приводит к списку в котором 127.0.0.2 или 127.0.0.3
”,
deny dnslists = a.b.c!=
127
.
0
.
0
.
2
,
127
.
0
.
0
.
3
|
средство
“запрет, если хост в чёрном списке домена a.b.c и IP-адрес не приводит к списку в котором 127.0.0.2 и 127.0.0.3
”. Другими словами, результат тестирования - инвертирован, если восклицательный знак появляется перед символом
“=
” ( или
“&
”).
Отметтьте: Этот вид отрицания - не то же самое, что и отрицание домена, хостов, или списков адресов (почему и синтаксис различается).
Если вы используете только один список, синтаксис отрицания немного вам даст. Предыдущий пример эквивалентен:
deny dnslists = a.b.c
!dnslists = a.b.c=
127
.
0
.
0
.
2
,
127
.
0
.
0
.
3
|
Однако, если вы используете составные списки, синтаксис отрицания более ясен. Рассмотрите этот пример:
deny dnslists = sbl.spamhaus.org : \
list.dsbl.org : \
dnsbl.njabl.org!=
127
.
0
.
0
.
3
: \
relays.ordb.org
|
Используя только позитивные списки, это было бы так:
deny dnslists = sbl.spamhaus.org : \
list.dsbl.org
deny dnslists = dnsbl.njabl.org
!dnslists = dnsbl.njabl.org=
127
.
0
.
0
.
3
deny dnslists = relays.ordb.org
|
который менее ясен, и тяжелее поддерживать.
39.29 Списки DNS и IPv6
Если exim`a просят сделать поиск по списку DNS для адреса IPv6, он его инвертирует, и откусывает по кусочкам. Например, если адрес вызывающего хоста - 3ffe:ffff:836f:0a00:000a:0800:200a:c031, exim мог бы искать
1
.
3
.
0
.c.a.
0
.
0
.
2
.
0
.
0
.
8
.
0
.a.
0
.
0
.
0
.
0
.
0
.a.
0
.f.
6
.
3
.
8
.
f.f.f.f.e.f.f.
3
.blackholes.mail-abuse.org
|
(разбито на две строки, чтобы вписать в страницу). К сожалению, некоторые списки DNS содержат групповые записи, подразумевающие IPv4, плохо взаимодействующие с IPv6. например, DNS-запись
*.
3
.some.list.example. A
127
.
0
.
0
.
1
|
вероятно, предназначен для помещения записи 3.0.0.0/8 сети IPv4 в список. К сожалению, это также соответствует всем сетям 3::/4, для IPv6.
Вы можете исключить адреса IPv6 из DNS-поисков используя подходящее условие
“
condition
”, как в этом примере:
deny condition = ${if isip4{$sender_host_address}}
dnslists = some.list.example
|
39.30 Ограничение нормы отправителей
Условие ACL
“
ratelimit
” может быть использовано для измерения и контроля частоты с которой клиент посылает электронную почту. Это более мощщное средство, чем опции
“
smtp_ratelimit_*
”, поскольку эти опции управляют частотой команд лишь в одной SMTP-сессии, тогда как условие
“
ratelimit
” работает для всех соединений (параллельных и последовательных) от того же самого хоста. Синтаксис условия
“
ratelimit
”, таков:
ratelimit = <m> / <p> / <options> / <key>
|
Если средний клиент, посылающий с частотой меньше
“
m
” сообщений за период времени
“
p
”, условие - ложно; иначе, оно истинно.
Как побочный эффект, условие
“
ratelimit
” устанавливает переменную раскрытия
“
$sender_rate
” в вычисленную частоту клиента,
“
$sender_rate_limit
” в сконфигурированное значение
“
m
”, и
“
$sender_rate_period
” в сконфигуриованное значение
“
p
”.
Параметр
“
p
” - постоянная временная константа, в форме интервалов времени exim`a, например, 8h - для восьми часов. Большее постоянное время, означает, что exim`y требуется большее время, чтобы забыть прошлое поведение клиента. Параметр
“
m
” - максимальное число сообщений, которые клиенту разрешено посылать в каждый интервал времени. Также, он определяет число сообщений рарешённых в быстром пакетном режиме. Путём увеличения обоих
“
m
” и
“
p
”, но оставляя неизменной константу
“
m/p
”, вы позволяете клиенту посылать больше сообщений в пактном режиме без изменения его общего предела посылки. Наоборот, если малы оба
“
m
” и
“
p
”, сообщения должны посылаться в пределах лимита.
Есть скрипт
“
util/ratelimit.pl
”, который извлекает частоту частоту отсылки из лог-файлов, помогая выбрать соостветствующие значения для
“
m
” и
“
p
”, при развёртывании условия ACL
“
ratelimit
”. Скрипт выводит инструкцию по использованию, когда он запускается без аргументов.
Для поиска данных, для вычисления средней частоты клиента посылки клиентом, используется ключ. Эти данные сохраняются в БД поддерживаемой exim`om в его спул-директории, наряду с другими БД подсказок. Дефолтовый ключ -
“
$sender_host_address
”, который применяет ограничения к каждому IP-адресу клиентского хоста. Путём изменения ключа, вы можете изменить то, как exim идентифицирует клиентов для ограничения частоты. Например, для ограничения частоты отсыла для каждого аутентифицированного пользователя, независимо от компьютера с которого отсылается, установите ключ в
“
$authenticated_id
”. Вы должны гарантировать, что ключ является значимым; например,
“
$authenticated_id
” - является значимым лишь если клиент аутентифицировался, и вы можете проверять его с условием ACL
“
authenticated
”.
Внутренне, exim включает сглаживание константы
“
p
”, и опции ключе поиска, поскольку они изменяют значение сохранённых данных. Это не истинно, для лимита
“
m
”, таким образом, вы можете изменять сконфигурированную максимальную частоту, и exim продолжает помнить предыдущее поведение клиента, но, если вы изменяете другие параметры частоты, exim забывает прошлое поведение.
Каждое условие
“
ratelimit
” может иметь до двух опций. Первая опция задаёт что exim считает мерой частоты, и вторая определяет как exim обрабатывает черезмерно быстрых клиентов. Опции разделены слэшами, как и другие параметры.
Опция
“
per_conn
” ограничивает частоту подключения клиента.
Опция
“
per_mail
” ограничиает частоту посылки сообщений клиентом. Это - значение по умолчанию, если на заданы опции
“
per_*
”.
Опция
“
per_byte
” ограничивает полосу пропускания электронной почты отправителя. Отметтьте, что её лучше использовать в DATA ACL; если это используется в более ранней ACL, она полагается на параметр SIZE в команде MAIL, которая может быть неточной, или вообще отсутствовать. Вы можете сопровождать лимит
“
m
” в конфигурации K, M, или G - для задания, соответственно, килобайт, мегабайт, или гигабайт.
Опция
“
per_cmd
” заставляет exim пересчитывать частоту при каждой обработке условия. Это может быть использовано для ограничения частоты команд SMTP. Альяс
“
per_rcpt
” предоставлен для использования в RCPT ACL вместо
“
per_cmd
”, для большей ясности, что эффект - ограничение частоты с которой принимаются получатели. Отметтьте, что в этом случае движок ограничения частоты будет видеть сообщения с несколькими получателями, как большой, высокоскоростной пакетный режим.
Если средняя частота клиента больше чем максимум, движок ограничения частоты может воздействтовать двумя возможными способами, зависящими от наличия опций
“
strict
” или
“
leaky
”. Это не завсит от других контрмер (типа отклонения сообщения), которые могут быть заданы путём остальной части ACL. Дефолтовый режим -
“
leaky
”, который избегает сверхагрессивной частоты повтора клиента, препятствуя отправке им любой почты.
Опция
“
strict
” означает, что клиентские записи частоты всегда обновляются. Эффект этого - что exim измеряет среднюю частоту клиента пытаться послать электронную почту, которая может быть значительно выше максимума. Если клиент превысит предел - он будет подвергнут контрмерам, пока он не замедлистся ниже максимальной частоты. Период сглаживания определяет время, которое требуется высокой частоте отсылки для экспоненциального снижения до 37% её пикового значения, что означает, что вы можете неработать время (число периодов сглаживания), что клиент подвергается контрмерам после резкого превышения лимита, по этой формуле:
Опция
“
leaky
” означает, что записи клиентской частоты не обновляются, если он превысил лимит. Эффект этого - что exim измеряет среднюю частоту успешного отсыла почты клиентом, которая не может быть больше максимума. Если клиент превышает лимит, он подвергнется контрмерам, но он всё ещё будет способен посылать почту с сконфигурированной максимальной частотой, вне зависимости от частоты его попыток. Это, в общем случае, - лучший выбор, если у вас есть клиенты с автоматическими повторами.
Другие средства ACL exim`a используются чтобы задать, какие контрмеры предпринимаются, когда превышен лимит частоты. Это может быть что-то из логгинга предупреждений (например, когда измеряется существующая частота отсылки для задания политики), через временные задержки, для замедления быстрых отправителей, до отклонения сообщений. Например:
# Log all senders' rates
warn
ratelimit =
0
/ 1h / strict
log_message = Sender rate $sender_rate / $sender_rate_period
# Slow down fast senders; note the need to truncate $sender_rate
# at the decimal point.
warn
ratelimit =
100
/ 1h / per_rcpt / strict
delay = ${eval: ${sg{
$sender_rate}{[.].*}{}} - \
$sender_rate_limit }s
# Keep authenticated users under control
deny
authenticated = *
ratelimit =
100
/ 1d / strict / $authenticated_id
# System-wide rate limit
defer
message = Sorry, too busy. Try again later.
ratelimit =
10
/ 1s / $primary_hostname
# Restrict incoming rate from each host, with a default
# set using a macro and special cases looked up in a table.
defer
message = Sender rate exceeds $sender_rate_limit \
messages per $sender_rate_period
ratelimit = ${lookup {$sender_host_address} \
cdb {DB/ratelimits.cdb} \
{$value} {RATELIMIT} }
|
Предупреждение: Если у вас нагруженный сервер, с большим количеством тестов
“
ratelimit
”, особенно с опцией
“
per_rcpt
”, вы можете пострадать от узкого места производительности, вызванного путём блокировок в БД подсказок ограничений частоты. Кроме создания мерее сложных ACL, вы можете уменьшить проблему, путём использования RAM диска для директории подсказок exim`a (обычно,
“
/var/spool/exim/db/
”). Однако, это означает, что exim потеряет все свои подсказки после перезагрузки (включая подсказки повторов, кэш обратного вызова, и данные ограничения частоты).
39.31 Проверка адресов
Несколько условий
“
verify
”, описанных в секции 39.20, вызывают проверку адреса. Эти условия могут сопровождаться опциями, которые моддифицируют процесс проверки. Опции отделены от ключевого слова, и друг от друга слэшами, и некоторые из них содержат параметры. Например:
verify = sender/callout
verify = recipient/defer_ok/callout=10s,defer_ok
|
Превая страдия проверки адреса, которая всегда происходит, - это запуск адреса через роутер, в
“режиме проверки
” (
“verify mode
”). Роутеры могут детектировать различие между проверкой и роутингом для доставки, и их действия могут быть множеством различных общих опций, типа
“
verify
” и
“
verify_only
” (смотрите часть 15). Если роутинг неудачен, проверка неудачна. Доступные опции таковы:
Если задана опция
“
callout
”, успешный роутинг к одному или более удалённых хостов сопровождается
“обратным вызовом
” (
“callout
”) к тем же хостам, как дополнительная проверка. Обратные вызовы и их субопции обсуждаются в следующей секции.
Если при проверке роутинга присходит ошибка отсрочки, ACL, обычно, возвращает
“defer
”. Однако, если вы включаете
“
defer_ok
” в опцию, вместо этого условие становится принудительно верным. Отметтьте, что это - главная проверочная опция, также как и субопции для обратных вызовов.
Опция
“
no_details
” охвачена в секции 39.35, в которой обсуждаются отчёты о неудаче проверки адреса отправителя.
Опция
“
success_on_redirect
” приводит к тому, что проверка всегда успешна, немедленно после успешного редиректа. По умолчанию, если редирект генерит лишь один адрес, этот адрес также проверяется. Дальнейшее обсуждение смотрите в разделе 39.36.
После неудачи проверки адреса,
“
$acl_verify_message
” содержит сообщение о ошибке, которое ассоциировано с ошибкой. Оно может быть сохранено, путём такого кодирования:
warn !verify = sender
set acl_m0 = $acl_verify_message
|
Если вы пишете ваше собственное сообщение о отклонении, или сообщение в логи, когда отказано в доступе, вы можете использовать эту переменную для включения информации о ошибке проверки.
В дополнение,
“
$sender_verify_failure
” или
“
$recipient_verify_failure
” (соответственно), содержат одно из следующих слов:
“
qualify
”: Адрес был дисквалифицированный (без домена), и сообщение не являлось локальным или прибывшим со свободного хоста.
“
route
”: Ошибка роутинга.
“
mail
”: Роутинг успешен, и была предпринята попытка обратного вызова; отклонение произошло до команды MAIL (т.е. в начале соединения, HELO или MAIL).
“
recipient
”: В обратном вызове была отклонена команда RCPT.
“
postmaster
”: В обратном вызове была выполнена проверка постмастера.
Как ожидается, основным использованим этих переменных будет различение между отклонением MAIL и RCPT в обратных вызовах.
39.32 Проверка обратным вызовом
Для нелокальных адресов, роутинг проверяет домен, но он неспособен сделать какую-либо проверку локальной части адреса. Есть ситуации, когда желательно какое-то средство проверки локальной части. Одним из способов это сделать, может быть создание SMTP
“
callback
”, к хосту доставки для адреса отправителя, или
“
callforward
” к последующему хосту для адреса получателя, чтобы увидеть, принимает ли хост адрес. Мы используем термин
“
callback
” для охвата обоих случаев. Отметтьте, что для адреса отправителя, обратный вызов - не к хосту клиента, который пытается доставить сообщение, а к одному из хостов, которые принимают входящую почту для домена отправителя.
Exim, по умолчанию, на производит обратных вызовов. Если вы хотите чтобы они происходили, вы должны запросить их, путём установки соответствующих опций, в условии
“
verify
”, как описано ниже. Это средство должно использоваться с осторожностью, поскольку оно может добавить много затрат ресурсов на проверку адреса. Однако, exim кэширует результаты обратных вызовов, что помогает уменьшить их стоимость. Детали о кэшировании даны в секции 39.34.
Обратные вызовы для получателей, обычно используются лишь между хостами, которыми управляет один и тот же администратор. Например, корпоративный шлюз может использовать обратные вызовы для проверки допустимости получателей на внутреннем почтовом сервере. Успешный обратный вызов не гарантирует, что реальная доставка на адрес была бы успешной; с другой стороны, неудачный обратный вызов гарантирует, что доставка была бы неудачной.
Если опция
“
callout
” представлена в условии проверяющем адрес, вторая стадия проверки происходит если адрес успешно сроучен к одному или более удалённым хостам. Обычный случай - роутинг путём роутера
“
dnslookup
” или
“
manualroute
”, где роутер определяет хосты. Однако, если роутер который не устанавливал маршруты хостов в транспорте
“
smtp
” с установкой
“
hosts
”, используются хосты транспорта. Если в транспорте
“
smtp
” установлена
“
hosts_override
”, всегда используются её хосты, вне зависимости, предоставлен или нет, роутером, список хостов.
Используемый порт берётся из транспорта, если он задан, и это - удалённый транспорт. (Для роутеров, которые лишь делают проверку, транспорт не нужно задавать.) Иначе, используется порт SMTP по умолчанию. Если удалённый транспорт задаёт исходящий интерфейс, используется он; иначе - интерфейс не определён.
Для проверки обратным вызовом отправителя, exim создаёт SMTP-соединение к удалённому хосту, для проверки, может ли быть доставлен на адрес отправителя рикошет. Посылаются следующие SMTP-команды:
HELO <smtp active host name>
MAIL FROM:<>
RCPT TO:<the address to be tested>
QUIT
|
Вместо HELO используется LHLO, если транспортная опция
“
protocol
” установлена в
“lmtp
”.
Проверка обратным вызовом получателя - подобна. По умолчанию, она также использует пустой адрес для отправителя. Такое значение по умолчанию выбрано потому, что большинство хостов не используют не используют адрес отправителя при проверка получателя. Использование тех же самых адресов - средство для использования одной записи в кэше для каждого получателя. Однако, некоторые сервера используют для проверки адрес отправителя. Они обслуживаются опциями
“
use_sender
” и
“
use_postmaster
”, описанными в следующей секции.
Если ответ на команду RCPT - код 2xx, проверка успешна. Если - 5xx, проверка неудачна. Для любых других обстоятельств, exim пробует следующий хост, если он есть. Если есть проблемы со всеми удалёнными хостами, ACL вернёт
“defer
”, если для опции
“
callout
” не дан параметр
“
defer_ok
”, в случае чего - условие принудительно успешно.
39.33 Дополнительные параметры для обратных вызовов
Опция
“
callout
” может сопровождаться символом равно и несколькими опциональными параметрами, разделёнными запятыми. Например:
verify = recipient/callout=10s,defer_ok
|
Старый синтаксис, имевший
“
callout_defer_ok
” и
“
check_postmaster
” как отдельные опции проверки, оставлен для обратной совместимости, но его использование не приветствуется. Дополнительный параметры для
“
callout
” таковы:
“
<a time interval>
”
Этим определяется интервал, который применяется к попытке обратного вызова к каждому хосту. Например:
verify = sender/callout=5s
|
По умолчанию, он - 30 секунд. Таймаут используется для каждого ответа с удалённого хоста. Также он используется для инициации связи, если не перезадан путём параметра
“
connect
”
“
connect
” =
“
<time interval>
”
Этот параметр делает возможным установить различные (обычно, меньшие) таймауты для создания SMTP cоединения. Например:
verify = sender/callout=5s,connect=1s
|
Если незадано, то по умолчанию этот таймаут равен значению общего таймаута.
“
defer_ok
”
Когда этот параметр присутствует, ошибки соединения с любым хостом, или любые другие виды временных ошибок, обрабатываются как успех ACL. Однако, при таких обстоятельствех кэш не обновляется.
“
fullpostmaster
”
Эта опция работает как и опция
“
postmaster
” (смотрите ниже), но если проверка на
“
postmaster@domain
” неудачна, она пробует просто
“
postmaster
”, без домена, в соответствии с спецификацией RFC2821. RFC заявляет, что неквалифицированный адрес
“
postmaster
” должен быть принят.
“
mailfrom
” =
“
<email address>
”
Когда проверка адресов в строках заголовков использует проверочную опцию
“
header_sender
”, exim, по умолчанию, ведёт себя как будто адреса - адреса отправителя из конверта. Проверка обратным вызовом, поэтому, проверяет может ли быть доставлен рикошет, путём использования пустого адреса в команде MAIL. Однако, спорно, что эти адреса никогда бы не могли бы использоваться как отправители конверта, и поэтому рикошеты (с пустым отправителем) могли быть правомерно отклонены. Параметр обратного вызова
“
mailfrom
” позволяет вам определить, какой адрес использовать в команде MAIL. Например:
require verify = header_sender/callout=mailfrom=abcd@x.y.z
|
Этот параметр доступен лишь в опции
“
header_sender
”.
“
maxwait
” =
“
<time interval>
”
Этот параметр устанавливает полный таймаут для выпонения проверки обратным вызовом. Например:
verify = sender/callout=5s,maxwait=30s
|
По умолчанию, этот таймаут равен четырём таймаутам для индивидуальных SMTP-команд. Общий таймаут применяется когда существует более одного хоста для, который можно попробовать. Таймаут проверяется до того как пробуется следующий хост. Этот предотвращает очень большие задержки, если существует большое количество хостов, и у всех них таймаут (гапример, когда сетевой таймаут).
“
no_cache
”
Когда дан этот параметр, кэш обратных вызовов не читается и не обновляется.
“
postmaster
”
Когда установлен этот параметр, успешная проверка обратным вызовом сопровождается подобной проверкой на локальную часть
“
postmaster
”, для того же самого домена. Если этот адрес отклоняется, обратный вызов - неудачен (но, смотрите
“
fullpostmaster
”, выше). Результат проверки постмастера записывается в кэш; если она неудачна, это используется для неудачи следующего обратного вызова для домена, без создания соединения, пока не истечёт время записи в кэше.
“
postmaster_mailfrom
” =
“
<email address>
”
По умолчанию, проверка постмастера использует в команде MAIL пустой адрес отправителя. Вы можете использовать этот параметр для проверки с использованием иного адреса. Например:
require verify = sender/callout=postmaster_mailfrom=abc@x.y.z
|
Если представлены обе опции -
“
postmaster
” и
“
postmaster_mailfrom
”, отвергается самая правая. Параметр
“
postmaster
” эквивалентен этому примеру:
require verify = sender/callout=postmaster_mailfrom=
|
Предупреждение: Меры кэширования для проверки постмастера не принимают во внимание адрес отправителя. Предполагается, что будет использоваться пустой или фиксированный непустой адрес. Всё что exim запоминает - что проверка постмастера для домена успешна или неудачна.
“
random
”
Когда установлен этот параметр, до обычной проверки обратным вызовом, exim проверяет
“случайную
” локальную часть того же домена. Локальная часть, реально, не случайна - она задаётся путём раскрытия опции
“
callout_random_local_part
”, которая по умолчанию такова:
$primary_host_name-$tod_epoch-testing
|
Идея состоит в том, чтобы попробовать определить, принимает ли удалённый хост все локальные части, без проверки. Если этот так, нет никакого смысла в выполнении обратного вызова для определённых локальных частей. Если проверка
“random
” успешна, результат сохраняется в записи кэша, и используется для принудительного успеха последующих проверок обратным вызовом, без создания соединения, до тех пор, пока не истечёт время жизни записи.
“
use_postmaster
”
Этот параметр применяется лишь к обратным вызовам проверки получателя. Например:
deny !verify = recipient/callout=use_postmaster
|
Он вызывает использование в команде MAIL непустого адреса при выполнении обратного вызова проверки получателя, и, также, для проверки
“random
”, если она сконфигурирована. Локальная часть адреса -
“
postmaster
”, и, домен - содержимое
“
$qualify_domain
”.
“
use_sender
”
Этот параметр применяется лишь к обратным вызовам проверки получателя. Например:
require verify = recipient/callout=use_sender
|
Он вызывает использование фактического адреса отправителя в команде MAIL, при проверке обратным вызовом, вместо пустого адреса. Нет необходимости использовать эту опцию, если вы не знаете, что вызываемые хосты используют отправителя при проверке получателя. Если её использовать неразборчиво, она уменьшает полноценность кэширования обратных вызовов.
Если вы используете любой параметр, который устанавливает непустого отправителя для команды MAIL (
“
mailfrom
”,
“
postmaster_mailfrom
”,
“
use_postmaster
” или
“
use_sender
”), вы должны подумать о возможных петлях. Проверка получателя, обычно, производится между двумя хостами, под одним и тем же управлением, и хост который получает обратный вызов - обычно не конфигурируется для непосредсвенного проведения обратного вызова. Поэтому, обычно, безопастно использовать
“
use_postmaster
” или
“
use_sender
” в этих случаях.
Однако, если вы используете непустой адрес отправителя для обратного вызова к произвольному хосту, есть вероятность, что удалённый хост сам инициирует обратный вызов к вашему хосту. Поскольку он проверяет отправителя сообщения, он, вероятно, будет использовать пустой адрес в MAIL, избегая петли обратных вызовов. Однако, в целях безопастности, лучше всего было бы настроить ваши собственные ACL, чтобы они не проводили проверку отправителя когда адрес получателя - адрес который вы используете для отправителя заголовка или проверки постмастера обратным вызовом.
Другая проблема, подумать при использовании непустых отправителей для обратных вызовов - кэширование. Когда вы устанавливаете
“
mailfrom
” или
“
use_sender
”, в записях кэша в качестве ключа используется комбинация отправитель/получатель; таким образом, для любого данного получателя выполянется намного больше обратных вызовов, чем когда используется пустой отправитель, или постмастер.
39.34 Кэширование обратных вызовов
Exim кэширует результаты обратных вызовов с целью уменьшить количество используемых ресурсов, если не задан параметр
“
no_cache
” с опцией
“
callout
”. База данных подсказок, называемая
“callout
”, используется для кэша. Используются два различных типа записей: первые типы записей - результат проверок обратным вызовом для специфических адресов, и другие информационные записи - которые применяются ко всему домену (например, что он принимает локальную часть
“
postmaster
”).
Когда оригинальный обратный вызов неудачен, дайтся детальное SMTP-сообщение о ошибке. Однако, для последующих ошибок, используются кэшированные данные, и это сообщение недоступно.
Время жизни для негативных и позитивных записей адресного кэша - независимы, и может быть установлено путём глобальной опции
“
callout_negative_expire
” (значение по умолчанию - 2 часа) и
“
callout_positive_expire
” (значение по умолчанию - 24 часа), соответственно.
Если хост даёт отрицательный ответ в SMTP-соединении, или отклоняет любую команду до и включительно
(но не включая команду MAIL с непустым адресом), любая попытка обратного вызова обязана стать неудачной. Exim помнит такие ошибки в записях кэша доменов, который используется для для неудачи обратных вызовов для домена, без создания нового соединения, пока не кончиться время жизни записи. Есть два отдельных времени окончания записей для кэша доменов:
“
callout_domain_negative_expire
” (значение по умолчанию - три часа) и
“
callout_domain_positive_expire
” (значение по умолчанию - семь дней).
Записи доменов истекают, когда достигается негативное время жизни, если обратный вызов не может быть сделан для домена, или если неудачна проверка постмастера. Иначе, они истекают по достижении времени истечения. Это гарантирует, например, что хост остановивший приём
“случайных
” локальных частей, в конечном счёте будет замечен.
Механизм кэширования обратных вызовов основан на домене проверяемого адреса. Если домен роутится к нескольким хостам, предполагается, что их поведение будет одинаковым.
39.35 Отчёты проверки адресов отправителя
Когда проверка отправителя неудачна в ACL, детали о ошибке даются как дополнительные строки до 550-го ответа на релевантную SMTP-команду (RCPT или DATA). Например, если используется обратный вызов отправителя, вы могли бы видеть:
MAIL FROM:<xyz@abc.example>
250
OK
RCPT TO:<pqr@def.example>
550
-Verification failed for <xyz@abc.example>
550
-Called:
192
.
168
.
34
.
43
550
-Sent: RCPT TO:<xyz@abc.example>
550
-Response:
550
Unknown local part xyz in <xyz@abc.example>
550
Sender verification failed
|
Если таким же образом была неудачна более чем одна команда RCPT, делали даются лишь для первой из них. Однако, некоторые администраторы не хотят отсылать об этом слишком много информации. Вы можете подавить детализацию путём добавления
“/no_details
” к утверждению ACL которое запрашивает проверку отправителя. Например:
verify = sender/no_details
|
39.36 Перенаправление при проверке
Возникает дилемма, когда локальный адрес редиректится путём альясинга или форвардинга во время проверки: должны ли быть проверены сгенерённые адреса, или успешного раскрытия оригинального адреса достаточно, для подтверждения? По умолчанию, exim выбирает следующий прагматический подход:
Когда входящий адрес переадресован лишь к одному дочернему адресу, проверка продолжжается с дочерним адресом, и если проверка неудачна, оригинальная проверка также неудачна.
Когда входящий адрес переадресован более чем к одному дочернему адресу, проверка не продолжжается. Возвращается успешный результат.
Это кажется наиболее разумным поведением для общего использования альясинга, как способ редиректа различных локальных частей к тому же самому почтовому ящику. Это означает, например, что пара записей альясов формы
A.Wol: aw123
aw123: :fail: Gone away, no forwarding address
|
работает как ожидается, вызывая ошибку с обоими локальными частями. Когда редирект генерит более одного адреса, поведение больше походит список рассылки, где существования алиаса достаточно для успешности проверки.
Однако, возможно изменить дефолтовое поведение так, что все успешные редиректы считаются как успешная проверка, однако генерится много новых адресов. Это определено путём проверочной опции
“
success_on_redirect
”. Например:
require verify = recipient/success_on_redirect/callout=10s
|
В этом примере, проверка успешна, если роутер генерит новый адрес, и обратный вызов не происходит, поскольку никакой адрес не роутится на удалённый хост.
39.37 Клиентская SMTP-авторизация (CSA)
Клиентская SMTP-авторизация - система, которая позволяет чайту давать объявление, каким машинам можно, и каким нельзя посылать электронную почту. Это делается путём помещения специальной SRV записи в DNS; она ищется используя домен из HELO клиента. Во время записи (видимо - когда писался этот текст) - всё ещё черновик интернета. Клиентская SMTP-авторизация выполняется в exim`e путём условия ACL:
Оно неудачно, если клиент неавторизован. Если существует проблема в DNS, или не найдена действительная CSA SRV запись, или если клиент - авторизован, условие успешно. Эти три случая можно различить используя переменную раскрытия
“
$csa_status
”, которая может принимать одно из значений
“fail
”,
“defer
”,
“unknown
”, или
“ok
”. Условие, самостоятельно, не отсрочивает доставку, поскольку, вероятно, это вызвало бы проблемы для закооной почты.
Сообщения о ошибках производимые кодом CSA включают немного больше деталей. Если
“
$csa_status
” -
“defer
”, это может быть потому, что проблемы при поиске записи CSA SRV, или проблемы поиска целевой записи CSA. Есть четыре причины, чтобы
“
$csa_status
” был
“fail
”:
Клиентское имя хоста явно не разрешено.
IP адрес клиента не совпадает с какими-либо целевыми IP-адресами CSA.
Клиентское имя хоста авторизовано, но у него нет допустимых IP-адресов (например, целевые адреса - IPv6 и клиент использует IPv4).
Клиентское имя хоста не имеет записи CSA SRV, но родительский домен явно утверждает, что все субдомены должны быть явно разрешены.
Условие проверки CSA может принимать аргумент, являющейся доменом для использования в запроса DNS. Значение по умолчанию:
verify = csa/$sender_helo_name
|
Это воплощение включает расширение к CSA. Если запрос домена - буквальный адрес, типа [192.0.2.95], или если это голый IP-адрес, exim ищет записи записи в обратных DNS, как юудто домен HELO был (например)
“
95.2.0.192.in-addr.arpa
”. Поэтому, это значит сказать:
verify = csa/$sender_host_address
|
Фактически, это проверка, выполянемая exim`ом если клиент не сказал HELO. Это расширение может быть отключено путём установки опции, в главной конфигурации,
“
dns_csa_use_reverse
”, в ложь.
Если непосредственно для домена не найдена запись CSA SRV, поиск выполянется через его родительские домены для записи, которая могла бы сделать утверждение о субдоменах. Максимальная глубина этого поиска ограничена используя опцию главной конфигурации
“
dns_csa_search_limit
”, которая по умолчанию равна 5. Exim не ищет CSA SRV в домене верхнего уровня, таким образом, дефолтовая установка обработки домена HELO - семь (
“
hostname.five.four.three.two.one.com
”). Это охватывает большинство легитимных доменов HELO.
Поиск
“
dnsdb
” также имеет поддержку для CSA. Хотя
“
dnsdb
”, также, поддерживает прямые поиски SRV, этого недостаточно из-за поведения высшего домена для для поиска CSA, и (как с поисками PTR)
“
dnsdb
” также превращает IP-адреса в поиске в обратном пространстве DNS. Результат успешного поиска, типа:
${lookup dnsdb {csa=$sender_helo_name}}
|
имеет два поля разделённых пробелами: Код авторизации, и имя целевого хоста. Авторизационный код может быть
“Y
” - для yes,
“N
” - для no,
“X
” - для явно требуемого разрешения, но отсутствия, или
“?
” - для неизвестного.
39.38 Проверка тега адреса рикошета
Проверка тега адреса рикошета (Bounce address tag validation - BATV), это схема, посредством которой отправители конверта исходящего сообщения имеют добавленный к ним
“tag
” - шифрованный, с меткой времени. Подлинные входящие рикошеты всегда должны быть адресованы получателям,, которые имеют действительный тег. Эта схема - способ детектировать нежелательные рикошеты, вызванные подделкой адреса (часто называемые
“сопутствующий спам
”), поскольку получатели таких сообщений не содержат в себе действительный тег.
Есть два элемента раскрытия для помощи в реализации схемы BATV
“prvs
” (частная подпись - private signature) в конфигурации exim`a. Эта схема подписывает оригинальный адрес отправителя конверта путём использования простого разделённого ключа для добавления хэша адреса и некоторой, основанной на времени рандомизированной информации. Элемент раскрытия
“
prvs
” создаёт подписанный адрес, и элемент раскрытия
“
prvscheck
” проверяет его. Синтаксис этих пунктов описан в разделе 11.5.
Как пример, предположим, что секретные ключи (по ключу на адрес) были сохранены в БД MySQL. Запрос для поиска ключа для адреса мог быть определён макросом типа этого:
PRVSCHECK_SQL = ${lookup mysql{SELECT secret FROM batv_prvs \
WHERE sender='${quote_mysql:$prvscheck_address}'\
}{$value}}
|
Предположим, также, что отправители использующие BATV заданы списком адресов называемым
“
batv_senders
”. Тогда, в ACL для команд RCPT вы могли бы использовать это:
# Bounces: drop unsigned addresses for BATV senders
deny message = This address does not send an unsigned reverse path.
senders = :
recipients = +batv_senders
# Bounces: In case of prvs-signed address, check signature.
deny message = Invalid reverse path signature.
senders = :
condition = ${prvscheck {$local_part@$domain}\
{PRVSCHECK_SQL}{1}}
!condition = $prvscheck_result
|
Первое утверждение отклоняет получателей для рикошетов, которые адресованы простым адресам отправителей BATV, поскольку известно, что отправители BATV не отсылают сообщения с открытым адресом отправителя. Второе утверждение отклоняет получателей которые подписаны prvs, но с неверными сигнатурами (или потому что неверный ключ, или произошёл таймаут сигнатуры).
Адреса, не подписанные prvs, не отклоняются вторым утверждением, поскольку раскрытие
“
prvscheck
” приносит пустую строку, если его первый аргумент не prvs-подписанный адрес, вызывая, таким образом, что условие
“
condition
” становится ложным. Если первый аргумент - синтаксически верный prvs-подписанный адрес, возвращается третья строка (в этом случае -
“1
”), независимо от успеха проверок шифрования и таймаута. Переменная
“
$prvscheck_result
” содержит результат проверок (пустая - для ошибки,
“1
” - для успеха).
Есть ещё две проблемы, которые вы должны рассмотреть при осуществлении prvs-подписей. Во-первых, вы должны гарантировать, что prvs-подписанный адрес не блокируется вашими ACL. Такие адреса содержат символы слэша, но дефолтовая конфигурация exim`a содержит это утверждение в ACL RCPT:
deny message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
|
Это - консервативное правило, которое блокирует локальные части содержащие слэши. Вы должны удалить слэш в последней строке.
Во-вторых, вы должны гарантировать, что роутеры примут prvs-подписанные адреса, и корректно доставят их. Самый простой способ обработать их - использовать роутер
“
redirect
”, для удаления сигнатуры, с подобной конфигурацией:
batv_redirect:
driver = redirect
data = ${prvscheck {$local_part@$domain}{PRVSCHECK_SQL}}
|
Это работает потому, что если третий аргумент
“
prvscheck
” - пустой, результат раскрытия prvs-подписанного адреса - декодированное значение оригинального адреса. Этот роутер, вероятно, должен быть первым в ваших роутерах, которые обрабатывают локальные адреса.
Для создания BATV-подписанного адреса в первом месте, может использоваться транспорт такой формы:
external_smtp_batv:
driver = smtp
return_path = ${prvs {$return_path} \
{${lookup mysql{SELECT \
secret FROM batv_prvs WHERE \
sender='${quote_mysql:$sender_address}'} \
{$value}fail}}}
|
Если для существующего пути возврата ключ не может быть найден, подписывания не происходит.
39.39 Использование ACL для упавления релеингом
MTA, как говорят, передает (relay) сообщение, если оно передаётся с некоторого хоста, и непосредственно доставляется на другой хост, как результат удалённого адреса содержавшегося в нём. Переадресация локальных частей через файл альясов или форвардов, и, затем, пеердача сообщения на другой хост - не релеинг, но редирект в результате обработки символа процента (
“percent hack
”) - да.
Существует два вида релеинга, которые называют
“incoming
” и
“outgoing
”. Хост, дейтвующий как шлюз, или резервный MX - имеет отношение ко входящему релеингу, от произвольных хостов к специфически установленным доменам. С другой стороны, хост, выступающий в роли умного хоста для множества клиентов, имеет отношение к исходящему релеингу от этих клиентов ко всему интернету. Часто, некоторые хосты выполняют обе функции, но, в принципе, эти два вида релеинга полностью независимы. То, что не требуется - передача почты с произвольного удалённого хоста через вашу систему к произвольным доменам.
Вы можете осуществить контроль релея путём подходящих утверждений ACL, которые выполняются для каждой команды RCPT. Для удобства, часто, самое лёгкое, использовать средство именованного списка exim`a, для задания вовлечённых зоменов и хостов. Например, предположим, что вы хотите следующее:
Доставлять множество доменов в почтовые ящики локального хоста (или локально обрабатывать их каким-то другим способом). Скажем, они -
“
my.dom1.example
” и
“
my.dom2.example
”.
Релеить почту для множества других доменов, для которых вы являетесь вторичным MX. Это могли бы быть
“
friend1.example
” и
“
friend2.example
”.
Релеить почту от хостов в вашей локальной LAN, к любым вовлечённым доменам. Предположим, ваша LAN - 192.168.45.0/24.
В главной части конфигурации, вы помещаете следующие определения:
domainlist local_domains = my.dom1.example : my.dom2.example
domainlist relay_domains = friend1.example : friend2.example
hostlist relay_hosts =
192
.
168
.
45
.
0
/
24
|
Теперь вы можете использовать эти определения в ACL, работающих для каждой команды RCPT:
acl_check_rcpt:
accept domains = +local_domains : +relay_domains
accept hosts = +relay_hosts
|
Первое утверждение принимает любую команду RCPT, которая содержит адрес в локальном или релейном домене. Для любых других доменов, управление передаётся второму утверждению, которое принимает команды, лишь если они приходят с релейных хостов. Практически, вы, вероятно, захотите создать свою, более сложную ACL чем эта, например, путём включения отправителя и проверки получателя. Дефолтовая конфигурация включает более всесторонний пример, который описан в части 7.
39.40 Проверка конфигурации релея
Вы можете проверить характеристики релея вашей конфигурации таким же образом, как и проверяете поведение любой ACL для входящих SMTP-подключений, путём использования опции
“
-bh
”, для запуска поддельной SMTP-сессии, с которой вы взаимодействуете.
Для особого тестирования на нежелательный релеинг, хост
“
relay-test.mail-abuse.org
” предоставляет полезный сервис. Если вы подключитесь по telnet на этот хост с хоста на котором запущен exim? используя обычный порт telnet, вы увидите обычное сообщение о соединении telnet, и, затем, довольно долгая задержка. Будте терпеливы. Удалённый хост создаёт SMTP-соединение обратно на ваш хост, и пробует множество обычных исследований на тестирование уязвимости - открытый релей. Результаты тестов, в конечном счёте, появятся на вашем терминале.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
48. Файлы логов
Exim пишет три различных лога, называемых - главный лог, лог отклонённых, и лог паники:
В главном логе записывается приход каждого сообщения, и каждая доставка, по одной строке на каждый случай. Формат - компактен насколько возможно, с целью попытаться уменьшить размер лог-файлов. Двухсимвольная последовательности флага облегчают выбор этих строк. Множество иных событий записывается в главный лог. Некоторые из них - опциональны, управляемые включением или выключением опции селектора логов
“
log_selector
”. Perl`овый скрипт, называемый
“
eximstats
”, производит простой анализ файлов главного лога, предоставляется в дистрибутиве exim`a (смотрите раздел 49.7).
В лог отклонённых записывается информация из сообщений, которые были отклонены как результат конфигурационных опций (т.е. по причинам политик). Первая строка каждого отклонения - копия строки, которая, также, пишется в главный лог. Затем, если заголовки сообщения были прочитаны во время записи лога, их содержимое пишется в этот лог. Доступны лишь оригинальные строки заголовоков; заголовки добавленные ACL - не логгируются. Вы можете использовать лог отклонённых для проверки, что ваши политики работают корректно; на загруженных хостах это может быть более легким чем сканирование главного лога на отклонённые сообщения. Вы можете подавить запись лога отклонённых путём установки
“
write_rejectlog
” в ложь.
Когда происходят определённые серьёзные ошибки, exim делает запись в лог паники. Если ошибка достаточно серьёзная, exim прекращает работу. Записи в лог паники, обычно, также пишутся в главный лог, но могут теряться среди массы других записей. В обычных обстоятельствах, лог паники должен быть пустой. Хорошая идея - проверять его регулярно (или скрипт в
“
cron
”, который будет это делать), с целью узнать о проблемах. Когда exim yе может открыть свой лог паники, он пытается, как последнее средство, записать в системный лог (syslog). Он открывается с LOG_PID+LOG_CONS и кодом средства LOG_MAIL. Само сообщение пишется с приоритетом LOG_CRIT.
Каждая строка лога начинается со штампа времени, в формате, показанном в следующем примере. Отметьте, что многие из примеров, показанных в этой части, с переносом строк. В файле логов, это было бы одной строкой:
2001
-
09
-
16
16
:
09
:
47
SMTP connection from [
127
.
0
.
0
.
1
] closed
by QUIT
|
По умолчанию, штампы времени в локальной временной зоне. Есть два способа это изменить:
Вы можете установить опцию
“
timezone
” в иную временную зону; в частности, вы можете установить:
для штампов времени в UTC (который - GMT).
Вы можете установить
“
log_timezone
” в истину, для добавления временной зоны к штампу времени, например:
2003
-
04
-
25
11
:
17
:
07
+
0100
Start queue run: pid=
12762
|
48.1 Где пишутся логи
Логи могут быть записаны в локальные файлы, или в syslog, или и туда и туда. Однако, нужно отметить, что многие реализации syslog используют в качестве транспорта UDP, и ненадёжны, в смысле, что не гарантируется прибытие сообщений на хост логгирования, и при этом порядок сообщений не обязательно поддерживается. Также сообщалось, что на больших файлах логов (десятки мегабайт), возможно, вам необходимо настроить syslog, для предотвращения синхронизации файла при каждой записи - на linux было замечено, что это вызывало 90% загрузку центрального процессора.
Назначение для логов exim`a конфигурируется путём установки LOG_FILE_PATH в
“
Local/Makefile
”, или путём установки
“
log_file_path
” в рабочей конфигурации. Эта, последняя, строка раскрывается, и, таким образом, она может содержать, например, ссылки на имя хоста:
log_file_path = /var/log/$primary_hostname/exim_%slog
|
Вообще, желательна установка строки в
“
Local/Makefile
”, вместо рабочей конфигурации, поскольку в этом случае установка доступна с самого начала выполнения exim`a. Иначе, если будет нужно залоггировать что-то до чтения конфигурационного файла (например, ошибку в конфигурационном файле), он не сможет использовать путь который вы хотите, и может оказаться не в состоянии залоггировать вообще что бы то нибыло.
Значение LOG_FILE_PATH или
“
log_file_path
” - список разделённый двоеточиями, в настоящее время ограниченный максимум двумя элементами. Это - единственная опция, где не может использоваться средство для изменения разделителя списка. Этот список всегда должен быть разделён двоеточиями. Если элемент в списке -
“syslog
”, тогда используется syslog; иначе, элемент должен быть абсолютным путём, содержащим
“%s
” как точку, где должны быть вставлены
“main
”,
“reject
”, или
“panic
”, или быть пустым, подразумевая использование дефолтового пути.
Когда exim сталкивается с пустым элементом в списке, он ищет список, заданный путём LOG_FILE_PATH, и использует первый найденный элемент, если он не пустой, или не
“syslog
”. Это означает, что в
“
log_file_path
” может использоваться пустой элемент, для обозначения
“
использовать путь заданный при сборке
”. Если элемента не существует, лог файлы пишутся в субдиректорию
“
log
”, в директории спула. Это эквивалентно установке:
log_file_path = $spool_directory/log/%slog
|
Если вы не определили что-то при компиляции или в рабочей конфигурации, логи пишутся по указанному пути.
Путь к логам может содержать
“%D
”, если в имени логов используется штамп даты - смотрите секцию 48.3, ниже.
Вот - некоторые примеры возможных установок:
LOG_FILE_PATH=syslog syslog only
LOG_FILE_PATH=:syslog syslog and default path
LOG_FILE_PATH=syslog : /usr/log/exim_%s syslog and specified path
LOG_FILE_PATH=/usr/log/exim_%s specified path only
|
Если в списке более двух путей, используется первый, и логгируется паническая ошибка.
48.2 Логгинг в локальные файлы, которые периодически ротируются
Некоторые операционные системы предоставляют централизованные и стандартизованные методы для ротации файлов логов. Для тех, которые этого не делают, предоставляется скрипт утилиты с именем
“
exicyclog
” (смотрите секцию [url=./?id=1249#49.6]49.6[/url). Он переименовывает и сжимает главный лог, и лог отклонённых при каждом его вызове. Может быть настроено максимальное число оставляемых старых логов. Предполагается, что этот скрипт запускается как ежедневное задание
“
cron
”.
Процесс доставки exim`a открывает главный лог когда ему первый раз необходимо в него записать, и оставляет его открытым в случае, если требуется последующая запись - например, если для одного и того же сообщения производится несколько различных доставок. Однако, удалённые SMTP-доставки могут занять много времени, и это означает, что файл может оставаться открытым после его переименования, если
“
exicyclog
”, или что-то подобное используется для переименования файлов логов на регулярной основе (имеется ввиду - постоянно - раз в сутки, например - прим. lissyara). Для гарантии, что переключение лог-файлов будет замечено как можно быстрее, exim вызывает
“
stat()
” для имени главных логов, до повторного использования открытых файлов, и если файл не существует, или изменилась его инода, старый файл закрывается, и exim пробует открыть пустой главный лог. Таким образом, старый лог может оставться открытым довольно долго, но никакие процессы exim`a в него не пишут, как только он был переименован.
48.3 Штамп даты на файлах логов
Вместо ротации файлов главного лога и лога отклонённых путём их периодического переименовывания, некоторые любят исполльзовать файлы, чьи имена содержат штамп времени, например,
“
mainlog-20031225
”. Штамп времни имеет форму
“
yyyymmdd
”. Exim обладает поддержкой для этого способа работы. Он включается путём установки опции
“
log_file_path
” в путь, который содержит
“%D
” в точке где требуется штамп даты. Например:
log_file_path = /var/spool/exim/log/%slog-%D
log_file_path = /var/log/exim-%s-%D.log
log_file_path = /var/spool/exim/log/%D-%slog
|
Как и прежде,
“%s
” заменяется на
“main
” или
“reject
”; вот - примеры имён генерируемых этим примером:
/var/spool/exim/log/mainlog-
20021225
/var/log/exim-reject-
20021225
.log
/var/spool/exim/log/
20021225
-mainlog
|
Когда задана эта форма логов, exim автоматически переключается на новые файлы по ночам. Он не предпринимает никаких попыток для сжатия старых логов; вам придётся написать свой скрипт, который будет это делать. Вы не должны запускать
“
exicyclog
” с этой формой логгинга.
Местоположение лога паники, также определяется путём
“
log_file_path
”, но на него не ставиться штамп даты, поскольку ротация лога паники не имеет смысла. При генерации имени лога паники,
“%D
” удаляется из строки. Дополнительно, если он идёт немедленно после слэша, следующий не алфавитно-цифровой символ - удаляется; иначе, удаляется предшествующий не алфавитно-цифровой символ. Таким образом, предыдущие три примера, привели бы к таким логам паники:
/var/spool/exim/log/paniclog
/var/log/exim-panic.log
/var/spool/exim/log/paniclog
|
48.4 Логгинг в syslog
Использование syslog не изменяет того, как exim логгирует, или формат его сообщений, исключая одно отношение. Если
“
syslog_timestamp
” установлена в ложь, штамп времени в строках лога exim`a пропускается, когда строка посылается в syslog. Кроме того? те же самые строки пишутся в syslog как в файлы логов. Средство (
“facility
”) syslog установлено в LOG_MAIL, и по умолчанию, программа именуется
“exim
”, но вы можете изменить это путём опций
“
syslog_facility
” и
“
syslog_processname
”, соответственно. Если exim скомпилен с SYSLOG_LOG_PID установленным в
“
Local/Makefile
” (это, значение по умолчанию, в
“
src/EDITME
”), тогда, на системах, которые разрешают это (все, исключая ULTRIX), флаг LOG_PID - установлен так, чтобы вызов
“
syslog()
” добавлял pid, также как и время и имя хоста, в каждую строку. Три потока логов распределяются по приоритетам syslog следующим образом:
“
mainlog
” - маппится на LOG_INFO
“
rejectlog
” - маппится на LOG_NOTICE
“
paniclog
” - маппится на LOG_ALERT
Многие строки пишутся в оба -
“
mainlog
” и
“
rejectlog
”, а некоторые пишутся и в
“
mainlog
” и в
“
paniclog
”, таким образом, они будут дублироваться, если syslod их направит в одно место. Вы можете подавить дубликацию путём установки
“
syslog_duplication
” в ложь.
Иногда, строки логов exim`a бывают очень длинными, и некоторые записи
“
rejectlog
” содержат несколько строк, когда включаются заголовки. Для борьбы с этими обоими случаями, записываемые в syslog вхождения разделяются в отдельные вызовы
“
syslog()
” по внутренним новым строкам, и, также, после максимум, 870 знаков. (Это учитывает максимальную длинну строки syslog - 1024, когда добавлены дополнения, типа штампа времени.) Если вы запускаете замену syslog, которая может обработать строки длинней чем 1024 символа, разрешённые RFC3164, вы должны установить
в
“
Local/Makefile
” до сборки exim`a. Это предотвращает разбитие exim`ом длинных строк, но всё ещё разбирает внутренние новые строки во вхождениях лога
“
reject
”.
Для облегчения повторной сборки разбитых строк, каждый компонент разбитого вхождения начинается со строки формы
“[<n>/<m>]
” или
“[<n>\<m>]
”, где
“<n>
” - компонент числа, и
“<m>
” - полное число компонентов вхождения. Разделитель
“/
” используется когда строка разбита из-за того, что она слишком длинная; если же она разбита из-за внутренней новой строки, используется разделитель
“\
”. Например, предположим что ограничение длинны 50 вместо 870, следующий пример был бы результатом типичного отклонения сообщения в
“
mainlog
” (LOG_INFO), дополненительно, каждая строка предваряется временем, именем хоста, и pid, добавляемых syslog:
[
1
/
5
]
2002
-
09
-
16
16
:
09
:
43
16RdAL-0006pc-
00
rejected from
[
2
/
5
] [
127
.
0
.
0
.
1
] (ph10): syntax error in 'From' header
[
3
/
5
] when scanning for sender: missing or malformed lo
[
4
/
5
] cal part in "<>" (envelope sender is <ph10@cam.exa
[
5
/
5
] mple>)
|
Та же самая ошибка могла бы привести к следующим строкам записанным в
“rejectlog
” (LOG_NOTICE):
[
1
/
18
]
2002
-
09
-
16
16
:
09
:
43
16RdAL-0006pc-
00
rejected fro
[
2
/
18
] m [
127
.
0
.
0
.
1
] (ph10): syntax error in 'From' head
[
3
/
18
] er when scanning for sender: missing or malformed
[
4
/
18
] local part in "<>" (envelope sender is <ph10@cam
[5\18] .example>)
[6\18] Recipients: ph10@some.domain.cam.example
[7\18] P Received: from [
127
.
0
.
0
.
1
] (ident=ph10)
[8\18] by xxxxx.cam.example with smtp (Exim
4
.
00
)
[9\18] id 16RdAL-0006pc-
00
[
10
/
18
] for ph10@cam.example; Mon,
16
Sep
2002
16
:
[11\18]
09
:
43
+
0100
[12\18] F From: <>
[13\18] Subject: this is a test header
[18\18] X-something: this is another header
[
15
/
18
] I Message-Id: <E16RdAL-0006pc-00@xxxxx.cam.examp
[16\18] le>
[17\18] B Bcc:
[
18
/
18
] Date: Mon,
16
Sep
2002
16
:
09
:
43
+
0100
|
Строки логов, которые не слишком длинные, или не содержат символа новой строки, пишутся в syslog без модификации.
Если используется только syslog, монитор exim`a не может показывать логи, если syslog не направляет
“
mainlog
” в файл на локальном хосте, и переемнная окружения EXIMON_LOG_FILE_PATH не указывает монитору, где он находится.
48.5 Флаги строк логов
На каждое пришедшее сообщение, в логи записывается одна строка, и для каждой успешной, неуспешной, и задержанной доставки. Эти строки могут быть выбраны по отличительным двухсимвольным флагам, которые идут сразу за штампом времени. Флаги таковы:
Флаг
|
Значение
|
<=
|
прибытие сообщения
|
=>
|
нормальная доставка сообщения
|
->
|
дополнительный адрес в той же доставке
|
*>
|
доставка подавлена путём -N
|
**
|
доставка неудачна; отправляется рикошет
|
==
|
доставка задержана; временная проблема
|
|
48.6 Логирование приёма сообщений
Формат однострочного вхождения в главном логе, который пишется для каждого полученного сообщения, показан в простом примере, ниже, который разбит на несколько строк, чтобы уместиться на странице:
2002
-
10
-
31
08
:
57
:
53
16ZCW1-0005MB-
00
<= kryten@dwarf.fict.example
H=mailer.fict.example [
192
.
168
.
123
.
123
] U=exim
P=smtp S=
5678
id=<incoming message id>
|
Адрес, немедленно сопровождаемый
“<=
” - адрес отправителя конверта. Рикошет отображается с адресом отправителя
“<>
”, и, если он сгенерирован локально, он сопровождается элементом в форме:
являющимся ссфлкой на сообщение, которое вызвало отсылку рикошета.
Для сообщений с других хостов, поля
“H
” и
“U
” идентифицируют удалённый хост и запись идентификатора RFC1413 пользователя, пославшего сообщение, если оно было принято. Число данное в кадратных скобках - IP адрес, отсылавшего хоста. Если тут единственное, не заключённое в скобки, имя хоста в поле
“H
”, как выше, значит оно было проверено на соответствие IP адресу (смотрите опцию
“
host_lookup
”). Если имя в круглых скобках, то это имя, указанное удалённым хостом в SMTP команде HELO или EHLO, и оно не было проверено. Если проверка приводит к имени отличающемуся от данного в HELO или EHLO, проверенное имя показано первым, сопровождаемое именем HELO или EHLO в круглых скобках.
Неверно сконфигурированные хосты (и те, кто подделывает почту) иногда помещают IP адрес, с квадратными скобками, или без, в команду HELO или EHLO, приводя к записям в логах, типа этих примеров:
H=(
10
.
21
.
32
.
43
) [
192
.
168
.
8
.
34
]
H=([
10
.
21
.
32
.
43
]) [
192
.
168
.
8
.
34
]
|
Это может запутывать. Можно положиться лишь на последний адрес в квадратных скобках.
Для локально сгенерённых сообщений (т.е. не переданных через TCP/IP), поле
“H
” - пропущено, и поле
“U
” содержит логин вызвавшего exim.
Для всех сообщений, поле
“P
” определяет протокол, используемый для получения сообщения. Это значение сохраняется в
“
$received_protocol
”. В случае входящего SMTP сообщения, значение указывает, использовались ли расширения SMTP (ESMTP), шифрование, или аутентификация. Если сессия SMTP была шифрованная, есть дополнительное поле
“X
”, в котором записан тип использовавшегося шифрования.
Протокол устанавливается в
“esmptsa
” или
“esmtpa
” для сообщений переданных от хостов которые аутентифицировались, используя команду SMTP AUTH. Первое значение используется когда SMTP соединение шифрованное (
“secure
”). В этом случае, есть дополнительный пункт
“A=
”, сопровождаемый именем использовавшегося аутентификатора. Если аутентифицированная идентификация была установлена аутентифкационной опцией
“
server_set_id
”, она также логируется, отделяемая двоеточием от имени аутентификатора.
Поле
“id
” записывает существующий идентификатор сообщения, если он есть. Размер принятого сообщения даётся в поле
“S
”. Когда сообщение доставляется, заголовки могут быть удалены или добавлены, таким образом, размер доставленных копий сообщений может не соответствовать этому значению (и в действительности могут отличаться друг от друга).
Опция
“
log_selector
” может использоваться для запроса логгинга дополнительных данных, при получении сообщения. Смотрите раздел 48.15.
48.7 Логгинг доставок
Формат однострочного вхождения в главном логе, который пишется для каждой доставки показан в одном из примеров ниже, для локальной и удалённой доставки соответсвенно. Каждый пример был разбит на две строки, чтобы вписаться в страницу:
2002
-
10
-
31
08
:
59
:
13
16ZCW1-0005MB-
00
=> marv
<marv@hitch.fict.example> R=localuser T=local_delivery
2002
-
10
-
31
09
:
00
:
10
16ZCW1-0005MB-
00
=>
monk@holistic.fict.example R=dnslookup T=remote_smtp
H=holistic.fict.example [
192
.
168
.
234
.
234
]
|
Для обычных локальных доставок, оригинальный адрес даётся в угловых скобках после финального адреса доставки, который может быть трубой или файлом. Если между оргтнальным и финальным адресом существует промежуточный, последний даётся в круглых скобках после заключительного адреса. Поля
“R
” и
“T
” записывают роутер и транспорт которые использовались при обработке адреса.
Если после успешной локальной доставки запускается теневой транспорт, к концу строки о успешной доставке добавляется элемент, в форме:
ST=<shadow transport name>
|
Если теневой транспорт был неуспешен, сообщение о ошибке помещается в конце, в круглых скобках.
Когда в одной доставке включён более чем один адрес (например, две команды SMTP RCPT в одной транзакции), второй и последующие адреса помечаются флагами с
“->
” вместо
“=>
”. Когда два и более сообщения отправляются по одному SMTP соединению, для второго и последующих сообщений в строках логов за IP адресом вставляется звёздочка.
Генерация сообщения с ответом, путём файла фильтра, логгируется как
“доставка
” на адрес, которому предшествует
“>
”.
Опция
“
log_selector
” может использоваться для запроса логгинга дополнительных данных, при получении сообщения. Смотрите раздел 48.15.
48.8 Доставки от которых отказались
Когда от сообщения отказались, как разультат команды
“seen finish
” появившейся в файле фильтра, который не генерит никаких доставок, в логи записывается вхождение такой формы:
2002
-
12
-
10
00
:
50
:
49
16auJc-0001UB-
00
=> discarded
<low.club@bridge.example> R=userforward
|
для указаний, почему не залоггированы никакие доставки. Когда от сообщения отказываются по причине что альяс привёл к
“:blackhole:
” (чёрная дыра - /dev/null - прим. lissyara), строка логов будет такой:
1999
-
03
-
02
09
:
44
:
33
10HmaX-0005vi-
00
=> :blackhole:
<hole@nowhere.example> R=blackhole_router
|
48.9 Отсроченные доставки
Когда сообщение задержано, логгируется строка следующей формы:
2002
-
12
-
19
16
:
20
:
23
16aiQz-0002Q5-
00
== marvin@endrest.example
R=dnslookup T=smtp defer (
146
): Connection refused
|
В случае удалённых доставок, ошибка - то, что давалось для последнего пробовавшегося IP адреса. Детали индивидуальной SMTP ошибки также пишутся в лог, таким образом, вышеупомянутой строке предшествовало бы что-то вроде этого:
2002
-
12
-
19
16
:
20
:
23
16aiQz-0002Q5-
00
Failed to connect to
mail1.endrest.example [
192
.
168
.
239
.
239
]: Connection refused
|
Когда задержанный адрес пропускается, поскольку не наступило его времяя повтора, в лог записывается сообщение, но это может быть подавлено путём установки соответствующего значения в
“
log_selector
”.
48.10 Ошибки доставки
Если доставка неуспешна по причине невозможности сроутить адрес, логгируется строка такой формы:
1995
-
12
-
19
16
:
20
:
23
0tRiQz-0002Q5-
00
** jim@trek99.example
<jim@trek99.example>: unknown mail domain
|
Если доставка неудачна в транспортное время, показываются роутер и транспорт, и включается ответ удалённого хоста, как в этом примере:
2002
-
07
-
11
07
:
14
:
17
17SXDU-
000189
-
00
** ace400@pb.example
R=dnslookup T=remote_smtp: SMTP error from remote mailer
after pipelined RCPT TO:<ace400@pb.example>: host
pbmail3.py.example [
192
.
168
.
63
.
111
]:
553
5
.
3
.
0
<ace400@pb.example>...Addressee unknown
|
Слово
“pipelined
” указывает, что было использовано расширение SMTP PIPELINING. Смотрите
“
hosts_avoid_esmtp
” в транспорте
“
smtp
” для способа отключения PIPELINING. Строки логов для всех форм неудачной доставки помечаются флагом
“**
”.
48.11 Поддельные доставки
Если доставка, фактически, не имела места, поскольку для её подавления использовалась опция
“
-N
”, в лог пишется обычная строка доставки, исключая, что
“=>
” заменяется на
“*>
”.
48.12 Завершение
Строка в форме
2002
-
10
-
31
09
:
00
:
11
16ZCW1-0005MB-
00
Completed
|
пишется в главный лог когда сообщение должно быть удалено из спула, в конце его обработки.
48.13 Краткое изложение полей в строках логов
Краткое изложение идентификаторов полей, которые используются в строках логов, показано в следующей таблице:
Идентификатор
|
Значение
|
A
|
имя аутентификатора (и опциональный id)
|
С
|
подтверждение SMTP после доставки
|
CV
|
статус проверки сертификата
|
DN
|
характерное имя от сертификата узла
|
DT
|
в строке => - время затраченное на доставку
|
F
|
адрес отправителя (в строках доставки)
|
H
|
имя хоста и IP адрес
|
I
|
используемый локальный интерфейс
|
id
|
идентификатор сообщения для входящего сообщения
|
P
|
в строке <= - используемый протокол
|
P
|
в => и ** строках - используемый протокол
|
QT
|
в строках => - время нахождения в очереди на данный момент
|
QT
|
в строках “Completed ” - время нахождения в очереди
|
R
|
в строках <= - ссылка для локального рикошета
|
R
|
в ** и == строках - имя роутера
|
S
|
размер сообщения
|
ST
|
имя теневого транспорта
|
T
|
в строках <= - тема сообщения
|
T
|
в ** и == строках - имя транспорта
|
U
|
локальный пользователь или идентификатор RFC1413
|
X
|
способ шифрования TLS
|
|
48.14 Другие записи логов
Различные иные типы записей время от времени пишутся в логи. Большинство из них - очевидны. Чаще всего:
“
retry time not reached
” - предварительно, адрес подвергся временной ошибке при роутинге, или локальной доставке, и время его повтора ещё не наступило. Это сообщение не пишется в индивидуальный файл лога, если это не происходит во время первой попытки доставки.
“
retry time not reached for any host
” - предварительно, адрес подвергся временной ошибке в процессе удалённой доставки, и ни для одного из хостов, к которым был сроучен адрес, не наступило время повтора.
“
spool file locked
” - Попытка доставки сообщения не может произойти, поскольку некоторые иной процесс exim`a уже работают над ним. Это довольно обычно, если процесс обработки очереди запускается через короткие интервалы. Сервисный скрипт
“
exiwhat
” может быть использован чтобы узнать, чем занимаются процессы exim`a.
“
error ignored
” - есть несколько обстоятельств, которые могут привести к этому сообщению:
1. Exim не может доставить рикошет, чей возрас больше чем
“
ignore_bounce_errors_after
”. От рикошета отказываются.
2. Файл фильтра установил доставку используя опцию
“noerror
”, и доставка неудачна. От доставки отказываются.
3. Доставка настроенная путём роутера сконфигурированного с
неудачна. От доставки отказываются.
48.15 Сокращение или увеличение того, что логгируется
Путём установки глобальной опции
“
log_selector
”, вы можете отключить некоторое дефолтовое логгирование exim`a, или вы можете запросить дополнительный логгинг. Значение
“
log_selector
” составлено из имён, с предшествующем символом плюса или минуса. Например:
log_selector = +arguments -retry_defer
|
Список опциональных элементов лога, указаны в следующей таблице, с дефолтовым значением отмеченным звёздочкой:
элемент
|
значение
|
*acl_warn_skipped
|
пропущенное в ACL утверждение “warn ”
|
address_rewrite
|
перезапись адреса
|
all_parents
|
все родители в => строке
|
arguments
|
аргументы командной строки
|
*connection_reject
|
отклонения соединений
|
*delay_delivery
|
задержка немедленной доставки
|
deliver_time
|
время затраченнное на выполнение доставки
|
delivery_size
|
добавляет S=nnn в строки =>
|
*dnslist_defer
|
задержки поисков в списках DNS (RBL)
|
*etrn
|
команды ETRN
|
*host_lookup_failed
|
в названии опции всё сказано
|
ident_timeout
|
таймаут соединения ident
|
incoming_interface
|
входящий интерфейс в строке <=
|
incoming_port
|
входящий порт в строке <=
|
*lost_incoming_connection
|
что сказано в названии опции (включая таймауты)
|
outgoing_port
|
добавляет удалённый порт к строке =>
|
*queue_run
|
начало и завершение обработки очереди
|
queue_time
|
время в очереди для одного получателя
|
queue_time_overall
|
время в очереди для всего сообщения
|
received_recipients
|
получатели в cтроках <=
|
received_recipients
|
отправители в строках <=
|
*rejected_header
|
содержимое заголовка в логе отклонённых
|
*retry_defer
|
“retry time not reached ”
|
return_path_on_delivery
|
помещает путь возврата в строки => и *\
|
sender_on_delivery
|
добавляет отправителя к строкам =>
|
*sender_verify_fail
|
ошибка проверки отправителя
|
*size_reject
|
отклонение по причине слишком большого размера
|
*skip_delivery
|
пропуск доставки в обработчике очереди
|
smtp_confirmation
|
подтверждение SMTP в строках =>
|
smtp_connection
|
подключения SMTP
|
smtp_incomplete_transaction
|
незавершенная транзакция SMTP
|
smtp_protocol_error
|
ошибки протокола SMTP
|
smtp_syntax_error
|
ошибки синтаксиса SMTP
|
subject
|
содержимое Subject: в строках <=
|
tls_certificate_verified
|
статус проверки сертификата
|
*tls_cipher
|
метод шифрования TLS в строках <= и =>
|
tls_peerdn
|
TLS узел DN в строках <= и =>
|
unknown_in_list
|
неудача поиска DNS при сравнении списка
|
-
|
-
|
all
|
все вышеупомянутые
|
|
Дополнительные детали для каждого из этих элементов таковы:
“
acl_warn_skipped
”: Когда пропускается
“
warn
” утверждение ACL, поскольку одно из его условий не может быть оценено, о этом эффекте записывается строка лога, если этот селектор установлен.
“
address_rewrite
”: Это применяется к обоим перезаписям, - глобальной и транспортной, но не к перезаписи в фильтрах, работающих от непривелигированного пользователя (поскольку такой пользователь не имеет доступа к логам).
“
all_parents
”: Обычно, лишь оригинальный и финальный адреса логгируются в строках доставки; с этим селектором, промежуточные предки даются между ними, в круглых скобках.
“
arguments
”: Это вызывает запись exim`ом аргументов, с которыми он был вызван, в главный лог, предшествуемые текущей рабочей директорией. Это - отладочная возможность, добавленная для облегчения узнавания того, как некоторые MUA вызывают вызывают
“
/usr/sbin/sendmail
”. Логгинг не происходит, если exim отказался от root`овых привилегий, поскольку он вызывается с опциями
“
-C
” или
“
-D
”. Аргументы которые пусты, или которые содержат пустое пространство - помещаются в кавычки. Непечатаемые символы показываются в последовательностях начинающихся с обратной косой черты. Это средство не может логгировать нераспознанные аргументы, поскольку аргументы проверяются до чтения конфигурационного файла. Единственный способ логгировать такие случаи - вставка скрипта, типа
“
util/logargs.sh
”, между вызывающим и exim`ом.
“
connection_reject
”: Запись в лог производится каждый раз когда отклоняется входящее SMTP подключение, по любой причине.
“
delay_delivery
”: Запись в лог производится каждый раз когда процесс доставки не запускается для входящего сообщения, поскольку загрузка слишком высока, или слишком много сообщений передано в одном соединении. Логгирования не происходит, если процесс доставки не начат по причине что установлена опция
“
queue_only
” или используется
“
-odq
”.
“
deliver_time
”: Для каждой доставки, количество реального времени затраченного на реальную доставку логгируется как DT=<time>, например, DT=1s.
“
delivery_size
”: Для каждой доставки, размер сообщения добавляется к строке
“=>
”, с тегом
“S=
”.
“
dnslist_defer
”: Запись в логи делается если попытка поиска хоста в чёрных списках DNS возвращает временную ошибку.
“
etrn
”: Каждая полученная легальная команда ETRN логгируется, до запуска ACL, фактически определяющей, принята она или нет. Неверная команда ERTN, или переданная во время обработки сообщения - не логгируется этим селектором (смотрите
“
smtp_syntax_error
” и
“
smtp_protocol_error
”).
“
host_lookup_failed
”: Когда поиск IP-адресов хоста не в состоянии найти какой-либо адрес, или когда поиск по IP адресу не возвращает имени, в логи записывается строка. Этот логгинг не применяется к прямым поискам DNS при роутинге почтовых адресов, но он применяется к поискам
“по имени
”.
“
ident_timeout
”: Строка в лог записывается каждый раз когда попытка подключиться к клиентскому порту ident привела к таймауту.
“
incoming_interface
”: Интерфейс на котором получено сообщение добавляется к строке
“<=
” как IP-адрес в квадратных скобках, помеченный путём
“I=
” и сопровождаемый двоеточием и номером порта. Локальный интерфейс и порт также добавляется к прочим стркам логов SMTP, например,
“SMTP connection from
”, и строкам о отклонениях.
“
incoming_port
”: Удалённый номер порта, с которого было получено сообщение, добавляется к записям логов и строкам заголовков
“
Received:
”, сопровождаемый IP-адресом в квадратных скобках, и отделённый от него двоеточием. Это осуществляется путём изменения значения помещённого в переменные
“
$sender_fullhost
” и
“
$sender_rcvhost
”. Запись удалённого номера порта стала более важной в связи с использованием NAT (смотрите RFC2505).
“
lost_incoming_connection
”: Строка лога записывается когда входящее SMTP соединение неожиданно обрывается.
“
outgoing_port
”: Номер удалённого порта, добавляемый к строкам доставки (которые содержат тэг
“=>
”), сопровождаемый IP-адресом. Эта опция не включена в дефолтовые настройки, поскольку в большинстве обычных конфигураций удалённый порт всегда 25 (порт SMTP).
“
queue_run
”: Логгирование запуска и завершения обработки очереди.
“
queue_time
”: Количество времени, которое сообщение находилось в очереди на локальном хосте логгируется как
“
QT=<time>
” в строках доставки (=>), например, QT=3m45s. Часы запускаются когда exim начинает приём сообщения, таким образом оно включает время приёма как и время доставки для текущего адреса. Это означает, что оно может быть больше чем разница между временем прибытия и временем доставки в логе, поскольку строка лога о прибытии не пишется, пока сообщение не будет успешно получено.
“
queue_time_overall
”: Количество времени которое сообщение было в очереди на локальном хосте логгируется как
“
QT=<time>
” в строках
“Completed
”, например, QT=3m45s. Часы запускаются когда exim начинает приём сообщения, таким образом оно включает время приёма как и полное время доставки.
“
received_recipients
”: Получатели сообщения перечислены в главном логе, как только получено сообщение. Список появляется в конце строки лога, которая записывается когда сообщение приянто, предшествуемый словом
“for
”. Адреса пеерчислены после того как они были квалифицированы, но до того как имела место перезапись адресов. Получатели от которых отказались из-за ACL для MAIL или RCPT не фигурируют в этом списке.
“
received_sender
”: Не перезаписанный оригинальный отправитель сообщения добавляется в конце строки лога, которая записывается по прибытии сообщения, после слова
“from
” (до получателей, если, также, установлена
“
received_recipients
”).
“
rejected_header
”: Если во время записи о отклонении, в лог отклонённых, был получен заголовок сообщения, полный заголовок добавляется в лог. Логгинг заголовков может быть индивидуально отключен для сообщений которые были отклонены функцией
“
local_scan()
” (смотрите раздел 41.2).
“
retry_defer
”: Строка лога записывается, если доставка задержана по причине что не достигнуто время повтора. Однако, сообщение
“retry time not reached
” всегда пропускается от индивидуальных логов сообщений, после первой попытки доставки.
“
return_path_on_delivery
”: Путь возврата, который передаётся с сообщением, включается в строки доставки и рикошета, используя тэг
“
P=
”. Он пропускается, если не было фактической доставки, например, при неудаче роутинга, или при доставке в
“
/dev/null
”, или в
“:blackhole:
”.
“
sender_on_delivery
”: Адрес отправителя сообщения, добавляемый к каждой строке доствки и рикошета, помеченный
“
F=
” (для
“from
”). Это - оригинальный отправитель, который передан с сообщением; он - не обязательно то же самое, что и исходящий путь возврата.
“
sender_verify_failure
”: Если этот селектор не установлен, не пишется отдельная строка о ошибке проверки отправителя. Строка лога для отклонения SMTP команд содержит лишь
“sender verify failed
”, таким образом, некоторые детали теряются.
“
size_reject
”: Каждый раз, когда сообщение отклоняется потому, что слишком велико, пишется строка лога.
“
skip_delivery
”: Строка лога пишется каждый раз, когда сообщение пропущено в течение работы очереди, поскольку оно заморожено, или поскольку его уже доставляет иной процесс. Сообщение которое пишется -
“spool file is locked
”.
“
smtp_confirmation
”: Ответ на финальную
“.
” в диалоге SMTP для исходящего сообщения добавляется в строку лога доставки, в форме
“C=<text>
”. Большинство MTA (включая exim), в этом ответе, возвращают идентификационную строку.
“
smtp_connection
”: Строка лога пишется каждый раз, когда SMTP соединение установлено или закрыто, исключая соединения от хостов которые совпадают с
“
hosts_connection_nolog
”. (В противоположность,
“
lost_incoming_connection
” - применется лишь когда закрытие неожиданное.) Она применяется к соединениям от локальных процессов, которые используют
“
-bs
”, точно так же как и к подключениям по TCP/IP. Если соединение разорвано в середине сообщения, строка лога пишется всегда, вне зависимости от установки этого селектора, если же он не установлен, то в начале и в конце соединнеия ничё не пишется.
Для TCP/IP соединений к даемону exim`a, число текущих соединений включается в сообщение лога для каждого нового соединения, но записывается, что счётчик сброшен, если даемон перезапущен. Также, поскольку соединения закрываются (и закрытие логгируется) в подпроцессах, счётчик может не включать соединения, которые были закрыты, но чьё завершение ещё не заметил даемон. Таким образом, когда возможно совпадение открытия и закрытия соединений в логе, значение логгируемого счётчика может быть не совсем точным.
“
smtp_incomplete_transaction
”: Когда почтовая транзакция прервана по причине RSET, QUIT, потери соединения, или как-то иначе, инцидент логгируется, и отправитель сообщения плюс любые принятые получатели включаются в строку лога. Это может предостваить очевидные доказательства атак по словарю.
“
smtp_protocol_error
”: Строка лога пишется для каждой встреченной ошибки протокола SMTP. Exim не обладает прекрасным обранужением всех ошибок протокола, из-за задержек передачи и конвейерных обработок. Если клиент оповещался о PIPELINING, сервер exim предполагает что клиент будет его использовать, и поэтому не подсчитывает
“ожидаемые
” ошибки (например, RCPT переданную после отклонённого MAIL) как ошибки протокола.
“
smtp_syntax_error
”: Строка лога пишется для каждой встреченной ошибки синтаксиса SMTP. Нераспознанная команда рассматривается как ошибка синтаксиса. Для внешних соединений, даётся идентификатор хоста; для внутренних соединений использующих
“
-bs
”, даётся идентификатор отправителя (обычно - вызывающий пользователь).
“
subject
”: Тема сообщения добавляется в строку лога прибытия, с предшествующим
“T=
” (
“T
” -
“topic
”, т.к.
“S
” уже используется для
“size
”). Любые
“слова
” MIME в теме - декодируются. Опция
“
print_topbitchars
” задаёт, должны ли символы с кодом более 127 регистрироваться неизменными, или они должны быть превращены в последовательности с обратным слэшом.
“
tls_certificate_verified
”: Дополнительный пункт добавляется к строке
“<=
” и
“=>
”, когда используется TLS. Элемент
“CV=yes
” - если сертификат узла был проверен, и
“CV=no
” - если нет.
“
tls_cipher
”: Когда сообщение посылается или принимается через шифрованное соединение, используемый метод шифрования добавляется к строке лога, с предшествующим
“X=
”.
“
tls_peerdn
”: Когда сообщение посылается или принимается через шифрованное соединение, и сетификат предоставляется удалёным хостом, DN узла добавляется к строке лога, с предшествующим
“DN=
”.
“
unknown_in_list
”: "nf установка вызывает запись в лог когда результат сравнения списка неудачен по причине неудачи поиска в DNS.
48.16 Лог сообщения
В дополнение к главному файлу логов, exim пишет лог-файл для каждого сообщения, которое он обрабатывает. Имена этих персональных логов для сообщений - идентификаторы сообщений, и они хранятся в субдиректории
“
msglog
” директории спула. Каждый лог сообщения содержит копии строк логов, которые касаются сообщения. Это облегчает выяснение статуса индивидуального сообщения без необходимости поиска по главному логу. Лог сообщения удаляется после завершения обработки сообщения, если не задана
“
preserve_message_logs
”, но она должна использоваться с большой осторожностью, поскольку логи могут очень быстро заполнить ваш диск.
На сильно загруженных системах, может быть желательным отключить использование персональных логов сообщений, для уменьшения дискового ввода-вывода. Это может быть сделано путём установки опции
“
message_logs
” в ложь.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
49. Утилиты exim`a
Множество скриптовых утилит и программ поставляются с exim`ом и описано в этой части. Также, есть Exim Monitor, который описыватся в следующей части. Описанные утилиты таковы:
49.1
“
exiwhat
” - список, что делают процессы exim`a
49.2
“
exiqgrep
” - выбор из очереди
49.3
“
exiqsumm
” - суммирование очереди
49.4
“
exigrep
” - поиск по главному логу
49.5
“
exipick
” - выбор сообщений по различным критериям
49.6
“
exicyclog
” - ротация лог-файлов
49.7
“
eximstats
” - выбор статистики из логов
49.8
“
exim_checkaccess
” - проверка приёма адреса с данного IP
49.9
“
exim_dbmbuild
” - сборка файла DBM
49.10
“
exinext
” - извлечение информации повторов
49.11
“
exim_dumpdb
” - дамб БД подсказок
49.11
“
exim_tidydb
” - очистка БД подсказок
49.11
“
exim_fixdb
” - правка БД подсказок
49.15
“
exim_lock
” - блокировка файла почтового ящика (mailbox)
Другая утилита, которая могла бы использоваться на сайтах с многими MTA -
“
exilog
” Tom Kistner's. Он обеспечивает визуализацию логов от многих серверов exim`a. Для деталей, смотрите http://duncanthrax.net/exilog/.
49.1 Поиск, что делают процессы exim`a (exiwhat)
На опреационных системах, которые могут перезапускать системные вызовы после получения сигнала (большинство современных OS), процесс exim`a отвечает на сигнал SIGUSR1, путём записи строки описывающей, что он делает в файл
“
exim-process.info
” в директории спула exim`a. Скрипт
“
exiwhat
” посылает сигнал всем процессам exim`a, которые он находит, вначале очистив файл. После чего он ждёт секунду, чтобы позволить процессам exim`a отреагировать, до отображения результатов. Для успешного управления
“
exiwhat
”, вы должны обладать достаточными привилегиями для посылки сигнала процессам exim`a, таким образом, обычно, он запускается от рута.
Предупреждение: Это неэффективный процесс. Он предназначен для случайного использования администраторами системы. Неразумно, например, настраивать скрипт, который через короткие периоды посылает процессам exim`a сигнал SIGUSR1.
К сожалению, команда
“
ps
” которую
“
exiwhat
” использует для нахождения процессов exim`a, различна в разных операционных системах. Мало того, что используются различные опции, но и формат вывода - различен. Для этого, есть некоторые систменые конфигурационные опции, которые конфигурируют, как работает
“
exiwhat
”. Если вам кажется, что он не работает, проверьте следующие компиляционные опции:
EXIWHAT_PS_CMD - команда для запуска
“
ps
”
EXIWHAT_PS_ARG - аргумент для
“
ps
”
EXIWHAT_EGREP_ARG - аргумент для
“
egrep
”, для выбора из вывода
“
ps
”
EXIWHAT_KILL_ARG - аргумент для команды
“
kill
”
Пример типичного вывода
“
exiwhat
”:
164
daemon: -q1h, listening on port
25
10483
running queue: waiting for 0tAycK-0002ij-
00
(
10492
)
10492
delivering 0tAycK-0002ij-
00
to mail.ref.example
[
10
.
19
.
42
.
42
] (editor@ref.example)
10592
handling incoming call from [
192
.
168
.
243
.
242
]
10628
accepting a local non-SMTP message
|
Превое число в строке вывода - номер процесса. Третья строка была разделена, чтоб уместиться в странице.
49.2 Селективный просмотр очереди (exiqgrep)
Эта утилита - скрипт на Perl, предоставленный Matt Hubbard. Он запускает
для получения списка очереди, содержащего лишь недоставленных получателей, и затем выбирает из вывода сообщения, которые совпадают с заданными критериями. Доступны следющие опции выбора:
“
-f <regex>
” - Совпадение с адресом отправителя. Проверяемое поле окружено угловыми скобками, таким образом, вы можете проверить рикошеты используя
“
-r <regex>
” - Совпадение с адресом получателя. Проверяемое поле не окружено угловыми скобками.
“
-s <regex>
” - Совпадение с полем размера.
“
-y <seconds>
” - Совпедение сообщений, которые раньше данного времени.
“
-o <seconds>
” - Совпедение сообщений, которые старше данного времени.
“
-z
” - Совпадение лишь с замороженными сообщеними.
“
-x
” - Совпадение лишь с незамороженными сообщеними.
Следующие опции управляют форматированием вывода:
“
-c
” - Показ только счётчика совпавших сообщений.
“
-l
” - Длинный формат - показывает полную информацию, как в выводе exim`a. Это - значение по умолчанию.
“
-i
” - Показывает лишь идентификаторы сообщений.
“
-b
” - Краткий формат - одна строка на сообщение.
“
-R
” - Показывает сообщения в обратном порядке.
Есть ещё одна опция,
“
-h
”, которая выводит список всех опций.
49.3 Подведение итогов очереди (exiqsumm)
Утилита
“
exiqsumm
” - скрипт на perl, который читает вывод
“
exim -bp
” и сложение сообщений в очереди. Таким образом, вы можете использовать его путём запуска команды типа такой:
Вывод состоит из одной строки для каждого домена, который имеет ожидающие сообщения, как в следующем примере:
3
2322
74m 66m msn.com.example
|
Каждая строка перечисляет висящие доставки для домена, их полный объём, и отрезки времени, которые ожидают самое старое и самое новое сообщения. Отметтьте, что число зависших доставок больше чем число сообщений, когда сообщения имеют более одного получателя.
Итоговая строка выводится в конце. По умолчанию, вывод сортируется по доменному имени, но
“
exiqsumm
” обладает опциями
“
-a
” и
“
-c
”, вызывающих сортировку вывода по наиболее старым сообщениям, и по счётчику сообщений, соотвественно.
Вывод
“
exim -bp
” содержит оригинальные адреса в сообщении, таким образом, он также применяется к выводу
“
exiqsumm
”. Домены сренерированные из адресов в результате альясинга или форвардинга - не включаются (если не использовалась опция
“
one_time
” роутера
“
redirect
” для конвертации из в адреса
“верхнего уровня
”).
49.4 Извлечение специфической информации из лога (exigrep)
Утилита
“
exigrep
” - скрипт на perl, который ищет по одному или нескольким главным логам элементы совпадающие с заданным шаблоном. Когда он находит совпадение, он извлекает все записи логов для уместного сообщения, а не только совпавшие с шаблоном. Таким образом,
“
exigrep
” может извлекать полный лог для заданного сообщения, или всю почту для заданного пользователя, или для заданного хоста, например. Входные файлы должны быть в формате логов exim`a или syslog.
Если совпадающие строки логов не ассоциируются с определённым сообщением, то оно всегда включаются в вывод
“
exigrep
”. Использование:
exigrep [-l] [-t<n>] <pattern> [<log file>] ...
|
Аргумент
“
-t
” определяет число секунд. Он добавляет дополнительное условие для выбора сообщения. Сообщения которые являются полными, показываются лишь если они провели в очереди более чем
“<n>
” секунд.
Флаг
“
-l
” - буквальный флаг, для обработки всех символов шаблона как они есть. Иначе паттерн должен быть регулярным выражением perl. Сравнение шаблона нечувствительно к регистру. Если в командной строке не задано имя файла, читается стандартный ввод.
Если местоположение команды
“
zcat
” известно из определения ZCAT_COMMAND в
“
Local/Makefile
”,
“
exigrep
” автоматически передаёт файлы, чьи имена заканчиваются на COMPRESS_SUFFIX, через
“
zcat
” и затем ищет.
49.5 Отбор сообщений по различным критериям (exipick)
Утилита John Jetmore -
“
exipick
”, включена в дистрибутив exim`a. Она выводит список сообщений из очереди согласно разнообразным критериям. Для деталей, запустите:
49.6 Ротация лог-файлов (exicyclog)
Скрипт
“
exicyclog
” может быть использован для ротации логов
“
mainlog
” и
“
rejectlog
”. В этом нет необходимости лишь если используется syslog, или если вы используете файлы логов со штампом даты в их именах (смотрите раздел 48.3). Некоторые операционные системы имеют собственные стандартные механизмы для ротации логов, и, если предпочитаете, они могут использоваться вместо
“
exicyclog
”. Есть два варианта опций командной строки для
“
exicyclog
”:
“
-k <count>
” - определяет число оставляемых лог-файлов, перезадавая значение по умолчанию, установленное при сборке exim`a. Значение по умолчанию этого счётчика - 10.
“
-l <path>
” - определяет путь к файлам логов, в том же формате, что и в опции exim`a
“
log_file_path
” (например,
“/var/log/exim_%slog
”), перезадавая значение по умолчанию скрипта, который находит значение из конфигуции exim`a.
Каждый раз при запуске
“
exicyclog
” файлы передвигаются вниз на один. Если имя главного лока файлов -
“
mainlog
” (по умолчанию), тогда при запуске
“
exicyclog
”
“
mainlog
” становиться
“
mainlog.01
”, предыдущий
“
mainlog.01
” в
“
mainlog.02
” и т.д. до предела, установленного в скрипте или опцией
“
-k
”. От файлы логов, чьи имена превысили лимит - отказываются. Лог отклонённых обрабатывается подобным образом.
Если лимит более 99, скрипт использует 3-х цифровые номера, типа
“
mainlog.001
”,
“
mainlog.002
”, и т.д.Если вы изменяете число менее 99 на большее чем 99, или наоборот, вы должны будете исправить имена существующих логов.
Если файл
“
mainlog
” не существует, скрипт ничего не делает. Файлы которые достигли конца - удаляются. Все файлы чей номер более 01 - сжимаются, используя команду сжатия сконфигурированную установкой COMPRESS_COMMAND в
“
Local/Makefile
”. Обычно,
“
exicyclog
” запускается ежедневно из root`ового
“
crontab
”, строкой формы:
1
0
* * * su exim -c /usr/exim/bin/exicyclog
|
предполагая, что вы используете для пользователя exim`a имя
“exim
”. Вы можете запускать
“
exicyclog
” от root`a, если вы этого желаете, но в этом нет необходимости.
49.7 Почтовая статистика (eximstats)
Скрипт на perl с именем
“
eximstats
” предоставлен для извлечения статистической информации из лог-файлов. Вывод - является простым текстом, или HTML. Логи exim`a также поддерживаются системой
“
Lire
”, сделанной LogReport Foundation http://www.logreport.org.
Скрипт был нерабочим а течение долгого времени. Последняя версия - результат довольно большой переработки Steve Campbell. По умолчанию, даётся много информации, но есть опции для подавления некоторых её частей. После любых опций, аргументами должны быть файлы главного лога. Например:
eximstats -nr /var/spool/exim/log/mainlog.
01
|
По умолчанию,
“
eximstats
” извлекает информацию о числе и объёме соощений полученных или доставленных на различные хосты. Информация сортирована по обоим, счётчику сообщений и по объёму, и высшие 50 хостов, в каждой категории, перечислены в стандартном выводе. Подобная информация, основанная на почтовых адресах или доменах, может быть запрошена при помощи различных опций. Для сообщений, доставляемых и передаваемых локально, подобная статистика делается на основании пользователей.
Вывод, также включает общий счётчик и статистику о ошибках доставки, и гистограммы, показывающие число сообщений переданных и доставленных на каждый час дня. Доставки с более чем одним адресом в конверте (например, SMTP транзакция с более чем одной командой RCPT) подсчитывается как одна доставка.
Хотя, обычно, уведомляется о большем числе доставок чем приёмов (поскольку сообщения могут иметь более одного получателя),
“
eximstats
” может сообщить сообщить о большем числе отправленных сообщений, чем было получено, даже если очередь пуста в начале и в конце рассматриваемого периода. Если входящее сообщение не содержит допустимых получателей, для него доставки не записываются. Рикошеты обрабатываются как полностью независмые сообщения.
Скрипт
“
eximstats
” всегда выводит полное резюме, дающее объём и число переданных и доставленных сообщений, и число хостов вовлечённых в каждый случай. Также он выводит число задержанных сообщений (т.е. которые не были полностью доставлены в первую попытку), и число тех, у которых хотя бы один ардет был неудачен.
Оставшийся вывод находится в секциях, которые могут быть независимо отключены, или модифицированы различными опциями. Он состоит из изложения доставко по транспортам, гистограмм сообщений переданных и доставленных по интервалу времени (по умолчанию - по часу), информации р времени сообщений проведённом в очереди, списке релееных сообщений, списке высшиих 50 хостов по отправке, локальных отправителей, хостов назначения, и назначении локальных пользователей по счётчику и объёму, и списку происходивших ошибок доставки.
Информация о релеинге перечисляет список сообщений которые были реально отрелеены, т.е. которые прибыли с удалённого хоста и были непосредственно доставлены на некоторый другой удалённый хост, без локальной обработки (например, без альясинга или форвардинга).
Есть довольно много вариантов управления опциями
“
eximstats
”, для точного управления его выводом. Они непосредственно задокументированы в перл-скрипте, и могут быть извлечены путём запуска команды
“
perldoc
” для скрипта. Например:
perldoc /usr/exim/bin/eximstats
|
49.8 Проверка политики доступа (exim_checkaccess)
Аргумент командной строки
“
-bh
” позволяет вам запускать поддельную SMTP сессию с отладочным выводом, для проверки, что делает exim когда применяет управление политиками ко входящей SMTP-почте. Однако, не все достаточно знакомы с протоколом SMTP, чтобы быть в состоянии полностью использовать
“
-bh
”, и иногда вы лишь хотите ответа на вопрос - имеет ли какой-то адрес доступ? - без получения дополнительных деталей.
Утилита
“
exim_checkaccess
” -
“упакованная
” (
“packaged
”) версия
“
-bh
”. Она понимает два аргумента, IP-адрес и адрес электронной почты:
exim_checkaccess
10
.
9
.
8
.
7
A.User@a.domain.example
|
Утилита управляет вызовом exim с опцией
“
-bh
”, для тестирования, будет ли принят данный почтовый адрес в команде RCPT в соединении TCP/IP от хоста с заданным IP адресом. Вывод утилиты - или слово
“accepted
”, или ошибочный ответ SMTP, например:
Rejected:
550
Relay not permitted
|
При работе этого теста, утилита использует
“<>
” как отправителя конверта в команде MAIL, но вы можете это изменить, предоставляя дополнительные опции. Их передают непосредственно команде exim`a. Например, для задания, что тест запускается с адресом отправителя
“
himself@there.example
”, вы можете использовать:
exim_checkaccess
10
.
9
.
8
.
7
A.User@a.domain.example \
-f himself@there.example
|
Отметтьте, что эти дополнительные элементы командной строки exim`a нужно давать после двух обязательных элементов.
Поскольку
“
exim_checkaccess
” использует
“
-bh
”, он не выполянет обратный вызов при проведении проверки. Вы можете запустить проверку с включением обратного вызова используя
“
-bhc
”, но это недоступно в
“упакованной
” (
“packaged
”) форме.
49.9 Создание файлов DBM (exim_dbmbuild)
Программа
“
exim_dbmbuild
” читает входной файл, содержащий ключи и данные в формате используемом поиском
“
lsearch
” (смотрите раздел 9.3). Она пишет файлы DBM используя имена альясов в нижнем регистре как ключи, и оставшуюся информацию - как данные. Приведение к нижнему регистру может быть предотвращено путём вызова программы с опцией
“
-nolc
”.
Завершающий ноль включается как часть ключевой строки Это ожидается типом поиска
“
dbm
”. Однако, если задана опция
“
-nozero
”,
“
exim_dbmbuild
” создаёт файлы без завершающих нулей в строках ключей, или строках данных. Тип поиска
“
dbmnz
” может быть использован с такими файлами.
Программа требует двух аргументов: имя входного файла (который может быть одним дефисом, для индикации стандартного ввода), и именем выходного файла. Она создаёт вывод с временным именем, и, затем, переименовывает его, если всё успешно.
Если используется родной интерфейс DB (USE_DB установлена в компиляционном конфигурационном файле - это часто бывает в свободных версиях UNIX) два имени файлов должны быть различными, поскольку в этом режиме, функции Berkeley DB создают один выходной файл, используя точно заданное имя. Например:
exim_dbmbuild /etc/aliases /etc/aliases.db
|
читает файл системных альясов, и создаёт его DBM версию в
“
/etc/aliases.db
”.
В системах, которые используют шаблоны
“
ndbm
” (большинство проприетарных версий UNIX), используются два файла, с суффиксами
“
.dir
” и
“
.pag
”. В этом окружении, суффиксы добавляются ко второму аргументу
“
exim_dbmbuild
”, таким образом он может быть как и первый. Это также имеет место, когда функции Berkeley используются в совместимом режиме (хотя это не рекомендуется), поскольку в этом случае к имени файла добавляется суффикс
“
.db
”.
Если происходит столкновение с двойным ключом (повторяющимся - прим. lissyara), программа выводит предупреждение, и после завершения, она возвращает код 1, а не ноль, если не задана опция
“
-noduperr
”. По умолчанию, используется лишь первый дубликат - это делает её совместимой с поисками
“
lsearch
”. Также, есть опция
“
-lastdup
”, вызывающая использование последнего дубликата вместо первого. Ещё есть опция
“
-nowarn
”, которая останавливает перечисление двойных ключей на
“
stderr
”. Для других ошибок, при которых новый файл, фактически, не создаётся, код возврата - 2.
49.10 Нахождение индивидуальных времён повторов (exinext)
Утилита, называемая
“
exinext
” (по большей части - скрипт perl), предоставляет возможность выбрать специфическую информацию из БД повторов. Данный почтовый домен (или полный адрес) ищется в хостах для этого домена, и выводит любую информацию повторов для хоста или домена. В настоящее время, информация повторов получается путём запуска
“
exim_dumpdb
” (смотрите ниже), и последующей обработки её вывода. Например:
$ exinext piglet@milne.fict.example
kanga.milne.example:
192
.
168
.
8
.
1
error
146
: Connection refused
first failed:
21
-Feb-
1996
14
:
57
:
34
last tried:
21
-Feb-
1996
14
:
57
:
34
next try at:
21
-Feb-
1996
15
:
02
:
34
roo.milne.example:
192
.
168
.
8
.
3
error
146
: Connection refused
first failed:
20
-Jan-
1996
13
:
12
:
08
last tried:
21
-Feb-
1996
11
:
42
:
03
next try at:
21
-Feb-
1996
19
:
42
:
03
past final cutoff time
|
Также, вы можете дать
“
exinext
” локальную часть, без домена, и он выдаст любую информацию повторов для этой локальной части, в вашем дефолтовом домене. Идентификатор сообщения может использоваться для получения информации повторов относящейся к специфическому сообщению. Она существует лишь когда попытка доставки сообщения на удалённый зост привела к специфической для сообщения ошибки (смотрите раздел 44.2).
“
exinext
” - не очень эффективен, но, как ожидается, он не будет часто запускаться.
Утилита
“
exinext
” вызывает exim для нахождения информации, типа расположения spool-директории. Утилита имеет опции
“
-C
” и
“
-D
”, передаваемые командам
“
exim
”. Первая определяет альтернативный конфигурационный файл exim`a, и вторая устанавливает макрос для использования в конфигурационном файле. Эти особенности должны помочь в тестировании, но они, также, могли бы быть полезны в окружении, где используется более одного конфигурационного файла.
49.11 Обслуживание БД подсказок
Три утилиты предоставляются для обслуживания файлов DBM, которые exim использует для хранения его информации подсказок о доставках. Каждая программа требует двух аргументов. Первый определяет имя директории спула exim`a, и второй - имя БД с которой она работает. Они, таковы:
“
retry
”: БД информации повторов
“
wait-<transport name>
”: БД информации о сообщениях, ожидающих удалённых хостов
“
callout
”: кэш обратных вызовов
“
ratelimit
”: данные для осуществления условий ACL ограничения частоты
“
misc
”: иные данные подсказок
БД
“
misc
” используется для
Сериализации запусков ETRN (когда установлена
“
smtp_etrn_serialize
”)
Сериализации доставки к специфическому хосту (когда
“
smtp_etrn_serialize
” установлена в транспорте
“
smtp
”)
49.12 exim_dumpdb
Всё содержимое БД пишется на стандартный вывод, при помощи программы
“
exim_dumpdb
”, которая не имеет опций или аргументов кроме как имена спула и БД. Например, для дампа БД повторов:
exim_dumpdb /var/spool/exim retry
|
На каждое вхождение производится две строки вывода:
T:mail.ref.example:
192
.
168
.
242
.
242
146
77
Connection refused
31
-Oct-
1995
12
:
00
:
12
02
-Nov-
1995
12
:
21
:
39
02
-Nov-
1995
20
:
21
:
39
*
|
Первый элемент в первой строке - ключ записи. Он начинается с одной из букв -
“R
” или
“T
”, в зависимоти от того, ссылается ли она на повтор роутинга, или транспорта. Для локальной доставки, следующая часть - локальный адрес; для удалённой доставки - это имя удалённого хоста, сопровождаемое его неудачным IP-адресом (если
“
no_retry_include_ip_address
” не установлена в транспорте
“
smtp
”). Если удалённый порт не стандартный (порт 25), он добавляется к IP-адресу. Затем следует код ошибки, дополнительный код ошибки, и текстовое описание ошибки.
Три времени во второй строке - время первой ошибки, время последней попытки доставки, и вычисленное время для следующей попытки. Строка завершается звёздочкой, если время убывания для последнего повтора было превышено.
Каждая строка вывода
“
exim_dumpdb
” для БД
“
wait-xxx
” содержит имя хоста, сопровождаемое списком идентификаторов для сообщений, которые есть, или ждут доставки на этот хост. Если для какого-то хоста очень много (идентификаторов, наверное - прим. lissyara), могут быть замечены повторяющиеся записи, с номерами последовательности добавленным к имени хоста. Данные в этих записях, часто являются устаревшими, поскольку сообщение может быть сроучено к нескольким альтернативным хостам, и exim не предпринимает усилий для ведения перекрёстных ссылок.
49.13 exim_tidydb
Утилита
“
exim_tidydb
” используется для упорядочивания содержимого БД подсказок. Если она запускается без опций, она удаляет все записи, которые старше 30 дней. Возраст вычисляется из даты и времени, когда запись была последний раз обновлена. Отметтьте, что в случае БД повторов, это не время с момента первого отказа. Информация о хосте, который лежал более 30 дней останется в БД, при условии, что записи обновляются достаточно часто.
Дата сокращения может быть изменена путём опции
“
-t
”? которая должна сопровождаться временем. Например, для удаления всех записей которые старше недели из БД повторов:
exim_tidydb -t 7d /var/spool/exim retry
|
Обе БД -
“
wait-xxx
” и
“
retry
”, содержат элементы, которые вовлекают идентификаторы сообщений. Они фигурируют в форме данных в записях, где ключи - хосты, они были сообщениями ожидавшими этих хостов - и в последующем они - ключи для информации о сообщениях, перенёсших определённые типы ошибок. Когда
“
exim_tidydb
” работает, производится проверка? что идентификаторы сообщений записанные в БД - это сообщения, которые всё ещё в очереди. Идентификаторы для сообщений, которые больше не существуют, удаляются из записей
“
wait-xxx
”, и если остаются пустые записи, они удаляются. Для БД
“
retry
”, удаляются записи чьи ключи - идентификаторы несуществующих сообщений. Утилита
“
exim_tidydb
” выводит комментарии на стандартный вывод каждый раз, когда она удаляет информацию из БД.
Определённые записи автоматически удаляются exim`ом когда они больше не нужны., но иные не удаляются. Например, если все MX хосты домена лежат, записи повторов создаются для каждого из них. Если первичный MX подымется первым, его запись удалится, когда exim успешно доставит на него, но записи для других - останутся, поскольку exim не пробовал эти хосты.
Это важно, поэтому, периодически запускайте
“
exim_tidydb
” для всех БД подсказок. Вы должны делать это в спокойное время суток, поскольку она требует, чтобы БД была заблокирована (и, поэтому, недоступна exim`y) когда она работает. Удаление записей из файлов DBM, обычно, не делает файл меньше, но все обычные библиотеки DBM умеют заново использовать освобождённое место. После начальной фазы увеличения в размере, БД, обычно, достигают точки, в которой они не становятся намного больше, пока они регулярно обслуживаются.
Предупреждение: Если вы никогда не будете запускать
“
exim_tidydb
”, то вероятно, используемое БД подсказок место будет продолжать увеличиваться.
49.14 exim_fixdb
Программа
“
exim_fixdb
” - утилита для интерактивной можификации БД. Главное её использование - для тестирования exim`a, но, также, иногда она может быть полезна для обхода проблемы на живой системе. Она не имеет опций, и её интерфейс несколько грубоват. На входе, она выводит подсказку в виде правой угловой скобки. В это время может быть введён ключ записи, и будут отображены данные для этой записи.
Если в следующеи приглашении будет введено
“d
”, запись будет удалена. Для всех кроме БД
“
retry
”, это - единственная возможная операция. Для БД
“
retry
”, каждое поле предшествуется номером, и данные для индивидуальных полей могут быть изменены путём ввода номера поля, сопровождаемого новыми данными, напрмер:
сбросит время следующей попытки доставки. Значение времени даётся как последовательность цифровых пар для года, месяца, дня, часа, и минут. Двоеточия могут использоваться как опциональные разделители.
49.15 Обслуживание почтового ящика (exim_lock)
Утилита
“
exim_lock
” блокирует файл почтового ящика, используя тот же самый алгоритм что и exim. Для обсуждения проблем блокировки, смотрите раздел 26.3.
“
exim_lock
” может быть использована для предотвращения какой-либо модификации почтового ящика exim`ом или пользовательским агентом, при исследовании проблемы. Утилита требует имя файла как её первый аргумент. Если блокировка успешна, второй аргумент запускает команду (используя функцию
“
system()
” С); если второй аргумент не задан, используется значение переменной окружения SHELL; если она не задана или пуста, запускается
“
/bin/sh
”. Когда команда завершается, почтовый ящик разблокируется, и утилита завершается. Доступны следующие опции:
“
-fcntl
” - Использовать для блокировки открытого почтового ящика
“
fcntl()
”.
“
-flock
” - Использовать для блокировки открытого почтового ящика
“
flock()
”, если операционная система это поддерживает.
“
-interval
” - Она должна сопровождаться числом, которое - число секунд; она устанавливает интервал засыпания между повторами (по умолчанию - 3).
“
-lockfile
” - Созавать файл блокировки до открытия почтового ящика.
“
-mbx
” - Блокировать почтовый ящик используя парвила MBX.
“
-q
” - Убрать проверочный вывод.
“
-retries
” - Она должна сопровождаться числом; оно устанавливает сколько бкдет предприниматься попыток установить блокировку (по умолчанию - 10).
“
-restore_time
” - Эта опция заставляет
“
exim_lock
” восстанавливать время изменённения и время чтения блокированного файла до выхода. Это позволяет получить вам доступ к блокированному почтовому ящику (например, чтобы получить резервную копию) не изменяя время, которое впоследствии увилит пользователь.
“
-timeout
” - Она должна сопровождаться числом, которое - число секунд; оно устанавливает таймаут который будет использоваться с блокировкой
“
fcntl()
”. Если она не установлена (по умолчанию), используются неблокирующие вызовы.
“
-v
” - Генерировать подробный вывод.
Если не заданы
“
-fcntl
”,
“
-flock
”,
“
-lockfile
” или
“
-mbx
”, по умолчанию создаётся файл блокировки, и, также, на почтовом ящике используется блокировка
“
fcntl()
”, что делает и exim, по умолчанию. Использование
“
-flock
” и
“
-fcntl
” требует чтобы было право писать в файл; использование
“
-lockfile
” требует чтобы было право записи в директорию, содержащую файл. Блокировка путём файла не длится вечно; exim предполагает, что блокировка истекла, если он старее 30 минут.
Опция
“
-mbx
” может использоваться с одной, или обоими -
“
-fcntl
” или
“
-flock
”. По умолчанию, предполагается
“
-fcntl
”. Блокирока MBX вызывает отключение общей блокировки открытого почтового ящика, и эксклюзивную блокировку на файле
“
/tmp/.n.m
”, где
“
n
” и
“
m
” - номер устройства и номер иноды файла почтового ящика. Когда блокировка снята, если для почтового ящика может быть получена эксклюзивная блокировка, файл в
“
/tmp
” - удаляется.
Дефолтовый вывод содержит проверки имеющих место блокировок. Опция
“
-v
” вызывает выдачу некоторой дополнительной информации. Опция
“
-q
” подавляет весь вывод, исключая сообщения о ошибках.
Команда типа:
exim_lock /var/spool/mail/spqr
|
запускает интерактивный шелл, когда файл заблокирован, тогда как:
exim_lock -q /var/spool/mail/spqr <<End
<some commands>
End
|
запускает определённую неинтерактивную последовательность команд, когда файл заблокирован, подавляя весь проверочный вывод. Одна команда может быть запущена командой типа:
exim_lock -q /var/spool/mail/spqr \
"cp /var/spool/mail/spqr /some/where"
|
Отметтьте, что если команда предоставлена, она должна полностью находиться во втором аргументе, следовательно - в кавычках.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
21. РОУТЕР QUERYPROGRAM.
Роутер
“queryprogram
” маршрутизирует адрес путем вызова внешней команды и после действует в соответствии с ее выводом. Это достаточно тяжеловесный способ маршрутизации и предназначен он главным образом для несильно нагруженных систем или для экспериментов. Однако, если есть возможность использовать опции предусловий (
“domains
”,
“local_parts
”, и т.д. ), чтобы пропускать этот роутер для большинства адресов, то он может использоваться в специальных целях даже на загруженном узле. Ниже перечислены следующие частные опции роутера:
command
|
Use: queryprogram
|
Type: string†
|
Default: unset
|
|
Данная опция должна быть обязательно установлена. Она определяет команду, которая должна запускаться. Команда разделяется на имя команды и ее аргументы, и затем каждый из них преобразуется отдельно (точно так же как и для транспорта
“pipe
”, описанного в главе 29).
command_group
|
Use: queryprogram
|
Type: string
|
Default: unset
|
|
Эта опция определяет групповой идентификатор (gid) для запуска команды. Она должна быть установлена в том случае, если опции
“command_user
” присвоено числовое значение идентификатора пользователя (uid). Если данная опция начинается с цифры, то она интерпретируется как числовое значение группового идентификатора (gid). В противном случае, поиск ее значения выполняется путем вызова функции
“
getgrnam()
”.
command_user
|
Use: queryprogram
|
Type: string
|
Default: unset
|
|
Данная опция должна быть обязательно установлена. Она определяет идентификатор пользователя (uid), от имени которого должна быть выполнена команда. Если опция начинается с цифры, то она интерпретируется как числовое значение идетификатора пользователя. В противном случае, поиск ее значения выполняется при помощи функции
“
getpwnam()
”, а если не определена опция
“command_group
”, то также происходит и поиск значения группового идентификатора gid.
Внимание: Изменение uid и gid возможно лишь когда exim запущен от пользователя root, что происходит, в нормальной конфигурации, во время доставки. Однако, во время проверки адреса, в процессе приёма сообщения, exim, обычно работает не от пользователя root. Если маршрутизатор
“queryprogram
” вызывается не от root, то exim не может изменить uid или gid до выполнения команды. В таких обстоятельствах, команда выполняется с текущими gid и uid.
current_directory
|
Use: queryprogram
|
Type: string
|
Default: /
|
|
Эта опция определяет абсолютный путь, куда происходит переход перед запуском команды.
timeout
|
Use: queryprogram
|
Type: time
|
Default: 1h
|
|
Если команда не завершается в течение периода таймаута, то ее группа процессов уничтожается и сообщение замораживается. Нулевое значение времени указывает на отсутствие таймаута.
Стандартный вывод команды направляется в конвейер (pipe), чтение из которого производится когда команда завершается. Он должен состоять из одной строки вывода, содержащей до 5 полей, разделенных пробелами. Максимальная длинна строки 1923 символа. Более длинные линии укорачиваются. Первое поле является одним из нижеперечисленных слов (независимо от регистра):
“Accept
”: маршрутизация выполнена успешно; остальные поля определяют какие действия выполнять (см. ниже).
“Decline
”: роутер отклоняется; передать адрес на следующий роутер, если только не установлена опция
“no_more
”
“Fail
”: маршрутизация завершилась неудачно; больше не передавать этот адрес роутерам. Весь следующий за этим текст является сообщением об ошибке. Если запуск роутера выполняется как часть проверки адреса во время входящего SMTP сообщения, то сообщение включается в SMTP-ответ.
“Defer
”: в данный момент маршрутизация не может быть завершена; попробуйте позже еще раз. Весь следующий за этим текст в строке является сообщением об ошибке, которое записывается в журнал. Сообщение не вклчается в SMTP-ответ.
“Freeze
”: то же что и
“defer", за исключением того, что сообщение замораживается.
“Pass
”: передать адрес на следующий роутер (или на роутер, определенный опцией
“pass_router
”), перекрывая опцию
“no_more
”.
“Redirect
”: сообщение перенаправляется. Оставшаяся часть строки представляет собой список новых адресов, маршрутизируемых независимо друг от друга, начиная с первого роутера, либо с роутера, определенного опцией
“redirect_router
”.
Если первым словом является
“accept
”, то остаток строки состоит из некоторого количества ключевых слов и их значений, например так (строка разделена на две, для того, чтобы уместить по ширине страницы):
ACCEPT TRANSPORT=<transport> HOSTS=<list of hosts>
LOOKUP=byname|bydns DATA=<text>
|
Данные могут быть указаны в произвольном порядке, к тому же все они являются необязательными. Если не определен транспорт, то используется транспорт, описанный общей опцией
“transport
”. Список узлов и тип поиска необходимы только в том случае, если транспортом является транспорт smtp, который не может самостоятельно определить список узлов.
Формат списка узлов такой же как и для роутера manualroute. Он может содержать как IP-адреса и имена узлов, так и имена с последующим суффиксом
“/MX
” для определения подсписков узлов, полученных путем поиска MX-записей.
Если тип поиска не определен, то Exim ведет себя следующим образом во время попыток нахождения IP-адреса для каждого узла: Сначала выполняется DNS-запрос. Если в результате возвращается что-либо, отличное от HOST_NOT_FOUND, то используется этот результат. В противном случае, Exim вызывает функцию
“
getipnodebyname()
” или
“
gethostbyname()
”, и результатом поиска в этом случае является результат этого вызова.
Если установлено поле DATA, то его значение помещается в переменную
“
$address_data
”. Например, данная возвращенная строка
accept hosts=x1.y.example:x2.y.example data="rule1"
|
маршрутизирует адрес на транспорт по умолчанию, список узлов состоит из двух узлов. Если транспорт запускается, то строка
“rule1
” помещается в переменную
“
$address_data
”.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
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
|
Если файл не существует или не содержит никаких инструкций по выполнению (например, файл пуст или содержит только комментарии), то роутер пропускается. Внимание: это не тот случай, когда файл содержит синтаксически допустимые элементы, которые могут иногда выдавать пустые адреса, например элементы, содержащие только адресные комментарии в соответствии с RFC2822.
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, такие локальные части могут быть предварены символом
“\
”, но это не является требованием для предотвращения зацикливания. Однако, это дает разницу если таким образом обрабатывается более одного домена.
Если элемент начинается с символа
“\
” и остальная часть его является адресом, соответствующим RFC2822, не включающим в себя домен, то этот элемент дополняется доменом входящего адреса. В отсутствие предшествующего символа
“\
” неполные адреса дополняются используя значение опции
“qualify_recipient
”, но вы можете принудительно изменить входящий домен, используя опцию
“qualify_preserve_domain
”.
Если существуют псевдонимы для локальных пользователей, то нужно быть осторожным. Рассмотрим MTA, обрабатывающий простой локальный домен, где системный файл псевдонимов содержит:
Теперь предположим, что Сэм (чей идентификатор -
“spqr
”) хочет сохранять копии сообщений в локальном почтовом ящике, а также перенаправлять копии куда-либо еще. Он создает такой файл перенаправления:
Sam.Reman, spqr@reme.elsewhere.example
|
С подобными настройками входящее сообщение для
“Sam.Reman
” отклоняется. Роутер redirect для системных псевдонимов не обрабатывает
“Sam.Reman
” второй раз, потому как он уже маршрутизировал его, и следующие роутеры по-видимому тоже не смогут обработать псевдоним. Файл перенаправления должен на самом деле содержать:
spqr, spqr@reme.elsewhere.example
|
но т.к. это распространенная ошибка, то существует опция
“check_ancestor
” (см. ниже) для ее обхода. Обычно она определяется в роутере, обрабатывающем пользовательские файлы
“
.forward
”.
22.6 Специальные конструкции в списках перенаправления
Вдобавок к адресам в списках перенаправления (не являющихся фильтрами) могут быть следующие типы конструкций:
Элемент рассматривается как команда перенаправления если он начинается с символа
“|
” и не распознается как адрес соответствующий RFC2822. Транспорт для запуска этой команды должен быть определен опцией
“pipe_transport
”. Обычно, пользователь и группа, от имени которых выполняется доставка, определяются роутером или транспортом. По умолчанию, используются пользователь и группа, отведенные для Exim.
Одинарные или двойные кавычки могут использоваться для заключения аргументов команды перенаправления, причем для одинарных кавычек интерполяция содержимого внутри не производится. Если команда содержит символ
“,
”, то ее необходимо поместить в двойные кавычки, например:
"|/some/command ready,steady,go"
|
т.к. элементы в списках перенаправления оканчиваются
“,
”. Однако недопустимо помещать в кавычки только команду. Например,
|"/some/command ready,steady,go"
|
интерпретируется как перенаправление вывода с довольно странным именем команды без аргументов.
Элемент интерпретируется как путь если он начинается с
“/
” и не распознается как адрес соответствующий RFC2822. Например,
трактуется как имя файла, но
/s=molari/o=babylon/@x400gate.way
|
распознается как адрес. Для файла должен быть определен транспорт при помощи опции
“file_transport
”. Однако, если путь оканчивается символом
“/
” то он интерпретируется как имя директории, а не имя файла, и в этом случае используется опция
“directory_transport
”.
Обычно, пользователь и группа, от имени которых выполняется доставка, определяются роутером или транспортом. По умолчанию, используется пользователь и группа, из под которых работает Exim. Однако, если перенаправление производится в
“/dev/null
”, то доставка в него передается на высокий уровень, и запись в логе выглядит как
“**bypassed**
” вместо имени транспорта. В этом случае, пользователь и группа не используются.
Если элемент выглядит таким образом:
то он представляет собой список дальнейших элеменотв, которые берутся из файла, находящегося по данному пути. Замечание: этот файл не может быть файлом фильтров; он является просто добавлением к списку. Элементы во включаемом списке разделяются
“,
” или новыми строками. Если это первый элемент в списке псевдонимов в файле, то имя псевдонима должно отделяться
“:
”. Следующий пример неверен:
list1 :include:/opt/lists/list1
|
Должно быть так:
list1: :include:/opt/lists/list1
|
Иногда вы хотите выбрасывать почту с определенной локальной частью почтового адреса. Способ преобразования опции
“data
” в пустую строку не работает потому как он заставляет роутер отклонять сообщение. Вместо этого, используется специальный элемент:
То, что он делает, видно из его названия. Не происходит никакой доставки, и не генерируется сообщения об ошибке. Это приводит к такому же эффекту, что и указание
“/dev/null
”, однако это может быть избирательно выключено.
Внимание: Если
“:blackhole:
” указано где-либо в списке перенаправления, то
доставка для исходной локальной части почтового адреса не выполняется, даже если присутствуют другие элементы перенаправления. Если вы создаете многоэлементный список (например, путем чтения из базы данных) и вам нужна возможность обеспечить элемент такого, который не выполняет доставку, то вы должны использовать
“/dev/null
”.
Попытка доставки почты для определенного адреса может быть отложена или принудительно завершена неудачно при помощи элементов:
или
соответственно. Если список перенаправления содержит такой элемент, то он применяется ко всему списку; другие элементы в списке игнорируются (кроме
“: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) для поиска псевдонимов. Однако, может быть потребность для исключений их этого. Они могут быть обработаны путем псевдонимизации их к:
Отличие от
“: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
|
redirect
|
boolean
|
false
|
|
Установка этой опции позволяет использовать
“:defer:
” в данных перенаправления (не в фильтрах), либо команду
“defer
” в файле фильтров Exim.
опция
|
использование
|
тип
|
по-умолчанию
|
allow_fail
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то элемент
“:fail:
” можно использовать в списке перенаправления, и команда
“fail
” может использоваться в файле фильтров.
опция
|
использование
|
тип
|
по-умолчанию
|
allow_filter
|
redirect
|
boolean
|
false
|
|
Установка этой опции позволяет Exim интерпретировать данные перенаправления,
начинающихся с
“#Exim filter
” или
“#Sieve filter
” как множество инструкций
по фильтрации. Есть несколько свойств файлов фильтров Exim, которые
некоторые администраторы могут захотеть запретить; см. опции
“forbid_filter_xxx
” ниже. Фильтр запускается от имени пользователя и группы, определенных общими опциями
“user
” и
“group
”. Они берут свои умолчательные значения из файла паролей если установлена опция
“check_local_user
”, так что в случае наличия пользовательских файлов фильтров фильтр запускается от имени соответствующего пользователя. Если опция
“allow_filter
” истинна, то Exim требует чтобы была выставлена опция
“check_local_user
” или
“user
”.
опция
|
использование
|
тип
|
по-умолчанию
|
allow_freeze
|
redirect
|
boolean
|
false
|
|
Установка этой опции позволяет использовать команду
“freeze
” в фильтре Exim. Эта команда чаще встречается в системных фильтрах, и выключена по умолчанию для фильтров перенаправления т.к. это не то, что вы бы хотели позволить делать обычным пользователям.
опция
|
использование
|
тип
|
по-умолчанию
|
check_ancestor
|
redirect
|
boolean
|
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
|
redirect
|
boolean
|
смотрите ниже
|
|
Если используется опция
“file
”, то группа-владелец файла проверяется только если установлена эта опция. Разрешенные группы - это те, которые перечислены в опции
“owngroups
”, вместе с пользовательской группой по умолчанию в случае если установлена опция
“check_local_user
”. Если файл принадлежит неверной группе, то маршрутизация откладывается. Значение по умолчанию для этой опции - истина в случае если установлена опция
“check_local_user
” и опция
“modemask
” дает права на запись для группы, либо установлена опция
“owngroups
”. В любом другом случае она ложна и никаких проверок группы не выполняется.
опция
|
использование
|
тип
|
по-умолчанию
|
check_owner
|
redirect
|
boolean
|
смотрите ниже
|
|
Если используется опция
“file
”, то владелец файла проверяется только если установлена эта опция. Если установлена
“check_local_user
”, то локальный пользователь получает разрешение; в другом случае владелец должен быть одним из перечисленных в опции
“owners
”. Значение по умолчанию для этой опции - истина если установлены опции
“check_local_user
” или
“owners
”. В противном случае значение по умолчанию - ложь, и никаких проверок владельца не производится.
опция
|
использование
|
тип
|
по-умолчанию
|
data
|
redirect
|
string†
|
unset
|
|
Эта опция является взаимоисключающей с опцией
“file
”. Одна из них должна быть определена, но не обе одновременно. Содержимое опции
“data
” может преобразовываться, и затем использоваться как список элементов перенаправления, или как множество инструкций фильтров. Если преобразование выполняется неудачно или результатом является пустая строка или строка без эффекта (состоящая из комментариев), то роутер отклоняется.
Если используются инструкции фильтров, то строка должна начинаться с
“#Exim filter
”, и все комментарии в строке, включая этот, должны оканчиваться символом новой строки. Например:
data = #Exim filter\n\
if $h_to: contains Exim then save $home/mail/exim endif
|
Если вы читаете данные из базы, где символы новой строки не могут быть включены, то вы можете использовать элемент преобразования
“
${sg}
” для преобразования шаблона строки последовательности в символ новой строки.
опция
|
использование
|
тип
|
по-умолчанию
|
directory_transport
|
redirect
|
string†
|
unset
|
|
Роутер
“redirect
” устанавливает прямую доставку в каталог если путь, оканчивающийся символом
“/
” определяется как новый
“адрес
”. Транспорт для доставки определяется этой опцией, который после преобразования должен быть именем сконфигурированного транспорта. Обычно им является транспорт
“appendfile
”.
опция
|
использование
|
тип
|
по-умолчанию
|
file
|
redirect
|
string†
|
unset
|
|
Данная опция определяет имя файла, содержащего данные для перенаправления. Она является взаимоисключающей с опцией
“data
”. Строка перед использованием преобразуется; если преобразование завершается неудачно - роутер отклоняется. Другие ошибки преобразования ведут к откладыванию доставки. Результатом успешного преобразования должен быть абсолютный путь. Файл читается целиком и используется как данные для перенаправления. Если данные представляют собой пустую строку или строку, состоящую из комментариев, то роутер отклоняется.
Если попытка открыть файл завершается неудачно вследствие того, что файл не существует, Exim выполняет проверку содержимого каталога, если только опция
“ignore_enotdir
” не установлена в истинное значение (см. ниже). Если каталог не существует, то доставка откладывается. Это может произойти в случае если пользовательские файлы
“
.forward
” монтируются по NFS, и если существует проблема монтирования. Если каталог существует а файл - нет, роутер отклоняется.
опция
|
использование
|
тип
|
по-умолчанию
|
file_transport
|
redirect
|
string†
|
unset
|
|
Роутер
“redirect
” устанавливает прямую доставку в файл если имя пути не оканчивающееся
“/
” определено как новый
“адрес
”. Используемый транспорт в данном случае определяется этой опцией, которая после преобразования должна содержать имя сконфигурированного транспорта. Обычно таким транспортом является транспорт
“appendfile
”. В процессе его работы имя файла содержится в переменной
“
$address_file
”.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_blackhole
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то элемент
“:blackhole:
” не может быть указан в списке перенаправления.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_exim_filter
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то только фильтры Sieve разрешены, когда опция
“allow_filter
” истинна.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_file
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то роутер не может генерировать новый адрес, осуществляющий доставку в локальный файл или каталог либо посредством фильтра, либо посредством шаблонного файла пересылки (forward). Эта опция принудительно устанавливается в
“истину
” если установлена опция
“one_time
”. Она применяется как к фильтрам Sieve так и к фильтрам Exim, но если она истинна, то она блокирует возможность
“keep
” Sieve.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_dlfunc
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, расктытию строки в фильре exim`a не позволяется использовать средство раскрытия
“dlfunc
” для выполнения динамически загружаемых функций.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_existstest
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то преобразования строк в фильтрах Exim не разрешаются для использования в условии
“exists
”.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_logwrite
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то использовать логгирование в фильтрах Exim не разрешено. Логгирование в любом случае доступно, если фильтр запускается от имени непривилегированного пользователя (что является нормальным для пользовательских файлов
“
.forward
”).
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_lookup
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то преобразования строк для использования элементов
“lookup
” в фильтрах Exim не разрешается.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_perl
|
redirect
|
boolean
|
false
|
|
Эта опция доступна только в случае если Exim скомпилирован с поддержкой встроенного Perl. Если это так, то преобразования строк для использования встроенного Perl не разрешены.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_readfile
|
redirect
|
boolean
|
false
|
|
Если эта опция истинна, то преобразования строк в файлах фильтров Exim для использования элементов
“readfile
” не разрешены.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_readsocket
|
redirect
|
boolean
|
false
|
|
Если эта опция истинна, то преобразования строк в файлах фильтров Exim для использования элементов
“readsocket
” не разрешены.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_reply
|
redirect
|
boolean
|
false
|
|
Если эта опция истинна, то данный роутер не может генерировать автоматический ответ. Автоответы могут генерироваться только из файлов фильтров Exim, но не из традиционных файлов перенаправления или фильтров Sieve. Данная опция автоматически становится истинной если определена опция
“one_time
”.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_filter_run
|
redirect
|
boolean
|
false
|
|
Если эта опция истинна, то преобразования строк в файлах фильтров Exim для использования элементов
“run
” не разрешены.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_include
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то элементы вида:
запрещены в списках перенаправления, не являющихся фильтрами.
опция
|
использование
|
тип
|
по-умолчанию
|
forbid_pipe
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то роутер не может генерировать новый адрес, определяющий доставку в трубу (pipe), равно как из фильтра Exim, так и из обычного файла перенаправления. Если установлена опция
“one_time
”, то данная опция автоматически становится истинной.
опция
|
использование
|
тип
|
по-умолчанию
|
hide_child_in_errmsg
|
redirect
|
boolean
|
false
|
|
Если данная опция истинна, то она вынуждает Exim скрывать дочерний адрес в случае, если генерируется сообщение об отказе в доставке или о задержке. Вместо этого подставляется адрес генерируемый <родительский адрес>. Конечно, это применимо только к генерируемым локально сообщениям об отказе в доставке. Если сообщение перенаправляется на другой хост, то сообщение об отказе может быть послано на генерируемый адрес.
опция
|
использование
|
тип
|
по-умолчанию
|
ignore_eacces
|
redirect
|
boolean
|
false
|
|
Если эта опция установлена и попытка открыть файл перенаправления вызывает ошибку EACCES (доступ запрещен), то роутер
“redirect
” ведет себя как будто файл не существует.
опция
|
использование
|
тип
|
по-умолчанию
|
ignore_enotdir
|
redirect
|
boolean
|
false
|
|
Если данная опция определена и попытка открыть файл перенаправления вызывает ошибку ENOTDIR (что-либо в пути не является директорией), то роутер ведет себя как будто файл не существует.
Установка
“ignore_enotdir" имеет другой эффект: Когда роутер
“redirect
”, имеющий опцию
“file
”, обнаруживает что данный файл не существует (ошибка ENOENT), он пытается выполнить функцию
“
stat()
” для родительской директории, например при проверке на отмонтированные NFS директории. Если функция возвращает ненулевое значение, то доставка откладывается. Однако, неверно выполнять такую проверку когда установлена опция
“ignore_enotdir
”, потому что эта опция заставляет Exim игнорировать в пути
“то, что не является директорией
” (ошибка ENOTDIR). Это вопрос неоднозначный, потому как некоторые операционные системы выдают ошибку ENOENT, а некоторые - ENOTDIR.
опция
|
использование
|
тип
|
по-умолчанию
|
include_directory
|
redirect
|
string
|
unset
|
|
Если установлена эта опция, пути любых элементов
“:include:
” в списке перенаправления должны начинаться с этой директории.
опция
|
использование
|
тип
|
по-умолчанию
|
modemask
|
redirect
|
octal integer
|
022
|
|
Опция определяет биты режима, которые не должны быть установлены для файла, определенного опцией
“file
”. Если установлен любой из этих битов, то доставка откладывается.
опция
|
использование
|
тип
|
по-умолчанию
|
one_time
|
redirect
|
boolean
|
false
|
|
Иногда факт что Exim перечитывает файл псевдонимов и заново обрабатывает файлы перенаправления каждый раз когда он пытается доставить сообщение, вызывает проблему когда один или несколько сгенерированных адресов не могут быть доставлены с первой попытки. Это не является проблемой повторной доставки - Exim способен это обработать - кроме ситуаций когда список перенаправления меняется во время, когда сообщение находится в очереди Exim'a. Это особенно справедливо в случае списков рассылки, когда новые подписчики могут получить копии сообщений в случае если они были посланы до того как они подписались на рассылку.
Если опция
“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
|
redirect
|
string list
|
unset
|
|
Это определяет список разрешённых владельцев для файла заданного как
“file
”. Этот список - дополнение к локальному пользователю, когда установлена опция
“check_local_user
”. Смотрите
“check_owner
” ниже.
опция
|
использование
|
тип
|
по-умолчанию
|
owngroups
|
redirect
|
string list
|
unset
|
|
Это определяет список разрешённых групп для файла заданного как
“file
”. Этот список - дополнение к локальной группе, когда установлена опция
“check_local_user
”. Смотрите опцию
“check_group
” выше.
опция
|
использование
|
тип
|
по-умолчанию
|
pipe_transport
|
redirect
|
string†
|
unset
|
|
Роутер
“redirect
” задаёт прямую доставку в трубу, когда строка начинающаяся с
“|
” задана как новый
“адрес
”. Используемый транспорт определён этой опцией, которая, после раскрытия, должна быть названа именем сконфигуренного транспорта. Когда транспорт запущен, команда pipe в
“
$address_pipe
”.
опция
|
использование
|
тип
|
по-умолчанию
|
qualify_domain
|
redirect
|
string†
|
unset
|
|
Если эта опция установлена, и сгенерён неполный адрес (без домена), и в нормальных условиях этот адрес был бы квалифицирован (дополнен доменным именем) по глобальной опции
“qualify_recipient
”, но вместо этого он квалифицируется доменом, содержащимся в этой строке, после раскрытия. Если раскрытие неудачно, маршрутизатор снижается(?). Если вы хотите вернуться к значению по умолчанию, то можно раскрыть
“
$qualify_recipient
”.
Эта опция применяется ко всем неполным адресам сгенерённым фильтрами exim`a, но для традиционных файлов
“
.forward
” это применяется лишь для адресов не предварённых обратным слешем. Фильтры Sieve не могут генерить неполные адреса.
опция
|
использование
|
тип
|
по-умолчанию
|
qualify_preserve_domain
|
redirect
|
boolean
|
false
|
|
Если установлена эта опция, то локальная опция
“qualify_domain
” не должна быть задана (будет ошибка конфигурации, если задать обе). Если генерится неполный адрес (без домена), он дополняется доменом родительского адреса (предыдущий предок), вместо глобального домена из
“qualify_recipient
”. В случае традиционнго файла
“
.forward
” это применяется вне зависмости от того, был ли перед адресом обратный слэш.
опция
|
использование
|
тип
|
по-умолчанию
|
repeat_use
|
redirect
|
boolean
|
true
|
|
Если эта опция установлена в
“false
”, то роутер пропускается для дочерних адресов, предки которых были отроучены (не смог подобрать слово :))) этим роутером. Это проверяется до проверки других предварительных условий. Дефолтовые правила exim`a против зацикливания пропускаются лишь в случае если предок с таким же адресом как и текущий. Смотрите также
“check_ancestor
” и
“redirect_router
” опции.
опция
|
использование
|
тип
|
по-умолчанию
|
reply_transport
|
redirect
|
string†
|
unset
|
|
Роутер
“redirect
” устанавливает автоответ когда в фильтре используются команды
“mail
” или
“vacation
”. Используемый транспорт определяется этой опцией, которая, после раскрытия, должна быть именем сконфигуренного транспорта. Обычно это транспорт
“autoreply
”. Другие транспорты вряд ли смогут принести какую-то пользу.
опция
|
использование
|
тип
|
по-умолчанию
|
rewrite
|
redirect
|
boolean
|
true
|
|
Если эта опция установлена в
“false
”, адреса сгенерённые маршрутизатором не являются объектами для перезаписи адреса. Иначе, они будут обработаны как новые адреса и перезаписаны в соответствии с глобальными правилами перезаписи.
опция
|
использование
|
тип
|
по-умолчанию
|
sieve_subaddress
|
redirect
|
string†
|
unset
|
|
Значение этой опции передаётся фильтру Sieve для задания части адреса :subaddress.
опция
|
использование
|
тип
|
по-умолчанию
|
sieve_useraddress
|
redirect
|
string†
|
unset
|
|
Значение этой опции передаётся фильтру Sieve для задания части адреса :user. Если она не задана, для :user используется оригинальная локальная часть адреса (включая суффикс и преффикс).
опция
|
использование
|
тип
|
по-умолчанию
|
sieve_vacation_directory
|
redirect
|
string†
|
unset
|
|
Для включения расширения
“vacation
” для фильров Sieve, вы должны задать
“sieve_vacation_directory
” в каталог где находятся БД
“vacation
” (больше ничего не помещайте в эту директорию), и гарантировать, что опция
“reply_transport
” относится к транспорту
“autoreply
”. Каждому пользователю необходим собственный каталог; exim создаст их в случае необходимости.
опция
|
использование
|
тип
|
по-умолчанию
|
skip_syntax_errors
|
redirect
|
boolean
|
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`a, любые синтаксические ошибки в фильтре вызывают пропуск без предпринятия какого-либо действия. Инцидент записывается, и маршрутизатор отказывается обрабатывать адрес, и адрес передаётся следующим роутерам.
Любые синтаксические ошибки в фильтрах Sieve, повод для действия
“keep
”. Это действие определено RFC3028. Значения
“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 = \
This is an automatically generated message. An error has\n\
been found in your .forward file. Details of the error are\n\
reported below. While this error persists, you will receive\n\
a copy of this message for every message that is addressed\n\
to you. If your .forward file is a filter file, or if it is\n\
a non-filter file containing no valid forwarding addresses,\n\
a copy of each incoming message will be put in your normal\n\
mailbox. If a non-filter file contains at least one valid\n\
forwarding address, forwarding to the valid addresses will\n\
happen, and those will be the only deliveries that occur. \n\
\n\
Честно говоря, ломает перводить чё тут написано, сами напишете \n\
что захотите :))) Общий смысл - про ошибку в фильтре пользователя, \n\
которому эта мессага и пошлётся.
|
Также, вам необходим роутер, чтобы гарантировать, что локальные адреса у которых распознан преффикс
“real-
”, не форвардятся и не фильтруются. Для примера, его можно поместить сразу перед маршрутизатором
“userforward
”:
real_localuser:
driver = accept
check_local_user
local_part_prefix = real-
transport = local_delivery
|
опция
|
использование
|
тип
|
по-умолчанию
|
syntax_errors_text
|
redirect
|
string†
|
unset
|
|
Смотрите выше, опцию
“skip_syntax_errors
”.
опция
|
использование
|
тип
|
по-умолчанию
|
syntax_errors_to
|
redirect
|
string
|
unset
|
|
Смотрите выше, опцию
“skip_syntax_errors
”.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
23. Среда для работы локальных транспортов
Локальные транспорты обрабатывают доставки в файлы и трубы (pipe). (О транспорте
“
autoreply
” можно думать как о доставке в трубу.) Exim всегда выполняет транспорты в субпроцессах, под заданным gid и uid. Типичная доставка в локальные почтовые ящики выполняется под gid и uid локального пользователя.
Также, exim устанавливает специфическую текущую директорию, когда работает транспорт; для некоторых транспортов, также уместна установка домашней директории. Единственный транспорт, устанавливающий переменные окружения -
“
pipe
”; для получения дополнительных деталей, смотрите раздел 29.4.
Значение, используемое для uid, gid, и директорий может приходить из нескольких различных мест. Во многих случаях, роутер, обрабатывающий адрес, ассоциирует настройки этого адреса как результат его опций
“
check_local_user
”,
“
group
” или
“
user
”. Однако, значения также можно задать в собственной конфигурации транспорта, и они перезадают любые прихожящие из роутера.
23.1 Одновременные доставки
Если одновременно приходят два различных сообщения, для одного и того же пользователя, то, вероятно, два процеса доставки выполнятся одновременно. Когда для записи в файл используется транспорт
“
appendfile
”, exim применяет правила блокировки, чтобы помешать одновременным процессам записывать в один файл одновременно.
Однако, когда вы используете транспорт
“
pipe
”, вам решать, как упорядочивать необходимую блокировку. Вот, глупый пример:
my_transport:
driver = pipe
command = /bin/sh -c 'cat >>/some/file'
|
Он, должен записывать сообщение в конце файла. Однако, если придут два сообщения одновременно, в файле будет свалка. Вы можете использовать утилиту
“
exim_lock
” (смотрите раздел 49.15), для блокировки файла с использованием того же алгоритма, который использует exim.
23.2 Uid`ы и gid`ы
У всех транспортов есть опции
“
group
” и
“
user
”. Если установлена
“
group
”, она перезадаёт любую группу, заданную маршрутизатором в адресе, даже если для транспорта не задана опция
“
user
”. Это позволяет, например, производить локальную доставку почты под uid получателя (установленного роутером), но в специальной группе (установленной транспортом). Например:
# Routers ...
# User/group are set by check_local_user in this router
local_users:
driver = accept
check_local_user
transport = group_delivery
# Transports ...
# This transport overrides the group
group_delivery:
driver = appendfile
file = /var/spool/mail/$local_part
group = mail
|
Если для транспорта установлена опция
“
user
”, её значение переопределяет, то, что установленно маршрутизатором в адресе. Если
“
user
” задано не в виде числа, и незадана
“
group
”, gid ассоциируется с используемым пользователем. Если
“
user
” в виде числа,
“
group
” должна быть задана.
Когда uid берётся из конфигурации транспорта, для связанных с этим uid групп вызывается функция
“
initgroups()
”, если для транспорта установлена опция
“
initgroups
”. Когда uid не задан транспортом, но ассоциирован роутером с адресом, опция для вызова
“
initgroups()
” берётся из конфигурации роутера.
Транспорт
“
pipe
” содержит специальную опцию -
“
pipe_as_creator
”. Если она задана, и не задана
“
user
”, используется uid процесса, вызвавшего exim для передачи сообщения, и если не задана
“
group
”, также используется оригинальный gid.
Это - предпочтительный детализованный порядок получения gid; используется первый из установленных:
Установка
“
group
” транспорта;
Установка
“
group
” роутера;
Gid ассоциированный с пользовательской настройкой роутера, или как результат
“
check_local_user
”, или явной нечисловой установки
“
user
”;
Группа, ассоциированная с нечисловой установкой
“
user
” транспорта;
В транспорте
“
pipe
”, gid создателя, если
“
deliver_as_creator
” установлена, и uid - uid создателя;
Gid exim`a, если по дефолту используется uid exim`a.
Если, например, пользователь определён в роутере в цифровой форме, и в нём нет установок группы, нет доступного gid. В этой ситуации, происходит ошибка. Это отличается от uid, для которого всегда есть дефолтовое значение. Используется первая из установленных настроек:
Установка
“
user
” транспорта;
В транспорте
“
pipe
”, uid создателя, если установлена
“
deliver_as_creator
”;
Установка
“
user
” роутера;
Установка роутера -
“
check_local_user
”;
Uid exim`a.
Разумеется, всё равно будет ошибка, если выбранный uid в списке
“
never_users
”.
23.3 Текущая и домашняя директории
Роутеры могут устанавливать текущую и домашнюю директории для локальных транспортов путём опций
“
transport_current_directory
” и
“
transport_home_directory
”. Однако, если для транспорта установлены опции
“
current_directory
” и
“
home_directory
”, они переопределяют значения роутера. В деталях, домашняя директория для локального транспорта берётся из первого установленного значения:
Опции
“
home_directory
”, в транспорте;
Опции
“
transport_home_directory
” в роутере;
Данных пароля, если в роутере установлена
“
check_local_user
”;
Опции
“
router_home_directory
”, в роутере.
Текущая директория берётся из первого установленного значения:
Опции транспорта
“
current_directory
”;
Опции
“
transport_current_directory
”, роутера.
Если ни роутер, ни транспорт не устанавливают текущую директорию, exim использует значение домашней директории, если оно установлено. Иначе, до работы локального транспорта, он устанавливает текущую директорию в
“/
”.
23.4 Переменные раскрытия произведённые из адреса
Обычно, локальная доставка обрабатывает один адрес, и в этом случае, переменные типа
“
$domain
” и
“
$local_part
” установлены в течение локальных доставок. Однако, в некоторых обсоятельствах, может быть обработано более одного адреса за раз (например, при записи пакетного SMTP для дальнейшей передачи другими средствами). В этом случае, переменные, ассоциированные с локальной частью, никогда не устанавливаются,
“
$domain
” устанавливается лишь если адреса имеют одинаковый домен,
“
$original_domain
” не устанавливается никогда.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
24. Общие опции для транспортов
Следующие общие опции применяются ко всем транспортам:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
body_only
|
transports
|
boolean
|
ложь
|
|
Если эта опция установлена, заголовки сообщения не транспортируются. Эта опция взаимоисключаяющая с
“
headers_only
”. Если она используется с транспортом
“
appendfile
” или
“
pipe
”, должны быть проверены установки
“
message_prefix
” и
“
message_suffix
”, поскольку эта опция не подавляет их автоматически.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
current_directory
|
transports
|
string†
|
незадана
|
|
Эта опция определяет текущую директорию, которая должна быть установлена при работе транспорта, перезадавая любое значение, которое могло быть установлено роутером. Если раскрытие неудачно по какой-либо причине, включая принудительную неудачу, ошибка логгируется и доставка задерживается.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
disable_logging
|
transports
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, ничего не логгируется ни для каких доставок транспортом, и никаие ошибки в логи не пишутся. Вы не должны устанавливать эту опцию, если не понимаете что делаете.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
debug_print
|
transports
|
string†
|
незадана
|
|
Если эта опция установлена и отладка включена (смотрите опцию командной строки
“
-d
”), строка раскрывается и включается в отладочный вывод, при работе транспорта. Если раскрытие строки неудачно, сообщение о ошибке пишется в отладочный вывод, и exim продолжает обработку. Это средство предоставлено для помощи при проверке значений переменных и т.п. при отладке конфигурации драйвера. Например, если некорректно работает опция
“
headers_add
”,
“
debug_print
” может быть использована для вывода зависимых переменных. В текст добавляется символ новой строки, если он им не заканчивается.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
delivery_date_add
|
transports
|
boolean
|
ложь
|
|
Если эта опция истинна, в сообщение добавляется заголовок
“
Delivery-date:
”. Это даёт актуальное время, когда призошла доставка. Это не стандартный заголовок, у exim`a есть конфигурационная опция (
“
delivery_date_remove
”), запрашивающая его удаление из из входящих сообщений, таким образом, доставленные сообщения можно безопасно пересылать другим получателям.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
driver
|
transports
|
string
|
незадана
|
|
Этим определяется, который из доступных транспортных драйверов будет использоваться. Тут нет значения по умолчанию, и эта опция должна быть установлена для каждого транспорта.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
envelope_to_add
|
transports
|
boolean
|
ложь
|
|
Если эта опция истинна, в сообщение добавляется заголовок
“
Envelope-to:
”. Этим даётся оригинальный адрес (или адреса) во входящем конверте, который вызвал эту доставку. Может быть представлено более одного адреса, если транспорт сконфигурирован для обработки сразу нескольких адресов, или к одному финальному адресу было переадресовано более одного адреса. Это не стандартный заголовок, у exim`a есть конфигурационная опция (
“
envelope_to_remove
”), запрашивающая его удаление из из входящих сообщений, таким образом, доставленные сообщения можно безопасно пересылать другим получателям.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
group
|
transports
|
string†
|
Exim group
|
|
Эта опция задаёт gid для выполнения транспортного процесса, перезадавая любое значение переданное из роутера, и, также, перезадавая любое значение ассоциированное с
“
user
” (смотрите ниже).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers_add
|
transports
|
string†
|
незадана
|
|
Эта опция определяет строку текста, который раскрывается и добавляется в заголовочную часть сообщения при транспортировке, как описано в разделе 43.17. Также, дополнительные строки заголовков, могут быть заданы роутерами. Если результат раскрытия - пустая строка, или раскрытие принудительно неудачно - никаких действий не предпринимается. Другие ошибки раскрытия обрабатываются как ошибки, и вызывают задержку доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers_only
|
transports
|
boolean
|
ложь
|
|
Если эта опция установлена, тело сообщения не транспортируется. Эта опция взаимоисключаема с
“
body_only
”. Если она используется с транспортом
“
appendfile
” или
“
pipe
”, должны быть проверены установки
“
message_prefix
” и
“
message_suffix
”, поскольку эта опция не подавляет их автоматически.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers_remove
|
transports
|
string†
|
незадана
|
|
Эта опция определяет строку текста, который раскрывается в список имён заголовков; эти заголовки опускаются (они в нём остаются, но при передаче сообщения далее они не передаются - прим. lissyara) из сообщения при транспортировке, как описано в разделе 43.17. Также, удаление заголовка, может быть задано роутером. Если результат раскрытия - пустая строка, или раскрытие принудительно неудачно - никаких действий не предпринимается. Другие ошибки раскрытия обрабатываются как ошибки, и вызывают задержку доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers_rewrite
|
transports
|
string
|
незадана
|
|
Эта опция позволяет перезаписывать адреса в строках заголовков во время транспортировки, т.е. когда сообщение копируется в его местоназаначение. Содержимое опции - список правил перезаписи, разделённых двоеточиями. Каждое правило - в той же самое форме, что и общие правила перезаписи применяемые при передаче сообщения. Они описаны в разделе 31. Например,
headers_rewrite = a@b c@d f : \
x@y w@z
|
заменит
“a@b
” на
“c@d
” в строке заголовка
“
From:
”, и
“x@y
” на
“w@z
” - во всех строках заголовков содержащих адрес. Правила применяются к строкам заголовков сразу перед их передачей при транспортировке, таким образом, они затрагивают лишь те копии сообщений, которые проходят через транспорт. Однако, перезаписываются лишь оригинальные строки заголовков, и те, которые были добавлены системным фильтром. Если роутер или транспорт добавляет строки заголовков, они не затрагиваются этой опцией. Эти правила перезаписи не применяются к конверту. Вы можете изменить обратный путь используя опцию
“
return_path
”, но в этот момент обработки сообщения вы не можете изменить получателей конверта.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
home_directory
|
transports
|
string†
|
незадана
|
|
Эта опция определяет установку домашней директории для локального транспорта, перезадавая любое значение, которое может быть установлено роутером. Домашняя директория помещается в
“
$home
”, при раскрытии частных опций транспорта. Она также используется как текущая директория, если текущая директория не установлена в транспорте опцией
“
current_directory
”, или опцией роутера
“
transport_current_directory
”. Если раскрытие неудачно по какой-либо причине, включая принудительную неудачу, ошибка логгируется, и доставка задерживается.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
initgroups
|
transports
|
boolean
|
ложь
|
|
Если эта опция истинна, и uid процесса доставки предоставлен транспортом, при работе транспорта вызывается функция
“
initgroups()
”, для гарантии, что любые группы, связянные с uid установлены.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_size_limit
|
transports
|
string†
|
0
|
|
Эта опция контролирует размер сообщений, проходящих через транспорт. Она раскрывается до использования; результат раскрытия должен быть последовательностью цифр, опционально сопровождаемых
“K
” или
“M
”. Если раскрытие неудачно по какой-либо причине, включая принудительную неудачу, или результат не имеет необходимую форму (не цифры, или вообще левая строка текста - прим. lissyara), доставка задерживается. Если значение больше нуля, и размер сообщения больше этого значения, адрес неудачен. Если есть какой-то шанс, что результирующий рикошет будет маршрутизирован на тот же самый транспорт, вы должны гарантировать, что
“
return_size_limit
” меньше чем
“
message_size_limit
” транспорта, иначе будет невозможно доставить рикошет.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
rcpt_include_affixes
|
transports
|
boolean
|
ложь
|
|
Когда эта опция ложна (по умолчанию), и адрес, имевший любые аффиксы (преффиксы или суффиксы) удалённые из локальной части, доставляется любой формой SMTP или LMTP, аффиксы не включаются. Например, если роутер содержит
маршрутизирует адрес
“abc-xyz@some.domain
” на SMTP-транспорт, конверт доставляется с
RCPT TO:<xyz@some.domain>
|
Это также происходт, когда во время ACL для проверки адреса получателя используется обратный вызов. Однако, если
“
rcpt_include_affixes
” установлена в истину, в команду RCPT включается полная локальная часть. Эта опция применяется к доставкам BSMTP через транспорты
“
appendfile
” и
“
pipe
”, также как и к транспортам
“
lmtp
” и
“
smtp
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
retry_use_local_part
|
transports
|
boolean
|
смотрите ниже
|
|
Когда происходит временная ошибка доставки, в БД подсказок exim`a создаётся отчёт повтора. Для удалённых доставок, ключ для записи повтора основан на имени и/или IP-адресе хоста вызывашего ошибку. Для локальных доставок, ключ, обычно, - весь адрес, включая локальную часть и домен. Это подходит для большинства общих случаев временных ошибок локальной доставки - например, превышение квоты почтового ящика, должно вызывать задержку доставки лишь в почтовый ящик с превышением, а не на весь домен.
Однако, в некоторых специальных случаях, у вас может возникнуть необходимость обработать локальную ошибку доставки как ассоциированную с доменом, а не со специфической локальной частью. (Например, если вы храните всю почту какого-то домена в файлах.) Вы можете это сделать путём установки
“
retry_use_local_part
” в ложь.
Для всех локальных транспортов, его дефолтовое значение - истина. Для удалённых транспортов, значение по умолчанию - ложь, в целях опрятности, но изменение значения не оказывает никакого эффекта на удалённый транспорт, в текущей реализации (имеется ввиду, что в будущих релизах exim`a, она чё-то будет делать - прим. lissyara).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
return_path
|
transports
|
string†
|
незадана
|
|
Если эта опция задана, строка раскрывается во время транспортировки, и заменяет значение существующего обратного пути (отправителя конверта), в копии доставляемого сообщения. Пустой путь возврата допускается. Эта возможность спроектирована для удалённых доставко, где значение этой опции используется в команде SMTP MAIL. Если вы установите
“
return_path
” для локального транспорта, будет единственный эффект - измениться адрес, помещаемый в строку заголовка
“
Return-path:
”, если она добавляется к сообщению (смотрите следующую опцию).
Раскрытие может обратиться к существующиму значению через
“
$return_path
”. Оно является отправителем конверта сообщения, или адресом, установленным опцией роутера
“
errors_to
”. Если раскрытие принудительно неудачно, замена не происходит; если неудача по другой причине, доставка задерживается. Эта опция может использоваться для поддержки VERP (Variable Envelope Return Paths) (переменные пути возврата конверта) - смотрите раздел 46.6.
Отметтьте: Если ошибка доставки детектируется локально, включая случай, когда удалённый сервер отклоняет сообщение во время SMTP диалога, рикошет не посылается по значению этой опции. Он шлётся по ранее установленному адресу для ошибок. Это дефолтовое значение для входящих адресов отправителя, но оно может быть изменено путём опции
“
errors_to
” в роутере.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
return_path_add
|
transports
|
boolean
|
ложь
|
|
Если эта опция истинна, к сообщению добавляется заголовок
“
Return-path:
”. Хотя пути возврата, обычно, доступны в строке преффикса BSD-майлбокса, обычно они не отображаются MUA, и таким образом, пользователь не имеет к ним лёгкого доступа.
RFC2821 заявляет, что строка заголовка
“
Return-path:
” добавляется к сообщению
“когда доставляющий SMTP-сервер делает финальную доставку
”. Это подразумевает, что этот заголовок не должен содержаться во входящих сообщениях. У exim`a есть конфигурационная опция,
“
return_path_remove
”, которая запрашивает удаление этого заголовка из входящих сообщений, таким образом, доставленные сообщения, могут быть безопасно пересланы другим получателям.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
shadow_condition
|
transports
|
string†
|
незадана
|
|
Смотрите ниже, опцию
“
shadow_transport
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
shadow_transport
|
transports
|
string
|
незадана
|
|
Локальный транспорт может установить опцию
“
shadow_transport
” в имя иного локального транспорта. Удалённые теневые доставки не поддерживаются.
Каждый раз, когда доставка на главный транспорт успешна, и или незадана опция
“
shadow_transport
”, или её раскрытие не приводит к пустой строке, или одной из строк
“0
” или
“no
” или
“false
”, сообщение, также передаётся теневому транспорту, с тем же самым адресом для доставки. Если раскрытие неудачно, никаких действий не предпринимается, исключая принудительное раскрытие, вызывающее запись в лог файл.
Результат теневого транспорта отбрасывается, и не затрагивает последующую обработку сообщения. Предоставлен лишь один теневой уровень; опция
“
shadow_transport
” игнорируется в любом транспорте, выполняемом как теневой. Опции, связянные с выводом из труб (pipe) также игнорируются. Строки логов для успешной доставки имеют в конце добавленный элемент, вида
ST=<shadow transport name>
|
Если теневой транспорт неуспешен, сообщение об ошибке помещается в конце, в круглых скобках. Теневой транспорт может использоваться для множества различных целей, включая сохранение более детализированной лог-информации, чем обычно предоставляет exim? и осуществления автоматической политики подтверждения, основанной на заголовках, требуемой некотрыми серверами.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
transport_filter
|
transports
|
string†
|
незадана
|
|
Эта опция устанавливает процесс фильтрации (в смысле UNIX-шелла) для сообщений, во время транспортировки. Это не должно быть спутано с почтовой фильтрацией устанавливаемой пользователями индивидуально, или через системный фильтр.
Перед выходом сообщения из транспорта, команда, заданная в
“
transport_filter
” запускается в отдельном, параллельном процессе, и всё сообщение целиком, включая строки заголовков, передаётся ему на стандартный ввод (фактически, это делается от третьего процесса, во избежание тупиков). Команда должна быть задана как абсолютный путь.
Строки сообщения, записываемые в транспортный фильтр, завершаются символом новой строки (
“\n
”). Сообщение передаётся фильтру до любых SMTP-специфичных обработок, типа преобразования
“\n
” в
“\r\n
” и экранирования строк начинающихся с точки, и, также, до любой обработки подразумеваемой параметрами
“
check_string
” и
“
escape_string
” в транспортах
“
appendfile
” или
“
pipe
”.
Стандартные ошибки для процесса фильтра устанавливается в то же самое местоназначение, что и стандартный вывод; они читаются и пишутся в окончательное местоназаначение сообщения. Процесс, который пишет сообщение в фильтр, сам фильтр, и оригинальный процесс, читающий результат и доставляюший его, работают параллельно, как передача через трубы (pipeline) шелла.
Фильтр может выполнить любые преобразования, какие захочет, но, разумеется, необходимо позаботится о том, чтобы не нарушить синтаксис RFC2822. Демонстрационный скрипт на perl находится в
“
util/transport-filter.pl
”; он делает несколько произольных модификаций, лишь для того, чтобы показать возможности. Exim не проверяет результат, кроме проверки заключительного символа новой строки, когда используется SMTP. Все сообщения, передаваемые через SMTP, должны завершаться символом новой строки, таким образом, exim подставляет его, при его отсутствии.
Транспортный фильтр может использоваться для проведения контентного сканирования на основе пользователей (имеется ввиду, что в зависмости от пользователя можно делать разные действия - прим. lissyara) во время доставки, если единственный эффект от сканирования - модификация сообщения. Например, контентное сканирование может вставлять новую строку заголовка, содержащую очки насчитанные за спам. Это могло бы быть интерпретировано фильром в пользовательском MUA. На данном этапе, невозможно отказаться от сообщения.
Могут возникнуть проблемы, если фильтр увеличивает размер сообщения, пересылаемого по SMTP соединению. Если принимающий SMTP-сервер указал поддержку параметра SIZE, exim пошлёт размер сообщения в начале SMTP-сессии. Если то, что фактически посылается, значительно больше, сервер может отклонить сообщение. Это могло бы работать, путём установки опции
“
size_addition
” в транспорте
“
smtp
”, или учитывая дополнения к сообщению, или вообще отключив использование SIZE.
Значение опции
“
transport_filter
” - строка команды для запуска фильтра, веполняемого непосредственно из exim`a, а не из шелла. Строка парсится exim`ом точно таким же образом, как командная строка для транспорта
“
pipe
”: exim разбирает её на аргументы, а затем раскрывает каждый параметр отдельно (смотрите раздел 29). Любой вид ошибки раскрытия, вызывает задержку доставки. Специальный параметр -
“
$pipe_addresses
” заменяется аргументами, по одному на каждый доставляемый адрес. (Это не идеальное название для этой особенности, но, поскольку оно уже было реализовано для транспорта
“
pipe
”, показалось разумным не изменять этого.)
Когда хост удалённый, доступны переменные раскрытия
“
$host
” и
“
$host_address
”. Они содержат имя и IP-адрес хоста, на который посылается сообщение. например:
transport_filter = /some/directory/transport-filter.pl \
$host $host_address $sender_address $pipe_addresses
|
Если вы хотите использовать более сложные элементы раскрытия для создания команд транспортного фильтра, возникают две проблемы, обе - вследствие того, что команда разделяется до раскрытия.
Если раскрытие элемента содержит пробелы, вы должны экранировать их кавычками, что это вся команда. Если вся опция - один элемент раскрытия, вы должны учесть, какие кавычки вы используетею Например:
transport_filter = '/bin/cmd${if eq{$host}{a.b.c}{1}{2}}'
|
Этим выполняется команда
“
/bin/cmd1
”, если имя хоста
“
a.b.c
”, и
“
/bin/cmd2
” в ином случае. Если бы использовались двойные кавычки, то они бы удалились exim`ом при чтении значения опции. Когда используется значение, если бы отсутствовали одиночные кавычки, строка была бы разбита на два пункта -
“/bin/cmd${if
” и
“eq{$host}{a.b.c}{1}{2}
”, и произошла бы ошибка при попытке exim`a раскрыть первый элемент.
За исключением специального случая -
“
$pipe_addresses
”, упомянутого выше, раскрытие не может генерить несколько параметров, или имя команды сопровождаемое параметрами. Рассмотрите этот пример:
transport_filter = ${lookup{
$host}lsearch{/some/file}\
{$value}{/bin/cat}}
|
Результат поиска интерпретируется как имя команды, даже если он содержит пустое пространство. Самый простой путь для обхода этого состоит в использовании шелла:
transport_filter = /bin/sh -c ${lookup{
$host}lsearch{/some/file}\
{$value}{/bin/cat}}
|
Процесс фильтра работает под теми же gid и uid что инормальный процесс доставки. Для удалённых доставок, по умолчанию, это - gid/uid пользователя exim`a. Обычно, команда должна приводить к нулевому коду возврата. Код, отличный от нуля, означает, что транспортный фильтр столкнулся с какой-то серьёзной проблемой. Доставка сообщения задерживается; сообщение остаётся в очереди и пробуется позже. Невозможно вызывать рикошет из транспортного фильтра.
Если транспортный фильтр установлен на транспорте
“
autoreply
”, оригинальное сообщение передаётся через фильтр, поскольку оно копируется в новое сгенерённое сообщение, что случается, если установлена опция
“
return_message
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
transport_filter_timeout
|
transports
|
time
|
5m
|
|
Когда exim читает вывод транспортного фильтра, он применяет таймаут, который может быть установлен этой опцией. Превышение таймаута обрабатывается как временная ошибка доставки. Однако, если транспортный фильтр используется с транспортом
“
pipe
”, таймаут транспортного фильтра обрабатывается таким же образом как и таймаут непосредственно в трубе (pipe). По умолчанию, таймаут - жёсткая ошибка, но если истинна опция
“
timeout_defer
” транспорта
“
pipe
”, она становиться временной ошибкой.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
user
|
transports
|
string†
|
пользователь exim`a
|
|
Эта опция определяет пользователя, под чьим uid работает процесс доставки, перезадавая любой uid, который мог быть задан роутером. Если пользователь даётся в виде имени, uid ищется из данный пароля, и ассоциированая группа берётся как значение gid, для использования если опция
“
group
” не задана.
Для доставок использующих локальные транспорты, пользователь и группа обычно определяются явно, или неявно (например, как результат
“
check_local_user
”) роутером или транспортом.
Для удалённых транспортов, вы должны оставить эту опцию незаданной, если вы действительно не понимаете, что делаете. Когда выполняется удалённый транспорт exim`a, ему необходима возможность доступа к базе данных подсказок exim`a, поскольку каждый хост может может иметь собственные данные повторов.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
25. Группировка адресов в локальных транспортах
Обычно, лишь удалённый транспорт (
“
smtp
”) сконфигурирован для обработки более одного адреса за раз, таким образом, чтобы когда несколько адресов роутятся к одному хосту, посылалась лишь одна копия сообщения. Однако, локальные транспорты, обычно, обрабатывают одновременно лишь один адрес. Таким образом, транспортировка выполняется для каждого адреса, сроученного к транспорту. Единовременно доставляется лишь одна копия сообщения.
В транспорте
“
appendfile
”, когда сообщение сохраняется в файл для дальнейшей доставки какими-то другими средствами, сохраняется одна копия сообщения с несколькими адресатами, для экономии места.
В транспорте
“
lmtp
”, при доставке через
“локальный SMTP
” другим процессам, сохраняется время, путём доставки одной копии сообщения, и это обычно ожидаемый способ работы LMTP.
В транспорте
“
pipe
”, при передаче сообщения сканирущей программе, или иному доставляющему механизму, типа UUCP, могут быть приемлимы несколько получателей.
Эти три локальных транспорта имеют те же самые опции для контроля многочисленных (
“batched
” - пакетных) доставок, именуемых
“
batch_max
” и
“
batch_id
”. Для сохранения повторения информации для каждого транспорта, эти опции описаны тут.
Опция
“
batch_max
” определяет максимальное число адресов, которые могут быть доставлены вместе, в одном запуске транспорта. Её дефолтовое значение - единица (нет пакетной передачи). Когда более одного адреса роутится на транспорт, имеющий значение
“
batch_max
” больше единицы, адреса доставляются пакетно (т.е. в одном запуске транспорта, с многочисленными получателями), подчиняясь определённым условиям:
Если любая опция транспорта содержит ссылку на
“
$local_part
” - пакетная передача невозможна.
Если любая опция транспорта содержит ссылку на
“
$domain
”, передаются пакетно лишь те адреса, у которых одинаковый домен.
Если
“
batch_id
” установлена, она раскрывается для каждого адреса, и передаются пакетно лишь те адреса, у которых, в результате раскрытия, одинаковое значение. Это позволяет задавать ручные настройки пакетной передачи. Ошибка раскрытия, в любом случае, включая принудительную неудачу, отключает пакетную передачу, но не останавливает доставку.
Пакетные адреса также должны иметь одинаковый обратный адрес (для возврата ошибок доставки), одинаквые добавления и удаления заголовков, одного и того же пользователя и группу для транспорта, и если представлен список хостов, первый хост должен быть тем самым хостом.
В случае транспортов
“
appendfile
” и
“
pipe
”, пакетная передача применяется к ним обоим, когда файл или команда трубы (pipe command) задана в транспорте, и когда это определено роутером
“
redirect
”, но, разумеется, все пакетные адреса должны быть направлены в один и тот же файл или команду трубы. Эти два транспорта имеют опцию называемую
“
use_bsmtp
”, заставляющую их доставлять сообщение в формате
“пакетного SMTP
”, с конвертом представленным в команде SMTP. Опции
“
check_string
” и
“
escape_string
” приводятся к значениям
check_string = "."
escape_string = ".."
|
когда используется пакетная SMTP-передача. Полное описание механизма пакетного SMTP дано в разделе 44.10. Транспорт
“
lmtp
” не имеет опции
“
use_bsmtp
”, поскольку он всегда доставляет используя SMTP-протокол.
Общая опция
“
envelope_to_add
” установлена для пакетного транспорта, заголовок
“
Envelope-to:
”, добавляющийся к сообщению, содержит все адреса, которые обрабатываются вместе. Если вы используете пакетный транспорт
“
appendfile
” без
“
use_bsmtp
”, единственный способ сохранить адрес получателя - установить опцию
“
envelope_to_add
”.
Если вы используете транспорт
“
pipe
” без BSMTP, и устанавливаете транспортную опцию
“
command
”, вы должны включить
“
$pipe_addresses
” как часть команды. Это не истинная переменная, это немного шаманства, позволяющего подставить адреса получателей как раздельные аргументы. Этим предоставляется способ обратиться ко всем адресам, доставляемым в пакете. Отметтьте: Это невозможно для команды трубы, заданной путём роутера
“
redirect
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
26. Транспорт appendfile
Транспорт
“
appendfile
” доставляет сообщения путём добавления его к существующему файлу, или путём создания нового файла в заданной директории. Отдельные файлы, к которым добавляются сообщения, могут быть в традиционном формате UNIX mailbox, или, опционально, в формате MBX, поддерживаемом Pine MUA и даемоном University of Washington IMAP (его подерживают и другие). Когда каждое сообщение доставляется в отдельный файл, может использоваться, опционально, формат
“maildir
”, для дополнительной защиты от ошибок при доставке. Также поддерживается третья форма доставки в отдельные файлы, известная как
“mailstore
”. Для всех этих форматов, exim, в случае необходимости, пытается создать необходимое число уровней директорий, при условии что установлена опция
“
create_directory
”.
Код для опциональных форматов, по умолчанию не включен в бинарный файл exim`a. Для включения соответствующего кода, необходимо в
“
Local/Makefile
” установить SUPPORT_MBX, SUPPORT_MAILDIR и/или SUPPORT_MAILSTORE.
Exim распознаёт ошибки системной квоты, и генерит соответствующее сообщение. Также он поддерживает собственное управление квотами в транспорте, для использования когда системные средства недоступны, или по каким-то причинам не могут использоваться.
Если ошибка происходит при добавлении к файлу (например, превысилась квота, или заполнился раздел), exim пытается сбросить длинну и время последней модификации назад, к тем что были прежде. Если ошибка происходит при создании нового файла - файл удаляется.
До добавления к файлу, выполняется множество проверок безопасности, и файл блокируется. Детальное описание дано ниже, после списка частных опций.
Обычно, транспорт
“
appendfile
” используется для локальной доставки в пользовательские ящики. Однако, он также может использоваться как псевдо-удалённый транспорт, для раскладывания сообщений в файлы, для удалённой доставки другими средствами, кроме exim`a. В этом случае, часто используется формат
“пакетного SMTP
” (смотрите опцию
“
use_bsmtp
”).
26.1 Опции
“file
” и
“directory
”
Опция
“
file
” определяет единичный файл, к которому добавляются сообщения; опция
“
directory
” определяет директорию, в которой создаётся новый файл, содержащий сообщение. Может быть задана лишь одна из этих двух опций, и для нормальной доставки в почтовые ящики, одна из них должна быть установлена.
Однако,
“
appendfile
” также используется для доставки сообщений в файлы или директории, имена которых (или части имён) получаются из яльясов, форвардинга, или операций фильтрации (например, команды
“
save
” в пользовательском фильтре exim`a). Когда выполняется такой транспорт,
“
$local_part
” содержит локальную часть, которая альясится или форвардится, и
“
$address_file
” содержит имя (или часть имени) файла или директории, сгенерённое операцией перенаправления. Есть два случая:
Если не установлены ни
“
file
” ни
“
directory
”, операция перенаправления должна определить абсолютный путь (тот, который начинается с
“/
”). Это - большинство общих случаев, когда пользователи с локальными аккаунтами используют фильтрацию для сортировки почты по различным директориям. Смотрите, для примера, транспорт
“
address_file
”, в дефолтовой конфигурации. Если путь завершается слэшем, предполагается, что это - имя директории. Доставка в директорию может быть вызвана путём установки
“
maildir_format
” или
“
mailstore_format
”.
Если
“
file
” или
“
directory
” установлены для доставки от переназначения (редиректа [redirection] - прим. lissyara), она используется для определения имени файла или директории для доставки. Обычно, содержимое
“
$address_file
” используется каким-то образом в раскрытии строки.
Как пример второго случая, рассмотрите окружение где пользователи не имеют домашних директорий. Им можно разрешить использование команды фильтра exim`a в форме:
или команды фильтра Sieve в форме:
require "fileinto";
fileinto "folder23";
|
В этой ситуации, раскрытие
“
file
” или
“
directory
” в транспорте должно преобразовать относительный путь в соответствующее абсолютное имя файла. В случае фильтров Sieve, должно быть обработано имя
“
inbox
”. Это имя, используемое в качестве результата действия
“keep
” (
“сохранить
”), в фильтре. Этот пример показывает один способ обработать это требование:
file = ${if eq{$address_file}{inbox} \
{/var/mail/$local_part} \
{${if eq{${substr_0_1:$address_file}}{/} \
{$address_file} \
{$home/mail/$address_file} \
}} \
}
|
С этой установкой опции
“
file
”,
“
inbox
” ссылается на стандартное расположение почтового ящика, абсолютные пути используются без изменения, и другие папки находятся в директории
“
mail
”, внутри домашней директории.
Замечание 1: При обработке в фильтре exim`a, относительный путь, типа
“
folder23
” превращается в абсолютный, если роутеру известна домашняя директория. В частности, так обстоят дела, если установлена опция
“
check_local_user
”. Если вы хотите предотвратить это во время маршрутизации, вы должны установить
“
router_home_directory
” в пустое значение. Это вынуждает маршрутизатор передавать транспорту относительный путь.
Замечание 2: Абсолютный путь в
“
$address_file
” не обрабатывается как-то особенно; продолжает использоваться опция
“
file
” или
“
directory
”, если она установлена.
26.2 Частные опции для
“appendfile
”
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
allow_fifo
|
appendfile
|
boolean
|
ложь
|
|
Установка этой опции позволяет доставлять в именованные каналы (трубы, или FIFO) точно также как и в обычные файлы. Если, во время доставки, отстутсвует процесс читающий трубу, доставка задерживается.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
allow_symlink
|
appendfile
|
boolean
|
ложь
|
|
По умолчанию,
“
appendfile
” не доставляет, если имя пути к файлу будет символической ссылкой. Установка этой опции смягчает это ограничение, но существуют проблемы безопасности связанные с использованием симлинков. Убедитесь, что вы знаете, что делаете, при установке этой опции. Точные детали того, что затрагивает эта опция, находятся в обсуждении следующим за этим списком опций.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
batch_id
|
appendfile
|
string†
|
незадана
|
|
Смотрите описание пакетной локальной доставки в разделе 25. Однако, пакетная доставка автоматически отключается для доставок
“
appendfile
”, происходящих как результат форвардинга, альясинга, или других переназначений прямо в файл.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
batch_max
|
appendfile
|
integer
|
1
|
|
Смотрите описание пакетной локальной доставки в разделе 25.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_group
|
appendfile
|
boolean
|
ложь
|
|
Когда эта опция установлена, проверяется группа владельца файла, заданного опцией
“
file
”, для удостверения, что это та же самая группа, под которой выполняется процесс доставки. Дефолтовая настройка - ложна, поскольку дефолтовый режим - 0600, что означает, что группа не имеет значения.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_owner
|
appendfile
|
boolean
|
истина
|
|
Когда эта опция установлена, проверяется владелец файла, заданного опцией
“
file
”, для удостверения, что он тот же самый, под которым выполняется процесс доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_string
|
appendfile
|
string
|
смотрите ниже
|
|
Поскольку
“
appendfile
” записывает сообщение, начало каждой строки проверяется на совпадение с
“
check_string
”, и если оно происходит, совпавшие начальные символы заменяются на содержимое
“
escape_string
”. Значение
“
check_string
” - литеральная строка, а не регулярное выражение, и регистр содержащихся букв имеет значение.
Если установлена
“
use_bsmtp
”, значение
“
check_string
” и
“
escape_string
” принудительно устанавливаются в
“.
” и
“..
”, соответственно, и любые конфигурационные настройки игнорируются. Иначе, - у них значения по умолчанию
“From
” и
“>From
” когда задана опция
“
file
”, и незаданы, когда установлена любая из опций
“
directory
”,
“
maildir
” или
“
mailstore
”.
Дефолтовые настройки, наряду с
“
message_prefix
” и
“
message_suffix
”, являются подходящими для традиционных
“BSD
”-майлбоксов, где строка, начинающаяся с
“From
” индицирует начало нового сообщения. Все четыре опции нуждаются в изменении, если используется иной формат. Например, для доставки в почтовые ящики в формате MMDF:
check_string = "\1\1\1\1\n"
escape_string = "\1\1\1\1 \n"
message_prefix = "\1\1\1\1\n"
message_suffix = "\1\1\1\1\n"
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
create_directory
|
appendfile
|
boolean
|
истина
|
|
Когда эта опция истинна, exim пытается создать любые недостающие вышестоящие директории, для файла в который собирается производить запись. Режим созданного каталога, задаётся опцией
“
directory_mode
”.
Владелец группы созданной директории сильно зависит от используемой операционной системы (и, возможно, файловой системы). Например, в Solaris, если родительский каталог имеет установленный бит
“setgid
”, его группа передаётся дочернему каталогу; если нет, используется текущая установленная группа. Однако, в FreeBSD, всегда используется родительская группа.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
create_file
|
appendfile
|
string
|
anywhere
|
|
Эта опция ограничивает местоположение файлов и директорий создаваемых этим транспортом. Это применяется к файлам, заданным опцией
“
file
”, и директориям, заданным опцией
“
directory
”. В случае доставки maildir, это применяется к директориям верхнего уровня, а не к нижележащим директориям maildir.
Опция должна быть установлена в одно из слов
“anywhere
”,
“inhome
”, или
“belowhome
”. Во втором и третьем случае, для транспорта должна быть установлена домашняя директория. Эта опция бесполезна, когда задаётся явное имя файла для обычной доставки в почтовые ящики. Она предназначена для случая, когда имя файла генерится из пользовательских файлов
“
.forward
”. Обычно, они обрабатываются транспортом
“
appendfile
”, вызыванным
“
address_file
”. Также, смотрите опцию
“
file_must_exist
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
directory
|
appendfile
|
string†
|
незадана
|
|
Эта опция взаимоисключающая с опцией
“
file
”, но одна из опций
“
file
” или
“
directory
” должжна быть задана, исключая случай доставки как результата перенаправления (смотрите раздел 26.1).
Когда задана опция
“
directory
”, строка раскрывается, и сообщение доставляется в новый файл или файлы, или в подкаталог данного каталога, вместо добавления к единственному файлу почтового ящика. Поддерживается несколько различных форматов (смотрите
“
maildir_format
” и
“
mailstore_format
”), и смотрите раздел 26.4, для дальнейших деталей о этой форме доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
directory_file
|
appendfile
|
string†
|
q${base62:$tod_epoch}-$inode
|
|
Когда установлена опция
“
directory
”, но не установлены ни
“
maildir_format
” ни
“
mailstore_format
”,
“
appendfile
” доставляет каждое сообщение в файл, имя которого получается в результате раскрытия строки этой опции. Значение по умолчанию генерит уникальное имя из текущего времени, в форме base 62, и иноды файла. Переменная
“
$inode
” доступна лишь при раскрытии этой опции.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
directory_mode
|
appendfile
|
octal integer
|
0700
|
|
Если
“
appendfile
” создаёт какие-либо директории как результат опции
“
create_directory
”, их режим задаётся этой опцией.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
escape_string
|
appendfile
|
string
|
смотрите описание
|
|
Смотрите выше, опцию
“
check_string
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
file
|
appendfile
|
string†
|
незадана
|
|
Эта опция взаимоисключающая с опцией
“
directory
”, но одна из опций
“
file
” или
“
directory
” должжна быть задана, исключая случай доставки как результата перенаправления (смотрите раздел 26.1). Опция
“
file
” определяет единичный файл, к которому добавляется сообщение. Одна и более из опций
“
use_fcntl_lock
”,
“
use_flock_lock
” или
“
use_lockfile
” должны быть заданы с опцией
“
file
”.
Если вы используете более одного хоста для достаки через NFS в одни и те же почтовые ящики, вы всегда должны файлы блокировки
Значение строки раскрывается для каждой доставки, и должно привести к абсолютному пути. Самые общие установки этой опции - вариации одного из этих примеров:
file = /var/spool/mail/$local_part
file = /home/$local_part/inbox
file = $home/inbox
|
В первом примере, все доставки осуществляются в один и тот же каталог. Если exim сконфигурирован использовать файлы блокировки (смотрите ниже, опцию
“
use_lockfile
”), он должен быть в состояниии создать файл в директории, таким образом,
“липкий
” (
“sticky
”) бит должен быть включен для возможности доставки, или, альтернативно, может использоваться опция
“
group
” для выполнения доставки под групповым идентификатором, имеющим доступ к директории.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
file_format
|
appendfile
|
string
|
незадана
|
|
Эта опция просит транспорт проверить формат существующего файла, до добавления к нему. Проверка состоит из соответствия специфической строке в начале файла. Значение опции состоит из чётного числа строк, разделённых двоеточиями. Первая из кадой пары - проверочная строка, и вторая - имя транспорта. Если транспорт, ассоциированный с совпавшей строкой, не является текущим транспортом, управление передаётся другому транспорту. Например, предположим что к стандартному транспорту
“
local_delivery
” добавлено это:
file_format = "From : local_delivery :\
\1\1\1\1\n : local_mmdf_delivery"
|
Почтовые ящики, начинающиеся с
“From
”, продолжают обрабатываться этим транспортом, но почтовые ящики, начинающиеся с четырёх двоичных единиц, с символом новой строки, управление передаётся транспорту назваемому
“
local_mmdf_delivery
”, который, видимо, сконфигурирован для осуществления доставки в формате MMDF. Если почтовый ящик не существует, или пуст, предполагается совпадение с текущим транспортом. Если начало почтового ящика не совпадает ни с одной строкой, или не задан транспорт чьё имя совпало, доставка задерживается.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
file_must_exist
|
appendfile
|
boolean
|
ложь
|
|
Если эта опция истинна, файл заданный опцией
“
file
” должен существовать, и происходит ошибка, если это не так. Если она не задана, в случае его отсутствия, он создаётся.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lock_fcntl_timeout
|
appendfile
|
time
|
0s
|
|
По умолчанию, транспорт
“
appendfile
” использует неблокирующие вызовы
“
fcntl()
”, при блокировке открытого файла почтового ящика. Если вызов неудачен, процесс доставки засыпает на
“
lock_interval
”, и пробует снова, до времени
“
lock_retries
”. Неблокирующие вызовы используются так, чтобы файл не оставлялся открытым в ожидании блокировки; причина этого заключается в желании сделать это безопасным насколько возможно, для доставок через NFS, в случае, когда процессы могли бы обращаться к почтовому ящику NFS без использования файла блокировки. Этого не должно быть, но недоразумения, и, следовательно, просчёты конфигурации неизвестны.
На загруженных системах, однако, производительность неблокирующей блокировки не столь хороша, как использование блокирующей блокировки с таймаутом. В этом случае, ожидание делается в системном вызове, и процесс доставки exim`a овладевает блокировкой и может обработать, как только предыдущий держатель блокировки снимет её.
Если
“
lock_fcntl_timeout
” установлена в ненулевое время, блокирование болкируется, с использованием этого таймаута. Всё ещё может быть некоторое повторение: максимальное число повторений
(lock_retries * lock_interval) / lock_fcntl_timeout
|
округляется к следующему целому числу. Другими словами, полное время в течение которого
“
appendfile
” пробует получить блокировку - примерно тоже самое, если
“
lock_fcntl_timeout
” не установлена слишком большой.
Вы должны рассмотреть установку этой опции, если вы получаете много отсроченных локальных доставок из-за ошибок вида
failed to lock mailbox /some/file (fcntl)
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lock_flock_timeout
|
appendfile
|
time
|
0s
|
|
Этот таймаут применяется к блокировке файла, когда используется
“
flock()
” (смотрите
“
use_flock
”); таймаут работает в манере, похожей на
“
lock_fcntl_timeout
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lock_interval
|
appendfile
|
time
|
3s
|
|
Эта опция определяет время ожидания между попытками блокировки файла. Смотрите ниже, для дополнительных деталей о блокировке.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lock_retries
|
appendfile
|
integer
|
10
|
|
Эта опция определяет максимальное число попыток блокировки файла. Значение нуля обрабатывается как единица. Смотрите ниже, для дополнительных деталей о блокировке.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lockfile_mode
|
appendfile
|
octal integer
|
0600
|
|
Эта опция определяет режим создаваемого файла блокировки, когда используется файл блокировки (смотрите опции
“
use_lockfile
” и
“
use_mbx_lock
”)
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lockfile_timeout
|
appendfile
|
time
|
30m
|
|
Когда используется файл блокировки (смотрите опцию
“
use_lockfile
”), если файл блокировки уже существует, и он старше этого значения, предполагается, что он был случайно оставлен, и exim пытается его удалить.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mailbox_filecount
|
appendfile
|
string†
|
незадана
|
|
Если эта опция установлена, она раскрывается, и результат берётся как текущее число файлов в почтовом ящике. Это должно быть десятичное число, опционально сопровождаемое K или M. Этим предоставлятся способ получить информацию из внешнего источника, обслуживающего данные.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mailbox_size
|
appendfile
|
string†
|
незадана
|
|
Если эта опция задана, она раскрывается, и результат берётся как текущий размер почтового ящика. то должно быть десятичное число, опционально сопровождаемое K или M. Этим предоставлятся способ получить информацию из внешнего источника, обслуживающего данные. Это, вероятно, будет полезным для доставок
“maildir
”, где, в вычислительном отношении, дорого вычислить размер почтового ящика.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
maildir_format
|
appendfile
|
boolean
|
ложь
|
|
Если эта опция задана с опцией
“
directory
”, доставка в новый файл, в формате
“maildir
” используемом другими почтовыми программами. Когда транспорт активизирован непосредственно от роутера
“
redirect
” (например, транспорт
“
address_file
” в дефолтовой конфигурации), установка
“
maildir_format
” вызывает обработку пути переданного из роутера как каталога, вне зависмости, завершается, или нет, он на
“/
”. Эта опция доступна лишь если в
“
Local/Makefile
” присутствует SUPPORT_MAILDIR. Для получения дополнительных деталей, смотрите раздел 26.5.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
maildir_quota_directory_regex
|
appendfile
|
string
|
смотрите ниже
|
|
Эта опция уместна лишь если установлена
“
maildir_use_size_file
”. Она определяет регулярное выражение, для определения директорий, относительно директории квоты (смотрите
“
quota_directory
”), которая должна быть включена в подсчёт квоты. Значение по умолчанию:
maildir_quota_directory_regex = ^(?:cur|new|\..*)$
|
Этим включаются директории
“
cur
” и
“
new
”, и любые директории
“maildir++
” (директории, чьи имена начинаются с точки). Если вы хотите исключить из подсчёта директорию
“
Trash
” (как делают некоторые сайты), вы должны изменить эту установку на
maildir_quota_directory_regex = ^(?:cur|new|\.(?!Trash).*)$
|
Это использует отрицательное предвидение в регулярном выражении, для исключения директории с именем
“
.
Trash
”. Когда директория исключена из подсчёта квоты, обработка квоты пропускается для любых сообщений доставляемых в этот каталог.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
maildir_retries
|
appendfile
|
integer
|
10
|
|
Эта опция определяет число повторов при записи файла в формате
“maildir
”. Смотрите ниже, раздел 26.5.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
maildir_tag
|
appendfile
|
string†
|
незадана
|
|
Эта опция применяется лишь к доставкам в формате
“maildir
”, и она описана ниже, в разделе 26.5.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
maildir_use_size_file
|
appendfile
|
boolean
|
ложь
|
|
Установка этой опции в истину включает поддержку файлов
“
maildirsize
”. Exim создаёт файлы
“
maildirsize
” в
“maildir
”, если они не существуют, беря квоту из опции
“
quota
” транспорта. Если квота не задана - значение равно нулю. Смотрите
“
maildir_quota_directory_regex
”, выше и раздел 26.5 для получения дополнительных деталей.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
maildirfolder_create_regex
|
appendfile
|
string
|
незадана
|
|
Значение этой опции - регулярное выражение. Если оно не задано, опция не имеет никакого эффекта. Иначе, до доставки
“maildir
”, выражение сравнивается с именем директрии
“maildir
”, т.е. директории содержащей субдиректории
“
new
” и
“
tmp
”, которые будут использоваться для доставки. Если есть соответствие, exim проверяет существование файла с именем
“
maildirfolder
” в директории, и создаёт его, если он не существует. Для получения дополнительных деталей, смотрите раздел 26.5.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mailstore_format
|
appendfile
|
boolean
|
ложь
|
|
Если эта опция установлена вместе с опцией
“
directory
”, доставка осуществляется в два новых файла, в формате
“mailstore
”. Эта опция доступна лишь в случае, если при сборке exim`a в
“
Local/Makefile
” была опция SUPPORT_MAILSTORE. Для получения дополнительных деталей, смотрите раздел 26.4.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mailstore_prefix
|
appendfile
|
string†
|
незадана
|
|
Эта опция применяется только к доставкам в формате
“mailstore
”, и она описана ниже, в разделе 26.4.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mailstore_suffix
|
appendfile
|
string†
|
незадана
|
|
Эта опция применяется только к доставкам в формате
“mailstore
”, и она описана ниже, в разделе 26.4.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mbx_format
|
appendfile
|
boolean
|
ложь
|
|
Эта опция доступна лишь в случае, если при сборке exim`a в
“
Local/Makefile
” была опция SUPPORT_MBX. Если опция
“
mbx_format
” установлена с опцией
“
file
”, сообщение добавляется к почтовому ящику в формате MBX, вместо формата традиционного UNIX. Этот формат поддерживается Pine4, и связан с его POP3 и IMAP даемонами путём используемой всеми ими
“
c-client
” библиотеки.
Отметтьте: Опции
“
message_prefix
” и
“
message_suffix
” не меняются автоматически, при использовании
“
mbx_format
”. Обычно, при использовании формата MBX, они должны устанавливаться пустыми? таким образом, эта опция почти всегда появляется в такой комбинации:
mbx_format = true
message_prefix =
message_suffix =
|
Если в конфигурации не упомянута ни одна из опций блокировки, предполагается
“
use_mbx_lock
”, и другие опции блокировки, по дефолту, ложны. С
“
mbx_format
” возможно определить другие виды блокировок, но
“
use_fcntl_lock
” и
“
use_mbx_lock
” являются взаимоисключающими. Блокировка MBX взаимодействует с
“
c-client
”, предоставляя общий (может быть - распределённый - прим. lissyara) доступ к почтовому ящику. Она не должна использоваться, если любая иная программа, не использующая эту форму блокировки, собирается обращаться к этому почтовому ящику, или если почтовый ящик находится на файловой системе смонтированной по NFS, поскольку она работает лишь когда к почтовому ящику обращаются с одного хоста.
Если вы устанавливаете
“
use_fcntl_lock
” с почтовыми ящиками в формате MBX, вы не можете использовать станадартную версию
“
c-client
”, поскольку пока есть открытый ящик (это бывает при сессии Pine или IMAP), exim не в состоянии добавить к нему сообщение.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_prefix
|
appendfile
|
string†
|
смотрите ниже
|
|
Строка заданная в этом пункте раскрывается и выводится в начале каждого сообщения. По умолчанию, она незадана, если не определена опция
“
file
”, и не установлена
“
use_bsmtp
”, когда она:
message_prefix = "From ${if def:return_path{$return_path}\
{MAILER-DAEMON}} $tod_bsdinbox\n"
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_suffix
|
appendfile
|
string†
|
смотрите ниже
|
|
Строка заданная в этом пункте раскрывается и выводится в конце каждого сообщения. По умолчанию, она незадана, если не определена опция
“
file
”, и не установлена
“
use_bsmtp
”, в этих случаях она состоит из единственного символа - символа новой строки. Суффикс может быть подавлен путём установки:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mode
|
appendfile
|
octal integer
|
0600
|
|
Если создаётся файл вывода - на него устанавливается такой режим. Если он существует и на него установлены более широкие разрешения, они уменьшаются до указанного в этой опции. Если на него установлены более жёсткие ограничения, то происходит ошибка, если неложна опция
“
mode_fail_narrower
”. Однако, если доставка - результат команды
“
save
” в файле фильтра, задающей особый режим, режим выходного файла всегда принудительно приводится к этому значению, и эта опция игнорируется.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mode_fail_narrower
|
appendfile
|
boolean
|
истина
|
|
Эта опция применяется в случае, когда существующий файл почтового ящика имеет более строгие ограничения чем заданные опцией
“
mode
”. Если опция
“
mode_fail_narrower
” истинна - доставка задерживается (
“mailbox has the wrong mode
”); иначе - exim продолжает попытки достаки, используя существующий режим файла.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
notify_comsat
|
appendfile
|
boolean
|
ложь
|
|
Если эта опция истинна, даемон
“
comsat
” уведомляется после каждой успешной доставки в пользовательский почтовый ящик. Это даемон, который уведомляет залогиненых пользователей о пришедшей почте.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
quota
|
appendfile
|
string†
|
незадана
|
|
Эта опция налагает ограничения на размер файла, к которому exim добавляет сообщение, или на полный размер используемый деревом директорий, когда установлена опция
“
directory
”. В последнем случае, вычисление используемого места дорого стоит, поскольку должны быть индивидуально осмотрены и просуммированы все файлы в директории (и любых субдиректориях). (Смотрите
“
quota_size_regex
” и
“
maildir_use_size_file
” для способов избежать этого в окружении где пользователи не имеют shell-доступа к своим почтовым ящикам.)
Нет блокировки от двух одновременных доставок в многофайловый почтовый ящик, и в этом случае возможно превышение квоты. Для однофайловых почтовых ящиков, разумеется, блокировка - необходимость.
Размер файла берётся как его используемое значение. Из-за эффектов блокировки, оно может быть намного меньше дискового пространства, фактически используемого файлом. Если складываются размеры большого числа файлов, эффект округления может стать весьма заметным, особенно на системах использующих большой размер блока. Однако, кажется лучше придерживаться используемого числа, поскольку оно - очевидное значение, наиболее легко понимаемое пользователями.
Значение опции раскрывается, и должно быть числовым значением (разрешена десятичная точка), опционально сопровождаемая одной из букв K, M, или G - для килобайт, мегабайт, или гигабайт. Если exim работает на системе с поддержкой больших файлов (FreeBSD и Linux имеют такую поддержку), могут быть обработаны ящики более 2G размером.
Отметтьте: Значение нуля интерпретируется как
“нет квоты
”.
Раскрытие происходит когда exim работает как root, до того, как он для доставки меняет uid. Это означает, что для содержания квоты, которая ищется в раскрытии можно использовать файлы, которые недоступны конечному пользователю. При неудаче доставки по причине превышения квоты, ошибка обрабатывается как ошибка системной квоты.
По умолчанию, проверка квоты exim`ом подражает системным квотам, и ограничивает почтовый ящик заданным максимальным размером, хотя значение не является точным до последнего байта, из-за строк разделителей, и дополнительных заголовков, которые могут добавляться при доставке сообщения. Когда почтовый ящик почти полный, большие сообщения могут быть отклонены, а маленькие приняты, поскольку размер текущего сообщения добавляется к квоте, при проверке. Это поведение может быть изменено путём установки
“
quota_is_inclusive
” в ложь. Когда это сделано, проверка на превышение квоты не включает текущее сообщение. Таким образом, доставки продолжаются до превышения квоты; после этого никакие последующие сообщения не доставляются. Также смотрите опцию
“
quota_warn_threshold
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
quota_directory
|
appendfile
|
string†
|
незадана
|
|
Эта опция задаёт директорию для проверки квоты при доставке в отдельные файлы. ПО умолчанию - это директория для доставки, или, если в
“maildir
” директории существует файл с именем
“
maildirfolder
”, родительский каталог, по отношению к директории для доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
quota_filecount
|
appendfile
|
string†
|
0
|
|
Эта опция применяется когда установлена опция
“
directory
”. Она ограничивает общее число файлов в директории (сравните с лимитом на иноды в системных квотах). Она может использоваться, лишь когда установлена опция
“
quota
”. Значение раскрывается; ошибка доставки вызывает задержку доставки. Значение нуля интерпретируется как
“нет квоты
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
quota_is_inclusive
|
appendfile
|
boolean
|
истина
|
|
Смотрите выше, опцию
“
quota
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
quota_size_regex
|
appendfile
|
string
|
незадана
|
|
Эта опция применяется когда используется один из режимов доставки, записывающий отдельный файл для каждого сообщения. Когда exim хочет найти размер одного из этих файлов, для проверки квоты, он вначале проверяет
“
quota_size_regex
”. Если она установлена в регулярное выражение, которое совпадает с именем файла, и является одной строкой, строка интерепретируется как представление размера файла. Значение
“
quota_size_regex
” не раскрывается.
Эта особенность полезна лишь когда пользователи не имеют shell-доступа к своим почтовым ящикам - иначе они могли бы обойти квоту простым переименованием файлов. Это средство может использоваться для
“maildir
” доставок, путём установки
“
maildir_tag
” для добавления длинны файла к имени файла. Например:
maildir_tag = ,S=$message_size
quota_size_regex = ,S=(\d+)
|
Альтернативой
“
$message_size
” является
“
$message_linecount
”, которая содержит число линий в сообщений.
Регулярное выражение не должно предполагать что размер сообщения - в конце имени файла (даже при том, что её там помещает
“
maildir_tag
”), поскольку MUA обрабатывающие
“maildir
” иногда добавляют иную информацию в конец имени сообщения.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
quota_warn_message
|
appendfile
|
string†
|
смотрите ниже
|
|
Смотрите ниже, при использование этой опции. Если эта опция не задана, когда установлена
“
quota_warn_threshold
”, значение по умолчанию будет:
quota_warn_message = "\
To: $local_part@$domain\n\
Subject: Your mailbox\n\n\
This message is automatically created \
by mail delivery software.\n\n\
The size of your mailbox has exceeded \
a warning threshold that is\n\
set by the system administrator.\n"
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
quota_warn_threshold
|
appendfile
|
string†
|
0
|
|
Эта опция раскрывается точно таким же образом, как и
“
quota
” (смотрите выше). Если результирующее значение больше нуля, и доставка сообщения приводит к размеру файла или общему размеру дерева директорий более данного порога, посылается предупреждающее сообщение. Если, также, установлена
“
quota
”, порог может быть определён как процент от её значения, путём сопровождения значения символом процента. Например:
quota = 10M
quota_warn_threshold = 75%
|
Если
“
quota
” не задана, установка
“
quota_warn_threshold
” заканчивающаяся символом процента - игнорируется.
Само предупреждающее сообщение определяется путём опции
“
quota_warn_message
”, и оно должно начинаться со строки заголовка
“
To:
”, содержащей получателя (получателей) предупреждающего сообщения. Они не обязательно должны включать отправителей оригинального сообщения. Также, обычно, должна предоставляться строка
“
Subject:
”. Вы можете включить любые другие строки заголовков, которые вам необходимы. Если вы не включите строку
“
From:
”, то значение по умолчанию будет:
From: Mail Delivery System <mailer-daemon@$qualify_domain_sender>
|
Если вы предоставляете строку
“
Reply-To:
”, она перезадаёт глобальную опцию
“
errors_reply_to
”.
Опция
“
quota
” не нуждается в приведении в порядок, для использования этой опции; они независимы друг от друга, кроме случаев, когда порог определён как процент.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_bsmtp
|
appendfile
|
boolean
|
ложь
|
|
Если эта опция установлена в истину,
“
appendfile
” пишет сообщения в формате
“пакетного SMTP
”, с отправителем конверта и получателем(получателями) включёнными в SMTP-команды. Если вы хотите включить начальную команду HELO в эти сообщения, вы можете это сделать путём установки опции
“
message_prefix
”. Для получения дополнительных деталей о пакетном SMTP, смотрите раздел 44.10.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_crlf
|
appendfile
|
boolean
|
ложь
|
|
Эта опция заставляет строки заканчиваться двухсимвольной CRLF последовательностью (возврат каретки, перевод строки), вместо одного символа перевода строки. В случае пакетного SMTP, записанная в файл последовательность байт, - точное изображение того, что произвело бы отключение реального SMTP-соединения.
Содержимое опций
“
message_prefix
” и
“
message_suffix
” пишется дословно, таким образом, они должны содержать свои символы возврата каретки, если они необходимы. В случаях, когда эти опции имеют непустые значения по умолчанию, значение завершается единственным переводом строки, таким образом, они должны быть изменены, чтобы заканчиваться на
“\r\n
”, если установлена опция
“
use_crlf
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_fcntl_lock
|
appendfile
|
boolean
|
смотрите ниже
|
|
Эта опция контролирует использование функции
“
fcntl()
”, для блокировки файла в целях исключительного использования, при добавлении сообщения. По умолчанию, она установлена, когда не установлена
“
use_flock_lock
”. Иначе, она должна быть выключена, лишь если вы знаете что все ваши MUA используют блокировку путём файла блокировки. Когда не установлены обе опции,
“
use_fcntl_lock
” и
“
use_flock_lock
”, опция
“
use_lockfile
” должна быть задана.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_flock_lock
|
appendfile
|
boolean
|
ложь
|
|
Эта опция предоставлена для поддержки блокировки файлов с использованием
“
flock()
”, в тех немногих ситуациях, когда это необходимо. Самые современные операционные системы поддерживают блокировки
“
fcntl()
” и
“
lockf()
”, и эти две функции взаимодействуют друг с другом. По умолчанию, exim использует блокировку
“
fcntl()
”.
Эта опция требуется лишь если вы используете операционную систему где
“
lockf()
” используется программами обращающимися к почтовым ящикам (обычно - MUA), и где
“
flock()
” некорректно взаимодействует с
“
fcntl()
”. Если вы хотите, то можете одновременно использовать обе блокировки
“
fcntl()
” и
“
flock()
”.
Не все операционные системы предоставляют
“
flock()
”. Некоторые версии Solaris не имеют её (и некоторые, я думаю, предоставляют не совсем правильные версии, собранные на верху
“
lockf()
”). Если операционная система не имеет
“
flock()
”, exim будет собран без способности её использовать, и любые попытки сделать это приведут к конфигурационной ошибке.
Предупреждение: Блокировка
“
flock()
” не работает на NFS файлах (только если
“
flock()
” не отображается (mapped) на
“
fcntl()
” с помощью операционной системы).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_lockfile
|
appendfile
|
boolean
|
смотрите ниже
|
|
Если эта опция выключена, exim не пытается создать файл блокировки при добавлении к файлу почтового ящика. В этой ситуации, единственная блокировка -
“
fcntl()
”. Вы должны отключать
“
use_lockfile
” лишь в случае, если вы абсолютно уверены, что любые MUA, которые когда-либо будут просматривать почтовые ящики пользователей, используют
“
fcntl()
” вместо блокировочного файла и тогда, когда вы не передаёт через NFS более чем от одного хоста.
Для безопасного добавления к файлам NFS более чем от одного хоста, необходимо снять блокировку до открытия файла, и блокировочный файл достигает этого. Иначе, даже с блокировкой
“
fcntl()
”, есть риск повреждения файла.
Опция
“
use_lockfile
” установлена по умолчанию, если не задана
“
use_mbx_lock
”. Не возможно выключить обе опции -
“
use_lockfile
” и
“
use_fcntl_lock
”, кроме случаев, когда установлена
“
mbx_format
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
use_mbx_lock
|
appendfile
|
boolean
|
смотрите ниже
|
|
Эта опция доступна лишь когда exim скомпилирован с установленной SUPPORT_MBX в
“
Local/Makefile
”. Установка опции определяет, что используются специальные правила блокировки MBX. По умолчанию, она установлена, если установлена
“
mbx_format
”, и ни одной опции блокировки нет в конфигурации. Правила блокировки - такие же, как используются библиотекой
“
c-client
”, лежащей в основе даемонов Pine, IMAP4 и POP, которые идут вместе с ней (ниже, смотрите обсуждение). Правила разрешают общий доступ к почтовому ящику. Однако, этот вид блокироки не работает, когда почтовый ящик примонтирован по NFS.
Вы можете установить
“
use_mbx_lock
” с одной или обеими опциями
“
use_fcntl_lock
”
“
use_flock_lock
” для контроля, какая блокировка используется в осуществлении правил блокировки MBX. Значение по умолчанию использует
“
fcntl()
” если
“
use_mbx_lock
” установлена без
“
use_fcntl_lock
” или
“
use_flock_lock
”.
26.3 Операционные детали для добавления
До добавления к файлу, производятся следующие подготовительные операции:
Если имя файла -
“
/dev/null
”, не предпринимается никакого действия, и выдаётся успешное завершение.
Если какие-либо директории на пути файла отсутствуют, exim создёт их, если установлена опция
“
create_directory
”. Режим созданных директорий даётся опцией
“
directory_mode
”.
Если установлена
“
file_format
”, проверяется формат существующего файла. Если она указывает, что должен использоваться иной транспорт, управление передаётся этому транспорту.
Если установлена
“
use_lockfile
”, создаётся файл блокировки для способа, который будет надёжно работать по NFS, следующим образом:
1. Создание
“сцепленного файла
” чьё имя - имя файла блокировки с текущим именем, первичным именем хоста, и добавленным идентификатором процесса, путём открытия для записи нового файла. Если происходит неудача с ошибкой доступа, доставка задерживается.
2. Закрытие
“сцепленного файла
”, жёсткая ликовка его на имя файла блокировки.
3. Если вызов
“
link()
” успешен, создание файла блокировки успешно. Удаление имени сцепленного файла.
4. Иначе, используется
“
stat()
” для получения информации о сцепленном файле, и, затем, удаляется ссылка на имя сцепленного файла. Если число ссылок - ровно две, создание блокировчного файла успешно, но иногда (например, падение и рестарт NFS-сервера) вызывает несообщение этого факта вызову
“
link()
”.
5. Если создание блокировочного файла неудачно, ждётся
“
lock_interval
” и снова пробуется, вплоть до времени
“
lock_retries
”. Однако, т.к. любая программа пишущая в почтовый ящик должна завершить свою задачу очень быстро,это разумный таймаут старых блокировочных файлов, которые, обычно, резулльтат сбоев пользовательского агента и системы. Если существующий файл блокировки старее чем
“
lockfile_timeout
”, exim пытается удалить его до новой попытки.
К
“
lstat()
” производится запрос, для обнаружения, существует ли главный файл, и если это так, каковы его характеристики. Если
“
lstat()
” - неудачна для по какой-либо причине, кроме несуществования, доставка задерживается.
Если файл действительно существует, и явялется симлинком, доставка задерживается, если незадана опция
“
allow_symlink
”, в случае чего проверяется владелец ссылки, и, затем, вызывается
“
stat()
”, для нахождения реального файла, подвергаемого последующим проверкам. Проверка владельца вышестоящей ссылки предотвращает создание пользователем ссылки на чужой почтовый ящик в
“липкой
” директории, разрешение симлинков, в этом случае, - не самая хорошая идея. Если существует цепочка симликов, промежуточные не проверяются.
Если файл реально существует, но он не регулярный файл, или владелец и группа файла (если группа проверяется - смотрите выше, опцию
“
check_group
”) отличабтся от пользователя и группы под которыми производится доставка, доставка задерживается.
Если разрешения файла более широкие, чем указанные, - они уменьшаются. Если они недостаточны - доставка задерживается, если опция
“
mode_fail_narrower
” не установлена в ложь, в случае чего пробуется доставка с существующими разрешениями.
Сохраняется номер иноды файла, и файл открывается для добавления. Если это неудачно, по причине что файл исчез,
“
appendfile
” ведёт себя так, как будто его не существовало (смотрите ниже). Для любых других ошибок - доставка задерживается.
Если файл открыт успешно, проверяется, что не изменился его номер иноды, что это - всё ещё регулярный файл, и что не изменились его владелец и права. Если что-то не так - доставка задерживается, и сообщение замораживается.
Если файл изначально не существовал, доставка задерживается, если установлена опция
“
file_must_exist
”. Иначе, если установлена опция
“
create_file
”, проверяется что файл создан в разрешённом каталоге, и, затем, открывается для записи новый файл, с опциями O_EXCL и O_CREAT, кроме случаев, когда это производится с символической ссылкой (должна быть установлена опция
“
allow_symlink
”). В этом случае, который может произойти если ссылка указывает на несуществующий файл, файл открывается для записи используя O_CREAT, но не O_EXCL, поскольку это мешает связи с ссылкой.
Если открытие неудачно, поскольку файл существует, происходят проверки данные выше, для существующих файлов. Однако, для избежания петель в ситуациях, когда файл непрерыно создаётся и удаляется, петля существует/несуществует разрывается после 10 повторов, и сообщение замораживается.
Если открытие неудачно по любой другой причине - доставка задерживается.
Как только файл открыт, если неложны опции
“
use_fcntl_lock
” и
“
use_flock_lock
”, он блокируется, используя
“
fcntl()
” или
“
flock()
” или обе. Если
“
use_mbx_lock
” - ложна, в каждом случае запрашивается эксклюзивная блокировка. Однако, если
“
use_mbx_lock
” - истинна, exim забирает общую блокировку открытого файла, и эксклюзивно блокирует файл с именем
/tmp/.<device-number>.<inode-number>
|
используя устройство и номер иноды открытого файла почтовго ящика, в соответствии с правилами блокировки MBX. Этот файл создаётся с режимом, определённым путём опции
“
lockfile_mode
”.
Если exim не в состоянии заблокировать файл, есть два возможных действия, в зависимости от значения таймаута блокировки. Оно получается из
“
lock_fcntl_timeout
” и
“
lock_flock_timeout
”, соответственно.
Если значение таймаута - ноль, файл закрывается, exim ждёт
“
lock_interval
”, и, затем, возвращается и повторно открывает файл, как описано выше, и снова пробует ео заблокировать. Это случается до времени
“
lock_retries
”, после которого доставка задерживается.
Если значение таймаута более нуля, блокировка вызывает
“
fcntl()
” или
“
flock()
”, которая используются (с данным таймаутом), таким образом, уже будет некоторое значение таймаута, путём ошибок блокировки. Однако, exim не прекращает немедленно. Он повторяет до времени (округлённого)
(lock_retries * lock_interval) / <timeout>
|
В конце доставки, exim закрывает файл (освобождая блокировки
“
fcntl()
” и/или
“
flock()
”), и после этого удаляет, если он существует, файл блокировки.
26.4 Операционные детали для доставки в новый файл
Когда опция
“
directory
” установлена вместо
“
file
”, каждое сообщение доставялется в недавно созданный файл, или установленные файлы. Когда
“
appendfile
” активирован непосредственно из роутера
“
redirect
”, то обычно ни
“
file
”, ни
“
directory
” не устанавливаются, поскольку путь для доставки предоставялется роутером. (Смотрите, например, транспорт
“
address_file
”, в дефолтовой конфигурации.) В этом случае, доставка осуществляется в новый файл, если имя пути завершается на
“/
”, или установлена опция
“
maildir_format
” или
“
mailstore_format
”.
При записи сообщения в новый файл блокировка не требуется, следовательно, различные опции блокировки транспорта - игнорируются. Строка
“From
”, которая по умолчанию, разделяет сообщения в одном файле, обычно не требуется, ни экранирование строк сообщения начинающихся с
“From
”, и нет необходимости обеспечивать новую строку в конце каждого сообщения. Следовательно, значения по умолчанию
“
check_string
”,
“
message_prefix
” и
“
message_suffix
” - все незаданы, когда установлена любая из опций
“
directory
”,
“
maildir_format
” или
“
mailstore_format
”.
Если exim должен проверять установку
“
quota
”, он скоадывает размеры всех файлов в дефолтовой директории для доставки. Однако, вы можете задать иную диреткорию, путём установки
“
quota_directory
”. Также, для доставок
“maildir
” (смотрите ниже), соблюдается соглашение
“
maildirfolder
”.
Есть три различных пути, которыми может быть сделана доставка в индивидуальные файлы,контролируемые параметрами настройки опций
“
maildir_format
” и
“
mailstore_format
”. Отметтьте, что код для поддержки форматов
“maildir
” или
“mailstore
” не включен в бинарник, если SUPPORT_MAILDIR, или, соответственно, SUPPORT_MAILSTORE не установлены в
“
Local/Makefile
”.
Во всех трёх случаях, делается попытка создать директорию и все необходимые субдиреткории, если они не существуют, при условии что установлена опция
“
create_directory
” (по дефолту - установлена). Расположение созданного каталога может быть ограничено установкой
“
create_file
”. Режим созданной директории даётся опцией
“
directory_mode
”. Если создание неудачно, или если опция
“
create_directory
” не установлена, когда требуется создание, доставка задерживается.
26.5 Доставка
“maildir
”
Если истинна опция
“
maildir_format
”, exim доставляет каждое сообщение путём записи его в файл, чьё имя -
“
tmp/<stime>.H<mtime>P<pid>.<host>
”, в директории, определённой опцией
“
directory
” (
“директория доставки
”). Если доставка успешна, файл переименовывается внутрь субдиректории
“
new
”.
В имени файла,
“
<stime>
” - текущее время дня, в секундах, и
“
<mtime>
” - часть микросекунд времени. После
“
maildir
” доставки, exim проверяет, что часы дневного времени ушли дальше по крайней мере на микросекунду, перед завершением процесса доставки. Это гарантирует уникальность имени файла. Однако, предусмотрительно, exim вызывает
“
stat()
” для файла, до его открытия. Если даётся какой угодно ответ кроме ENOENT (не существует), exim ждёт две секунды, и пробует снова, вплоть до времени
“
maildir_retries
”.
До того, как exim выполнит
“
maildir
”-доставку, он обеспечивает что директории с именами
“
new
”,
“
cur
” и
“
tmp
” существуют в директории доставки. Если они не существуют, exim пробует создать их, и другие предстоящие директории в пути, подчиняясь опциям
“
create_directory
” и
“
create_file
”. Если задана опция
“
maildirfolder_create_regex
”, и её регулярное выражение содержит совпадение с директорией доставки, exim, также, гарантирует, что в директории доставки существует файл
“
maildirfolder
”. Если отсутствующая директория, или файл
“
maildirfolder
” не могут быть созданы, доставка задерживается.
Эти особенности позволяют использовать exim для создания всех необходимых файлов и каталогов в почтовом ящике, включая субдиректории для папок
“
maildir++
”. Рассмотрите этот пример:
maildir_format = true
directory = /var/mail/$local_part\
${if eq{$local_part_suffix}{}{}\
{/.${substr_1:$local_part_suffix}}}
maildirfolder_create_regex = /\.[^/]+$
|
Если пуста
“
$local_part_suffix
” (нет суффикса для локальной части), доставка происходит в вышележащую
“maildir
”, с именем типа
“
/var/mail/pimbo
” (для юзера с именем
“
pimbo
”). Регулярное выражение в
“
maildirfolder_create_regex
” не совпадает с этим именем, таким образом, exim не будет искать или создавать
“
/var/mail/pimbo/maildirfolder
”, хотя он, в случае необходимости, создаст
“
/var/mail/pimbo/{cur,new,tmp}
”.
Однако, если
“
$local_part_suffix
” содержит, например,
“-eximusers
”, доставка присходит в папку
“maildir++
”
“
/var/mail/pimbo/.eximusers
”, которая не совпадает с
“
maildirfolder_create_regex
”. В этом случае, exim создаст
“
/var/mail/pimbo/.eximusers/maildirfolder
”, также как и три директории
“maildir
” -
“
/var/mail/pimbo/.eximusers/{cur,new,tmp}
”.
Предупреждение: При установке
“
maildirfolder_create_regex
” позаботьтесь о том, чтобы она, по неосторожности, не совпадала с вышестоящей директорией
“maildir
”, поскольку файл
“
maildirfolder
” на вышестоящем уровне полностью нарушил бы подсчёт квоты.
Если exim обязан проверять установку
“
quota
” до
“maildir
” доставки, и
“
quota_directory
” не установлена, он ищет файл с именем
“
maildirfolder
” в
“maildir
”-директории (рядом
“
new
”,
“
cur
”,
“
tmp
”). Если он существует, exim предполагает, что директория - директория папок
“maildir++
”, которая одним уровнем ниже верхнего уровня пользовательской директории почтового ящика. Это заставляет его начать подсчёт используемого места с родительского каталога, вместо текущей директории.
Проблема, при доставке в многофайловый почтовый ящик, состоит в том, что в вычислительном отношении дорого подсчитать размер почтового ящика, для проверки квоты. Были предприянты различные подходы для уменьшения необходимой работы. Следующие два раздела описывают два из них. Третья альтернатива заключается в использовании какого-то внешнего процесса для обслуживания данных о размере, и использовании раскрытия опции
“
mailbox_size
” как способа импортировать эти данные в exim.
26.6 Использование тэгов для записи размера сообщений
Если установлена
“
maildir_tag
”, строка раскрывается для каждой доставки. Когда
“maildir
”-файл переименовывается в субдиректорию
“
new
”, к его имени добавляется тэг. Однако, если добавялемый тэг берёт длинну имени с которой проверочный вызов
“
stat()
” неудачен по причине ENAMETOOLONG, тег удаляется, и
“maildir
”-файл создаётся без тега.
Теги могут использоваться для кодирования размеров файлов в их именах; для примера, смотрите выше, опцию
“
quota_size_regex
”. Раскрытие
“
maildir_tag
” происходит после записи сообщения. Значение переменной
“
$message_size
” устанавливается в число фактически записанных байт. Если раскрытие принудительно неудачно, тэг игнорируется, но непринудительная неудача раскрытия приводит к задержке доставки. Раскрытый тэг может содержать любые печатные символы, кроме
“/
”. Непечатные символы в строке - игнорируются; если результирующая строка пустая - она игнорируется. Если она начинается с алфавитно-цифрового символа - вставляется начальное двоеточие.
26.7 Использование файла
“maildirsize
”
Если истинна опция
“
maildir_use_size_file
”, exim осуществляет правила
“maildir++
”, для хранения квоты и информации о размере файла в файле с именем
“
maildirsize
”, в директории
“maildir
” верхнего уровня. Если этот файл не существует, exim создаст его, устанавливая квоту из транспортной опции
“
quota
”. Если не существует сам каталог
“maildir
”, он его создаст до любых попыток записать файл
“
maildirsize
”.
Файл
“
maildirsize
” используется для хранения информации о размерах сообщений в
“maildir
”, ускоряя подсчёт квоты. Значение квоты в файле - всего лишь кэш; если квота изменяется в транспорте, новое значение перезаписывает кэшированное при доставке следующего сообщения. Кэш поддерживается для других программ, которые обращаются к
“maildir
” и должны знать квоту.
Если опция
“
quota
” в транспорте незадана, или равна нулю, файл
“
maildirsize
” поддерживается (с нулевой установкой квоты), но никакой квоты не накладывается.
Для контроля, какие каталоги используются в вычислении квоты при использовании файла
“
maildirsize
”, доступно регулярное выражение. Для дополнительных деталей, смотрите
“
maildir_quota_directory_regex
”, выше.
26.8 Доставка
“mailstore
”
Если истинна опция
“
mailstore_format
”, каждое сообщение записывается как два файла в данной директории. Уникальное базовое имя создаётся из идентификатора сообщения, и текущего процесса доставки, и файлы записываются с использованием этого базового имени, плюс суффиксов
“
.env
” и
“
.msg
”. Файл
“
.env
” содержит конверт сообщения, и файл
“
.msg
” - непосредственно сообщение. Базовое имя помещается в переменную
“
$mailstore_basename
”.
В процессе доставки, конверт, вначале, записывается в файл суффикс.tmp. Затем пишется файл
“
.msg
”, и по завершении записи, файл
“
.tmp
” переименовывается в файл
“
.env
”. Программы, обращающиеся к сообщениям, должны ожидать появления обоих файлов -
“
.env
” и
“
.msg
”, до доступа к любому из них. Альтернативный подход заключается в ожидании исчезновения файла
“
.tmp
”.
Файл конверта начинается с любого текста, заданного опцией
“
mailstore_prefix
”, раскрытой и завершённой символом новой строки, если таковой отсутствует. Затем следует адрес отправителя в одной строке, затем все адреса получателей - по одному на строке.Может быть более одного получателя лишь в случае, если значение опции
“
batch_max
” более одного. В конце, раскрывается
“
mailstore_suffix
” и результат добавляется в файл, сопровождаемый символом новой строки, если он им не заканчивается.
Если раскрытие
“
mailstore_prefix
” или
“
mailstore_suffix
” завершается принудительной неудачей - они игнорируются. Другие ошибки раскрытия рассматриваются как конфигурационные ошибки, и доставка задерживается. Переменная
“
$mailstore_basename
” доступна для использования в процессе этих раскрытий.
26.9 Неспециальная доставка в новый файл
Если не установлены ни
“
maildir_format
” ни
“
mailstore_format
”, непосредственно в названном каталоге создаётся единичный новый файл. Например, при доставке сообщений в файлы в пакетном формате SMTP, для позднейшей доставки на другой хост (смотрите раздел 44.10), могут использоваться установки типа таких:
directory = /var/bsmtp/$host
|
Сообщение записывается в файл с временным именем, которое переименовывается, когда доставка завершена. Финальное имя файла получается путём раскрытия опции
“
directory_file
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
27. Транспорт autoreply
Транспорт
“
autoreply
” - не истинный транспорт, в нём не происходит передачи сообщения. Вместо этого, генерится новое почтовое сообщение, как автоматический ответ на входящее сообщение. Включаются строки заголовков
“
References:
” и
“
Auto-Submitted:
”. Они создаются согласно правилам в RFC2822 и RFC3834, соответственно.
Если в роутере передающем сообщение этому транспорту не установлена опция
“
unseen
”, оригинальное сообщение (для текущего получателя), не доставляется куда-либо. Однако, когда в роутере передающем сообщение этому транспорту установлена опция
“
unseen
”, роутинг адреса продолжается таким образом, чтобы другой маршрутизатор мог выполнить нормальную доставку.
Транспорт
“
autoreply
”, обычно, запускается как результат почтовой фильтрации,
“отпускные
” сообщения (видимо, автоответ пока человек в отпуске - прим lissyara), - являются стандартным примером. Однако, также он может быть выполнен напрямую из роутера, как и любой другой транспорт. Для уменьшения возможных каскадов сообщений, сообщения созданные транспортом
“
autoreply
” всегда имеют пустого отправителя, как и рикошеты.
Параметры посылаемого сообщения могут быть заданы в конфигурации путём описанных ниже опций. Однако, они используются лишь когда адрес, передаваемый транспорту, не содержит собственной информации ответа. Когда транспорт выполняется как следствие команды
“
mail
” или
“
vacation
” в файле фильтра, параметры сообщения, переданные фильтром, передаются вместе с адресом. Транспортные опции, определяющие сообщение, в таком случае игнорируются (таким образом, обычно, в этом случае они не устанавливаются). Сообщение полностью определено фильтром, или транспортом; они никогда не состоят из смеси этих опций. Однако, опции
“
file_optional
”,
“
mode
” и
“
return_message
” применяются во всех случаях.
Транспорт
“
autoreply
” осуществляется как локальный транспорт. При использовании его как результат команды в пользовательском файле фильтра,
“
autoreply
”, обычно работает под uid и gid пользователя, и с соответствующими текущей и домашней директориями (смотрите раздел 23).
Есть трудноуловимое различие между роутингом сообщения в транспорт
“
pipe
”, который генерит некий текст для возвращения отправителю, и роутингом его в транспорт
“
autoreply
”. Это различие заметно лишь если обрабатывается более одного адреса в одном сообщении. В случае
“
pipe
”, раздельные выводы от различных адресов собираются и возвращаются отправителю в одном сообщении, тогда как при использовании
“
autoreply
” для каждого адреса генерятся различные сообщения для передачи.
Непечатные символы не разрешены в строках заголовков сгенерённых для сообщения созданного
“
autoreply
”, за исключением символа новой строки, немедленно сопровождаемого пробелом. Если найдены любые непечатные символы, транспорт задерживается. Глобальная опция
“
print_topbitchars
” управляет считать ли символы с установленным высшим битом как печатные, или нет. Они не применяются непосредственно к сгенерённому сообщению.
Если любые из общих опций для манипуляции заголовками (например,
“
headers_add
”) установлена в транспорте
“
autoreply
”, они применяются к копии оригинального сообщения, включённой в сгенерированное сообщение, когда установлена
“
return_message
”. Они не применяются непосредственно к сгенрированному сообщению.
Если транспорт
“
autoreply
” получает от exim код возврата 2 при предоставлении сообщения, указывая, что не было получателей, это не обрабатывается как ошибка. Это означает, что автответы посылались на
“
$sender_address
” когда она была пуста (поскольку входящее сообщение - рикошет), не вызывая проблем. Они лишь отбрасываются.
27.1 Частные опции для
“autoreply
”
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bcc
|
autoreply
|
string†
|
незадана
|
|
Этим определяются адреса которые должны получать
“слепые копии
” (
“blind carbon copies
”) сообщений, когда сообщение определено транспортом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
cc
|
autoreply
|
string†
|
незадана
|
|
Этим определяются получатели сообщения и содержимое заголовка
“
Cc:
”, когда сообщение определено транспортом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
file
|
autoreply
|
string†
|
незадана
|
|
Содержимое файла посылается как тело сообщения, когда сообщение определно транспортом. Если установлены обе опции -
“
file
” и
“
text
”, более важна текстовая строка.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
file_expand
|
autoreply
|
boolean
|
ложь
|
|
Если это установлено, содержимое указанного опцией
“
file
” файла подвергается раскрытию строк, и они добавляются в сообщение.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
file_optional
|
autoreply
|
boolean
|
ложь
|
|
Если эта опция истинна, не генится ошибка, если файл названный в опции
“
file
”, или пришедший с адресом не существует, или нечитаем.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
from
|
autoreply
|
string†
|
незадана
|
|
Этим определяется содержимое заголовка
“
From:
”, когда сообщение определено транспортом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers
|
autoreply
|
string†
|
незадана
|
|
Этим определяются дополнительные заголовки, согдасно RFC2822, которые должны быть добавлены к сообщению, когда сообщение определено транспортом. Можно задать несколько, путём использования
“\n
” для их разделения. Проверка их формата отсутствует.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log
|
autoreply
|
boolean
|
незадана
|
|
Имя этой опции - файл, в который записывается каждое посланное сообщение, когда сообщение определено транспортом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mode
|
autoreply
|
octal integer
|
0600
|
|
Этот режим используется если создаётся файл логов, или файл
“once
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
never_mail
|
autoreply
|
address list†
|
незадана
|
|
Если любой запуск транспорта создаёт сообщение с получателем, который совпадает с любым элементом в этом списке, от этого получателя тихо отказываются. Если отвергнуты все получатели, не создаётся никакого сообщения. Это применяется и когда получатели сгенерированы фильтром, и когда они заданы в транспорте.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
once
|
autoreply
|
string†
|
незадана
|
|
Эта опция - имя файла или БД DBM в которой сохраняются записи каждого
“
To:
” получателя, когда сообщение определено транспортом. Отметтьте: Это не применяется к получателям
“
Cc:
” и
“
Bcc:
”.
Если
“
once
” незадана, или установлена в пустую строку, сообщение всегда шлётся. По умолчанию, если
“
once
” установлена в непустое имя файла, сообщение не шлётся, если потенциальный получатель уже перечислен в БД. Однако, если опция
“
once_repeat
” определяет время более нуля, сообщение посылается, если прошло столько времени с тех пор как было послано последнее сообщение этому получателю. Установка нулевого времени в
“
once_repeat
” (по умолчанию) препятствует повторной отсылке сообщения - в этом случае, ноль - указание бесконечности.
Если
“
once_file_size
” - ноль, база данных DBM используется для запоминания получателей, и этим ей позволяется быть любого необходимого размера. Если
“
once_file_size
” установлена более нуля, это изменяет способ, которым exim осуществляет опцию
“
once
”. Вместо использования DBM базы для записи каждого получателя, он использует регулярный файл, который никогда не будет больше установленного размера.
В файле, exim хранит линейный список адресов получателей и времён, когда ис было послано сообщение. Если файл полон при необходимости добавить новую запись, удаляется самый старый адрес. Если
“
once_repeat
” не установлена, это означает, что данный получатель может получать много сообщений, но в непредсказуемых интарвалах, зависящих от частоты оборота адресов в файле. Если установлена
“
once_repeat
”, она определяет максимально время между повторениями.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
once_file_size
|
autoreply
|
integer
|
0
|
|
Смотрите выше, опцию
“
once
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
once_repeat
|
autoreply
|
time†
|
0s
|
|
Смотрите выше, опцию
“
once
”. После раскрытия, значение это йопции должно быть допустимым значением времени.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
reply_to
|
autoreply
|
string†
|
незадана
|
|
Этой опцией определяется содержимое заголовка
“
Reply-To:
”, когда сообщение определено транспортом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
return_message
|
autoreply
|
boolean
|
ложь
|
|
Если эта опция установлена, копия оригинального сообщения возвращается с новым сообщением, максимальный размер подчиняется установке глобальной конфигурационной установке
“
return_size_limit
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
subject
|
autoreply
|
string†
|
незадана
|
|
Эта опция определяет содержимое заголовка
“
Subject:
”, когда сообщение определено транспортом. Это позволяет указывать оригинальную тему сообщения в автоматических ответах. Например:
subject = Re: $h_subject:
|
Однако, при выполнении этого существует опасность. Это может позволить третьему лицу подписатьваших пользователей на списки рассылки, при условии, что список принимает рикошеты как подтверждение подписки. Хорошие списки требуют, чтобы подписка подтверждалась не сообщением рикошета, таким образом, опасность относительно невелика.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
text
|
autoreply
|
string†
|
незадана
|
|
Этой опцией определяется одна строка, которая будет использоваться как тело сообщения, когда сообщение определено транспортом. Если заданы и
“
text
” и
“
file
”, вначале используется
“
text
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
to
|
autoreply
|
string†
|
незадана
|
|
Этой опцией определяются получатели сообщения, и содержимое заголовка
“
To:
”, когда сообщение определено транспортом.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
30. Транспорт SMTP
Транспорт
“
smtp
” доставляет сообщения через TCP/IP соединения, используя протокол SMTP или LMTP. Список хостов, для попыток доставки, может быть взят из обрабатываемого адреса (будет установлен роутером), или явно определён для транмпорта. Обработка таймаутов и повторов (смотрите раздел 32) применяется независимо, к каждому IP-адресу.
30.1 Несколько сообщений в одном соединении
Отправка нескольких сообщений через одно TCP/IP соединение может быть результатом двух путей:
Если сообщение содержит более чем
“
max_rcpt
” (смотрите ниже) адресов, которые направляются к одному и тому же хосту, к нему должна быть послана более чем одна копия сообщения. В этой ситуации, несколько копий могут быть посланы в одном запуске транспорта
“
smtp
” через одно TCP/IP соединение. (Что, фактически, и делает exim, когда ему надо отослать очень много адресов в одном сообщении, также зависит от значения глобальной опции
“
remote_max_parallel
”. Подробности даны в разделе 44.1.)
Когда сообщение было успешно доставлено через TCP/IP соединение, exim смотрит свою БД подсказок (hints), для нахождения - есть ли какие-либо другие сообщения, ожидающие подключения к тому же самому хосту. Если они есть, для одного из них начинается новый процесс доставки, и текущее TCP/IP соединнеие передаётся ему. Новый процесс, в свою очередь, может посылать несколько копий, и, возможно, создать ещё один процесс.
Для каждой копии, посланной по одному и тому же TCP/IP соединению, увеличивается счётчик последовательности, и, если его значение когда-либо добирается до
“
connection_max_messages
”, по этому подключению сообщения более не посылаются.
30.2 Использование переменной
“
$host
”
В начале запуска транспорта
“
smtp
”, значения
“
$host
” и
“
$host_address
” - имя и адрес первого хоста в списке хостов переданном роутером. Однако, когда транспорт собирается соединяться с заданным хостом, и в то время, когда он соединён с этим хостом, в
“
$host
” и
“
$host_address
” устанавливаются значения этого хоста. Они - значения, находящиеся в силе, когда раскрыты
“
helo_data
”,
“
hosts_try_auth
”,
“
interface
”
“
serialize_hosts
” и различные опции TLS.
30.1 Частные опции для
“smtp
”
Частные опции транспорта
“
smtp
” таковы:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
allow_localhost
|
smtp
|
boolean
|
ложь
|
|
Когда хост, заданный в
“
hosts
” или
“
fallback_hosts
” (смотрите ниже), оказывается локальным хостом, или перечислен в
“
hosts_treat_as_local
”, по умолчанию, доставка задерживается. Однако, если установлена опция
“
allow_localhost
”, exim продолжает производить доставку. Это должно использоваться лишь в специальных случаях, когда конфигурация гарантирует, что в результата не будет петель (например, порт, на который посылается сообщение, слушает иначе сконфигурированный exim).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
authenticated_sender
|
smtp
|
string†
|
незадана
|
|
Когда exim аутентифицирует клиента, или если истинна опция
“
authenticated_sender_force
”, эта опция устанавливает значение для элемента
“AUTH=
” в исходящих командах MAIL, перезадавая любое существующее значение аутентифицированного отправителя. Если раскрытие строки принудительно неудачно, опция игнорируется. Иные ошибки раскрытия вызывают задержку доставки. Если результат раскрытия - пустся строка, она также игнорируется.
Если SMTP-сессия не аутентифицирована, всё равно происходит раскрытие
“
authenticated_sender
” (и может вызывать задержку доставки, если оно неудачно), но элемент
“AUTH=
” в команды MAIL не добавляется, исключая случай, когда истинна опция
“
authenticated_sender_force
”.
Эта опция позволяет вам использовать транспорт SMTP в режиме LMTP, для доставки почты Cyrus IMAP, и обеспечения надлежащей локальной части как
“authenticated sender
”, с помощью установки типа:
authenticated_sender = $local_part
|
Это удаляет необходимость в субдиректориях IMAP, для назначения специальных ACL, чтобы позволить прямую доставку в эти субдиректории.
Поскольку ожидаемое использование - типа описанного для Cyrus (когда домен не используется), нет проверки на синтаксис предоставляемого значения.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
authenticated_sender_force
|
smtp
|
boolean
|
ложь
|
|
Если эта опция истинна, значение опции
“
authenticated_sender
” используется для элемента
“AUTH=
” в исходящих командах MAIL, когда exim не аутентифицирован, как клиент.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
command_timeout
|
smtp
|
time
|
5m
|
|
Эта опция определяет таймаут для получения ответа на отосланную SMTP команду. Также, это значение используется при ожидании начально приветственного сообщения с удалённого хоста. Это значение должно быть ненулевым.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
connect_timeout
|
smtp
|
time
|
5m
|
|
Эта опция определяет таймаут для функции
“
connect()
”, устанавливающей TCP/IP вызов к удалённому хосту. Значение нуля разрешает действовать системному таймауту (обычно - несколько минут). Для какого-либо эффекта, это значение должно быть меньше системного таймаута. Однако, на некоторых системах наблюдалось отсутствие какого-либо системного таймаута, поэтому, дефолтовое значение этой опции - 5 минут, это значение рекомендовано RFC1123.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
connection_max_messages
|
smtp
|
integer
|
500
|
|
Эта опция контролирует максимальное число отдельных сообщений, доставялемых через одно TCP/IP соединение. Если значение равно нулю, нет ограничений. В целях теститрования, это значение может быть перезадано опцией командной строки
“
-oB
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
data_timeout
|
smtp
|
time
|
5m
|
|
Эта опция определяет таймаут для передачи каждого блока, в части данных, сообщения. Как результат, - полный таймаут зависит от размера сообщения. Значение не должно быть нулём. Также смотрите опцию
“
final_timeout
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
delay_after_cutoff
|
smtp
|
boolean
|
истина
|
|
Эта опция управляет там, что происходит когда все удалённые адреса для данного домена были недоступны так долго, что они были переданы их сокращающимся временам повторов.
В дефолтовом состоянии, если в следующее время повтора ни один из них не был достигнут, адрес возвращается (в виде рикошета - прим. lissyara) без дальнейших попыток доставки. Другими словами, exim задерживает повторы IP адресов после финального времени сокращения до достижения нового времени повтора, и поэтому адрес может сорваться без попыток доставки, когда машина недоступна долгое время. Некоторые люди несчистны от этой перспективы, так что...
Если опция
“
delay_after_cutoff
” установлена в ложь, exim ведёт себя по другому. Если все адреса проходят их финальное время сокращения, exim пробует доставить тем адресам, которые не были опробованы с моменты прибытия сообщения. Если они отсутствуют, или все они неудачны, адрес срывается (генерится рикошет - прим. lissyara). Другими словами, при прибытии нового сообщения задержки не происходит, немедленно пробуются адреса с истёкшим сроком, которы не пробовались с момента прибытия сообщения. Если существует продолжающийся поток сообщений к мёртвым хостам, незаданная опция
“
delay_after_cutoff
” означает, что будет ещё много попыток доставки на них.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_qualify_single
|
smtp
|
boolean
|
ложь
|
|
Если используются опции
“
hosts
” и
“
fallback_hosts
”, и опция
“
gethostbyname
” - ложна, то установлена опция RES_DEFNAMES, резольвера. Для дополнительных деталей, смотрите опцию
“
qualify_single
”, в разделе 17.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_search_parents
|
smtp
|
boolean
|
ложь
|
|
Если используются опции
“
hosts
” и
“
fallback_hosts
”, и опция
“
gethostbyname
” - ложна, то установлена опция RES_DNSRCH, резольвера. Для дополнительных деталей, смотрите опцию
“
qualify_single
”, в разделе 17.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
fallback_hosts
|
smtp
|
string list
|
незадана
|
|
К этой опции не применяется раскрытие строк. Аргумент должен быть списком имён хостов, или IP-адресов, разделённых двоеточиями, также, опционально, включается номер порта, разделитель может быть изменён, как описано в разделе 6.19. Каждый отдельный элемент списка - тоже самое, что и элемент в установке
“
route_list
” для
“
manualroute
”, как описано в разделе 20.5.
Аварийные (резервные, чтоли... - прим. lissyara) хосты, также могут быть определены в роутерах, которые ассоциированы с обрабатываемыми адресами. Что используется для опции
“
hosts
” без заданных в транспорте
“
hosts_override
” и
“
fallback_hosts
” лишь если адрес не обладает собственным ассоциированным аварийным списком хостов. В отличие от
“
hosts
”, установка для адреса
“
fallback_hosts
” не перезадаётся путём
“
hosts_override
”. Однако,
“
hosts_randomize
” обращается к спискам аварийных хостов.
Если exim не может доставить на любой хост для специфического адреса, и ошибки - не постоянные отклонения, адрес помещается в отдельную транспортную очередь, со своим списком хостов, заменённым аварийными хостами, кроме адресов которые роутятся через MX-записи и текущий хост был в изначальном списке MX. В этой ситуации, список аварийных хостов не используется.
Как только завершены нормальные доставки, аварийная очередь доставляется путем повторного запуска тогоже транспорта с новыми списками хостов. Если несколько неудачных адресов имеют одинаковый аварийный хост (и это разрешается опцией
“
max_rcpt
”), посылается одна копия сообщения.
Разрешение имён хостов в аварийном списке контролируется опцией
“
gethostbyname
”, как для опции
“
hosts
”. Аварийные хосты применяются в обоих случаях, когда список хостов прибывает с адресом, и когда он берётся из
“
hosts
”. Эта опция обеспечивает средство
“use a smart host only if delivery fails
” (использовать умные хосты лишь когда неудачна доставка).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
final_timeout
|
smtp
|
boolean
|
ложь
|
|
Это - таймаут, который применяется когда ожидается заключительная строка, содержащая лишь
“.
”, завершая сообщение. Это значение не должно быть нулём.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
gethostbyname
|
smtp
|
boolean
|
ложь
|
|
Если эта опция истинна, когда используются опции
“
hosts
” и/или
“
fallback_hosts
”, имена ищутся используя
“
gethostbyname()
” (или
“
getipnodebyname()
”, когда доступна), вместо использования DNS. Разумеется, эта функция, может, фактически, использовать DNS, но она, также, может консультироваться с другими источниками информации, типа
“
/etc/hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
helo_data
|
smtp
|
string†
|
$primary_hostname
|
|
Зачение этой опции раскрывается, и используется как аргумент для команды EHLO, HELO, или LHLO, запускающей исходящую SMTP или LMTP сессии. В переменные
“
$host
” и
“
$host_address
” устанавливается даныые удалённого хоста, и они могут быть использованы для генрирования различных значений для различных серверов.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts
|
smtp
|
string list†
|
незадана
|
|
Хосты ассоциированы с адресом при помощи роутера типа
“
dnslookup
”, который ищёт хосты поиском домена адреса в DNS, или путём
“
manualroute
”, имеющего списки хостов в конфигурации. Однако, почтовые адреса могут быть переданы транспорту
“
smtp
” при помощи любого роутера, и не все они могут обеспечить ассоциированный список хостов.
Опция
“
hosts
” задаёт список хостов, используемых если обрабатываемый адрес не имеет связанных с ним ассоциированных хостов. Также, хосты определённые в
“
hosts
” используются при заданной опции
“
hosts_override
”, независимо от того, заданы ли собственные хосты адреса или нет.
Вначале строка раскрывается, до интерпретации как списка имён хостов, или IP-адресов разделённых двоеточиями, с возможным включением номера порта. Разделитель может быть изменён на что-то иное, чем двоеточие, как описано в разделе 6.19. Каждый отдельный элемент списка - тоже самое, что и элемент в установке
“
route_list
” для
“
manualroute
”, как описано в разделе 20.5. Однако, отметтьте, что средство
“/MX
”, роутера
“
manualroute
”, тут недоступно.
Если раскрытие неудачно, доставка задерживается. Исключая ошибку, вызыванную неспособностью завершить поиск, ошибка логгируется в лог паники, также как и в главный лог. Имена хостов ищутся или путём непосредсвенного поиска записи адреса в DNS, или путём вызова
“
gethostbyname()
” (или
“
getipnodebyname()
”, когда она доступна), в зависимости от установки опции
“
gethostbyname
”. Когда exim скомпилен с поддержкой IPv6, если хост, который ищется в DNS, имеет оба адреса - IPv4 и IPv6, используются оба типа адреса.
В процессе доставки, хосты пробуются в порядке подчиняющемся их статусу повтора, если не задана опция
“
hosts_randomize
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_avoid_esmtp
|
smtp
|
host list†
|
незадана
|
|
Эта опция - для использования с кривыми хостами, которые объявляют средства ESMTP (например PIPELINING), и, затем, не в состоянии осуществить их должным образом. Когда хост совпадает с
“
hosts_avoid_esmtp
”, exim посылает HELO, а не EHLO, в начале сеанса SMTP. Это означает, что не могут использоваться какие бы то ни было ESMTP средства, типа AUTH, PIPELINING, SIZE, и STARTTLS.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_avoid_tls
|
smtp
|
host list†
|
незадана
|
|
Exim не пытается начать TLS-сессию, когда происходит доставка на любой хост совпадающий с этим списком. Для получения дополнительных деталей о TLS, смотрите раздел 38.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_max_try
|
smtp
|
integer
|
5
|
|
Эта опция ограничивает число IP-адресов, которые пробуются для любой одной доставки, в случае когда происходят временные ошибки доставки. Раздел 30.4 описывает её использование, и зачем она нужна.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_max_try_hardlimit
|
smtp
|
integer
|
50
|
|
Это - дополнительная проверка на максимальное число IP-адресов, которые exim пробует для любой одной доставки. Раздел 30.4 описывает её использование, и зачем она нужна.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_nopass_tls
|
smtp
|
host list†
|
незадана
|
|
Для любых хостов, которые совпадают с этим списком, соединение на котоом был начата TLS-сессия, не будет передаваться новому процессу доставки для посылки иного сообщения в той же самой сессии. Для объяснений, когда это может быть необходимо, смотрите раздел 38.10.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_override
|
smtp
|
boolean
|
ложь
|
|
Если эта опция установлена, и, также, установлена опция
“
hosts
”, то любые хосты присоединённые к адресу игнорируются, и вместо них всегда используются хосты заданные в опции
“
hosts
”. Эта опция не применяется к
“
fallback_hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_randomize
|
smtp
|
boolean
|
ложь
|
|
Если эта опция установлена, и, или список хостов взят из опции
“
hosts
” или
“
fallback_hosts
”, или хосты предоставленные роутером не были получены из MX-записей (это включает аварийные хосты из роутера), и не были рандомизированы (изменён их порядок, случайным образом - прим. lissyara) роутером, то порядок опробования хостов рандомизируется каждый раз при запуске транспорта. Перемешивание порядка списка хостов может использоваться для грубого распределения нагрузки.
Когда опция
“
hosts_randomize
” - истинна, список хостов может быть разбит на группы, порядок которых перемешивается отдельно. Это позволяет установить MX-like поведение. Границы между группами обозначены элементом, который просто
“+
” в списке хостов. Например:
hosts = host1:host2:host3:+:host4:host5
|
Порядок трёх первых и порядок последних двух хостов перемешивается для каждого использования, но первые три всегда завершаются до двух последних. Если опция
“
hosts_randomize
” не установлена, элемент списка
“+
” - игнорируется.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_require_auth
|
smtp
|
host list†
|
незадана
|
|
Эта опция предоставляет список серверов, для которых должна произойти успешная аутентификация до того, как exim попробует передать сообщение. Если аутентификация неудачна для серверов которые не в этом списке, exim пробует отослать без аутентификации. Если аутентифкация неудачна для одного из серверов в списке, - доставка задерживается. Эта временная ошибка обнаружима в правилах повторов, таким образом, она может быть превращена жёсткую ошибку, если это требуется. Также смотрите опцию
“
hosts_try_auth
”, и раздел 33 - для получения дополнительных деталей о аутентификации.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_require_tls
|
smtp
|
host list†
|
незадана
|
|
Exim будет настаивать на использовании сессии TLS? когда доставляет к любому хосту который совпадает с этим списком. Смотрите раздел 38, для получения дополнительных деталей о TLS. Отметтьте: Эта опция затрагивает лишь исходящую почту. Для применения TLS ко входящим сообщениям, используйте соответствующую ACL.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_try_auth
|
smtp
|
host list†
|
незадана
|
|
Эта опция предоставляет список серверов, которым exim пытается аутентифицироваться, когда соединяется как клиент, если эти сервера объявляли о поддержке аутентификации. Если аутентификация неудачна, exim пробует передать сообщение неаутентифицировавшись. Также смотрите опцию
“
hosts_require_auth
”, и раздел 33 - для получения дополнительных деталей о аутентификации.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
interface
|
smtp
|
string list†
|
незадана
|
|
Эта опция определяет, какие интерфейсы будут использоваться при создании исходящего SMTP-вызова. Переменные
“
$host
” и
“
$host_address
”, в процессе раскрытия строки, ссылаются на хост, к которому будет производиться подключение. Принудительная неудача раскрытия, или результат в виде пустой строки, вызывают игнорирование этой опции. Иначе, после раскрытия, строка должна быть списком IP-адресов, по дефолту разделённых двоеточиями, но разделитель может быть изменён обычным способом. Например:
interface = <;
192
.
168
.
123
.
123
; 3ffe:ffff:836f::fe86:a061
|
Первый интерфейс корректного типа (IPv4 или IPv6) - используется для исходящего соединения. Если ни один из них не явялется интерфейсом правильного типа, опция игнорируется. Если опция
“
interface
” не установлена, или игнорируется, то системные IP-функции выбирают, какой интерфейс использовать, если у хоста их более одного.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
keepalive
|
smtp
|
boolean
|
истина
|
|
Эта опция контролирует установку SO_KEEPALIVE на исходящих сокетах соединения TCP/IP. Когда она установлена, она заставялет ядро периодически исследовать неактивные соединения, путём посыла пакета со
“старым
” номером последовательности. Другой конец подключения должен послать подтверждение, если с подключением всё в порядке, или сброс, если подключение было прервано. Причина для этого в том, что оказывается благоприятное воздействие освобождения некоторых типов подключений, которые могут
“застрять
”, когда удалённый хост отключается, не разрывая TCP/IP соединение должным образом. Механизм
“keepalive
” может занять несколько часов, для обнаружения недостижимых хостов.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lmtp_ignore_quota
|
smtp
|
boolean
|
ложь
|
|
Если эта опция истинна, когда опция
“
protocol
” установлена в
“lmtp
”, строка
“IGNOREQUOTA
” добавляется у команде RCPT, при условии, что LMTP-сервер информировал о поддержке IGNOREQUOTA в его ответе на команду LHLO.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
max_rcpt
|
smtp
|
integer
|
100
|
|
Эта опция ограничвает число команд RCPT, которые послылаются в одной SMTP-транзакции. Каждый установленный адрес обрабатывается независимо, и, таким образом, может вызывать параллельные подключения к одному и тому же хосту, если это разрешается опцией
“
remote_max_parallel
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
multi_domain
|
smtp
|
boolean
|
истина
|
|
Когда эта опция установлена, транспорт
“
smtp
” может обрабатывать множество адресов, содержащих смесь различных доменов, если все они резольвятся в один и тот же список хостов. Выключение опции ограничивает транспорт обработкой лишь одного домена одновременно. Это полезно, если вы хотите использовать
“
$domain
” в раскрытии для транспотра, поскольку она установлена лишь когда один домен вовлечён в удалённую доставку.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
port
|
smtp
|
string†
|
смтрите ниже
|
|
Эта опция определяет TCP/IP порт на сервере, с котрым соединяется exim. Если значение опции начинается с цифры, оно берётся как номер порта; иначе, оно ищется с использованием
“
getservbyname()
”. Обычно, дефолтовое значение -
“smtp
”, но, если протокол установлен как
“lmtp
”, значение по умолчанию -
“lmtp
”. Если раскрытие неудачно, или если не может быть найден номер порта, доставка задерживается.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
protocol
|
smtp
|
string
|
smtp
|
|
Если эта опция установлена в
“lmtp
” вместо
“smtp
”, значение по умолчанию для опции
“port
” изменяется на
“lmtp
”, и транспорт опрерирует протоколом LMTP (RFC2033), вместо SMTP. Этот протокол иногда используется для локальных доставок в закрытое хранилища сообщений. Exim, также, поддерживает выполнение LMTP через трубу к локальному процессу - смотрите раздел 28.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
retry_include_ip_address
|
smtp
|
boolean
|
истина
|
|
Exim, обычно, включает оба - имя хоста и IP-адрес в ключ, создаваемый для индексирования данных повторов, после временной неудачи доставки. Это означает, что когда один или несколько IP-адресов для хоста неудачны, он проверяет их периодически (управляемый правилами повторов), но использование других IP-адресов - не затрагивается.
Однако, в некоторых окружающих средах dialup-хостов, назначается другой адрес при каждом соединении. В этой ситуации, использование IP-адреса как части ключа повторов приводит к нежелательным результатам. Установка этой опции в ложь, заставляет exim использовать только имя хоста. Обычно, это должно делаться на отдельном
“
smtp
” транспорте, устанавливаемом специально для обработки dialup-хостов.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
serialize_hosts
|
smtp
|
host list†
|
незадана
|
|
Поскольку exim работает в распределённой манере, если несколько сообщений для одного хоста прибывают одновременно, может произойти более одного подключения к удалённому хосту. Обычно, это не проблема, кроме случаев, когда между хостами медленная связь. В этом случае, может быть полезным ограничить exim одним соединением одновременно. Это может быть сделано путём установки опции
“
serialize_hosts
”, чтобы она совпадала с этими хостами.
Exim осуществляет упорядочивание посредством базы данных подсказок (hints), в которую вносятся записи каждый раз, когда процесс соединяется с одним из ограниченных хостов. Запись удаляется после завершения соединения. Очевидно, есть возможность для оставления ложных записей, если происходит системный или програмный сбой. Для принятия мер против этого, exim игнорирует любые записи старше шести часов.
Если вы устанавливаете этот вид упорядочивания, вы, также, должны принять меры для удаления БД подсказок (hints) при каждой перезагрузке системы. Имена файлов начинаются с
“
misc
”, и они хранятся в директории
“
spool/db
”. Могут быть один, или два файла, в зависимости от типа используемой DBM. Те же самые файлы используются для упорядочивания ETRN.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
size_addition
|
smtp
|
integer
|
1024
|
|
Если удалённый сервер SMTP указывает, что он поддерживает опцию SIZE в команде MAIL, exim использует её для передачи размера сообщения, в начале SMTP-транзакции. Этой опцией добавляется значение
“
size_addition
” к передаваемому значению, для учёта заголовков и другого текста, который может быть добавлен, в процессе доставки, конфигурационными опциями, или в транспортном фильтре. Может возникнуть необходимость увеличить это значение, если к сообщениям добавляется много текста.
Альтернативно, если установлено отрицательное значение опции
“
size_addition
”, оно вообще отключает использование опции SIZE.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_certificate
|
smtp
|
string†
|
незадана
|
|
Значение этой опции должно быть абсолютным путём к файлу, содержащему клиентский сертификат, для возможного использования при посылке сообщения через зашифрованное соединение. В процессе раскрытия, значения
“
$host
” и
“
$host_address
” устанавливаются в имя и адрес сервера. Смотрите раздел 38, для получения дополнительных деталей о TLS.
Отметтьте: Эта опция должна быть задана, если вы хотите, чтобы exim мог использовать TLS-сертификаты при отправке сообщений как клиент. Глобальная опция, с тем же самым именем, задаёт сертификат для exim`a как сервера; не предполагается, автоматически, что тот же самый сертификат должен использоваться при работе exim`a как клиента.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_crl
|
smtp
|
string†
|
незадана
|
|
Эта опция определяет список аннулированных сертификатов. Раскрытое значение должно быть именем файла, содержащего CRL в формате PEM.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_privatekey
|
smtp
|
string†
|
незадана
|
|
Значение этой опции должно быть абсолютным путём к файлу, содержащему частный ключ клиента. Это используется при отправке сообщения через шифрованное соединение, используя клиентский сертификат. В процессе раскрытия, значения
“
$host
” и
“
$host_address
” устанавливаются в имя и адрес сервера. Если эта опция незадана, или раскрытие принудительно неудачно, или результат - пустая строка, предполагается, что частный ключ находится в том же файле, что и сертификат. Смотрите раздел 38, для получения дополнительных деталей о TLS.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_require_ciphers
|
smtp
|
string†
|
незадана
|
|
Значение этой опции должно быть списком разрешённых наборов шифров, для использования при установке исходящего шифрованного соединения. (Есть глобальная опция, с тем же самым именем, для контроля входящих соединений.) В процессе раскрытия, значения
“
$host
” и
“
$host_address
” устанавливаются в имя и адрес сервера. Смотрите раздел 38, для получения дополнительных деталей о TLS; отметтьте, что эта опция используется по разному OpenSSL и GnuTLS (смотрите разделы 38.4 и 38.5). Для GnuTLS, порядок шифров - предпочтительный порядок.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_tempfail_tryclear
|
smtp
|
boolean
|
истина
|
|
Когда хост сервера не находится в
“
hosts_require_tls
”, и есть проблема в установке TLS-сессии, эта опция поределяет, должен ли exim пытаться доставить незашифрованное соединение. Если она установлена в ложь, доставка к текущему хосту задержана; если есть другие хосты - пробуются они. Если эта опция установлена в истину, exim пытается доставить нешифрованное сообщение, после 4xx ответа на STARTTLS. Также, если STARTTLS принят, но последующие переговоры TLS неудачны, exim закрывает текущее соединение (поскольку оно находится в неизвстном состоянии), открывает новое, к тому же самому хосту, и пытается осуществить чистую (видимо - нешифрованную - прим. lissyara) доставку.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_verify_certificates
|
smtp
|
string†
|
незадана
|
|
Значение этой опции должно быть абсолютным путём к файлу, содержащему разрешённые серверные сертификаты, для использования при установке шифрованного подключения. Альтернативно, если вы используете OpenSSL, вы должны установить
“
tls_verify_certificates
” в имя директории, содержащей файлы сертификатов. Это не работает с GnuTLS; эта опция должны быть установлена в имя одного файла, если вы используете GnuTLS. В процессе раскрытия, значения
“
$host
” и
“
$host_address
” устанавливаются в имя и адрес сервера. Смотрите раздел 38, для получения дополнительных деталей о TLS.
30.4 Как ограничить число хостов используемых для проверки
Есть две опции, которые связаны с числом хостов, которые проверяются при SMTP доставке. Это
“
hosts_max_try
” и
“
hosts_max_try_hardlimit
”.
Опция
“
hosts_max_try
” ограничивает число хостов, которые пробуются за за одну доставку. Однако, несмотря на термин
“хост
” в её названии, опция, фактически, применяется независимо к каждому IP-адресу. Другими словами, многоадресные (тут применялось другое словечко - multihomed, но думаю, так будет ясней - прим. lissyara) хосты обрабатываются как несколько независимых хостов, точно так же как и для повторов.
Многие из больших ISP (Internet Service Provider, провайдеров интернета - прим. lissyara) имеют много MX-записей, часто указвающих на многоадресные хосты. Как результат, список дюжины и более IP-адресов может быть создан в результате маршрутизации одного из этих доменов.
Пробовать каждый отдельный адрес в таком длинном списке - не самая разумная идея; если несколько адресов вверху списка неудачны, разумно предположить, что существует какая-то проблема, затрагивающая их все. Грубо говоря, значние
“
hosts_max_try
” - максимальное число, пробуемое до задержки доставки. Однако, логика не может быть простой.
Во-первых, IP-адреса пропускаются, поскольку не пришло их время повтора, и кроме того, адреса, время повтора которых не подошло, также не подсчитываются. Это означает, что когда некоторые адреса доходят до их времени повтора, может быть попробовано более одного значения
“
hosts_max_try
”. Причина такого поведения заключается в необходимости гарантировать, что все IP-адреса рассмотрены до таймаута почтового адреса (но, смотрите ниже, для исключений).
Во-вторых, когда достигнут предел
“
hosts_max_try
”, exim просматривает вниз список хостов, чтобы найти есть ли последующие хосты с иным (более высоким) значением MX. Если они есть, этот хост рассматривается следующим, и текущий IP-адрес используется, но не подсчитывается. Это поведение - помощь в случае, когда домен с правилами повтора, которые почти никогда не задерживают никакие хосты, как - сейчас будет объяснено:
Рассмотрите случай длинного списка хостов, с одним значением MX, и нескольких с более высоким значением MX. Если
“
hosts_max_try
” - маленькое (значение по умолчанию - 5), вначале будут опробованы лишь несколько хостов вверху списка. С дефолтовыми правилами повторов, определяющими увеличивающееся время повтора, в конечном счёте, пробуются более высокие MX-хосты, после того, как те, что наверху списка пропущены, поскольку они не достигли их времени повтора.
Однако, это, - обычная практика для помещения короткого фиксированного времени повтора в доменах крупных ISP, на том основании, что что их сервера редко лежат очень долго. К сожалению, они - как раз те домены, которые имеющеи тенденцию к резольвингу в длинные списки хостов. Короткое время повтора - что самые самые маленькие MX-хосты пробуются чаще всего. Попытки могут быть в различном порядке, из-за случайной сортировки, но без специальной проверки MX, высшие MX-хосты бы никогда не пробовались, до тех пор, пока все низшие MX-хосты имеют таймаут (который может быть несколько дней), поскольку всегда есть каки-либо низшие MX-хосты, с наступивгим временем повтора. Со специальной проверкой, exim рассматривает по крайней мере один IP-адрес от каждого значения MX, при каждой попытке доставки, даже если уже был достигнут предел
“
hosts_max_try
”.
Вышеупомянутая логика означает, что
“
hosts_max_try
” - не является жёстким пределом, и в частности, обычно, exim пробует все адреса, до таймаута адреса электронной почты. Когда
“
hosts_max_try
” была осуществлена, это казалось разумной вещью. Однако, недавно, некоторые сумашедшие конфигурации DNS были установлены с сотнями IP-адресов для некоторых доменов. Это, действительно, может занять очень длительное время для таймаута адресов, в этих случаях.
Опция
“
hosts_max_try_hardlimit
” была добавлена для помощи при таких проблемах. Exim никогда не пробует больше этого числа IP-адресов; если он достигает этого предела, и у всех них был таймаут, почтовый адрес срывается (генерится рикошет - прим. lissyara), даже несмотря на то, что не все возможные IP-адреса были попробованы.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
31. Перезапись адресов
Существуют некоторые обстоятельства, при которых exim автоматически переписывает домены в адресах. Два самых частых - когда адрес даётся без домена (называемый
“неквалифицированным адресом
” (
“unqualified address
”)), или когда адрес содержит сокращённый домен, раскрываемый путём поиска в DNS.
Дисквалифицированные адреса конверта принимаются лишь для локально переданных сообщений, или для сообщений, которые передаются с хостов, совпадающих с
“
sender_unqualified_hosts
” или
“
recipient_unqualified_hosts
”, соответственно. Неполные адреса, в строках заголовков, квалифицируются, если они в локально переданных сообщениях, или сообщениях с хостов, которым разрешено посылать неквалифицированные адреса конверта. Иначе, неквалифицированные адреса в строках заголовков, ни квалифицированы, ни перезаписаны.
Одна ситуция, в которой exim автоматически не перезаписывает домен, - когда его имя - CNAME запись в DNS. Старые RFC предлагают что такой домен домен должен быть перезаписан используя
“каноническое
” имя, и некоторые MTA так и делают. Новые RFC не содержат этого предложения.
31.1 Явно сконфигурированная перезапись адресов
Эта часть описывает правила перезаписи, которые могут быть использованы в основном разделе конфигурационного файла, и, также, в общей опции
“
headers_rewrite
”, которая может быть установлена лишь для транспорта.
Некоторые люди полагают, что сконфигурированная перезапись адресов - Смертный Грех. Другие полагают, что хизнь без этого - невозможна. Exim предоставляет средство; Вы не должны его использовать.
Главные правила перезаписи, в строках заголовков, применяются лишь к тем заголовкам, которые были получены с сообщением, и, в случае транспортной перезаписи, тем, которые были добавлены системным фильтром. Таким образом, это применяется лишь к тем заголовкам, которые являются общими для всех копий сообщения. Строки заголовков, которые добавлены путём индивидуальных роутеров или транспортов (и, которые поэтому явялются специфическими для индивидуальных получателей адресов), не перезаписываются.
Вообще, перезапись адресов от вашей системы или домена имеет немного легитимности (законности). Перезапись иных адресов должна быть сделана лишь с большой осторожностью и в особых обстоятельствах. Автор exim`a полагает, что перезапись должна использоваться расчётливо, и, главным образом, для
“упорядочивания
” адресов в ваших собственных доменах. Хотя это и может использоваться как инструмент маршрутизации, это очень строго нерекомендуется.
Есть два часто встречающихся обстоятельства, где используется перезапись, как иллюстрировано этими примерами:
Компания, чей домен -
“
hitch.fict.example
”, имеет множество хостов, которые обмениваются почтой друг с другом за файрволлом, но есть лишь один шлюз во внешний мир. Шлюз переписывает
“
*.hitch.fict.example
” как
“
hitch.fict.example
”, когда посылает почту наружу.
Хост перезаписывает локальные части собственных пользователей так, чтобы, например,
“
fp42@hitch.fict.example
” стал
“
Ford.Prefect@hitch.fict.example
”.
31.2 Когда происходит перезапись?
Конфигурирование перезаписи адресов может иметь место на нескольких различных стадиях обработки сообщения
В начале ACL для MAIL, отправитель адреса может быть перезаписан путём специального SMTP правила перезаписи (смотрите раздел 31.9), но никаких обычных правил перезаписи не применяется. Однако, если адрес отправителя проверен в ACL, он перезаписан перед проверкой, и остаётся перезаписанным после неё. Последующее значение
“
$sender_address
” - перезаписанный адрес. Также, это применяется если проверка отправителя происходит в RCPT ACL. Иначе, когда адрес отправителя не проверен, он перезаписывается сразу после получения строк заголовка.
Точно также, в начале ACL для RCPT, текущий адрес получателя может быть перезаписан, во время SMTP, путём специального правила, но никаких обычных правил перезаписи не применяется. Однако, когда проверяется получатель, поведение отличается от проверки адреса отправителя. Адрес перезаписан для проверки, но на этой стадии перезапись не запоминается. Значение
“
$local_part
” и
“
$domain
”, после проверки, всегда те же самые, что и до неё (т.е. они содержат неперезаписанный - исключая перезапись во время SMTP - адрес).
Как только строки заголовков были получены, все адреса получателей конверта перезаписаны насовсем, и, также, перезапись применяется к адресам в строках заголовков (если сконфигурировано). Это происходит до добавления любых строк заголовков, которые были заданы в MAIL или RCPT ACL, и до DATA ACL и выполнения функции
“
local_scan()
”.
Когда адрес роутится, или для доставки, или для проверки, к дочерним адресам, сгенерённым перенаправлением, перезапись применяется немедленно, если на роутере не установлена опция
“
no_rewrite
”.
В транспортное время, дополнительная перезапись адресов в строках заголовков может быть задана путём установки в транспорте общей опции
“
headers_rewrite
”. Эта опция содержит правила, которые идентичны по форме правилам в секции перезаписи, конфигурационного файла. Они применяются к оригинальным строкам заголовков, и любым добавленным ACL или системным фильтром. Они не применяются к строкам заголовков которые были добавлены роутерами или транспортами.
Исходящий отправитель конверта может быть перезаписан при помощи транспортной опции
“
return_path
”. Однако, невозможно переписать получателей получателей конверта в транспортное время.
31.3 Тестирование правил перезаписи применяемых на входе
Входная конфигурация перезаписи появляется в части рабочего конфигурационного файла, озаглавленная как
“begin rewrite
”. Она может быть протестирована путём опции командной строки
“
-brw
”. Она берёт адрес (который может быть полным адресом, в соответствии с RFC2822) как аргумент. Вывод - список как адрес был бы преобразован путём правил перезаписи для каждого различного места, в котором он мог бы появиться во входящем сообщении, т.е. для каждого различного заголовка, и для поля отправителя конверта, и поля получателя конверта. Например,
exim -brw ph10@exim.workshop.example
|
может привети к такому выводу
sender: Philip.Hazel@exim.workshop.example
from: Philip.Hazel@exim.workshop.example
to: ph10@exim.workshop.example
cc: ph10@exim.workshop.example
bcc: ph10@exim.workshop.example
reply-to: Philip.Hazel@exim.workshop.example
env-from: Philip.Hazel@exim.workshop.example
env-to: ph10@exim.workshop.example
|
который показывает, что перезапись была установлена для этого адреса, когда он используется в любых исходных полях, но не когда он появляется как адрес получателя. В настоящее время, нет никакого альтернативного способа протестировать правила перезаписи установленные для специфического транспорта.
31.4 Правила перезаписи
Секция перезаписи, в конфигурационном файле, содержит строки правил перезаписи, в форме:
“
<source pattern> <replacement> <flags>
”
Правила перезаписи, которые заданы для общей транспортной опции
“
headers_rewrite
”, даны в в виде списка, разделённого двоеточиями. Каждый элемент в списке принимает такую же форму, как строка в главной конфигурации перезаписи (исключая, разумеется, что любые двоеточия должны быть удвоены).
Формат исходных шаблонов, и строк замены описаны ниже. Каждый - завершается пустым пространством (пробелом), если он не находится в двойных кавычках, в этом случае, применяются обычные соглашения о квотировании (помещении в двойные кавычки, экранировке - прим. lissyara). Флаги - единственные символы, которые могут появляться в любом порядке. Пробелы и символы табуляции, между ними, игнорируются.
Для каждого адреса, который, потенциально, может быть перезаписан, правила сканируются по порядку, и замены для адресов из ранних правил, могут быть самостоятельно заменены более поздними правилами (но, смотрите флаги
“q
” и
“R
”).
Порядок в котором перезаписываются адреса - не задан, может измениться между релизами, и на него нельзя положиться, с одним исключением: когда сообщение получено, отправитель конверта всегда перезаписан первым, до перезаписи любых строк заголовков. например, строка замены, для перезаписи адреса в
“
To:
”, не должна предполагать, что адрес сообщения в
“
From:
” был (или небыл) уже перезаписан. Однако, перезапись
“
From:
” может предположить, что отправитель конверта уже был перезаписан.
Переменные
“
$local_part
” и
“
$domain
” могут быть использованы в строке замены, для ссылки на перезаписываемый адрес. Отметтьте, что управляемая поиском перезапись не может быть сделана правилом в форме
где ключ поиска использует
“
$1
” и
“
$2
”, или
“
$local_part
” и
“
$domain
” для ссылки на перезаписываемый адрес.
31.5 Шаблоны перезаписи
Исходные шаблоны в правилах перезаписи - это любой элемент, который может появиться в списке адресов (смотрите раздел 10.18). Фактически, он обрабатывается как одноэлементный список адресов, что означает, что он раскрывается до проверки адресов. Как всегда, если в шаблоне вы используете регулярное выражение, вы должны позаботиться о экранировке символов доллара и обратного слэша, или использовать средство
“\N
”, для подавления раскрытия строки в пределах регулярного выражения.
Домены, в паттернах (шаблонах, или образцах - прим. lissyara), должны быть даны в строчных (маленьких) буквах. Локальные части, в паттернах, чувствительны к регистру. Если вы хотите сделать регистронезависисимое сравнение локальных частей, вы должны использовать регулярное выражение начинающееся с
“^(?i)
”.
После совпадения, числовые переменные
“
$1
”,
“
$2
” и т.д., могут быть установлены, в зависимости от произошедшего типа соответствия. Это может использоваться в строках замены, для вставления части входящего адреса.
“
$0
” - всегда совпадает с полным входящим адресом. Когда используется регулярное выражение, числовые переменные установлены из его подвыражений. Для других типов шаблонов, они устанавливаются следующим образом:
Если локальная часть, или домен, начинаются со звёздочки, числовые переменные ссылаются на строки символов, совпадающие со звёздочками, с
“
$1
” - ассоциированной с первой звёздочкой,
“
$2
” - со второй, если она представлена. Например, паттерн
сравнивается с адресом
“
hearts-queen@wonderland.fict.example
”, тогда
$0 = hearts-queen@wonderland.fict.example
$1 = hearts-
$2 = wonderland
|
Отметтьте, чт если локальная часть не начинается со звёздочки, но домен начинается, тогда
“
$1
” будет содержать совпавшую часть домена.
Если доменная часть паттерна - частичный поиск, совпавшие и фиксированные части домена помещаются в следующие доступные числовые переменные. Предположим, например, что адрес
“
foo@bar.baz.example
” - обрабатывается по правилу перезаписи в форме
*@partial-dbm;/some/dbm/file <replacement string>
|
и ключ в файле, соответствует домену в форме
“*.baz.example
”. Тогда
$1 = foo
$2 = bar
$3 = baz.example
|
Если адрес
“
foo@bar.baz.example
” находится, он совпадает с тем же вхождением подстановочного знака, и в случае
“
$2
” - устанавливается в пустую строку, но
“
$3
” всё ещё совпадает с
“
baz.example
”. Если неподстановчный ключ совпадает с частичным поиском,
“
$2
” снова устанавливается в пустую строку, и
“
$3
” устанавливается в весь домен. Для нечастичных поисков поисков домена, никакие числовые переменные незаданы.
31.6 Перезапись замен
Если строка замены для правила - единственная звёздочка, адрес, который совпадает с паттерном, и флаги не перезаписываются, и никакие последующие правила перезаписи не просматриваются. Например,
hatta@lookingglass.fict.example * f
|
определяет, что
“
hatta@lookingglass.fict.example
” - никогда не будет перезаписан в в заголовках
“
From:
”.
Если заменяющая строка - не единственная звёздочка, она раскрывается, и должна привести к полностю квалифицированному адресу (с доменной частью - прим. lissyara). В пределах раскрытия, переменные
“
$local_part
” и
“
$domain
” ссылаются на перезаписываемый адрес. Любые буквы, которые они содержат, сохраняют их оригинальный регистр, - они не преобразуются в нижний регистр. Числовые переменные установлены согласно типу паттерна, совпадающего с адресом, как описано выше. Если раскрытие принудительно неудачно, путём присутствия
“fail
” в условном элементе, или элементе поиска, перезапись путём текущего правила оставлена, но последующие правила могут вступить в силу. Любые другие ошибки раскрытия вызывают пропуск всей операции перезаписи, и вход пишется в лог паники.
31.7 Флаги перезаписи
Есть три различных вида флагов, которые могут появляться в правилах перезаписи:
Флаги, которые определяют, какой заголовок и адрес конверта перезаписывать:
“E
”,
“F
”,
“T
”,
“b
”,
“c
”,
“f
”,
“h
”,
“r
”,
“s
”,
“t
”.
Флаг, который определяет перезапись во время SMTP:
“S
”.
Флаги, которые контролируют процесс перезаписи:
“Q
”,
“q
”,
“R
”,
“w
”.
Для правил являющихся частью общей транспортной опции
“
headers_rewrite
”,
“E
”,
“F
”,
“T
” и
“S
” не разрешены.
31.8 Флаги, определяющие какие заголовки и адрес конверта перезаписывать
Если нет ни одного из следующих флагов, ни флага
“S
” (смотрите раздел 31.9), главное правило перезаписи применяется ко всем заголовкам, полям отправителя и получателя конверта, тогда как правило перезаписи в транспортное время, применяется лишь ко всем заголовкам. Иначе, правило перезаписи пропускается, если не обрабатываются релевантные адреса.
флаг
|
что перезаписывается
|
E
|
все поля конверта
|
F
|
поле “From ” в конверте
|
T
|
поле “To ” в конверте
|
b
|
заголовок “Bcc: ”
|
c
|
заголовок “Cc: ”
|
f
|
заголовок “From: ”
|
h
|
все заголовки
|
r
|
заголовок “Reply-To: ”
|
s
|
заголовок “Sender: ”
|
t
|
заголовок “To: ”
|
|
Вам надо быть осторожным при перезаписи заголовков
“
Sender:
”, и ограничить ее изветсными специальными случаями в ваших доменах.
31.9 Флаг перезаписи во время SMTP
Флаг перезаписи
“S
” определяет перезапись входящих адресов конверта во время SMTP, как только адрес получен в команде MAIL или RCPT, и до любых других процессов; даже до проврки синтаксиса. Паттерн обязан быть регулярным выражением, и он сравнивается с любыми данными для команд, включая любые соседние угловые скобки.
Форма правила перезаписи позволяет обработать адреса, которые не соответствуют RFC2821 и RFC2822 (например, адреса с восклицательными знаками, в пактном SMTP-вводе). Поскольку ввод не обязан быть синтаксически правильным адресом, переменные
“
$local_part
” и
“
$domain
” недоступны в процессе раскрытия строки. Результат перезаписи замещает оригинальный адрес в командах MAIL и RCPT.
31.10 Флаги контролирующие процесс перезаписи
Есть четыре флага, которые контролируют работу процесса перезаписи. Они вступают в силу лишь когда правило вызвано, т.е. когда адрес корректного типа (совпадает с флагами), и соответствуют паттерну:
Если в правиле установлен флаг
“Q
”, перезаписанному адресу разрешается быть неквалифицированной локальной частью. Она квалифицируется с
“
qualify_recipient
”. В отсутствии
“Q
” перезаписанный адрес всегда должен включать домен.
Если в правиле установлен флаг
“q
”, никакие дальнейшие правила перезаписи не рассматриваются, даже если небыло фактической перезаписи, поскольку в раскрытии присутствовало
“fail
”. Флаг
“q
” неэффективен, если адрес неверного типа (несоответствует флагам), или несовпадает с паттерном.
Флаг
“R
” вызывает повторное применение успешного правила перезаписи к новому адресу, до десяти раз. Это может быть скомбинировано с флагом
“q
”, для прекращения перезаписи как только будет несоответствие (после по крайней мере одной успешной перезаписи).
Когда адрес в заголовке перезаписан, перезапись, обычно, применяется лишь к рабочей части адреса, с оставленными неизменными любыми комментариями и фразой RFC2822. Например, перезапись может изменить
From: Ford Prefect <fp42@restaurant.hitch.fict.example>
|
на
From: Ford Prefect <prefectf@hitch.fict.example>
|
Иногда, есть потребность изменить весь элемент адреса, и это может быть сделано путём добавления флага
“w
” к правилу. Если он установлен для правила, вызывающего перезапись адреса в строке заголовка, заменяется весь адрес, а не только рабочая часть. Замена должна быть полным адресом согласно RFC2822, включая угловые скобки, если есть необходимость. Если текст вне угловых скобок, содержит символ чьё значение более 126 или менее 32 (исключая табуляцию), текст кодируется согласно RFC2047. Кодировка берётся из
“
headers_charset
”, значение по умолчанию которой - ISO-8859-1.
Когда флаг
“w
” установлен для правила перезаписи адреса конверта, отбрасывается всё, кроме рабочей части.
31.11 Примеры перезаписи
Вот - пример двух обычных образцов перезаписи:
*@*.hitch.fict.example $1@hitch.fict.example
*@hitch.fict.example ${lookup{
$1}dbm{/etc/realnames}\
{$value}fail}@hitch.fict.example bctfrF
|
Отметтьте, что использование
“fail
” в поиске, во втором правиле, вызывает принудительную неудачу, в случае безуспешного поиска. В этом контексте, это имеет эффект оставления оригинального адреса неизменным, но exim продолжает рассмотрение последующих правил, если таковые имеются, поскольку в этом правиле не присутстсвует флаг
“q
”. Альтернативой для
“fail
”, могда бы быть явная вставка
“
$1
”, которая вызвала бы перезапись адреса прежним, за счёт маленького бита обработки. Непредоставление любого из них - ошибка, так как перезаписанный адрес не вообще содержал бы локальной части.
Первый пример, выше, заменяет домен вышестоящим, более общим доменом. Возможно, это нежелательно для некоторых локальных частей. Если правило
root@*.hitch.fict.example *
|
было вставлено до первого правила, перезапись будет подавлена для локальной части
“
root
” в любом домене, заканчивающемся на
“
hitch.fict.example
”.
Перезапись может быть сделана условной, в ряде тестов, путём использования
“
${if
” в элементе раскрытия. Например, для применения правил перезаписи лишь для сообщений, который созданы вне локального хоста:
*@*.hitch.fict.example "${if !eq {$sender_host_address}{}\
{$1@hitch.fict.example}fail}"
|
Строка замены, в этом примере, помещена в кавычки, поскольку она содержит пустое пространство.
Exim не обрабатывает адреса в форме
“адресов с восклицательными знаками
” (
“bang paths
” - хрен его знает что это. - прим. lissyara). Если он видит такой адрес, он обрабатывает его как неквалифицированную локальную часть, которую он квалифицирует с локальным квалификационным доменом (если источник сообщения локальный, или если удалённому хосту разрешается посылать неквалифицированные адреса). Перезапись может, иногда, использоваться для обработки простых адресов с восклицательным знаком, с фиксированным числом компонентов. Например, правило
\N^([^!]+)!(.*)@your.domain.example$\N $2@$1
|
перезаписывает двухкомпонентный адрес с восклицательным знаком
“
host.name!user
”, как доменный адрес
“
user@host.name
”. Однако, тут замешана безопасность, в использовании этого как глобального перезаписывающего правила, для адресов конверта. Это может предоставить чёрный ход для использования вашей системы как релея, поскольку входящие адреса кажутся локальными. Если адреса с восклицательными знаками получены через SMTP, более безопасно использовать флаг
“S
”, для их перезаписи при получении, так, чтобы проверка релея могла быть сделана на перезаписанных адресах.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
32. Конфигурация повторов
Секция
“retry
”, рабочего файла конфигурации, содержит список правил повторов, которые контролируют, как часто exim пытается доставить сообщения, которые нельзя было доставить при первой попытке. Если правила повторов вообще отсутствуют, временные ошибки обрабатываются как постоянные. Опция командной строки
“
-brt
” может использоваться для проверки, какие правила повторов будут использоваться для данного адреса, домена, и ошибки.
Самая обычная причина повторов - временная ошибка доставки на удалённый хост, поскольку хост отключен, или недоступен из-за проблем с сетью. Обработка повторов exim`a, в этом случае, основана на применении к хостам (строго, по IP-адресам), не на сообщениях. Таким образом,если одно сообщение было недавно задержано, доставка нового сообщения на тот же самый хост, не пробуется немедленно, а ожидается достижения времени повтора хоста. Если установлен выбор логов
“
retry_defer
”, сообщение
“retry time not reached
” записывается в главный лог каждый раз,когда доставка пропущена по этой причине. Раздел 44.2 содержит более подробную информацию о обработке ошибок в течение удалённых доставок.
Обработка повторов применяется к роутингу так же, как и к доставке, исключение описано в следующем параграфе. Правила повторов не различают эти действия. Невозможно, например, задать различное поведение для ошибок роутинга домена
“
snark.fict.example
”, и ошибок доставки к хосту
“
snark.fict.example
”. Я не думал, что кому-либо будет необходимо это усложнение, так что не осуществлял этого. Однако, хотя они используют одно и тоже правило повтора, актуальное время повтора для роутинга и транспортировки данного домена обслуживается независимо.
Когда доставка - не часть выполняющейся очереди (обычная немедленная доставка сообщения получателю), роутеры всегда работают, и предпринимаются локальные доставки, даже если для них установлено время повтора. Это делается для лучшего поведения, если одно специфическое сообщение вызывает проблемы (например, вызывая превышение квоты, или вызывая ошибку в фильтре). Если такая доставка переносит временную ошибку, и последующие попытки доставки при обработке очереди происходят лишь когда наступит время повтора для локального адреса.
32.1 Правила повторов
Каждое правило повтора занимает одну строку, и содержит три или четыре части, разделённые пробелами: парттерн (габлон - прим. lissyara), имя ошибки, опциональный список адресов отправителя, и список параметров повтора. Паттер и список отправителей должны быть помещены в двойные кавычки, если они содержат пустое пространство. Правила ищутся по порядку, пока не найдено одно, где паттерн, имя ошибки, и список отправителей (если присутствует), совпадает с недостающим хостом или адресом, встретившаяся ошибка, и отправитель сообщения, соответственно.
Шаблон - любой отдельный элемент, который может появляться в списке адресов (смотрите раздел 10.18). Фактически, он обрабатывается как одноэлементный список адресов, что означает, что он раскрыт до начала сравнения с задержанным адресом. Обработка списка адресов относится к имени домена, как будто ему предшествовало
“*@
”, что делает возможным, для многих правил повтора, начинаться с домена. Например,
lookingglass.fict.example * F,24h,30m;
|
предоставляет правило для любого адреса в домене
“
lookingglass.fict.example
”, тогда как
alice@lookingglass.fict.example * F,24h,30m;
|
применяется лишь к временным ошибкам вовлекшим локальную часть
“
alice
”. Практически, почти все правила начинаются с шаблона, без локальной части.
Предупреждение: Если вы используете в шаблоне правила роутинга регулярное выражение, оно должно совпадать с полным адресом, а не только с доменом, поскольку именно так регулярные выражения работают в списке адресов.
^\Nxyz\d+\.abc\.example$\N * G,1h,10m,
2
Неправильно
^\N[^@]+@xyz\d+\.abc\.example$\N * G,1h,10m,
2
Правильно
|
32.2 Выбор, какие правила используются для ошибок адреса
Когда exim ищет правило повтора, после неудачной попытки роутинга (например, после таймаута DNS), каждай строка в конфигурации повторов сравнивается с полным адресом лишь если для роутера задана опция
“
retry_use_local_part
”. Иначе, используется только домен, за исключением случая, когда сравнивается с регулярным выражением, когда локальная часть адреса заменена
“*
”. Домен, может самостоятельно соответствовать шаблону, или образцу, начинающемуся с
“*@
”. По умолчанию,
“
retry_use_local_part
” истинна, для роутеров, где истинна
“
check_local_user
”, и ложна для других роутеров.
Точно также, exim ищет правило повтора после неудачной локальной доставки (например, после ошибки переполнения почтового ящика), каждая строка в конфигурации повторов сравнивается с полным адресом лишь если для транспорта установлена
“
retry_use_local_part
” (это истинно, по умолчанию, для всех локальных транспортов).
Однако, когда exim ищет правило повтора после ошибки адреса, для удалённой доставки (SMTP ответ 4xx, для адреса получателя), в качестве ключа, при поиске правила повтора, всегда используется весь адрес. Найденное правило используется для создания времени повтора для неудачного адреса.
32.3 Выбор, какое правило используется для хоста и сообщения о ошибке
Для временной ошибки, которая не связана с индивидуальным адресом (например, таймаут соединения), каждая строка в конфигурации повторов проверяется дважды. Вначале, имя удалённого хоста используется как доменное имя (предваряемое
“*@
”, при сравнении с регулярным выражением). Если оно не соответствует строке, подобным образом пробуется домен из адреса электронной почты. Например, предположим, что MX-записи для
“
a.b.c.example
” таковы
a.b.c.example MX
5
x.y.z.example
MX
6
p.q.r.example
MX
7
m.n.o.example
|
и правила повторов, таковы
p.q.r.example * F,24h,30m;
a.b.c.example * F,4d,45m;
|
и доставка к хосту
“
x.y.z.example
” переносит ошибку соединения. Первое правило не соответствует ни хосту, ни домену, таким образом, exim смотрит второе правило. Оно не соответствует хосту, но совпадает с доменом, таким образом, оно используется для вычисления времени повтора для хоста
“
x.y.z.example
”. Тем временем, exim пробует осуществить доставку на
“
p.q.r.example
”. Если при этом также происходит ошибка хоста, используется первое правило повтора, поскольку оно совпадает с хостом.
Другими словами, временные ошибки доставки к хосту
“
p.q.r.example
” используют первое правило для определения времён повтора, но для все других хостов домена
“
a.b.c.example
” используется второе правило. Также, второе правило, используется если временная ошибка происходит при роутигге к
“
a.b.c.example
”.
Отметтьте: Имя хоста используется при сравнении с паттернами, а не с его IP-адресом. Однако, если сообщение роутится напрямую к IP-адресу, без использования имени хоста, например, если роутер manualroute содержит установку типа:
route_list = *.a.example
192
.
168
.
34
.
23
|
Тогда, используемое при поиске правила повтора
“имя хоста
”, - текстовая форма IP-адреса.
32.4 Правила повтора для специфических ошибок
Второе поле в правиле повтора - имя специфической ошибки, или звёздочка, которая совпадает со всеми ошибками. Ошибки, которые могут быть проверены:
“
auth_failed
” - Аутентификация неудачна, при попытке отправить на хост в списке
“
hosts_require_auth
”, в транспорте
“
smtp
”.
“
data_4xx
” - Ошибка 4xx получается для исходящей команды DATA, или немедленно после команды, или после посылки данных сообщения.
“
mail_4xx
” - Ошибка 4xx получается для исходящей команды MAIL.
“
rcpt_4xx
” - Ошибка 4xx получается для исходящей команды RCPT.
Для трёх ошибок 4xx, первый, или оба из x`ов может быть дан как специфическая цифра, например:
“mail_45x
” или
“rcpt_436
”. Например, для распознания 452-й ошибки данной команде RCPT для адресов в определённом домене, и имеющих повторы каждые десять минут с одночасовым таймаутом, вы могли бы установить правило повтора такой формы:
the.domain.name rcpt_452 F,1h,10m
|
Эти ошибки применяются к обоим, исходящему SMTP (транспорт
“
smtp
”), и исходящему LMTP (или транспорт
“
lmtp
”, или транспорт
“
smtp
” в режиме LMTP).
“
lost_connection
” - Сервер неожиданно закрыт SMTP-соединение. Конечно, для этого могут быть законные причины (хост умер, сеть умерла), но если для одного и того же хоста это часто повторяется, это указывает на нечто странное.
“
refused_MX
” - Отказано в соединении к хосту полученному из MX записи.
“
refused_A
” - Отказано в соединении к хосту полученному не из MX записи.
“
refused
” - Отказано в соединении.
“
timeout_connect_MX
” - Таймаут попытки соединения с хостом полученным из MX-записи.
“
timeout_connect_A
” - Таймаут попытки соединения с хостом полученным не из MX-записи.
“
timeout_connect
” - Таймаут попытки соединения.
“
timeout_MX
” - Был таймаут при соединениии или во время SMTP-сессии с хостом, полученным из записи MX.
“
timeout_A
” - Был таймаут при соединениии или во время SMTP-сессии с хостом, полученным не из записи MX.
“
timeout
” - Был таймаут при соединениии или во время SMTP-сессии.
“
tls_required
” - Сервер обязан был использовать TLS (он соответствовал
“
hosts_require_tls
” в транспорте
“
smtp
”), но или не предлагал TLS, или ответил 4xx на STARTTLS, или была проблема с установкой TLS-подключения.
“
quota
” - При локальной доставке транспортом
“
appendfile
” была превышена квота почтового ящика.
“
quota_<time>
” - При локальной доставке транспортом
“
appendfile
” была превышена квота почтового ящика, и к почтовому ящику не обращались
“
<time>
”. Например,
“
quota_4d
” применяется к ошибкам квоты, когда к ящику не обращались в течение 4-х дней.
Идея
“
quota_<time>
” - сделать возможными более короткие таймауты, когда почтовый ящик полон, и не читается владельцем. Идеально, это должно быть основано на последнем времени, когда пользователь обращался к почтовому ящику. Однако, это не всегда можно определить. Exim использует следующие эвристические правила:
Если почтовый ящик - один файл, используется время последнего доступа (
“atime
”). Поскольку новые сообщения не доставляются (т.к. у почтовго ящика превышена квота), exim не обращается к файлу, следовательно, это - последнее время доступа пользователя.
Для доставки в
“maildir
”, используется время последней модификации субдиректории
“
new
”. Т.к. превышена квота, в ней не создаётся новых файлов, поскольку новые сообщения не доставляются. Предполагается, что любые изменения субдиректории
“
new
” - результат перемещения новых сообщений в
“
cur
”, пользовательским MUA при первом чтении. Используемое время - это время когда пользователь последний раз читал новые сообщения.
Для других видов многофайлового почтового ящика, время последнего доступа не может быть получено из времени последнего обращения, таким образом, правило повтора использующее этот тип поля ошибки, никогда не совпадёт.
Ошибки квоты применяются к обоим - системной квоте, и к собственному механизму квот exim`a, в транспорте
“
appendfile
”. Ошибка
“
quota
”, также применяется когда локальная доставка задержана, поскольку заполнился раздел диска (ошибка ENOSPC).
32.5 Правила повторов для специфических отправителей
Вы можете задать правила повторов применяемые лишь когда неуспешно сообщение для определённого отправителя. В частности, это может быть использовано для задания правил повторов применяемых только к рикошетам. Третий элемент в правиле повтора может иметь такую форму:
Тогда, расчёт времени повтора - четвёртый элемент. Например:
* rcpt_4xx senders=: F,1h,30m
|
совпадает получатель 4xx ошибок для рикошетов посланных к любому адресу любого хоста. Если список адресов содержит пробелы, он должен быть заключён в кавычки. Например:
a.domain rcpt_452 senders="xb.dom : yc.dom" G,8h,10m,
1
.
5
|
Предупреждение: Это средство может быть бесполезным если оно используется для ошибок хостов (которые не зависят от получателя). Причина - то, что отправитель используется лишь для совпадения с правилом повтора. Как только для ошибки хоста было найдено правило, есго содержимое для установки времени повтора для хоста, и это применяется ко всем сообщениям, не только к тем, у которых специфический отправитель.
Когда правило тестируется с использованием
“
-brt
”, вы можете предоставить отправителя, используя опцию командной строки
“
-f
”, как тут:
exim -f "" -brt user@dom.ain
|
Если вы не устанавливаете
“
-f
” с
“
-brt
”, правило повтора, содержащее список отправителей никогда не совпадёт.
32.6 Параметры повтора
Третье (или четвёртое, если присутствует список отправителей) поле в правиле повтора - последовательность набора параметров повторения, разделённых точкой с запятой.. Каждый набор состоит из
<letter>,<cutoff time>,<arguments>
|
Буква - идентифицирует алгоритм для вычисления нового времени повтора; время сокращения - время вне которого более не применяется этот алгоритм, и аргументы меняют действие алгоритма. Время сокращения измеряется со времени, когда была обнаружена первая ошибка для домена (комбинированного с локальной частью, если необходимо), а не со времени получения сообщения.
Доступные алгоритмы:
“
F
”: повторять с фиксированными интервалами. Существует один параметр времени, определяющий интервал.
“
G
”: повторять в геометрически увеличивающихся интервалах. Первый аргумент определяет начальное значение для интервала, и второе - множитель, используемый для увеличения интервала при каждом повторении.
“
H
”: повторять со случайными интервалами. Аргументы - такие же как для
“
G
”. Для каждого повтора, предыдущий интервал умножается на фактор, для получения максимума следующего интервала. Минимальный интервал - первый аргумент параметра, и актуальный интервал выбирается случайным образом из диапазона между ними. Такое поведение, как было найдено, было полезным в кластерных конфигурациях, когда все члены кластера перезапускаются одновременно, и поэтому могут синхронизировать свои времена обработки очереди.
Когда вычисляется следующее время повтора, по порядку сканируются определения алгоритма, пока не достигнут тот, чьё время уменьшения ещё не прошло. Тогда, он используется для вычисления нового времени повтора, которое более позднее, чем текущее время. В случае фиксированных интервалов повторов, это означает - просто добавление интервала к текущему времени. Для геометрически увеличивающихся интервалов, интервалы повторов вычисляются из параметров правил, до большего, чем предыдущий найденный интервал. Переменная главной конфигурации -
“
retry_interval_max
” ограничивает максимальный интервал между повторами. Она не может быть установлена более чем
“24h
”, что и является её значением по умолчанию.
Один удалённый домен может иметь несколько ассоциированных с ним хостов, и каждый хост может иметь более одного IP-адреса. Алгоритмы повтора отобраны на основле имени домена, но применяются к каждому адресу независимо. Если, например, хост имеет два IP-адреса, и один невозможно использовать, exim будет генерить время повтора для него, и не пробует его использовать до наступления следующего времени повтора. Таким образом, вероятно, работающий IP-адрес будет пробоваться первым в большинстве случаев.
Времена повторов - подсказки, а не обещщания. Exim не делает попыток доставки точно в вычисленное вермя. Вместо этого, процесс обработчика очереди, периодически запускает процесс доставки для задержанных сообщений, и он производит попытки доставки лишь для тех адресов, которые прошли их следующее время повтора. Если для задержанного хоста доставляется новое сообщение, немедленная попытка доставки происходит лишь если адрес имеет прошедшее время повтора. В отсутствии новых сообщений, минимальное время между попытками - интервал между процессами обработчика очереди. Нет большого смысла устанавливать время повтора в пять минут, если ваш обработчик очереди запускается раз в час, только если нет большого числа входящих сообщений (которые могли бы быть на системе, которая шлёт всё на умный (smart) хост, например).
Данные в базе данных подсказок повторов, могут быть проверены путём использования программ
“
exim_dumpdb
” или
“
exim_fixdb
” (смотрите раздел 49). Последняя утилита, также, может использоваться для изменения данных. Скрипт
“
exinext
” может использоваться для нахождения следующего времени повтора для хостов, ассоциированных со специфическим почтовым доменом, и, также, для задержанных локальных доставок.
32.7 Примеры правил повтора
Вот - некоторые примеры правил повтора:
alice@wonderland.fict.example quota_5d F,7d,3h
wonderland.fict.example quota_5d
wonderland.fict.example * F,1h,15m; G,2d,1h,
2
;
lookingglass.fict.example * F,24h,30m;
* refused_A F,2h,20m;
* * F,2h,15m; G,16h,1h,
1
.
5
; F,5d,8h
|
Первое правило - устанавливает специальную обработку для почты на
“
alice@wonderland.fict.example
”, когда происходит ошибка превышения квоты, и почтовый ящик не читался по крайней мере 5 дней. Повторы продолжаются каждые три часа в течение 7 дней. Второе правило - обрабатывает первышение квоты для всех остальных локальных частей в
“
wonderland.fict.example
”; отсутствие локальной части имеет тот же эффект, что и подстановка
“*@
”. Поскольку не предоставлено никакого алгоритма повторов, сообщения неудачны и немедленно шлётся рикошет, если почтовый ящик не читался по крайней мере 5 дней.
Третье правило обрабатывает все другие ошибки
“
wonderland.fict.example
”; повторы происходят каждые 15 минут в течение часа, затем - с геометрически увеличивающимися интервалами до двух дней с моента первой ошибки доставки. После первого часа, задержка - один час, затем - два часа, затем - четыре часа, и так далее (это - в некоторой степени экстремальный пример).
Четвёртое правило - контролирует повторы для домена
“
lookingglass.fict.example
”. Они происходят каждые 30 минут, только в течение 24 часов. Оставшиеся два правила - обрабатывают все остальные домены, со специальным действием при отказе в соединении для хостов, которые не были получены из MX-записей.
Последнее правило в конфигурации - всегда должно содержать звёздочки в первых двух полях, для обеспечения общего правила для всех адресов, не имеющих собственной особой обработки. Этот пример, пробцет каждые 15 минут в течение 2-х часов, затем - с интервалами, начинающимися с одного часа, и увеличивающимися путём фактора 1.5 до 16 часов, затем - каждые 8 часов, вплоть до 5 дней.
32.8 Таймаут для данных повторов
Exim ставит метку времени на данные, которые пишет в базу подсказок повторов. Когда он консультируется с данными в течение доставки, он игнорирует любые данные, являющиеся более старыми чем значение установленное в
“
retry_data_expire
” (по умолчанию - 7 дней). Если, например, хост не проверялся в течение 7 дней, exim попробует доставить на него немедленно, по прибытию сообщения, и если это будет неудачным, он попробует вычислить время повтора, как будто была первая неудачная попытка доставки.
Это улучшает поведение для сообщений направляющихся к редко используемым хостам, типа резервных MX. Если бы такой хост падал однажды, и такое случалось снова, когда exim пытался доставить на него месяц спустя, то использование старых данных повторов подразумевало бы, что он лежит всё время, что не явялется вреным предположением.
Если хост действительно постоянно мёртв, это поведение вызывает время от времени взрыв повторений, но лишь если направляющиеся к этому хосту сообщения редки. Если сообщения бывают по крайней мере раз в 7 дней, данные повтора никогда не истекут.
32.9 Долгосрочные ошибки
Когда адрес электронной почты был неудачен так долго, что истекло время уменьшения последнего алгоритма, происходит специальная обработка. Для примера, используем дефолтовое правило повтора:
* * F,2h,15m; G,16h,1h,
1
.
5
; F,4d,6h
|
время кменьшения - четыре дня. Достижение сокращения повтора - незавивит от того, как долго любое специфическое сообщение будет неудачно; оно - длинна непрерывной ошибки для оассчитываемого адреса получателя.
Когда истекает время уменьшения для локальной доставки, или для всех IP адресов, ассоциированных с удалённой доставкой, последующая ошибка доставки заставляет exim отказываться от адреса, и генерить рикошет. Для обслуживания новых сообщений, использующих неудачный адрес, следующее время повтора остаётся рассчитанным по конечному алгоритму, и используется следующим образом:
Для локальных доставок, для последующих сообщений всегда производится одна попытка доставки. Если эта доставка неудачна, адрес немедленно неудачен. Последующее время сокращения повторов не используется.
Если доставка удалённая, есть два варианта, управляемых опцией
“
delay_after_cutoff
” транспорта
“
smtp
”. По умолчанию, опция истинна. Пока не достигнуто время после уменьшения повтора для одного из IP-адресов, ошибочный адрес электронной почты немедленно срывается (генерится рикошет - прим. lissyara), без попыток доставки. После прохождения времени повтора, как к этим IP-адресам производится новая попытка доставки, и если она всё ещё неудачна, адрес срывается, и вычисляется новое время повтора.
Другими словами, когда все хосты для данного адреса электронной почты были неуспешны в течение долгого времени, exim срывает быстрее чем задерживает, пока не достигнуто одно из времён повторов хостов. Тогда он пытается один раз, и срывает, если попытка была безуспешной. Это поведение гарантирует, что при попытке доставить по кривому адресу будет затрачено немного ресурсов, но если хост восстановится, exim? в конечном счёте, это заметит.
Если опция
“
delay_after_cutoff
” установлена в ложь, exim ведёт себя по другому. Если все IP-адреса проходят их конечное время уменьшения, exim пробует доставить тем адресам, которые не пробовались с тех пор, как прибыло сообщение. Если нет подходящих адресов, или все они неудачны, адрес срывается. Другими словами, он не задерживается по прибытии нового сообщения, а немедленно пытается доставить адреса с истёкшим сроком, если они не проверялись с момента прибытия сообщения. Если существует непрерывный поток сообщений для неудачных доменов, установка
“
delay_after_cutoff
” в ложь означает, что ещё будет намного больше попыток доставить на постоянно недоступгые IP адреса, чем когда
“
delay_after_cutoff
” - истина.
32.10 Доставки работающие с перерывами
Требуется немного дополнительно логики для того, чтобы справиться со случаями, где хост периодически недоступен, или когда сообщение имеет какой-то признак, который мешает его доставке, когда другие, к тому же самому адресату, проходят. В этой ситуации, поскольку некоторые сообщения успешно доставляются,
“часы повтора
” (
“retry clock
”) для хоста или адреса продолжают быть сброшенными из-за успешных доставок, и, таким образом, неуспешные сообщения остаются в очереди навсегда, поскольку время уменьшения никогда не достигается.
Для предотвращения этого случая, применяется два необычных действия. Первое применяется к ошибкам, которые связаны с сообщением, а не с удалёнными хостами. В разделе 44.2 - обсуждение различных видов ошибок; примеры связанных с сообщениями ошибок - ответы 4xx на команды MAIL или DATA, и ошибки квоты. Для этого типа ошибок, если время прибытия сообщения - более ранее, чем
“первое неудачное
” (
“first failed
”) время для ошибки, меньшее время используется при просмотре правил повторов, чтобы решить когда проверять адрес, и когда таймаут адреса.
Второе необычное действие применяется во всех случаях. Если сообщение было в очереди больше, чем время уменьшения для любого применимого правила для данного адреса, для этого адреса предпринимается доставка, даже если это не его время, и если эта доставка неудачна, происходит таймаут адреса. В этом случае, новое время повтора адреса не вычисляется, таким образом, другие сообщения для того же самого адреса рассматриваются немедленно.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
33. SMTP-аутентификация
Секция
“authenticators
”, ребочей конфигурации exim`a, управляет SMTP-аутентификацией. Это средство - расширение протокола SMTP, описанное в RFC2554, которое разрешает клиентскому SMTP-хосту атентифицироваться на сервере. Это - обычный серверный способ распознавать клиентов, которым разрешено использовать его как релей. SMTP-аутентификация неуместна для передачи почты между серверами которые организационно никак не связаны друг с другом.
Вкратце, способ работы SMTP-аутентификации таков:
Сервер информирует число аутентифкационных механизмов (mechanisms) в ответе на клиентскую команду EHLO.
Клиент выдаёт команду AUTH, именуя специфический механизм. Команда может, опционально, содержать какие-либо аутентификационные данные.
Сервер может выдать один или более вызовов (challenges, может быть переведено как откликов - прим. lissyara), на которые клиент должен послать соответствующие ответы. В простых опознавательных механизмах, вызовы - просто запросы имён пользователей и паролей. Сервер не должен выдавать каких-либо вызовов - в некоторых механизмах, все уместные данные могут быть переданы с командой AUTH.
Сервер или принимает, или отклоняет аутентификацию.
Если аутентификация успешна, клиент, опционально, может использовать опцию AUTH в команде MAIL для передачи аутентифицированного (заверенного) отправителя в последующих почтовых транзакциях. Аутентификация остаётся до конца SMTP-соединения.
Если аутентификация неудачна, клиент может отключиться, или может попробовать другой аутентификационный механизм, или может попробовать передать почту по неаутентифицированному соединению.
Если вы настраиваете клиента, и хотите знать, какие аутентификационные механизмы поддерживает сервер, вы можете использовать telnet для соединения с 25 портом (порт SMTP) на сервере, и выдать команду EHLO. Ответ на неё включает список поддерживаемых механизмов. Например:
$ telnet server.example
25
Trying
192
.
168
.
34
.
25
...
Connected to server.example.
Escape character is '^]'.
220
server.example ESMTP Exim
4
.
20
...
ehlo client.example
250
-server.example Hello client.example [
10
.
8
.
4
.
5
]
250
-SIZE
52428800
250
-PIPELINING
250
-AUTH PLAIN
250
HELP
|
Предпоследняя линия этого примера, показывает, что сервер поддерживает аутентификацию с использованием механизма PLAIN. В exim`e, различные аутентификационные механизмы конфигурируются путём специфических дайверов
“
authenticator
”. Как у роутеров и транспортов, то, какие аутентификаторы включены в бинарник, определяется при сборке. В настоящее время, доступны следующие установки:
AUTH_CRAM_MD5=yes
AUTH_CYRUS_SASL=yes
AUTH_PLAINTEXT=yes
AUTH_SPA=yes
|
в
“
Local/Makefile
”, соответственно. Первая из этих поддержек аутентификационный механизм CRAM-MD5 (RFC2195), второй предоставляет интерфейс к аутентификационной библиотеке Cyrus SASL. Третий может быть сконфигурирован для поддержки аутентификационного механизма PLAIN (RFC2595), или механизма LOGIN, который формально не зарегистрирован, но используется несколькими MUA. Четвёртый аутентификатор поддерживает механизм Microsoft'овский
“
Secure Password Authentication
”.
Аутентификаторы конфигурируются с использованием того же синтаксиса, что и другие драйверы (смотрите раздел 6.21). Если аутентификаторы не требуются, аутентификационная секция в конфигурационном файле не требуется. Каждый аутентификатор, в принципе, может иметь и клиентские и серверные функции. Когда exim принимает почту по SMTP, он работает как сервер, когда он шлёт сообщения наружу через SMTP - он выступает в роли клиента. Конфигурационные опции аутентификатора предоставляют возможность использования обоих этих обстоятельств.
Для прояснения, какая опция к какой ситуации применяется, в именах опций используются префиксы
“
server_
” и
“
client_
”, определяющие серверные или клиентские функции, соответственно. Серверные и клиентские функции отключены, если не установлен ни один из вариантов. Если аутентификатор должен использоваться для обоих, серверных и клиентских функций, в одном определении, требуется использование обоих установок опций. Например:
cram:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${if eq{$auth1}{ph10}{secret1}fail}
client_name = ph10
client_secret = secret2
|
Опция
“
server_
” используется когда exim выступает в роли сервера, и
“
client_
” - когда он выступает в роли клиента.
Описания индивидуальных аутентификаторов даны в последующих главах. Оставшаяся часть этой главы охватывает общие опции для аутентификаторов, сопровождаемые общим обсуждением о способе работы аутентификации в exim`e.
33.1 Общие опции для аутентификаторов
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
driver
|
authenticators
|
string
|
незадана
|
|
Эта опция всегда должна быть установлена. Она определяет, какой из доступных аутентификаторов должен использоваться.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
public_name
|
authenticators
|
string
|
незадана
|
|
Эта опция определяет имя аутентификационного механизма, который принадлежит драйверу, и путём которого он известен внешнему миру. Эти имена должны содержать лишь буквы в прописном регистре (заглавные - прим. lissyara), цифры, подчёркиания, и дефисы (RFC2222), но exim фактически, соответствует им регистронезависимо. Если
“
public_name
” не задана, по умолчанию используется имя драйвера.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_advertise_condition
|
authenticators
|
string†
|
незадана
|
|
Когда сервер собирается информировать об аутентификационном механизме, условие раскрывается. Если оно приводит к пустой строке,
“0
”,
“no
”, или
“false
”, о механизм не информируется. Если ошибка не принудительная, и не вызывана путём задержки поиска, инцидент логгируется. Смотрите ниже, раздел 33.3 для дальнейшего обсуждения.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_debug_print
|
authenticators
|
string†
|
незадана
|
|
Если эта опция установлена, и включена отладка аутентификации (смотрите опцию
“
-d
” командной строки), строка раскрывается, и включается в отладочный вывод, когда аутентификатор работает как сервер. Это может помочь, при проверке значений переменных. Если раскрытие строки неудачно, сообщение о ошибке пишется в отладочный вывод, и exim продолжает обработку.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_set_id
|
authenticators
|
string†
|
незадана
|
|
Когда сервер exim успешно аутентифицируется как клиент, эта строка раскрывается, используя данные из аутентификации, и сохраняется для входящих сообщений в переменной
“
$authenticated_id
”. Также, она включается в строку лога для входящих сообщений. Например, конфигурация аутентификатора user/password могла бы сохранять использовавшееся для аутентификации имя пользователя, и обращатся к нему впоследствии, в течение доставки сообщения. Если раскрытие неудачно, опция игнорируется.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_mail_auth_condition
|
authenticators
|
string†
|
незадана
|
|
Эта опция позволяет серверу отказываться от аутентифицированных отправителей адресов, подаваемых как часть команды MAIL в SMTP-соединении, которое аутентифицировано путём драйвера, на котором установлена опция
“
server_mail_auth_condition
”. Опция не используется как часть аутентификационного процесса; вместо этого её (нераскрытое) значение запоминается для дальнейшего использования. То, как оно используется, описано в следующей секции.
33.2 Параметр AUTH в команде MAIL
Когда клиент предоставляет AUTH=элемент в команде MAIL, exim применяет следующие проверки, до приёма его как аутентифицированного отправителя сообщения:
Если соединение не использует расширенный SMTP (т.е. использовался HELO вместо EHLO), использование AUTH= - синтаксическая ошибка.
Если значение параметра AUTH= -
“<>
”, оно игнорируется.
Если задана
“
acl_smtp_mailauth
”, запускается определённая ACL. Когда она работает, значение
“
$authenticated_sender
” устанавливается из параметра AUTH=. Если ACL не выносит
“accept
”, значение
“
$authenticated_sender
” удаляется. ACL
“
acl_smtp_mailauth
” может не вернуть
“drop
” или
“discard
”. Если она задерживается, для команды MAIL выдаётся код временной ошибки (451).
Если
“
acl_smtp_mailauth
” не задана, значение параметра AUTH= принимается, и помещается в
“
$authenticated_sender
” лишь если клиент аутентифицировался.
Если значение AUTH= было принято любым из двух предыдущих правил, и клиент аутентифицировался, и аутентификатор имеет установку для
“
server_mail_auth_condition
”, условие проверяется в этой точке. Значение, которое было сохранено из аутенификатора - раскрывается. Если раскрытие неудачно, или приводит к пустой строке,
“0
”,
“no
”, или
“false
”, значение
“
$authenticated_sender
” удаляется. Если раскрытие приводит к другому значению, значение
“
$authenticated_sender
” сохраняется, и передаётся с сообщением.
Когда
“
$authenticated_sender
” установлена для сообщения, оно передаётся к другим хостам, на которых exim аутентифицируется как клиент. Не путайте это значение с
“
$authenticated_id
”, которое является строкой, полученной из аутентификационного процесса, и которое, обычно, неполный адрес электронной почты.
Каждый раз, когда значение AUTH= игнорируется, инцидент логгируется. ACL для MAIL, если задана, запускается после того как AUTH= принята, или проигнорирвана. Поэтому, она может использовать
“
$authenticated_sender
”. Обратное - неверно: значение
“
$sender_address
” - ещё не установлено, когда работает
“
acl_smtp_mailauth
” ACL.
33.3 Аутентификация на сервере exim
Когда exim передаёт команду EHLO, он сообщает публичные имена тех аутентификаторов, которые сконфигурированы как сервера, подчиняясь следующим условиям:
Клиентский хост должен совпадать с
“
auth_advertise_hosts
” (по умолчанию - *)
Если установлена опция
“
server_advertise_condition
”, её раскрытие не должно привести к пустой строке,
“0
”,
“no
”, или
“false
”.
Порядок, в котором заданы аутентификаторы контролирует порядок, в котором информируется о механизмах.
Некоторые почтовые клиенты (например, некоторые версии Netscape) требуют, чтобы пользователь предоставлял имя и пароль для аутентификации каждый раз, когда информируется о AUTH, даже при том, что аутентификация фактически, не необходима (например, exim может быть настроен для разрешения безоговорочного релея от клиентов, путём проверки IP-адреса). Вы можете сделать таких клиентов более дружественными, не сообщая им о AUTH. Например, если клентам сети 10.9.8.0/24 разрешено (путём ACL работающеё для RCPT) релеить почту без аутентификации, вы должны установить
auth_advertise_hosts = !
10
.
9
.
8
.
0
/
24
|
чтобы не информировать их о аутентификационных механизмах.
Опция
“
server_advertise_condition
” контролирует информирование о отдельных аутентификационных механизмах. Например, она может быть использована для ограничения информирования о специфических механизмах в шифрованных соединениях, путём установки типа:
server_advertise_condition = ${if eq{$tls_cipher}{}{no}{yes}}
|
Если сессия зашифрована, переменная
“
$tls_cipher
” - не пуста, и таким образом, раскрытие приводит к
“yes
”, которое разрешает информирование.
Когда exim как сервер получает от клиента команду AUTH, он немедленно её отклоняет, если о AUTH не сообщалось в более раннем ответе на команду EHLO. Так происходит если
Хост клиента не совпадает с
“
auth_advertise_hosts
”; или
Отсутствуют аутентификаторы сконфигурированные с серверной опцией; или
Раскрытие
“
server_advertise_condition
” заблокировало информирование о всех серверных аутентификаторах.
Иначе, exim запускает ACL определённую путём
“
acl_smtp_auth
”, чтобы решить - принять ли команду. Если опция
“
acl_smtp_auth
” не задана, AUTH принимается от любых клиентских хостов.
Если AUTH не отклонена путём ACL, exim ищет свою конфигурацию для серверного аутентификационного механизма, о котором информировалось в ответе на EHLO, и который совпадает с именованным в команде AUTH. Если он его находит, он запускает соотвтетствующий аутентификационный протокол, и аутентификация успещна или неуспешна. Если нет соответствия с информировавшимся механизмом, команда AUTH отклоняется с ошибкой 504.
Когда сообщение получено с аутентифицированного хоста, значение
“
$received_protocol
” установлено в
“esmtpa
” или
“esmtpsa
” вместо
“esmtp
” или
“esmtps
”, и
“
$sender_host_authenticated
” содержит имя (не публичное имя) драйвера аутентификации, который успешно аутентифицировал клиента, от которого было получено сообщение. Эта переменная пуста, если небыло успешной аутентификации.
33.4 Проверка серверной аутентификации
Опция
“
-bh
”, командной строки exim`a, может быть полезной при тестировании серверной конфигурации аутентификации. Данные для команды AUTHнужно посылать используя кодирование base64. Быстрый способ делать такие данные для тестирования - следующий скрипт на perl:
use
MIME
::
Base64
;
printf
(
"%s"
,
encode_base64
(eval
"\"$ARGV[0]\""
));
|
Он интерпретирует свои аргументы как строки perl, и, затем, кодирует их. Интерпретация как строки perl позволяет бинарные нули, которые должны быть включены в некоторые виды аутентификационных данных. Например, командная строка, для запуска этого скрипта с такими данными, могла бы быть такой:
encode '\0user\0password'
|
Отметтьте использование одиночных кавычек, для предотвращения интерпретации шеллом обратных слэшей, чтобы они могли быть интерпретированы perl`ом в специфические символы, чьё кодовое значение - ноль.
Предупреждение 1: Если строка пользователя или пароля начинается с восьмеричной цифры, вы должны использовать три нуля вместо одного, после начального обратного слэша. Если вы этого не сделаете, восьмеричная цифра, с которой начинается ваша строка будет некорректно интерпретирована как часть кода первого знака.
Предупреждение 2: Если в строках есть символы которые perl интерпретирует особым образом, вы должны использовать экранирование perl`a для предотвращения их неверного восприятия. Например, команда типа:
encode '\0user@domain.com\0pas$$word'
|
даст некорректный ответ, поскольку неэкранированы символы
“@
” и
“$
”.
Если у вас есть инсталлированная команда
“
mimencode
”, то другой способ создать закодированную по base64 строку - запустить команду
echo -e -n `\0user\0password' | mimencode
|
Опция
“
-e
” команды
“
echo
” включает интерпретацию экранирования обратных слэшей в аргументе, и опция
“
-n
” определяет, что в конце вывода не нужно добавлять символ новой строки. Однако, не все версии
“
echo
” распознают эти опции, следовательно, вы должны проверить вашу версию до того как полагаться на этот совет. (Надо заметить, что из перечисленных ключей в FreeBSD существует только ключ
“
-n
”, остальных нет - прим. lissyara).
33.5 Аутентификация exim`a как клиента
Транспорт
“
smtp
” имеет две опции, назваемые
“
hosts_require_auth
” и
“
hosts_try_auth
”. Когда транспорт
“
smtp
” коннектится к серверу которые информировал о поддержке аутентификации, и хост совпадает с отдельной записью в любой из этих опций, exim (как клиент) пробует аутентифицироваться следующим образом:
Для каждого аутентификатора, который сконфигурирован как клиент, он ищет аутентификационные механизмы объявленные сервером для того, чьё имя совпадает с публичным именем аутентификатора.
Когда он находит соответствующий, он запускает клиентский код аутентификатора. Переменные
“
$host
” и
“
$host_address
” доступны для любых раскрытий строк которые мог бы сделать клиент. Они устанавливаются в имя и IP-адрес сервера. Если дюбое раскрытие принудительно неудачно, попытка аутентификации прекращается и exim движется к следующему аутентификатору. Иные ошибки раскрытия вызывают задержку доставки
Если результат попытки аутентификации - временная ошибка или таймаут, exim прекращает попытку послать сообщение к хосту в этот момент. Он пробует позднее. Если есть доступные резервные хосты, они испытываются обычным образом.
Если ответ на аутентификацию - постоянная ошибка (с кодом 5xx), exim продолжает поиск списка аутентификаторов и пробует иные, если возможно. Если все попытки аутентификации дают постоянную ошибку, или если нет попыток по причине отсутствия совпадающих механизмов (или раскрытие опции приводит к принудительной неудаче), происходящее зависит от того, совпадает ли хост с
“
hosts_require_auth
” или
“
hosts_try_auth
”. В первом случае, генерится временная ошибка, и доставка задерживается. Ошибка может быть детектирована в правилах повторов, и, таким образом, превращена в постоянную - если вам это необходимо. Во втором случае, exim пробует доставить сообщение неаутентифицированным.
Когда exim подтвердил свою подлинность удалённому хосту, он добавляет параметр AUTH к посылаемой команде MAIL, если он имеет аутентифицированного отправителя. Если сообщение пришло с удалённого хоста, аутентифицированный отправитель - тот, который получен во входящей команде MAIL, при условии, что входящее соединение аутентифицировано, и кондишен
“
server_mail_auth
” позволяет сохранять аутентифицированного отправителя. Если локальный процесс вызывает exim для отправки сообщения, адрес отправителя построенный из имени логина пользователя и
“
qualify_domain
” рассматривается как аутентифицированный. Однако, если для транспорта
“
smtp
” установлена опция
“
authenticated_sender
”, она перезадаёт аутентифицированного отправителя полученного с сообщением.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
34. Аутентификатор plaintext
Аутентификатор
“
plaintext
” может быть сконфигурирован для поддержки аутентификационных механизмов PLAIN и LOGIN, оба которые передают аутентификационные данные в виде открытого (незашифрованного) текста (хотя и кодированного base64). Использование открытого текста - риск для безопасности; настоятельно рекомендуем на использовании SMTP-шифрования (смотрите раздел 38), если вы используете механизмы PLAIN и LOGIN. Если вы используете открытый текст, то вы не должны использовать для SMTP-подключений те же самые пароли, что и для учётных записей пользователей (имеются ввиду системные учётки - чтоб не могли перехватить и залогинится - прим. lissyara).
34.1 Использование plaintext в сервере
При выполнении как сервер,
“
plaintext
” выполняет аутентификационный тест путём раскрытия строки. Он имеет следующие опции:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_prompts
|
plaintext
|
string†
|
незадана
|
|
Содержимое этой опции, после раскрытия, должно быть списком строк подсказок, разделённых двоеточиями. Если раскрытие неудачно, даётся временное отклонение аутентификации.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_condition
|
plaintext
|
string†
|
незадана
|
|
Эта опция должна быть назначена, для конфигурирования драйвера как сервера. Её использование описано ниже.
Данные, посылаемые клиентом с командой AUTH, или в ответ на последующие подсказки, являются закодированными base64, b, таким образом, могут содержать любые значения байтов, после расшифровки. Если какие-либо данные доставлены с командой , они обрабатываются как список строк, разделённых NUL (бинарными нулями), первые три из которых, помещаются в переменные раскрытия
“
$auth1
”,
“
$auth2
” и
“
$auth3
” (ни LOGIN, ни PLAIN не используют более чем три строки).
Для совместимости с предыдущими релизами exim`a, значения, также, помещаются в переменные раскрытия
“
$1
”,
“
$2
” и
“
$3
”. Однако, использование этих перемнных с этой целью, сейчас, осуждается, поскольку оно может привети к беспорядку в раскрытиях строк, котоые также их используют для других целей.
Если в
“
server_prompts
” находится больше строк, чем переданных с командой AUTH, остающиеся подсказки используются для получения дополнительных данных. Каждый ответ клиента может быть списком строк, разделённых NUL-символами.
Как только получено достаточное число строк данных, раскрывается
“
server_condition
”. Если раскрытие принудительно неудачно, аутентификация непройдена. Любые другие ошибки аутентификации вызывают возврат временного кода ошибки. Если результат успешного раскрытия - пустая строка,
“0
”,
“no
”, или
“false
”, - аутентификация неудачна. Если результат раскрытия -
“1
”,
“yes
”, или
“true
”, - аутентификация успешна, и раскрывается общая опция
“
server_set_id
”, и сохраняется в
“
$authenticated_id
”. Для любого другого результата, возвращается временный код ошибки, с раскрытой строкой в качестве текста ошибки.
Предупреждение: Если вы используете, для нахождения пароля пользователя, поиск в раскрытии - убедитесь, что сделали неудачу аутентификации, если пользователь неизвестен. В конце следующего раздела есть хорошие и плохие примеры.
34.2 Аутентификационный механизм PLAIN
Аутентификационный механизм PLAIN (RFC2595), определяет, что три строки посылаются как один элемент данных (т.е. одна, комбинированная строка, содержащая два NUL-разделителя). Данные посылаются или как часть команды AUTH, или впоследствии, в ответе на пустую подсказку сервера.
Вторая и третья строки - имя пользователя и соответствующий пароль. Используя одно фиксированное имя пользователя и пароль, как пример, это могло бы быть сконфигурировано следующим образом:
fixed_plain:
driver = plaintext
public_name = PLAIN
server_prompts = :
server_condition = \
${if and {{eq{$auth2}{username}}{eq{
$auth3}{mysecret}}}}
server_set_id = $auth2
|
Установка
“
server_prompts
” задаёт единственную, пустую подсказку (пустые элементы в конце списка строки - игнорируются). Если все данные прибывают как часть команды AUTH, как обычно и бывает, - подсказка не используется. Об этом аутентификаторе извещается в ответе на EHLO
и клиентский хост может аутентифицироваться путём посыла команды
AUTH PLAIN AHVzZXJuYW1lAG15c2VjcmV0
|
Поскольку тут содержится три строки (больше чем число подсказок), от клиента не требуется больше данных. Альтернативно, клиент может лишь послать
для начала аутентификации, в этом случае сервер ответчает пустой подсказкой. Клиент должен ответить комбинированной строкой данных.
Строка данных - закодирована base64, как требуется по RFC. Этот пример, после расшифровки, -
“<NUL>username<NUL>mysecret
”, где
“<NUL>
” - нулевой байт. Она разделяется на три строки, первая из которых - пустая. Опция
“
server_condition
”, в проверках аутентификаторов, что вторые две -
“username
” и
“mysecret
” - соответствуют.
Наличие лишь одного фиксированного имени пользователя и пароля, как в этом примере, - не очень реалистично, хотя, для маленькой организации, с горсткой аутентифицируемых клиентов, - это могло бы иметь смысл.
Более сложный случай этого аутентификатора может использовать имя пользователя в
“
$auth2
”, для поиска пароля в файле, или БД, и, возможно, делать шифрованное сравнение (смотрите
“
crypteq
”, в разделе 11). Вот - пример этого подхода, где пароли ищутся в DBM-файле. Предупреждение: Это - неправильный пример:
server_condition = \
${if eq{$auth3}{
${lookup{
$auth2}dbm{/etc/authpwd}}}{yes}{no}}
|
Раскрытие использует имя пользователя (
“
$auth2
”), как ключ для поиска пароля, который, затем, сравнивается с переданным паролем (
“
$auth3
”). Почему этот пример неправилен? Он прекрасно работает для существующих пользователей, но рассмотрим, что происходит если даётся имя несуществующего пользователя. Поиск неудачен, но поскольку для поиска не даны строки удачи/неудачи, он приводит к пустой строке. Таким образом, чтобы обойти аутентификацию, все клиенты должны предоставлять несуществующее имя пользователя, и пустой пароль. Корректный способ написать эту проверку:
server_condition = ${lookup{
$auth2}dbm{/etc/authpwd}\
{${if eq{$value}{
$auth3}{yes}{no}}}{no}}
|
В этом случае, если поиск успешен, результат проверяется; если поиск неудачен, аутентификация - неудачна. Если вместо
“
eq
” используется
“
crypteq
”, первый пример, фактически, безопасен, поскольку
“
crypteq
” всегда неудачна, если второй аргумент пуст. Однако, второй способ написания проверки, делает логику более понятной.
34.3 Аутентификационный механизм LOGIN
Аутентификационный механизм LOGIN не задокументирован в каком-либо RFC, но - он используется множестовм программ. С командой AUTH никаких данных не посылается.Вместо этого, имя пользователя и пароль даются раздельно, в ответах на подсказки. Аутентификатор
“
plaintext
” может быть сконфигурирован для поддержки этого, как в этом примере:
fixed_login:
driver = plaintext
public_name = LOGIN
server_prompts = User Name : Password
server_condition = \
${if and {{eq{$auth1}{username}}{eq{
$auth2}{mysecret}}}\
{yes}{no}}
server_set_id = $auth1
|
Поскольку работает
“
plaintext
”, этот аутентификатор принимает данные предоставленные с командой AUTH (в нарушение спецификации LOGIN), но, если клиент не предоставляет их (как в случае LOGIN клиентов), строка подсказки используется для получения двух элементов данных.
Некоторые клиенты очень следят за точным текстом подсказок. Например, Outlook Express, как сообщают, распознаёт только
“Username:
” и
“Password:
”. Вот - пример аутентификатора LOGIN, использующего эти строки. Они использует условие раскрытия
“
ldapauth
”, для проверки имени пользователя и пароля, путём связи с LDAP-сервером:
login:
driver = plaintext
public_name = LOGIN
server_prompts = Username:: : Password::
server_condition = ${if ldapauth \
{user="cn=${quote_ldap_dn:$auth1},ou=people,o=example.org" \
pass=${quote:$auth2} \
ldap://ldap.example.org/}{yes}{no}}
server_set_id = uid=$auth1,ou=people,o=example.org
|
Отметтьте использование оператора
“
quote_ldap_dn
”, для корректного квотирования
“
DN
” для аутентификации. Однако, базовый оператор
“
quote
”, а не лююой из опреаторов квотирования LDAP, явялется правильным при использовании для пароля, поскольку квотирование необходимо лишь для того, чтобы пароль соответствовал синтаксису exim`a. На уровне LDAP, пароль - неинтерпретируемая строка.
34.4 Поддержка для иных видов аутентификации
Множество особенностей раскрытия строк предоставлены как интерфейс к иным способам аутентификации пользователей. Они включают проверку традиционно зашифрованных паролей
“
/etc/passwd
” (или эквивалент), PAM, Radius,
“
ldapauth
”,
“
pwcheck
”, and
“
saslauthd
”. Для дополнительных деталей смотрите раздел 11.7.
34.5 Использование
“plaintext
” как клиента
Аутентификатор
“
plaintext
” имеет две клиентские опции:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
client_ignore_invalid_base64
|
plaintext
|
boolean
|
ложь
|
|
Если клиент получает подсказку сервера не являющуюся допустимой base64 строкой, оставляется аутентификация по-умолчанию. Однако, если эта опция установлена в истину, ошибка в вызове игнорируется, и клиент посылает обычный ответ.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
client_send
|
plaintext
|
string†
|
незадана
|
|
Строка - список разделённых двоеточиями строк аутентификационных данных. Каждая строка независимо раскывается до отправки на сервер. Первая строка - посылается с командой AUTH; дополнительные строки посылаются на подсказки сервера. До раскрытия каждой строки, значение новой подсказки помещается в следующую переменную
“
$auth
<n>
”, начинающихся с
“
$auth1
”, для первой подсказки. Этим способом сохраняется вплоть до трёх подсказок. Таким образом, подсказка полученная в ответ на отправленную первую строку (с командой AUTH), может быть использована в раскрытии второй строки, и так далее. Если получена недопустимая base64 строка при установленной опции
“
client_ignore_invalid_base64
”, в переменную
“
$auth
<n>
” помещается пустая строка.
Отметтьте: Вы не можете использовать раскрытия для создания нескольких строк, поскольку у разбиения приоритет выше и оно происходит раньше.
Поскольку аутентификационный механизм PLAIN требует байт NUL (бинарный ноль) в данных, к каждой строке до её отправки применяется дальнейшая обработка. Если в строке есть символы крышки (^), они конвертируются в NUL. Если в строке требуется крышка как данные, символ должен быть удвоен в строке.
Это - пример клиентской конфигурации, которая воплощает аутентификационный механизм PLAIN с фиксированным именем пользователя и паролем:
fixed_plain:
driver = plaintext
public_name = PLAIN
client_send = ^username^mysecret
|
Нехватка двоеточий означает, что весь текст посылается с командой AUTH, с символами крышки преобразованными в NUL. Подобный пример, использующий механизм LOGIN:
fixed_login:
driver = plaintext
public_name = LOGIN
client_send = : username : mysecret
|
Начальное двоеточие означает, что первая строка пустая, таким образом, с командой AUTH никаких данных не посылается. Оставшиеся строки посылаются в ответ на подсказки.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
35. Аутентификатор cram_md5
Аутентификационный механизм cram_md5 описан в RFC2195. Сервер посылает клиенту строку вызова, и ответ содержит имя пользователя и CRAM-MD5 строки вызова, комбинированные с секретной строкой (паролем), который известен обоим, серверу и клиенту. Таким образом, секретная строка не посылается по сети открытым текстом, что делает этот аутентификатор более безопасным, чем
“
plaintext
”. Однако, обратная сторона - это то, что секретная строка должна быть доступна в открытом виде с обоих строн.
35.1 Использование cram_md5 как сервера
Этот аутентификатор имеет одну серверную опцию, которая должна быть установлена для конфигурирования аутентификатора как сервера:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_secret
|
cram_md5
|
string†
|
незадана
|
|
Когда серевер получает ответ клиента, имя пользвателя помещается в переменную раскрытия
“
$auth1
”, и
“
server_secret
” раскрывается, для полчения пароля этого пользователя. Тогда сервер вычисляет CRAM-MD5, который должен был послать клиент, и проверяет, что получена корректная строка. Если раскрытие
“
server_secret
” принудительно неудачно, - аутентификация неудачна. Если раскрытие неудачно по иной причине, клиенту возвращается временный код ошибки.
Для совместимости с предыдущими релизами exim`a, имя пользователя, также помещается в
“
$1
”. Однако, использование этой переменной для этой цели, сейчас, не приветствуется, поскольку может привести к беспорядку в раскрытиях строк, которые также используют числовые переменные для других целей.
Например, следующий аутентификатор проверяет, что имя пользователя данное клиентом -
“ph10
”, и, если это так, используется
“secret
” как пароль. Для любых других имён пользователя - аутентификация неудачна.
fixed_cram:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${if eq{$auth1}{ph10}{secret}fail}
server_set_id = $auth1
|
Если аутентификация успешна, установка
“
server_set_id
” сохраняет имя пользователя в
“
$authenticated_id
”. Более типичная конфигурация могла бы искать секретную строку в файле, используя имя пользователя как ключ. Например:
lookup_cram:
driver = cram_md5
public_name = CRAM-MD5
server_secret = ${lookup{
$auth1}lsearch{/etc/authpwd}{$value}fail}
server_set_id = $auth1
|
Отметтьте, что это раскрытие явно вызывает принудительную неудачу, если поиск неудачен, поскольку
“
$1
” содержит неизвестное имя пользователя.
35.2 Использование cram_md5 как клиента
Когда аутентификатор
“
cram_md5
” используется как клиент, он обладает двумя опциями:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
client_name
|
cram_md5
|
string†
|
первичное имя хоста
|
|
Эта строка раскрывается, и результат используется как данные имени пользователя, при вычислении ответа на подсказку сервера.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
client_secret
|
cram_md5
|
string†
|
незадана
|
|
Эта опция должна быть установлена, чтобы аутентификатор работал как клиент. Это значение раскрывается, и результат используется как секретная строка, когда вычисляется ответ.
Для различных серверов могут использоваться различные имера пользователей и пароли, используя опции
“
$host
” и
“
$host_address
”. Принудительная неудача любой раскрываемой строки обрабатывается как признак индицирующий, что этот аутентификатор не готов обработать этот случай. Exim двигается к следующему сконфигурированному клиентскому аутентификатору. Любые другие ошибки раскрытия заставляют exim прекратить попытки отправить сообщение текущему серверу.
Простая конфигурация аутентификатора
“
cram_md5
”, использующая фиксированные строки, такова:
fixed_cram:
driver = cram_md5
public_name = CRAM-MD5
client_name = ph10
client_secret = secret
|
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
40. Контентное сканирование во время ACL
Расширение exim`a для включения контентного сканирования во время ACL, раньше известное как
“exiscan
”, изначально было осуществлено как патч, Tom`ом Kistner`ом. Код был интегрирован в главный исходный код для 4.50 релиза exim`a, и Том продолжает его поддерживать. Большинство этой части взято из спецификации Тома.
Также возможно просматривать содержимое сообщений в другой момент времени. Функция
“
local_scan()
” (смотрите раздел 41) позволяет контентное сканирование после выполнения всех ACL. Транспортный фильтр может использоваться для сканирования сообщений во время доставки (смотрите опцию
“
transport_filter
”, описанную в части 24).
Если вы хотите включить контентное сканирование во время ACL, при сборке exim`a, вам необходимо принять меры для задания WITH_CONTENT_SCAN в вашем
“
Local/Makefile
”. Когда вы это сделаете, бинарник exim`a cобирается с:
Двумя дополнительными ACL (
“
acl_smtp_mime
” и
“
acl_not_smtp_mime
”), которые работают для всех частей MIME для SMTP и не-SMTP сообщений, соответственно.
Дополнительные условия и модификаторы ACL:
“
decode
”,
“
malware
”,
“
mime_regex
”,
“
regex
” и
“
spam
”. Они могут использоваться в ACL, которзая апускается в конце приёма сообщения (ACL
“
acl_smtp_data
”).
Дополнительные функции управления (
“no_mbox_unspool
”), которые сохраняют копии помещённых в очередь сообщений, или частей сообщений, в целях отладки.
Дополнительные переменные раскрытия, которые устанавливаются в в новых ACL с новыми условиями.
Две новые опции главной конфигурации:
“
av_scanner
” и
“
spamd_address
”.
Есть другая опция контентного сканирования для
“
Local/Makefile
”, называемая WITH_OLD_DEMIME. Если она установлена, компилируется старое, не одобряемое условие ACL
“
demime
”, в дополнение ко всем другим возможностям контентного сканирования.
Контентное сканирование непрерывно развивается, и продолжают добавляться новые возможности. В то время, когда такие возможности остаются нестабильными, и склонны к несовместимым изменениям, они делаются доступными в exim`e путём установки опций в
“
Local/Makefile
”, чьи имена начинаются с EXPERIMENTAL_. Такие возможности не документированы в этом руководстве. Вы можете узнать о них путём прочтения файла с именем
“
doc/experimental.txt
”.
Все средства контентного сканирования работают с MBOX копией сообщения, временно создаваемой в названном файле:
<spool_directory>/scan/<message_id>/<message_id>.eml
|
Расширение
“
.eml
” - дружелюбная подсказка вирусным сканерам, что они могут ожидать внутри файла структуру подобную MBOX. Файл создаётся при первом вызове средства контентного сканирования. Последующие вызовы условий контентного сканирования снова открывают тот же самый файл. Директория рекурсивно удаляется когда ACL
“
acl_smtp_data
” завершает работу, если не установлена опция:
control = no_mbox_unspool
|
Когда ACL MIME декодирует файлы, они, по умолчанию, кладутся в тот же самый каталог.
40.1 Сканирование на вирусы
Условие ACL
“
malware
” позволяет вам подключить программу вирусного сканера к exim`y. Оно поддерживает
“общий
” (
“generic
”) интерфейс к сканерам, вызываемым через шелл, и специализированные интерфейсы для вирусных сканеров типа
“daemon
”, которые постоянно находятся в памяти и, поэтому, значительно быстрее.
Вы можете установить опцию
“
av_scanner
” в первой части конфигурационного файла exim, для задания используемого сканера, вместе с любыми необходимыми дополнительными опциями. Базовый синтаксис - следующий:
av_scanner = <scanner-type>:<option1>:<option2>:[...]
|
Если вы не установите
“
av_scanner
”, по дефолту она будет:
av_scanner = sophie:/var/run/sophie
|
Если значение
“
av_scanner
” начинается с символа доллара, оно раскрывается до использования. В этом релизе поддерживаются следующие типы сканеров:
“
aveserver
” - Это даемон сканера Касперского, 5-й версии. Вы можете получить триальную версию по адресу http://www.kaspersky.com. Этот тип сканера обладает одной опцией, которая является путём к UNIX-сокету даемона. Значение по умолчанию показано в этом примере:
av_scanner = aveserver:/var/run/aveserver
|
“
clamd
” - Этот сканер типа даемона, выпускается по лицензии GPL и явялется свободным софтом. Вы можете получить его по следующему адресу http://www.clamav.net. Некоторые старые версии clamd не просматривали запакованные контейнеры MIME, таким образом, для использовавших его было рекомендовано распаковывать вложения MIME в ACL MIME. Больше нет такой необходимости. Требуется одна опция: или путь с именем фалы UNIX-сокета, или имя хоста с IP-адресом, и портом, отделённым пробелом, как во втором из этих примеров:
av_scanner = clamd:/opt/clamd/socket
av_scanner = clamd:
192
.
168
.
2
.
100
1234
|
“
cmdline
” - Это ключевое слово - общий интерфейс командной строки сканера. Она может использоваться для для добавления вирусного сканера, который вызывается из шелла. Этот тип сканера принимает три обязательных опции:
1. Полное имя и путь к бинарному файлу сканера, со всеми опциями командной строки, и подстановку (
“%s
”) для директории которая сканируется.
2. Регулярное выражение для сравнеия с выводом STDOUT и STDERR вирусного сканера. Если выражение совпадает, найден вирус. Вы должны должны быть абсолютно уверены, что это выражение совпадает с
“найден вирус
”. Его называют
“триггерным
” (
“trigger
”) выражением.
3. Иное регулярное выражение, содержащее точную пару круглых скобок, для соответствия имени найденного вируса в выводе сканера. Его называют
“именным
” (
“name
”) выражением.
Например, Sophos Sweep сообщает о вирусе в строке типа такой:
Virus 'W32/Magistr-B' found in file ./those.bat
|
Для триггерного выражения, мы можем использовать лишь слово
“found
”. Для именного выражения, мы хотим извлечь строку
“W32/Magistr-B
”, таким образом, мы можем установить соответствие для одиночных кавычек - левой и правой. В целом, создаётся такая конфигурационная установка:
av_scanner = cmdline:\
/path/to/sweep -all -rec -archive %s:\
found:'(.+)'
|
“
drweb
” - Интерфейс даемона сканера DrWeb (http://www.sald.com), получает один параметр, или полный путь к UNIX-сокету, или IP-адрес и порт, разделённые пробелом, как в этом примере:
av_scanner = drweb:/var/run/drwebd.sock
av_scanner = drweb:
192
.
168
.
2
.
20
31337
|
Если вы опускаете этот параметр, используется дефолтовый путь -
“
/usr/local/drweb/run/drwebd.sock
”. Спасибо Alex Miller, за внесение кода для этого сканера.
“
fsecure
” - Интерфейс даемона сканера F-Secure (http://www.f-secure.com) принимает один аргумент, который является путём к UNIX-сокету. Например:
av_scanner = fsecure:/path/to/.fsav
|
Если аргументов не задано, то значение по умолчанию -
“
/var/run/.fsav
”. Спасибо Johan Thelmen, за внесение кода для этого сканера.
“
kavdaemon
” - Это - сканирующий даемон Касперского 4-й версии. Эта версия сканера Касперского является устаревшей. Пожалуйста, обновитесь (смотрите выше, опцию
“
aveserver
”). Этот тип санера принимает одну опцию, которая является путём к UNIX-сокету даемона. Например:
av_scanner = kavdaemon:/opt/AVP/AvpCtl
|
Дефолтовый путь -
“
/var/run/AvpCtl
”.
“
mksd
” - Этот сканер нацелен главным образом на польских юзеров, хотя, сейчас, некоторые части документации доступны на английском. Вы можете получить ее на http://linux.mks.com.pl. Единственная опция этого сканера - максимальное число одновременно используемых процессов для сканирования вложений, при условии что используется средство demime, и при условии, что mksd был запущен с тем же самым числом дочерних процессов. Например:
“
sophie
” - Sophie - даемон использующий библиотеку Sophos' libsavi для сканирования на вирусы. Вы можете получить его по адресу http://www.vanja.com/tools/sophie. Для этого типа сканера есть лишь одна опция - путь к UNIX-сокету, который Sophie используется для связи с клиентом. Например:
av_scanner = sophie:/tmp/sophie
|
Дефолтовый путь -
“
/var/run/sophie
”, такчто если вы используете его, то можете опустить эту опцию.
Когда
“
av_scanner
” коректно установлена, вы можете использовать условие
“
malware
” в DATA ACL. Отметтьте: Вы не можете использовать условие
“
malware
” в MIME ACL.
Опция
“
av_scanner
” раскрывается при каждом вызове
“
malware
”. Это позволяет использовать различные сканеры. Смотрите ниже примеры использования. Условие
“
malware
” кэширует свои результаты, таким образом, вы можете использовать его неоднократно для одного и того же сообщения, фактически, процесс сканирования выполняется лишь один раз. Однако, использование раскрываемых элементов в
“
av_scanner
” отключает кэширование, и каждое использование условия
“
malware
” вызывает новое сканирование сообщения.
УСловие
“
malware
” берёт правый параметр, который раскрывается до использования. Он может быть одним из:
“true
”,
“*
”, или
“1
”, в случае чего сообщение сканируется на вирусы. Условие успешно, если найден вирус, или неудачно в ином случае. Это - рекомендуемое применение.
“false
” или
“0
”, в случае чего сканирования не происходит и условие немедленно неудачно.
Регулярное выражение, в случае чего сообщение сканируется на вирусы. Условие успешно если найден вирус, и его имя совпадает с регулярным выражением. Это позволяет вам предпринимать специальные действия для определённых типов вирусов.
Вы можете добавить
“/defer_ok
” к условию
“
malware
” чтобы принимать сообщения даже если какие-то проблемы с вирусным сканером.
Когда вирус найден, условие устанавливает переменную раскрытия с именем
“
$malware_name
”, которая содержит имя вируса. Вы можете использовать её в модификаторе
“
message
”, который определяет ошибку, возвращаемую отправителю, и/или логгируемые данные.
Если ваш вирусный сканер не может самостоятельно распаковать MIME и TNEF контейнеры, вы должны использовать условие
“
demime
” (смотрите секцию 40.6) до условия
“
malware
”.
Вот - очень простой пример сканирования:
deny message = This message contains malware ($malware_name)
demime = *
malware = *
|
Следующий пример принимает сообщения когда у сканера проблемы:
deny message = This message contains malware ($malware_name)
demime = *
malware = */defer_ok
|
Следующий пример показывает как использовать переменную ACL для сканирования обоими - sophie и aveserver. Он предполагает, что вы установили:
в главной конфигурации exim`a
deny message = This message contains malware ($malware_name)
set acl_m0 = sophie
malware = *
deny message = This message contains malware ($malware_name)
set acl_m0 = aveserver
malware = *
|
40.2 Сканирование с SpamAssassin
Условие ACL
“
spam
” вызывает даемона
“
spamd
” SpamAssassin'а для получения очков за спам и отчёта для сообщения. Вы можете получить SpamAssassin по адресу http://www.spamassassin.org, или, если у вас есть рабочая инсталляция Perl, вы можете использовать CPAN, путём запуска:
perl -MCPAN -e 'install Mail::SpamAssassin'
|
SpamAssassin обладает собственным набором конфигурационных файлов. Пожалуйста, посмотрите его документацию, чтобы узнать, как вы можете его настроить. Однако, и дефолтовая инсталляция работает хорошо.
Установив и настроив SpamAssassin, запустите даемон
“
spamd
”. По умолчанию, он слушает 127.0.0.1, TCP порт 783. Если вы используете иной хост или порт для
“
spamd
”, вы должны установить лпцию
“
spamd_address
” в глобальной части конфигурации exim`a, следующим образом (например):
spamd_address =
192
.
168
.
99
.
45
387
|
Вам нет нужды устанавливать эту опцию, если вы используете значение по умолчанию. Для версии 2.60,
“
spamd
” также поддерживает коммуникацию через UNIX-сокеты. Если вы хотите их использовать, установите
“
spamd_address
” в абсолютный путь до сокета, вместо пары адрес/порт:
spamd_address = /var/run/spamd_socket
|
У вас может быть несколько серверов
“
spamd
”, для улучшения масштабируемости. Они могут находиться на других железках, доступных по сети. Для задания нескольких серверов
“
spamd
”, установите в опцию
“
spamd_address
” несколько пар адрес/порт, разделённых двоеточиями:
spamd_address =
192
.
168
.
2
.
10
783
: \
192
.
168
.
2
.
11
783
: \
192
.
168
.
2
.
12
783
|
Поддерживается вплоть до 32 серверов
“
spamd
”. Сервера запрашиваются случайным образом. Когда сервер не в состоянии ответить на попытку подключения, пробуются все другие сервера, пока какой-либо не будет успешным. Если ни один сервер не ответил, условие
“
spamd
” задерживается.
Предупреждение: Невозможно использовать соединение через UNIX-сокет с несколькими серверами
“
spamd
”.
40.3 Вызов SpamAssassin из ACL exim`a
Вот - простой пример использования условия
“
spam
” в DATA ACL:
deny message = This message was classified as SPAM
spam = joe
|
Правая сторона условия
“
spam
” определяет имя пользователя, для которого SpamAssassin сканирует. Если вы не хотите использовать сканирование конкретного пользователя, на использовать профиль SpamAssassin как дефолтовый профиль системы, вы можете сканировать для неизвестного пользователя, или просто использовать
“nobody
”. Однако, вы должны что-то поместить в правую строну.
Имя пользователя позволяет вам использовать антиспамовый профили на домен, или на пользователя. Правая сторона раскрывается до использования, таким образом, в неё вы можете поместить поиск или условие. Когда правая строна вычисляется в
“0
” или
“false
”, сканирования не происходит, и условие немедленно неуспешно.
Сканирование с помощью SpamAssassin использует много ресурсов. Если вы сканируете каждое сообщение, большие сообщения могут вызывать существенное ухудшение производительности. Поскольку, большинство спама - маленькие сообщения, рекомендуется, чтобы вы не просматривали большие. Например:
deny message = This message was classified as SPAM
condition = ${if < {$message_size}{10K}}
spam = nobody
|
Условие
“
spam
” возвращает истину, если происходит соответсвие или превышение заданному в пользовательском профиле SpamAssassin`a. Если вы хотите использовать условие
“
spam
” для его стронних эффектов (смотрите ниже, переменные), вы можете заставить его всегда возвращать
“true
”, путём добавления к имени пользователя
“:true
”.
Когда выполняется условие
“
spam
”, оно устанавливает множество пеерменных раскрытия. За исключением
“
$spam_score_int
”, они доступны лишь внутри ACL; их значения не сохраняются с сообщением, и, таким образом, не могут быть использованы во время доставки.
“
$spam_score
” - Счётчик очков за спам, например,
“3.4
” или
“30.5
”. Он полезен для включения в логи или сообщение о отклонении.
“
$spam_score_int
” - Счётчик очков за спам, умноженный на 10, как значение целого числа. Например,
“34
” или
“305
”. Он полезен для цифровых сравнений в условиях. Это - специальная переменная; её значение сохраняется с сообщением, и пишется в файл спула exim`a. Это означает, что оно может быть использовано в течение всей жизни сообщения в вашей системе exim`a, в частности, роутерах или транспортах, в последующую фазу доставки.
“
$spam_bar
” - Строка содержит несколько символов
“+
” или
“-
”, изображая числовую часть значения счётчика спама. Счётчик спама 4.4 имел бы значение
“
$spam_bar
” равное
“++++
”. Это полезно для включения в предупреждающие заголовки, т.к. MUA могут сравнивать такие заголовки.
“
$spam_report
” - Многострочная текстовая таблица, содержащая полный отчёт SpamAssassin для сообщения. Полезна для включения в заголовки, или сообщение о отклонении.
Условие
“
spam
” кэширует свои результаты. Если вы вызываете его для того же самого имени пользователя, он не сканирует заново, а снова возвращает те же самые значения.
Условие
“
spam
” возвращает DEFER, если при обработке сообщения SpamAssassin`ом происходит какая-то ошибка. Если вы хотите обработать DEFER как FAIL (для перехода к следующему блоку утверждений ACL), добавьте
“/defer_ok
” к правой стороне условия
“
spam
”, например так:
deny message = This message was classified as SPAM
spam = joe/defer_ok
|
Это вызывает приём сообщения, даже если существуют со
“
spamd
”.
Вот - более длинный, прокомментированный пример использования условия
“
spam
”:
# put headers in all messages (no matter if spam or not)
warn message = X-Spam-Score: $spam_score ($spam_bar)
spam = nobody:true
warn message = X-Spam-Report: $spam_report
spam = nobody:true
# add second subject line with *SPAM* marker when message
# is over threshold
warn message = Subject: *SPAM* $h_Subject:
spam = nobody
# reject spam at high scores (> 12)
deny message = This message scored $spam_score spam points.
spam = nobody:true
condition = ${if >{$spam_score_int}{120}{1}{0}}
|
40.4 Сканирование частей MIME
Глобальная опция
“
acl_smtp_mime
” определяет ACL которая вызывается для каждой MIME части SMTP сообщения, включая типы состоящие из нескольких частей (multipart), в последовательности их позиций в сообщении. Точно также, опция
“
acl_not_smtp_mime
” определяет ACL, которая используется для MIME частей не-SMTP сообщений. Эти опции могут обе относиться к одной и той же AACL если вы хотите одну и ту же обработку в обоих случаях.
Эти ACL вызываются (возможно, несколько раз) лишь до ACL
“
acl_smtp_data
”, в случае сообщения SMTP, или лишь до приёма не-SMTP сообщений. Однако, MIME ACL вызывается лишь если сообщение содержит строку заголовка
“
MIME-Version:
”. Когда вызов MIME ACL не приводит к
“accept
”, обработка ACL прерывается, и клиенту посылается соответствующий код результата. В случае SMTP-сообщения, ACL
“
acl_smtp_data
” не вызывается когда это происходит.
Вы не можете использовать условия
“
malware
” или
“
spam
” в MIME ACL; они могут использоваться лишь в DATA или не-SMTP ACL. Однако, вы можете использовать условие
“
mime_regex
” для сравнения с декодированной MIME-частью (смотрите секцию 40.5).
В начале MIME ACL, множество переменных устанавливаются из информации заголовков для релевантной части MIME. Это описано ниже. По умолчанию, содержимое части MIME не декодируется в файл на диске, исключая части MIME чей тип содержимого -
“message/rfc822
”. Если вы хотите декодировать часть MIME в файл на диске, вы можете использовать модификатор
“
decode
”. Общий синтаксис таков:
decode = [/<path>/]<filename>
|
Правая строна раскрывается до использования. После раскрытия значение может быть:
1.
“0
” или
“false
”, в случае чего декодирования не происходит.
2. Строка
“default
”. В этом случае, файл кладётся во временную
“дефолтовую
” директорию
“
<spool_directory>/scan/<message_id>/
” с последующим именем файла, состоящим из идентификатора сообщения и последующего номера. Полный путь и имя доступны в
“
$mime_decoded_filename
” после декодирования.
3. Полный путь с именем начинается со слэша. Если полное имя - существующая директория, она используется как замена для дефолтовой директории. Имя файла добавляется последовательно. Если путь не существует; он используется как полный путь и имя файла.
4. Если строка не начинается со слэша, она используется как имя файла, и используется дефолтовый путь.
Вы можете легко расшифровать с его оригинальным, предполагаемым именем, используя
Однако, вы должны иметь ввиду, что
“
$mime_filename
” может содержать что угодно. Если вы помещаете файлы вне пути дефолтового пути, они не удаляются автоматически.
Для вложений RFC822 (они - сообщения ложенные в сообщения, с типом содержимого
“message/rfc822
”), ACL вызывается снова, таким же самым образом как для первичного сообщения, лишь если установлена переменная раскрытия
“
$mime_is_rfc822
” (смотрите ниже). Приложенные сообщения всегда декодируются на диск до проверки, и файлы удаляются после завершения проверки.
ACL MIME поддерживает условия
“
regex
” и
“
mime_regex
”. Они могут использоваться для сравнения регулярного выражения с сырыми и декодированными частями MIME, соответственно. Они описаны в секции 40.5.
Следующий список описывает все переменные раскрытия, которые доступны в ACL MIME:
“
$mime_boundary
” - Если текущая часть - multipart (смотрите ниже,
“
$mime_is_multipart
”), она должна иметь граничную строку, которая сохраняется, если доступна. Если текущая часть не имеет граничного параметра в заголовке
“
Content-Type:
”, эта переменная содержит пустую строку.
“
$mime_charset
” - Эта переменная содержит идентификатор набора символов (кодировки), если он найден в заголовке
“
Content-Type:
”. Примеры идентификаторов наборов символов:
us-ascii
gb2312 (Chinese)
iso-
8859
-
1
|
Пожалуйста, отметтьте, что это значение не нормальзовано, таким образом, вы должны его сравнивать регистронезависимо.
“
$mime_content_description
” - Эта переменая содержит нормализованное содержимое заголовка
“
Content-Description:
”. Он может содержать удобочитаемое описание части содержимого. Некоторые реализации повторяют тут имя вложенного файла, но, обычно они лишь используются для целей отображения.
“
$mime_content_disposition
” - Эта переменная содержит нормализованное содержимое заголовка
“
Content-Disposition:
”. Тут вы можете ожидать строку типа
“attachment
” или
“inline
”.
“
$mime_content_id
” - Эта переменная содержит нормализованное содержимое заголовка
“
Content-ID:
”. Это уникальный идентификатор который может использоваться для ссылки на часть от другой части.
“
$mime_content_size
” - Эта переменая устанавливается лишь после успешного выполнения модификатора
“
decode
” (смотрите выше). Она содержит размер декодированной части в килобайтах, таким образом, лишь полностью пустые части имеют нулевой
“
$mime_content_size
”.
“
$mime_content_transfer_encoding
” - Эта переменная содержит нормализованное содержимое заголовка
“
Content-transfer-encoding:
”. Это - символическое имя для типа кодировки. Типичное значение -
“base64
” и
“quoted-printable
”.
“
$mime_content_type
” - Если у части MIME есть заголовок
“
Content-Type:
”, эта переменная содержит его значение, в нижнем регистре, и без любых опций (типа
“name
” и
“charset
”). Вот - некоторые примеры популярных типов MIME, как они могут появляться в этой переменной:
text/plain
text/html
application/octet-stream
image/jpeg
audio/midi
|
Если часть MIME не имеет заголовка
“
Content-Type:
”, эта переменная содержит пустую строку.
“
$mime_decoded_filename
” - Эта переменная устанавливается лишь после успешной работы модификатора
“
decode
” (смотрите выше). Его содержимое содержит полный путь и имя файла содержащего декодированные данные.
“
$mime_filename
” - Это - возможно самая важная из переменных MIME. Она содержит предложенное имя файля вложения, если оно было найдено в одном из заголовков -
“
Content-Type:
” или
“
Content-Disposition:
”. Имя файла декодируется по RFC2047, но никаких дополнительных проверок на адекватность не производится. Если имя файла не найдено, эта переменная содержит пустую строку.
“
$mime_is_coverletter
” - Эта переменная пытается различить
“конверт письма
” (
“cover letter
”) от приложенных данных. Она может быть использована для пресечения кодированного содержимого в конверте письма, не ограничивая вложения вообще. (Вообще, тут несколько иная фраза, и советую обратиться к документации, ибо смысл написанного, да ещё и с ошибками, понял лишь прочтя главу, и то не до конца - прим. lissyara).
Переменная содержит 1 (истина) для частей MIME, являющихся частями письма, и 0 (ложь) для вложений. В настоящее время алгоритм такой:
1. Самая дальняя часть MIME - всегда обёртка письма.
2. Если обёртка письма multipart/alternative или multipart/related часть MIME, следовательно, все субчасти MIME внутри - multipart.
3. Если любая другая multipart-часть - обёртка письма, первая часть - обёртка, и последующие - вложегия.
4. Все части содержащиеся в пределах multipart - вложения.
Как пример, следующее правило запретит
“HTML mail
” (включая, что посылается с альтернативным чистым текстом), позволяя HTML-файлам быть прикрепленными. HTML обёртка письма, приложенная к не-HTML обёртке почты, также разрешена:
deny message = HTML mail is not accepted here
!condition = $mime_is_rfc822
condition = $mime_is_coverletter
condition = ${if eq{$mime_content_type}{text/html}{1}{0}}
|
“
$mime_is_multipart
” - Эта переменная имеет значение 1 (истина), когда текущая часть имеет главный тип
“multipart
”, например,
“multipart/alternative
” или
“multipart/mixed
”. Так как multipart объекты лишь служат контейнером для других частей, вы не можете захотеть предпринять для них специфические действия.
“
$mime_is_rfc822
” - Эта переменная имеет значение 1 (истина), если текущая часть - не непосредственно часть проверяемого сообщения, но часть приаттаченного сообщения. Приложенные сообщения декодируются полностью рекурсивно.
“
$mime_part_count
” - Эта переменная - счётчик, увеличивающийся для каждой обрабатываемой части MIME. Он начинается с нуля для самой первой части (которая, обычно, multipart). Счётчик - на сообщение, таким образом, он сбрасывается при обработке вложений RFC822 (смотрите
“
$mime_is_rfc822
”). Счётчик остаётся установленным после завершения
“
acl_smtp_mime
”, таким образом, вы можете использовать его в DATA ACL для опредления числа частей MIME в сообщении. Для не-MIME сообщений, эта переменная содержит
“-1
”.
40.5 Сканирование с регулярными выражениями
Вы можете задать ваши собственные регулярные сообщения, совпадающие с полным телом сообщения, или индивидуальными частями MIME.
Условие
“
regex
” получает одно или более регулярное выражение как аргумент, и сравнивает его с полным сообщением (при вызове в DATA ACL), или сырой частью MIME (при вызове в MIME ACL). Условие
“
regex
” сравнивается построчно, с максимальной длинной строки в 32k символов. Это означает, что вы не можете получить многострочные сравнения с условием
“
regex
”.
Условие
“
mime_regex
” может быть вызывано лишь в ACL MIME. Оно сравнивается вплоть до 32k декодированного содержимого (всё содержимое сразу, не построчно). Если часть не была декодирована с модификатором
“
decode
” ранее в ACL, она автоматически декодируется при выполнении
“
mime_regex
” (используя дефолтовый путь и значение имени файла). Если декодированные данные более 32k, проверяются лишь первые 32k.
Регулярные выражения передаются как список разделённый двоеточиями. Для включения символа двоеточия, вы должны его удвоить. Так как правая строка раскрыватся до использования, вы, также, должны экранировать символ доллара и обратные слэши обратными слэшами, или используя средство
“\N
”, для отключения раскрытия. Вот - простой пример, который содержит два регулярных выражения:
deny message = contains blacklisted regex ($regex_match_string)
regex = [Mm]ortgage : URGENT BUSINESS PROPOSAL
|
Условие возвращает истину, если совпадает любое регулярное выражение. Тогда устанавливается переменная раскрытия
“
$regex_match_string
”, и содержит соответтсвующее регулярное выражение.
Предупреждение: С большими сообщениями, это условие может быть довольно ресурсоёмким.
40.6 Условие
“demime
”
Условие ACL
“
demime
” предоставляет распаковку MIME, проверяя корректность и блокируемые расширения файлов. Оно может использоваться лишь в DATA и не-SMTP ACL. Условие
“
demime
” использует более простой интерфейс к декодированию MIME, чем функциональность MIME ACL, но не предоставляет никаких дополнительных средств. Пожалуйста, отметтьте, что это условие устарело, и осавлено лишь для обратной совместимости. Вы должны установить опцию WITH_OLD_DEMIME в
“
Local/Makefile
” во время сборки, для возможности использовать условие
“
demime
”.
Условие
“
demime
” распаковывает в сообщении контейнеры MIME. Оно детектирует ошибки в MIME контейнерах, и может сравнивать расширения файлов найденные в сообщении со списком. Использование этого средства приводит к файлам содержащим распакованные части MIME сообщения во временной директории сканирования. Если вы производите сканирование антивирусом, рекомендуется использовать условие demime до условия антивируса (
“
malware
”).
В правой строне условия
“
demime
” вы можете поместить список, разделённый двоеточиями, расширений файлов, с которыми оно будет сравниваться. Например:
deny message = Found blacklisted file attachment
demime = vbs:com:bat:pif:prf:lnk
|
Если найдено одно из расширений файлов, условие истинно, иначе - ложно. Если при демимизации происходит временная ошибка (например,
“disk full
”), условие задержано, и сообщение временно отклоняется (если только в условии не стоит команда
“
warn
”).
Правая строна раскрывается до использования как списка, таким образом, вы можете использовать в ней поиск. Если раскрытие приводит к пустой строке,
“false
”, или нулю (
“0
”), демимизации не происходит и условие неудачно.
Условие
“
demime
” устанавливает следующие переменные:
“
$demime_errorlevel
” - Когда в контейнере MIME детектируется ошибка, эта переменная содержит серьёзность ошибки, как целое число. Чем выше значение, тем более серьёзная ошибка (текущее максимальное значение - 3). Если эта переменная незадана, или нулевая, ошибок не было.
“
$demime_reason
” - Когда
“
$demime_errorlevel
” более нуля, эта переменная содержит удобочитаемую текстовую строку описывающую всреченную ошибку MIME.
“
$found_extension
” - Когда условие
“
demime
” истинно, эта переменная содержит найденное расширение файла.
Обе,
“
$demime_errorlevel
” и
“
$demime_reason
” устанавливаются при первом вызове условия
“
demime
”, и не изменяются при последующих вызовах.
Если вы не хотите проверять расширения файлов, а использовать условие
“
demime
” для распаковки или с целью проверки ошибок, поместите
“*
” в правую строну. Вот - более сложный пример использования этого средства:
# Reject messages with serious MIME container errors
deny message = Found MIME error ($demime_reason).
demime = *
condition = ${if >{$demime_errorlevel}{2}{1}{0}}
# Reject known virus spreading file extensions.
# Accepting these is pretty much braindead.
deny message = contains $found_extension file (blacklisted).
demime = com:vbs:bat:pif:scr
# Freeze .exe and .doc files. Postmaster can
# examine them and eventually thaw them.
deny log_message = Another $found_extension file.
demime = exe:doc
control = freeze
|
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
41. Добавляем функцию local scan в Exim
В эти дни когда увеличивается количество email червей, вирусов, и постоянно увеличивающегося спама некоторые сайты хотят увеличить проверку сообщений прежде чем примут их.
Расширение для проверки содержимого сообщений (глава 40)имеет средство для передачи возможности сканирования на спам и вирусы внешним программам. Вы можете так же определенное количество непосредственно в Exim, через строки расширения и условия
“
condition
” в ACL который запускается после команды SMTP DATA ли ACL для не-SMTP сообщений (см. главу 39), но здесь есть ограничения.
Для поддержки дальнейшей настройки в соответствии с требованиями сайта, можно слинковать Exim с функцией проверки частны сообщений, написанной на C. Если вы хотите запустить код написанный на чем то другом, чем C, Вы конечно же можете использовать C stub для вызова функции.
Функция local scan запускается единожды для каждого входящего сообщения, в тот момент когда Exim собирается принять сообщение. Поэтому эта возможность может использоваться для локальных не-SMTP сообщений также, как и для сообщений пришедших по SMTP.
Exim применяет перерыв к запросам функции local scan, опция которая задает это, называется
“
local_scan_timeout
”. По умолчанию параметр равен 5 минутам. Ноль обозначает "непрерывно". Exim так же настраивает описатели сигналов для SIGSEGV, SIGILL, SIGFPE, и SIGBUS перед вызовом функции local scan, для того что бы общие типы некорректного завершения были очевидны. Если время перерыва превышено или получен один из сигналов, входящее сообщение отклоняется с ошибкой по времени, если это SMTP сообщение. Для не-SMTP сообщений сообщение сбрасывается и Exim завершает работу с кодом ошибки. Происшествие отражается в main и reject логах.
41.1 Сборка Exim с использованием функции local scan
Для использования функции local scan, вы должны указать указать местоположение Вашей функции перед сборкой Exim, установкой LOCAL_SCAN_SOURCE в файле
“
Local/Makefile
”. Рекомендованное место хранения директория
“
Local
” поэтому можно установить
LOCAL_SCAN_SOURCE=Local/local_scan.c
|
для примера. Функция должна называться
“
local_scan()
”. Она вызывается Exim'ом после получения сообщения, перед отправкой кода успешного выполнения. Это после всех запущенных ACL. Код возврата вашей функции контролирует принято ли сообщение или нет. Есть закоментированый шаблон функции (который принимает сообщение) в файле
“src/local_scan.c_
”.
Если вы хотите использовать файл конфигурации Exim'а для установки опций для вашей функции local_scan(), вы должны установить
LOCAL_SCAN_HAS_OPTIONS=yes
|
в файле
“
Local/Makefile
” (смотрите раздел 41.3 ниже).
41.2 API для local_scan()
Вы должны включить эту строку ближе к началу кода:
Этот заголовочный файл определяет количество переменных, других значений и прототип самой функции. Exim написан для использования, практически исключительно, беззнаковых символов (unsigned char) и одна из вещей которую определяет заголовок - сокращение для беззнаковых символов, называемое uschar. Он так же содержит следующие макро определения, для упрощения отбора символьных строк и указателей на символьные строки.
#define CS (char *)
#define CCS (const char *)
#define CSS (char **)
#define US (unsigned char *)
#define CUS (const unsigned char *)
#define USS (unsigned char **)
|
Прототип функции
“
local_scan()
” это:
extern int local_scan(int fd, uschar **return_text);
|
Аргументы следующие:
“
fd
” - файловый дескриптор для файла который содержит тело сообщения (
“-D
” файл). Файл открыт для записи и чтения, но обновление не рекомендуется. Предупреждение: Вы не должны закрывать файловый дескриптор.
Дескриптор позиционируется на 19 символе в файле, в котором первый символ само тело, потому как первые 19 символов ID сообщения, следующий за ним -D и символ newline. Если вы переместитесь в начало файла, вы должны использовать макрос SPOOL_DATA_START_OFFSET для того что бы сбросить начало данных, на случай в последующих версиях.
“
return_text
” - адрес который вы можете использовать возвратив указатель на текстовую строку в конце функции. Значение на которое указывает при входе - NULL.
Функция должна возвратить значение
“
int
”, которое является одним из следующих макросов:
LOCAL_SCAN_ACCEPT - Сообщение принято. Если вы пропустите назад строку текста, это сохранится с сообщением и сделает доступным переменную
“
$local_scan_data
”. Никаких символов новых строк не поддерживается (если таковые присутствуют, они буду превращены в пробел) и максимальная длина текста 1000 символов.
LOCAL_SCAN_ACCEPT_FREEZE - Ведет себя так же как и LOCAL_SCAN_ACCEPT, за исключением того, что принятое сообщение становиться в очередь без незамедлительной доставки и замораживается.
LOCAL_SCAN_ACCEPT_QUEUE - Ведет себя так же как и LOCAL_SCAN_ACCEPT, за исключением того, что принятое сообщение становиться в очередь без незамедлительной доставки.
LOCAL_SCAN_REJECT - Сообщение отклонено; возвращаемый текст используется как ошибка, который отсылается обратно отправителю и которое протоколируется. Символы newlines поддерживаются, они разрешают многострочный ответ для SMTP отклонений, но конвертируются в
“\n
” в логах. Если никакое сообщение не присвоено, используется
“Administrative prohibition
”.
LOCAL_SCAN_TEMPREJECT - Сообщение временно отклонено. Возвращаемый текст используется как сообщение об ошибке, так же как и LOCAL_SCAN_REJECT. Если никакое сообщение не присвоено используется
“Temporary local problem
”.
LOCAL_SCAN_REJECT_NOLOGHDR - Ведет себя так же как и LOCAL_SCAN_REJECT, за исключением того что заголовок отклоненного сообщения не записывается в лог отклонений. Эффект неустановленного
“
rejected_header
” в выборе логов только для этого отклонения. Если
“
rejected_header
” уже не установлен (см. обсуждение
“
log_selection
” в главе 48.15) код тот же самый что и у LOCAL_SCAN_REJECT.
LOCAL_SCAN_TEMPREJECT_NOLOGHDR - Этот код - такое же изменение LOCAL_SCAN_TEMPREJECT, как и LOCAL_SCAN_REJECT_NOLOGHDR изменение LOCAL_SCAN_REJECT.
Если сообщение не было получено интерактивно по SMTP, об отклонениях сообщается записью в
“
stderr
” или отправкой письма, как сконфигурировано опциями
“
-oe
” в командной строке.
41.3 Опции конфигурации для local_scan()
Возможно использовать установку опции, которая устанавливает значения в статических переменных, в модуле
“
local_scan()
”. Если вы этого хотите, вы должны иметь строку
LOCAL_SCAN_HAS_OPTIONS=yes
|
в файле
“
Local/Makefile
”Local/Makefile когда вы собираете Exim. (Эта строка находится в
“
OS/Makefile-Default
”, закомментированная). Затем в исходном файле
“
local_scan()
” вы должны определить статические переменные, для хранения значений и таблицу, определяющую их.
Таблица должна быть вектором называемым
“
local_scan_options
”, типа
“optionlist
”. Каждая точка входа - тройное значение состоящее из имени, типа опции, и указателя на переменную содержащую значение. Точки входа должны следовать в алфавитном порядке. Следуя за
“
local_scan_options
”, вы должны так же определить значение переменной называемой
“
local_scan_options_count
” содержащую количество входов в таблицу. Вот краткий пример, демонстрирующий две опции:
static int my_integer_option =
42
;
static uschar *my_string_option = US"a default string";
optionlist local_scan_options[] = {
{ "my_integer", opt_int, &my_integer_option },
{ "my_string", opt_stringptr, &my_string_option }
};
int local_scan_options_count =
sizeof(local_scan_options)/sizeof(optionlist);
|
Значения переменных могут быть изменены Exim'ом из файла конфигурации включением секции local scan, так, как в этом примере:
begin local_scan
my_integer =
99
my_string = some string of text...
|
Доступные типы данных следующие:
“
opt_bool
” - Определяет булеву опцию (да/нет). Адрес должен указывать на переменную типа BOOL, которая устанавливается в TRUE или FALSE, которые являются макросами определенными как 1 и 0, соответственно. Если вы хотите оперделить была ли установлена такая переменная вообще, то вы можете вызвать ее как TRUE_UNSET. (Переменные BOOL - целочисленные, которые могут содержать более двух значений).
“
opt_fixed
” - Эта опция определяет число с фиксированной точкой (целочисленное). Адрес должен указывать на переменную типа int. Хранимое значение умножается на 1000, так например, значение 1.4142 отрежется и сохранится как 1414.
“
opt_int
” - Эта опция определяет целое число, адрес должен указывать на переменную типа int. Значение может быть определено в любом целочисленном формате, понимаемым Exim'ом.
“
opt_mkint
” - То же самое как opt_int, за исключением того, что значение выводится в -bP листинг, если в нем точное число килобайтов и мегабайтов, печатается с суффиксом K или M.
“
opt_octint
” - Опция тоже определяет число, как целочисленное, только значение интерпретируется всегда как восьмиричное целочисленное. Начинается с цифры 0 и выводится в восьмиричном счислении.
“
opt_stringptr
” - Определяет значение строки, адрес должен быть указателем на переменную, которая указывает на строку (например, тип uschar *).
“
opt_time
” - Определяет интервал времени. Адрес должен указывать на переменную типа int. Значение которое туда записывается, число в секундах.
Если в командной строке за local_scan следует параметр
“
-bP
”, Exim выводит значения всех опций
“
local_scan()
”.
41.4 Доступные переменные Exim
Заголовок
“
local_scan.h
” дает вам доступ к некоторым С переменным. Тут перечислены только те, которые, как гарантируют будут поддерживаться от релиза к релизу. Заметьте, как бы то ни было, вы можете получить любое значение переменной Exim вызывая функцию
“
expand_string()
”. Экспортируемые переменные следующие:
“
unsigned int debug_selector
” - Это переменная устанавливается в ноль, когда отладка не производится. Иначе - это набор значений отладочных селекторов. Два бита используются в функции
“
local_scan()
”; они определяются как макросы:
— D_v - бит установлен, когда
“
-v
” присутствует в коммандной строке. Эта тестовая опция не на что не влияет, любой вызов может установить ее. Остальные биты могут установить только администраторы.
— D_local_scan - бит для использования функцией
“
local_scan()
”; устанавливается в
“+local_scan
” отладочным селектором. По умолчанию не включается в дефолтовый набор отладочных битов. Таким образом, что бы получить отладочный вывод, только когда
“+local_scan
” включен, вам нужно написать следующее:
if ((debug_selector & D_local_scan) !=
0
)
debug_printf("xxx", ...);
|
“
uschar *expand_string_message
” - После неудачной попытки вызвать
“
expand_string()
” (Возвращаемое значение NULL) переменная
“
expand_string_message
” содержит сообщение об ошибке, завершается нулем.
“
header_line *header_list
” - Указатель на цепочку строк заголовка. Структура
“
header_line
” обсуждается ниже.
“
header_line *header_last
” - Указатель на последнюю строку заголовка.
“
uschar *headers_charset
” - Значение опции конфигурации
“
headers_charset
”.
“
BOOL host_checking
” - Эта переменная TRUE в момент проверки хоста, инициализируемого опцией
“
-bh
” командной строки.
“
uschar *interface_address
” - IP адрес интерфейса который получает сообщения, тип - строка. Значение NULL для локальных сообщений.
“
int interface_port
” - Порт, на котором было получено это сообщение.
“
uschar *message_id
” - Переменная содержащая идентификаторы сообщений Exim'а для входящих сообщений (значение
“
$message_exim_id
”), заканчивающаяся нулем.
“
uschar *received_protocol
” - Имя протокола, по которому было получено сообщение.
“
int recipients_count
” - Число подтвержденных получателей.
“
recipient_item *recipients_list
” - Список подтвержденных получателей, хранящийся как вектор длины
“
recipients_count
”. Структура
“
recipient_item
” обсуждается ниже. Вы можете добавлять получателей вызывая,
“
receive_add_recipient()
” (см. ниже). Вы можете удалять получателей, уберая их из вектора и исправляя значение в
“
recipients_count
”. В частности, устанавливая recipients_count в ноль вы удаляете всех получателей. Если вы затем возвратите значение LOCAL_SCAN_ACCEPT, сообщение будет принято, но тут же исчезнет. Для замещения получателей вы можете установить
“
recipients_count
” в ноль и затем вызвать
“
receive_add_recipient()
” так часто как это необходимо.
“
uschar *sender_address
” - Адрес отправителя. Для отвергнутых сообщений это пустая строка.
“
uschar *sender_host_address
” - IP адрес хоста отправителя. Для локальных сообщений NULL.
“
uschar *sender_host_authenticated
” - Имя аутентификационного механизма, который был использован, или NULL если сообщение было получено не через SMTP соединение с аутентификацией.
“
uschar *sender_host_name
” - Имя хоста отправителя, если известно.
“
int sender_host_port
” - Порт хоста отправителя.
“
BOOL smtp_input
” - Переменная равна TRUE для всех входящих SMTP, включая BSMTP.
“
BOOL smtp_batched_input
” - Переменная равна TRUE для входящих BSMTP.
“
int store_pool
” - Содержимое этой переменной определяет какой пул памяти будет использоваться для новых запросов. (См. секцию 41.8 для более детальной информации).
41.5 Структура header_line
Структура
“
header_line
”, содержит элементы упомянутые ниже. Вы можете добавить дополнительные строки заголовка, вызывая функцию
“
header_add()
”(см. ниже). Вы можете комментировать (удалять) линии заголовка, устанавливая их тип в
“*
”.
“
struct header_line *next
” - Указатель на следующую строку заголовка, или на NULL, для последней строки.
“
int type
” - Код идентифицирующий определенные заголовки, которые Exim распознает.
Коды, печатные символы, документированные в главе 52 этого руководства. Обратите внимание, любая строка заголовка тип которой -
“*
”, не передается с сообщением. Эта отметка используется для линий заголовка которые были перезаписаны, (например
“
Envelope-sender: header lines
”). Зачастую,
“*
” означает удалено.
“
int slen
” - Число символов в строке заголовка, включая символы завершения и символы новой строки.
“
uschar *text
” - Указатель на текст заголовка. Всегда заканчивается символом новой строки, сопровождаемый нулевым байтом. Внутренние символы новой строки сохраняются.
41.6 Структура recipient_item
Структура
“
recipient_item
” содержит следующие элементы:
“
uschar *address
” - Указатель на адрес получателя, который был получен.
“
int pno
” - Используется Exim'ом позже в обработке, когда главные адреса созданы опцией one_time. Несущественна, в то время, когда
“
local_scan()
” работает, и должен содержать всегда -1 на этом этапе.
“
uschar *errors_to
” - Если значение не NULL, отталкивет сообщение из-за невозможности доставки получателю по адресу который содержит. Другими словами отвергает отправителя конверта для одного адресата (Сравните с
“
errors_to
” в общих опциях маршрутизации). Если функция
“
local_scan()
” устанавливает поле
“
errors_to
” неквалифицированному адресу, Exim квалифицирует используя домен из
“
qualify_recipient
”. Когда функция
“
local_scan()
” вызвана, поле
“
errors_to
” содержит NULL для всех адресатов.
41.7 Доступные функции Exim
Заголовок
“
local_scan.h
” дает вам доступ к некоторому числу функций Exim. Здесь представлены только те, которые гарантированно будут поддерживаться от релиза к релизу.
“
pid_t child_open(uschar **argv, uschar **envp, int newumask, int *infdptr, int *outfdptr, BOOL make_leader)
”
Эта функция создает дочерний процесс, который запускает команду определенную в
“
argv
”. Окружение этого процесса определено в
“
envp
”, который может быть NULL, если не передаются переменные окружения. Новое unmask служит для процесса в newumask.
Пайпы стандартного ввода и вывода нового процесса уже настроены и возвращаются вызвавшему через аргументы
“
infdptr
” и
“
outfdptr
”. Стандартная ошибка приравнивается к стандартному выводу. Если есть дескрипторы для файла "в пути" в новом процессе, то они закрываются. Если последний аргумент TRUE, новый процесс возглавляет группу процессов.
Функция возвращает pid нового процесса, или -1 если что то пошло не так.
“
int child_close(pid_t pid, int timeout)
”
Функция ждет, когда дочерний процесс завершится, или таймаут (в секундах). Значение таймаута установленное в 0, означает ждать столько, сколько потребуется. Возвращаемые значения следующие:
>= 0 Завершение процесса корректно, возвращаемое значение это статус процесса.
< 0 and > -256 Процесс завершен сигналом, и возвращаемое значение сигнал процесса со знаком минус.
-256 Время процесса истекло.
-257 Произошла какая-то другая ошибка в wait(); errno все еще установлен.
“
pid_t child_open_exim(int *fd)
”
Функция обеспечивает вам, с помощью нового сообщения, к Exim. (Конечно вы можете всегда вызвать
“
/usr/sbin/sendmail
” сами, если хотите, в этом пакете все для вас). Функция создает пайп, форки и подпроцесс который запускается
и возвращает (через аргумент int *) файловый дескриптор для пайпа который подключен к стандартному вводу. Конечный результат фукции PID подпроцесса. Затем вы можете написать сообщение файловому дескриптору, с получателями в поле
“
To
”,
“
Cc:
” и/или
“
Bcc:
” строками в заголовке.
Когда вы закончите, вызовите
“
child_close()
” подождите пока процесс завершится и получите его статус окончания. Таймаут со значением ноль обычно неплохо в этих обстоятельствах. До тех пор пока вы не сделаете ошибку в адресе получателя, вы должны получать код возврата 0.
“
pid_t child_open_exim2(int *fd, uschar *sender, uschar *sender_authentication)
”
Эта функция более сложная версия
“
child_open()
”. Команда которая загружает ее:
exim -t -oem -oi -f sender -oMas sender_authentication
|
Третий аргумент может быть NULL, в этом случае опция -oMas опущена.
“
void debug_printf(char *, ...)
”
Это отладочная функция Exim'а, с аргументами как для
“
printf()
”. Вывод производится в поток стандартных ошибок. Если отладка не выбрана вызов
“
debug_printf()
” не будет иметь эффекта. Обычно вы должны делать вызовы по состоянию селекторов local_scan написав это так:
if ((debug_selector & D_local_scan) !=
0
)
debug_printf("xxx", ...);
|
“
uschar *expand_string(uschar *string)
”
Интерфейс для расширения строки Exim'а. Возвращаемое значение - расширяемая строка, или NULL, если расширение не произошло. Переменная C
“
expand_string_message
” содержит сообщение об ошибке, после невозможности расширения. Если расширение не меняет строку, возвращаемое значение является указателем на строку ввода. В другом случае, возвращаемое значение указывает на новый блок памяти, который был получен вызовом
“
store_get()
”. (см. раздел 41.8 ниже, где обсуждается выделение памяти).
“
void header_add(int type, char *format, ...)
”
Эта функция позволяет добавить дополнительную строку заголовка в конец уже существующей. Первый аргумент - тип, который обычно начинается пробелом. Второй аргумент форматированная строка, и любой номер заменяемых аргументов как для
“
sprintf()
”. Вы можете включать внутренний символ новой строки и вы должны убедится, что строка заканчивается символом новой строки.
“
void header_add_at_position(BOOL after, uschar *name, BOOL topnot, int type, char *format, ...)
”
Функция добавляет новую строку заголовка в определенную точку в цепочке заголовков. Сам заголовок определен как для
“
header_add()
”.
Если
“
name
” NULL, новый заголовок добавляется в конец цепочки, при условии что
“
after
” TRUE, или в начало, если
“
after
” FALSE. Если
“
name
” не NULL, строки заголовка ищутся до первого неудаленного заголовка, который совпадает с именем. Если что то найдено, новый заголовок добавляется до него, если значение
“
after
” FALSE. Если
“
after
” TRUE, добавляется новый заголовок после найденного заголовка и любых найденных последующих с таким же именем (даже если они отмечены как
“deleted
”). Если нет совпадений с non-deleted заголовком, то опция
“
topnot
” проверяет где был добавлен заголовок. Если он добавлялся - дополнение на верху, если нет то - внизу. Таким образом, что бы добавить заголовок после всех заголовков с полем
“
Received:
” или в начало, если нет заголовков
“
Received:
”, вы должны использовать:
header_add_at_position(TRUE, US"Received", TRUE,
' ', "X-xxx: ...");
|
Обычно присутствует хотя бы один не удаленный заголовок
“
Received:
”, но его может не оказаться если
“
received_header_text
” расширяется пустой строкой.
“
void header_remove(int occurrence, uschar *name)
”
Функция удаляет строки заголовка. Если
“
occurrence
” равно нулю или отрицательное заголовок удаляется. Если
“
occurrence
” больше нуля, удаляется часть заголовка. Если никаких совпадений не найдено, функция не делает ничего.
“
BOOL header_testname(header_line *hdr, uschar *name, int length, BOOL notdel)
”
Функция проверяет имеет ли данный заголовок данное имя. Это не просто сравнение строк, потому что непоказываемый пробел допускается между именем и двоеточием. Если аргумент
“
notdel
” TRUE, тогда возвращаемое FALSE применяется для всех
“deleted
” заголовков, иначе они не рассматриваются. Например:
if (header_testname(h, US"X-Spam",
6
, TRUE)) ...
|
“
uschar *lss_b64encode(uschar *cleartext, int length)
”
Эта base64 функция строка которая передает адрес и длину. Текст может содержать байты любого значения включая ноль. Результат возвращается в динамическую память которая динамически получается вызовом
“
store_get()
”. Заканчивается нулем.
“
int lss_b64decode(uschar *codetext, uschar **cleartext)
”
Функция декодирования base64 строки. Если аргумент заканчивающаяся нулем base64 строка, и адрес переменной который указывает на результат, находящийся в динамической памяти. Длина декодируемой строки получается после выполнения функции. Если вводимые данные неправильные, то результат -1. Нулевой байт добавляется в конце выводимой строки, для более простого ее определения, как С строки (предполагается что она не содержит собственных нулей). Добавляемый нулевой байт не считается.
“
int lss_match_domain(uschar *domain, uschar *list)
”
Функция проверяет совпадения в доменном списке. Домены всегда выбираются бессистемно. Возвращемое значение одно из следующих:
OK match succeeded
FAIL match failed
DEFER match deferred
|
Deffer обычно вызван каким либо поиском, таким как невозможность связаться с базой данных.
“
int lss_match_local_part(uschar *localpart, uschar *list, BOOL caseless)
”
Функция проверяет совпадения в локальном списке. Третий аргумент контролирует чувствительность к регистру. Возвращаемое значение такое же как и для
“
lss_match_domain()
”.
“
int lss_match_address(uschar *address, uschar *list, BOOL caseless)
”
Эта функция проверяет совпадения для списка адресов. Третий аргумент контролирует чувствительность к регистру. Домены всегда выбираются бессистемно. Возвращаемое значение такое же как и для
“
lss_match_domain()
”.
“
int lss_match_host(uschar *host_name, uschar *host_address, uschar *list)
”
Функция проверяет совпадения в списке хостов. Самое распространенное использование:
lss_match_host(sender_host_name, sender_host_address, ...)
|
Пустое поле адреса, совпадает с пустым записью в списке хостов. Если имя хоста NULL, соответствие названия
“
$sender_host_address
” ищется автоматически, если название хоста должно совпадать с именем в списке. Возвращаемые значения такие же как и в
“
lss_match_domain()
”, но в дополнении
“
lss_match_domain()
”, возвращается ERROR в случае, когда имя искалось и не нашлось.
“
void log_write(unsigned int selector, int which, char *format, ...)
”
Эта функция записывает лог файлы Exim'а. Первым аргументом должен являться (это нужно
“
log_selector
”). Следующий аргумент должен быть LOG_MAIN или LOG_REJECT, или LOG_PANIC или включая
“or
” комбинация аргументов. Это определяет в какой лог или логи будет записано сообщение. Оставшиеся аргументы - это формат и вставка. Строка не должна включать символов новой строки, даже в конце.
“
void receive_add_recipient(uschar *address, int pno)
”
Эта функция добавляет дополнительного получателя к сообщению. Первый аргумент - это адрес получателя. Если адрес не квалифицирован (не имеет домена) он квалифицируется с
“
qualify_recipient
” доменом. Второй аргумент должен быть всегда -1.
Функция не позволяет вам определить частный
“
errors_to
” адрес (как описано в структуре
“
recipient_item
” выше) потому что это предшествует дополнению поля к структуре. Однако, в последствии легко добавить это значение. Например:
receive_add_recipient(US"monitor@mydom.example", -
1
);
recipients_list[recipients_count-
1
].errors_to =
US"postmaster@mydom.example";
|
“
BOOL receive_remove_recipient(uschar *recipient)
”
Эта удобная функция для удаления названного получателя из списка получателей. Если возвращаемое значение TRUE получатель удален и FALSE если совпадающий получатель не найден. Аргумент должен быть полным e-mail адресом.
“
uschar rfc2047_decode(uschar *string, BOOL lencheck, uschar *target, int zeroval, int *lenptr, uschar **error)
”
Эта функция декодирует строку которая закодирована согласно RFC 2047. Обычно это содержимое файлов заголовка. Сперва, каждое
“закодированное слово
” декодируется от Q или B кодировки в байтовую строку. Затем, если представлено имя таблицы кодировки, и если
“
iconv()
” функция доступна, предпринимается попытка перевести результаты к данной кодовой таблице. Если это сделать не удается, бинарная строка возвращает сообщение об ошибке.
Первый аргумент - строка которая должна быть дешифрована. Если
“
lencheck
” TRUE, устанавливается максимальная длина MIME слова. Третий агрумент - перекодированое слово, или NULL если перекодировка не удалась.
Если бинарный ноль попадается в строке, то он заменяется в соответствии с содержимым аргумента
“
zeroval
”. Для использования с заголовками Exim, значение должно быть не ноль, поскольку строки заголовков заканчиваются нулем.
Функция возвращает результат обработки строки, заканчивающийся нулем; если
“
lenptr
” не NULL, то длина обработки устанавливается в переменную на которую она указывает. Когда
“
zeroval
” равен 0,
“
lenptr
” не должен быть NULL.
Если возникла ошибка функция возвращает NULL и использует
“
error
” аргумент для возврата сообщения об ошибке. Переменная указывающая на error устанавливается в NULL если небыло ошибки; она может быть установлена в не NULL даже когда функция возвращает не NULL значение при удачной расшифровке, но есть проблемы с перекодировкой.
“
int smtp_fflush(void)
”
Функция используется совместно с
“
smtp_printf()
”, как описано ниже.
“
void smtp_printf(char *, ...)
”
Аргументы такие же как и у
“
printf()
”; она записывает в выходной поток SMTP. Вы должны использовать эту функцию только когда есть выходной SMTP поток, то есть тогда когда получается через SMTP входящее сообщение, в этом случае
“
smtp_input
” TRUE, а
“
smtp_batched_input
” FALSE. Если вам нужно протестировать сообщение с другого хоста (в противоположность локальному процессу, который использует
“
-bs
” опцию командной строки) вы можете проверить значение
“
sender_host_address
” который не NULL если применяется удаленный хост.
Если SMTP соединение установлено
“
smtp_printf()
” использует функцию вывода TLS, таким образом это может использоваться для всех SMTP соединений.
Строки которые написаны
“
smtp_printf()
”, внутри
“
local_scan()
” должны начинаться с правильного кода ответа: 550 если вы собираетесь возвратить LOCAL_SCAN_REJECT, 451 если вы собираетесь возвратить LOCAL_SCAN_TEMPREJECT и 250 в остальных случаях. Поскольку вы пишите начальные строки многострочного сообщения, код может сопровождаться дефисом, что бы показать что это не последняя строчка в коде отклика. Вы должны так же убедиться что строки, которые вы пишите заканчиваются CRLF. Например:
smtp_printf("
550
-this is some extra info\r\n");
return LOCAL_SCAN_REJECT;
|
Учтите, что вы можете создать многострочный отклик включая символы новой строки в данные возвращаемые через аргумент
“
return_text
”.
Добавляемое значение использует
“
smtp_printf()
” для того, что бы вы могли ввести задержки между многократным выводом.
Функция
“
smtp_printf()
” не использует никакого возвращаемого сообщения об ошибке, потому что она не стирает автоматически идущий вывод и поэтому не проверяет состояние потока. (в главном коде Exim стирание и проверка ошибок отрабатываются когда Exim готов для следующего SMTP соединения). Если вы хотите удалить вывод и проверить ошибки (например, сбрасывая TCP/IP соединение) вы все еще сможете вызвать
“
smtp_fflush()
”, у которой нет аргументов. Она стирает вывод и возвращает ненулевое значение, при возникновении ошибки.
“
void *store_get(int)
”
Эта функция получает доступ к управлению внутренней памятью Exim. Она получает новый чанк памяти чей размер задан аргументом. Exim завершается, если память исчерпана. Смотрите следующий раздел, где обсуждается выделение памяти.
“
void *store_get_perm(int)
”
Функция наподобии
“
store_get()
”, но всегда получает память из постоянного пула. Смотрите следующий раздел, где обсуждается выделение памяти.
“
uschar *string_copy(uschar *string)
”
смотрите ниже
“
uschar *string_copyn(uschar *string, int length)
”
смотрите ниже
“
uschar *string_sprintf(char *format, ...)
”
Эти три функции создают строки используемые динамической памятью Exim'а. Первая делает копию всей строки. Вторая копирует максимальное число символов, обозначаенных во втором документе. Третья использует формат и вставку новой строки. В каждом случае результатом является указатель на новую строку в данном пуле памяти. Смотрите следующий раздел, где обсуждается выделение памяти.
41.8 Больше об обработке памяти Exim'ом
Нет никакой функции для освобождения памяти, поскольку она не нужна. Динамическая память, которую использует Exim автоматически передается другому сообщению полученному этим же процессом (распространяется только на SMTP подключения - другие методы могут только доставить одно сообщение за раз). После получения последнего сообщения, процесс получения завершается.
Поскольку память передается, нормальная динамическая память не может быть использована для хранения данных, которые должны быть сохранены более чем число входящих сообщений на том же SMTP соединении. Однако, Exim на самом деле использует два пула динамической памяти, второй не передается и может использоваться для этих целей.
Если вы хотите выделить память, которая останется доступной для последующих сообщений в том же SMTP соединении, вы должны установить
прежде, чем вызовите функцию выделения памяти. Не нужно восстанавливать значение без необходимости; однако если вы хотите вернуться к нормальному пулу, вы можете восстановить прежнее значение
“
store_pool
” или установить явным образом POOL_MAIN.
Установка пула, обращается ко всем функциям, которые получают динамическую память, включая
“
expand_string()
”,
“
store_get()
”, и
“
string_xxx()
” функции. Есть так же, удобная функция называемая
“
store_get_perm()
” которая получает блоки памяти из постоянного пула, сохраняя значения
“
store_pool
”.
translated by Andy
verifying by lissyara
42. Системная фильтрация сообщений
Предыдущие части (ACL и функция локального сканирования) описывают проверки, которые могут быть применены к сообщениям до того, как они принимаются хостом. Также есть механизм для проверки сообщений после их получения, но до доставки. Он называется -
“
system filter
”.
Системный фильтр работает подобно файлу пользовательского фильтра, но он запускается лишь один раз на сообщение (однако, у сообщения много получателей). Обычно, он не должен использоваться вместо роутинга, поскольку команда
“
deliver
” в системном роутере даёт новые адреса получателей конверта. Системный фильтр должен быть фильтром exim`a. Он не может быть фильром Sieve.
Системный фильтр запускается в начале попытки доставки, до какой-либо маршрутизации. Если сообщение невозможно доставить при первой попытке, системный фильтр запускается снова в начале каждого повтора.Если вы хотите чтобы фильтр работал лишь при первой доставке, вы можете использовать в фильтре условие
“
first_delivery
” в команде
“
if
”, для предотвращения обработки при повторах.
Внимание: Поскольку системный фильтр запускается лишь один раз, переменные являющиеся специфическими для индивидуальных адресов получателей, типа
“
$local_part
” и
“
$domain
”, не установлены, и условие
“personal
” - незначащее. Если вы хотите запускать заданный центрально фильтр незавсисмо для каждого адреса получателя, вы можете это сделать путём установки подходящего роутера
“
redirect
”, как описано ниже, в разделе 42.8.
42.1 Установка системного фильтра
Имя файла, который содержит системный фильтр, должно быть задано путём установки
“
system_filter
”. Если вы хотите запускать фильтр не под uid и gid root`a, вы, также, должны установить
“
system_filter_user
” и
“
system_filter_group
”, соответственно. Например:
system_filter = /etc/mail/exim.filter
system_filter_user = exim
|
Если системный фильтр генерирует любую доставку в файлы или трубы (через команды
“
save
” или
“
pipe
”), транспорты для обработки этих доставок должны быть определены путём установки
“
system_filter_file_transport
” и
“
system_filter_pipe_transport
”, соответственно. Точно также,
“
system_filter_reply_transport
” должна быть установлена для обработки любых сообщений генерируемых путём команды
“
reply
”.
42.2 Тестирование системного фильтра
Вы можете запускать простые тесты системного фильтра точно также, как для пользовательского фильтра, но вы холжны использовать
“
-bF
” вместо
“
-bf
”, так, чтобы были распознаны особенности, разрешённые лишь в системных фильтрах.
Если вы хотите тестировать комбинированный эффект системного и пользовательского фильтров, вы можете использовать обе опции -
“
-bF
” и
“
-bf
”, в одной комндной строке.
42.3 Содержимое системного фильтра
Язык, используемый для определения системных фильтров - точно такой же как и для файлов пользовательских фильтров. Он описан в отдельном документе для пользователя -
“
Exim's interface to mail filtering
”. Однако, есть некоторые дополнительные особенности, которые доступны лишь в системных фильтрах; они описаны в последующих секциях. Если с ними сталкиваются в файлах пользовательских фильтров, или при тестировании с
“
-bf
”, они вызывают ошибки.
Есть два специальных условия, которые доступны в файлах фильтров пользователей, но проектировались для использования в системных фильтрах. Условие
“
first_delivery
” - истинно лишь для первой попытки доставки сообщения, и
“
manually_thawed
” - истинно лишь если сообщение было заморожено, и в последствии было разморожено административным пользователем. Явная принудительная доставка считается ручным размораживанием, но разморозка в результате установки
“
auto_thaw
” таковой не считается.
Внимание: Если системный фильтр использует условие
“
first_delivery
” для создания
“unseen
” (невидимой) доставки, и эта доставка неуспешна, ещё одна попытка доставки не производится. Если вы хотите чтобы exim повторял невидимые доставки до их успеха, вы должны установить её при каждом запуске фильтра.
Когда системный фильтр завершает работу, значения переемнных
“
$n0
” -
“
$n9
” копируются в
“
$sn0
” -
“
$sn9
”, и, таким образом, становятся доступны в файлах пользовательских фильтров. Таким образом, системный фильтр может, например, устанавливать
“баллы
” для передачи пользовательским фильтрам.
42.4 Дополнительные переменные для системных фильтров
Переменная раскрытия
“
$recipients
”, содержащая список всех получателей сообщения (разделённых запятыми и пробелами), - доступна в системных фильтрах. Из соображений безопасности, она не доступна в пользовательских фильтрах.
42.5
“Defer
”,
“freeze
”, и
“fail
” команды системного фильтра
Существуют три дополнительные команды (
“
defer
”,
“
freeze
” и
“
fail
”), которые всегда доступны в системных фильтрах, но, обычно, недопустимы в пользовательских фильтрах. (Смотрите опции
“
allow_defer
”,
“
allow_freeze
” и
“
allow_fail
” роутера
“
redirect
”.) Эти команды, опционально, могут сопровождаться словом
“
text
” и строкой содержащей сообщение о ошибке, например:
fail text "this message looks like spam to me"
|
Ключевое слово
“
text
” - опционально, если следующий символ - двойная кавычка.
Команда
“
defer
” задерживает доставку оригинальных получателей сообщения. Команда
“
fail
” вызывает неудачу оригинальных получателей, и создание рикошета. Команда
“
freeze
” останавливает все попытки доставки для оригинальных получателей. Во всех случаях, любые новые доставки определённые фильтром предпринимаются обычным образом после работы фильтра.
Команда
“
freeze
” игнорируется, если сообщение было разморожено вручную, и с тех пор не было вручную заморожено.Это означает, что автоматическое замораживание путём системного фильтра может использоваться как способ проверки позозрительных сообщений.Если выясняется, что сообщение нормальное, ручная разморозка позволяет его доставку.
Текст, данный с командой
“
fail
”, используется как часть сообщения рикошета, а также записывается в лог. Если сообщение очень длинное, они могут занимать много места в логах, если отказы происходят постоянно. Для уменьшения размера сообщений в логах, exim специальным образом интерпретирует текст, если он начинается с
“<<
”, и, позднее, содержит
“>>
”. Текст между этими двумя строками пишется в лог, и оставшаяся часть текста используется в сообщении рикошета. Например:
fail "<<filter test
1
>>Your message is rejected \
because it contains attachments that we are \
not prepared to receive."
|
Используйте команду
“
fail
” с большой осторожностью, когда решение о неудаче основано на содержимом сообщения, поскольку сообщение рикошета будет включать содержимое оригинального сообщения, и может снова вызвать команду
“
fail
” (вызывая зацикливание почты), если не были приняты специальные меры для предотвращения этого. Тестирование условия
“
error_message
” - один из путёй это предотвратить. Например, вы можете использовать
if $message_body contains "this is spam" and not error_message
then fail text "spam is not wanted here" endif
|
хотя, разумеется, могут проходить нежелетельные рикошеты. Альтернатива - умная проверка тела и/или заголовков для детектирования рикошетов сгенерённых фильтром.
Интерпретация систмного фильтра прекращается немедленно после выполнения команды
“
defer
”,
“
freeze
” или
“
fail
”. Однако, любые доставки, установленные ранее в фильтре - соблюдаются, таким образом, вы можете использовать последовательность типа
для отправки заданного сообщения пи заморозке системным фильтром (или задержке, или ошибке) сообщения. Нормальные доставки для сообщения, разумеется, не происходят.
42.6 Добавление и удаление заголовков в системном фильтре
Две команды фильтра, которые доступны лишь в системных фильтрах, таковы:
headers add <string>
headers remove <string>
|
Аргумент для
“
headers add
” - строка, которая раскрывается, и, затем, добавляется к концу заголовков сообщения. Ответственностью разработчика фильтра является проследить за соответствием синтаксису RFC 2822. Начальные пробелы игнорируются, и если строка пуста, или раскрытие принудительно неудачно, команда не имеет эффекта.
Вы можете использовать
“\n
” внутри строки, сопровождаемый пробелом, для задания продолженных строк заголовков. Более чем один заголовок может быть добавлен в одной команде, путём включения
“\n
” в строке без пробелов. Например:
headers add "X-header-
1
: ....\n \
continuation of X-header-
1
...\n\
X-header-
2
: ...."
|
Отметтьте, что строки заголовков продолжающие пробелы после первого символа новой строки должны быть помещены до обратного слэша, который продолжает строку ввода, поскольку пробелы после появления продолжения игнорируются.
Аргумент для
“
headers remove
” - список имён заголовков, разделённых двоеточиями. Эта команда применяется лишь к тем заголовкам, которые сохраняются с сообщением; те, что добавляются в процессе доставки (типа
“
Envelope-To:
” и
“
Return-Path:
”) не могут быть удалены этим средством. Если есть более одного заголовка с одинаковым именем, они все удаляются.
Команда
“
headers
” в системном фильтре, делает немедленные изменения строк заголовков, полученных с сообщением (с возможными дополнениями от обработки ACL). Последующие команды системного фильтра оперируют модифицированным набором заголовков, который, также, является основой для последующей доставки. Кроме последующей модификации в процессе роутинга или транспортировки, этот набор заголовков используется для всех получателей сообщения.
В процессе роутинга и транспортировки, переменные, которые ссылаются на содержимое строк заголовков, ссылаются лишь на те строки, которые находятся в этом наборе заголовоков. Таким образом, строки заголовков, добавленные системным фильтром, видны в файлах пользовательских фильтров, и во всех роутерах и транспортах. Это - противоположно манипуляциям заголовками в роутерах и транспортах, которые не немедленные, а вместо этого, сохраняются вплоть до фактической записи сообщения (смотрите раздел 43.17).
Если сообщение не доставляется в первую попытку, строки заголовоков, добавленные системным фильтром, сохраняются с сообщением, и, таким образом, остаются предстваленными в следующую попытку доставки. Удаленные строки заголовков остаются присутствовать, но помечены
“deleted
”, таким образом, они не транспортируются с соообщением Для этого случая, обычно, команду
“
headers
” делают зависимой от команды
“
first_delivery
” так, чтобы строки заголовков не модифицировались более одного раза.
Поскольку подификация заголовков в системном фильтре происходит немедленно, вы должны использовать косвенный подход, если хотите изменить содержимое строки заголовка. Например:
headers add "Old-Subject: $h_subject:"
headers remove "Subject"
headers add "Subject: new subject (was: $h_old-subject:)"
headers remove "Old-Subject"
|
42.7 Установка адреса ошибок в системном фильтре
В системном фильтре, если команда
“
deliver
” сопровождается
для изменения адреса отправителя конверта (и, следовательно, сообщеня о ошибках) для этой доставки, может быть задан любой адрес. (В пользовательском фильтре, может быть установлен лишь текущий адрес пользователя.) Например, если какая-то почта проверяется, вы могли бы использовать
unseen deliver monitor@spying.example errors_to root@local.example
|
для получения копии, которая не была бы послана обратно на обычный адрес ошибки, если доставка неудачна.
42.8 Фильтрация по адресам
В отличие от системного фильтра, который запускается лишь один раз на сообщение для каждой попытки доставки, также возможно установить опрецию фильтрации для всей системы, которая запускается один раз для каждого получателя адреса. В этом случае, могут использоваться переменные типа
“
$local_part
” и
“
$domain
”, и действительно, ыфбор файла фильтра может быть сделан зависимым от них. Это - пример роутера, который осуществляет такой фильтр:
central_filter:
check_local_user
driver = redirect
domains = +local_domains
file = /central/filters/$local_part
no_verify
allow_filter
allow_freeze
|
Фильтр запускается в отдельном процессе под собственным uid. Поэтому, любая опция
“
check_local_user
” должна быть установлена (как выше), в случае когда фильтр выполняется от локального пользователя, или опция
“
user
” должна определять, какой пользователь будет использоваться. Если заданы обе,
“
user
” перезадаётся.
Необходимо позаботится чтобы ни одна из команд в файле фильтра не определяет важную доставку, если сообщение доставляется его непосредственному получателю. Тогда роутер не будет требовать адрес, таким образом, оно будет передано последующим роутерам для доставки обычным способом.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
43. Обработка сообщения
Exim выполняет различные преобразования адресов отправителей и получателей всех обрабатываемых сообщений, и, также, строк заголовков. Некоторые из них - опциональны и могут конфигурироваться, тогда как другие присутствуют всегда. Вся эта обработка, исключая перезапиь как результат роутинга, и добавления/удаления строк заголовков при доставке, происходит при приёме сообщения, до его помещения в очередь exim`a.
Часть автоматической обработки, по умолчанию, происходит лишь для
“сгенерированных локально
” (
“locally-originated
”) сообщений. Это прилагательное используется для описания сообщений которые не были переданы через TCP/IP, а переданы процессу exim`a на его стандартный ввод. Оно включает случай интерактивного
“локального SMTP
”, который устанавливается опцией
“
-bs
”, командной строки.
Отметтьте: Сообщения переданные через TCP/IP на интерфейсе обратной петли (127.0.0.1 или ::1), не рассматриваются как сгенерированные локально. Exim никогда не обрабатывает особым образом интерфейс локальной петли.
Если вы хотите обработать интерфейс локальной петли особым образом, вы должны гарантировать, что существуют соответствующие записи в ваших ACL.
43.1 Режим передачи для нелокальных сообщений
Происходящую автоматически обработку для локально сгенерированных сообщений (если не установлена опция
“
suppress_local_fixups
”), также можно затребовать для сообщений полученных по TCP/IP. Термин
“режим передачи
” (
“submission mode
”) используется для описания этого состояния. Режим передачи устанавливается при помощи модификатора
в MAIL, RCPT, или ACL до данных, для входящего собщения (смотрите разделы 39.17 и 39.18). Он заставляет exim обработать сообщение как переданное локально, и, обычно, используется для когда источник сообщения известен как MUA, работающий на клиентском хосте (в противовположность MTA). Например, для установки режима передачи для сообщений приходящих на IPv4 интерфейсе обратной петли, вы могли включить следующее в MAIL ACL:
warn hosts =
127
.
0
.
0
.
1
control = submission
|
Есть некоторые опции, которые могут использоваться когда установлен режим передачи. Слэш используется для разделения опций. Например:
control = submission/sender_retain
|
Домен может быть пустым. Как это значение используется - описано в разделах 43.11 и 43.16. Также, есть опция
“
name
”, которая позволяет вам задать полное имя пользователя для включения в создаваемые заголовки
“
Sender:
” и
“
From:
”. Например:
accept authenticated = *
control = submission/domain=wonderland.example/\
name=${lookup {$authenticated_id} \
lsearch {/etc/exim/namelist}}
|
Поскольку имя может содержать любые символы, включая слэши, опция
“
name
” должна быть дана последней. Оставшаяся строка используется как имя. Для примера выше, если
“
/etc/exim/namelist
” содержит:
тогда, когда отправитель аутентифицирован как
“
bigegg
”, сгенерированная строка
“
Sender:
” была бы:
Sender: Humpty Dumpty <bigegg@wonderland.example>
|
По умолчанию, режим передачи принудительно ставит путь возврата в тот же адрес, что используется для создания заголовка
“
Sender:
”. Однако, если задана
“
sender_retain
”, путь возврата также остаётся неизменным.
Отметтьте: изменения вызванные режимом передачи вступают в силу после ACL перед данными. Это означает, что любые проверки отправителя выполненные перед адресными привязками используют ненадёжный адрес отправителя заданный пользователем, а не надёжным адресом отправителя заданным режимом передачи. Хотя это несколько неожиданно, в действительности это означает, что вы можете сконфигурировать проверки ACL на определение что пользователь пробует сфабриковать иной адрес.
43.2 Завершения строк
RFC2821 задаёт, что CRLF (два символа: возврат каретки, сопровождаемый переводом строки) - конец сообщений пеердаваемых через интернет, используя SMTP через TCP/IP. Однако, в отдельных операционных системах, используются иные соглашения. Например, UNIX-подобные системы используют лишь LF, но иные используют CRLF или просто CR.
Exim был разработан для UNIX-подобных систем, и внутренне, он сохраняет сообщения используя системное соглашение единственного LF как терминатора строки. Получая сообщение, все концы строк переводятся в этот стандартный формат. Изначально, предполагалось, что программы передающие сообщения напрямую к MTA, внутри операционной системы, будут использовать системные соглашения. Опыт показал, что это не так; например, существуют UNIX-приложения, которые в этом случае используют CRLF. Поэтому, и для совместимости с другими MTA, способы, которыми exim обрабатывает концы строк для всех сообщений, на данный момент, - таковы:
LF, которму не предшествовал CR - обрабатывается как завершение строки.
CR - обрабатывается как конец строки; если сразу за ним идёт LF, LF игнорируется.
Последовательность
“CR, точка, CR
” не завершает входящее SMTP-сообщение, ни локальное сообщение, в случае когда строка содержащая лишь точку - терминатор.
Если в стрке заголовка найден лишь CR, после завершения строки добавляется дополнительное пустое пространство, чтобы не завершить строку заголовка. Рассуждения таковы, что пустые CR в заголовках, наиболее вероятно, ошибки, или люди пробующие игоать в глупые игры.
Если первая строка заголовка в сообщении завершается CRLF, последуюшие пустые LF в строке заголовка обрабатывается точно также как и пустой CR в строке заголовка.
43.3 Неквалифицированные адреса
По умолчанию, exim ожидает, что каждый, получаемый с внешнего хоста, адрес конверта, будет полностью квалифицирован (с доменным именем). Неквалифицированные адреса вызывают отрицательные ответы на команды SMTP. Однако, поскольку SMTP используется для как средство транспортировки сообщений от MUA работающих на персональных рабочих станциях, иногда требуется принимать неквалифицированные адреса от специфических хостов или IP-сетей.
У exim`a есть две опции, которые раздельно управляют тем, какие хосты могут посылать неквалифицированные адреса отправителей или получателей в SMTP-командах, именуемые
“
sender_unqualified_hosts
” и
“
recipient_unqualified_hosts
”. В обоих случаях, если принимаются неквалифицированные адреса, они квалифицируются путём добавления значения
“
qualify_domain
” или
“
qualify_recipient
”, соответственно.
Неквалифицированные адреса в строках заголовков, автоматически квалифицируются для сгенерённых локально сообщений, если в командной строке не дана опция
“
-bnq
”. Для сообщений принятых по SMTP, неквалифицированные адреса, в заголовках, квалифицируются лишь если в SMTP-командах разрешены неквалифицированные адреса. Другими словами, этой квалификацией также управляют путём
“
sender_unqualified_hosts
” и
“
recipient_unqualified_hosts
”.
43.4 Строка
“From
” UUCP
Сообщения приходящие из UUCP (и некоторых других приложений), часто, начинаются со строки содержащей отправителя конверта и штамп времени, после слова
“From
”. Примеры двух обычных форматов:
From a.oakley@berlin.mus Fri Jan
5
12
:
35
GMT
1996
From f.butler@berlin.mus Fri,
7
Jan
97
14
:
00
:
00
GMT
|
Эта строка предшествует строкам заголовков, соответствующим RFC2822. Для совместимости с sendmail, exim распознаёт такие строки как начало сообщения переданного через командную строку (т.е. на стандартном вводе). Он не распознаёт такие строки во входящих сообщениях, если посылающий хост не совпадает с
“
ignore_fromline_hosts
”, или не использовалась опция
“
-bs
” длч локального сообщения, при установленной
“
ignore_fromline_hosts
”. Распознание управляется регулярным выражением, которое задано опцией
“
uucp_from_pattern
”, чьё дефолтовое значение совпадает с двумя частыми случаями, показанными выше, и помещает адреса следующие за
“From
” в
“
$1
”.
Когда пользователь, вызывающий exim для не-SMTP сообщения содержащего строку
“From
” - доверенный пользователь, адрес отправителя сообщения конструируется путём раскрытия содержимого
“
uucp_sender_address
”, чьё дефолтовое значение -
“
$1
”. Затем оно разбирается как адрес по RFC2822. Если в нём нет домена, локальная часть квалифицируется с
“
qualify_domain
”, если оно - не пустая строка. Однако, если используется опция командной строки
“
-f
”, она перезадаёт строку
“From
”.
Если exim вызывает не доверенный пользователь, строка
“From
” распознаётся, но адрес отправителя не изменяется. Для входящих SMTP сообщений с разрешённой строкой
“From
”, применяется этот же случай.
Распознаётся лишь одна строка
“From
”. Если их больше одной, вторая обрабатывается как строка данных, которая начинает тело сообщения, поскольку она - не допустимая строка заголовка. Также это происходит если строка
“From
” представлена во входящем SMTP-сообщении от источника, которму его не разрешено посылать.
43.5 Строки заголовков
“Resent-
”
RFC2822 создаёт условия для добавления в сообщение строк заголовков начинающихся со строки
“Resent-
”, когда оно пересылается оригинальным получателем ещё кому-то. Эти заголовки -
“
Resent-Date:
”,
“
Resent-From:
”,
“
Resent-Sender:
”,
“
Resent-To:
”,
“
Resent-Cc:
”,
“
Resent-Bcc:
” и
“
Resent-Message-ID:
”. В RFC говорится:
Повторно посланные поля являются строго информационными. Они НЕ ДОЛЖНЫ использоваться в нормальной обработке ответов, или других подобных автоматических действиях для сообщений.
Этим оставляются несколько неопределённым, насколько затронуты другие действия обработки, типа перезаписи адресов. Exim обрабатывает строки заголовков
“
Resent-
” следующим образом:
Строка
“
Resent-From:
” - содержит лишь логин передающего пользователя, и автоматически перезаписывается точно таким же способом как
“
From:
” (смотрите ниже).
Если есть правило перезаписи для специфической строки заголовка, оно, также применяется к заголовку
“
Resent-
”, того же типа. Например, правило перезаписывающее
“
From:
” также перезапишет
“
Resent-From:
”.
Для локальных сообщений, если из ввода удалён
“
Sender:
”, также удаляется и
“
Resent-Sender:
”.
Для локально переданных сообщений, если есть какая либо строка заголовка
“
Resent-
”, но нет
“
Resent-Date:
”,
“
Resent-From:
” или
“
Resent-Message-Id:
”, они добавляются по мере необходимости. Это - содержимое
“
Resent-Message-Id:
” (а не
“
Message-Id:
”), которое включается в строки логов в этом случае.
Логика для добавления
“
Sender:
” - дублируется для
“
Resent-Sender:
”, когда присутствует любой заголовок
“
Resent-
”.
43.6 Строка заголовка
“Auto-Submitted:
”
Каждый раз, когда exim генерирует автоответ, рикошет, или предупреждающее сообщение о задержке, он включает строку заголовка:
Auto-Submitted: auto-replied
|
43.7 Строка заголовка
“Bcc:
”
Если exim вызывается с опцией
“
-t
”, чтобы получить адреса получателей из заголовков сообщений, он удаляет любые строки заголовков
“
Bcc:
” которые могут существовать (после извлечения их сдресов). Если
“
-t
” не представлена в командной строке, любые существующие
“
Bcc:
” не удаляются.
43.8 Строка заголовка
“Date:
”
Если сгенерённое локально сообщение, или сообщение в режиме передачи, не имеет заголовка
“
Date:
”, exim добавляет один, используя текущую дату и время, если не была определена опция
“
suppress_local_fixups
”.
43.9 Строка заголовка
“Delivery-date:
”
Заголовок
“
Delivery-date:
” - не часть стандартного набора заголовков RFC2822. Exim может быть сконфигурирован для её добавления при финальной доставке сообщений. (Смотрите общую транспортную опцию
“
delivery_date_add
”.) Он не должен присутствовать во время пути сообщения. Если установлена конфигурационная опция
“
delivery_date_add
” (по умолчанию), exim удаляет заголовки
“
Delivery-date:
” из входящих сообщений.
43.10 Строка заголовка
“Envelope-to:
”
Заголовок
“
Envelope-to:
” - не часть стандартного набора заголовков RFC2822. Exim может быть сконфигурирован для её добавления при финальной доставке сообщений. (Смотрите общую транспортную опцию
“
envelope_to_add
”.) Он не должен присутствовать во время пути сообщения. Если установлена конфигурационная опция
“
envelope_to_add
” (по умолчанию), exim удаляет заголовки
“
Envelope-to:
” из входящих сообщений.
43.11 Строка заголовка
“From:
”
Если сообщение в режиме передачи не содержит строки заголовка
“
From:
”, exim добавляет её если истинно любое из следующих условий:
Адрес отправителя конверта не пуст (т.е. это - не рикошет). Добавляемая строка заголовка копирует адрес отправителя конверта.
Сессия SMTP аутентифицирована, и
“
$authenticated_id
” - не пуст.
1. Если нет домена, заданного управлением передачей, локальная часть -
“
$authenticated_id
”, и домен -
“
$qualify_domain
”.
2. Если непустой домен задан путём управления передачей, локальная часть -
“
$authenticated_id
”, и домен - заданный домен.
3. Если управлением передачей задан пустой домен, предполагается, что в
“
$authenticated_id
” - полный адрес.
Непустой отправитель конверта обладает приоритетом.
Если входящее, локально сгенерённое сообщение не содержит строки заголовка
“
From:
”, и настройка
“
suppress_local_fixups
” не задана, exim добавляет заголовок содержащий адрес отправителя. Логин вызывающего пользователя и его полное имя используются для конструирования адреса, как описано в секции 43.8. Оно получаются из данных пароля, путём вызова
“
getpwuid()
” (но, смотрите конфигурацию
“
unknown_login
”). Адрес квалифицируется с
“
qualify_domain
”.
Для совместимости с sendmail, если приходящее не-SMTP сообщение содержит строку заголовка
“
From:
”, содержащую лишь неквалифицированное имя вызывающего пользователя, она заменяется адресом, содержащим пользовательский логин и полное имя, как описано в секции 43.18.
43.12 Строка заголовка
“Message-ID:
”
Если сгенерённое локально сообщение, или сообщение в режиме передачи, не имеет заголовка
“
Message-ID:
”, или
“
Resent-Message-ID:
”, и не установлена опция
“
suppress_local_fixups
”, exim добавляет подходящий заголовок в сообщение. Если в сообщении есть любой заголовок
“
Resent-:
”, он создаёт
“
Resent-Message-ID:
”. Идентификатор конструируется из внутренного идентификатора сообщения exima, с предшествующей буквой
“E
”, для гарантии, что он всегда начинается с буквы, и с и сопровождается "@" и первичным именем хоста. Дополнительная информация может быть включена в эту строку заголовка, путём установки опций
“
message_id_header_text
” и/или
“
message_id_header_domain
”.
43.13 Строка заголовка
“Received:
”
Строка заголовка
“
Received:
” добавляется в начале каждого сообщения. Содержимое определяется путём конфигурационной опции
“
received_header_text
”, и exim автоматически добавляет точку с запятой и штамп времени в сконфигурированную строку.
Заголовок
“
Received:
” генерится как только приходит строка заголовка сообщения. На этом этапе, метка времени в заголовке
“
Received:
” - время начала приёма сообщения. Это значение - то, которое замечено ACL DATA и функцией
“
local_scan()
”.
Как только сообщение принято, временная метка в заголовке
“
Received:
” изменяется на время приёма, которое является (кроме маленькой задержки на запись
“-H
” файла в спуле) наименьшим временем, когда могла начаться доставка.
43.14 Строка заголовка
“References:
”
Сообщения созданные транспортом
“
autoreply
” включают заголовок
“
References:
”. Он создаётся согласно правилам, которые описаны в секции 3.64 из RFC2822 (которая заявляет, что ответы должны содержать такую строку заголовка), и секции 3.14 из RFC3834 (которая заявляет, что автоматические ответы не различаются в этом отношении). Однако, поскольку некоторый софт обрабатывающий почту, не очень хорошо справляется с очень длинными строками заголовков, не более чем 12 идентификаторов сообщений копируются из строки заголовка
“
References:
”, входящего сообщения. Если их больше 12-ти, копируются первый, и последующие 11, до добавления идентификатора сообщения для входящего сообщения.
43.15 Строка заголовка
“Return-path:
”
Заголовок
“
Return-path:
” задан как нечто, что MTA может вставить, когда производит финальную доставку сообщения. (Смотрите общую транспортную опцию
“
return_path_add
”.) Поэтому, они не должны быть в сообщениях, которые находятся в пути. Если установлена конфигурационная опция
“
return_path_remove
” (по дефолту - установлена), exim удаляет заголовки
“
Return-path:
” из входящих сообщений.
43.16 Строка заголовка
“Sender:
”
Для локально сгенерённых сообщений от недоверенных пользователей, exim может удалять существующий заголовок
“
Sender:
”, и может добавлять новый. Вы можете модифицироать эти действия, путём установки опции
“
local_sender_retain
” в истину,
“
local_from_check
” - в ложь, или используя установку
“
suppress_local_fixups
”.
Когда локальное сообщение принимается от недоверенного пользователя, и
“
local_from_check
” - истинна (по умолчанию), и не установлена
“
suppress_local_fixups
”, производиться проверка, что адрес данный в заголовке
“
From:
” - корректный (локальный) отправитель сообщения. Ожидаемый адрес, имеет логин пользователя как локальную часть, и значение
“
qualify_domain
” - как доменную. Преффиксы и суффиксы для локальных частей могут быть разрешены путём установки
“
local_from_prefix
” и
“
local_from_suffix
”, соответственно. Если
“
From:
” не содержит корректного отправителя, к сообщению добавляется строка
“
Sender:
”.
Если вы установите
“
local_from_check
” в ложь, этой проверки не произойдёт. Однако, всё ещё происходит удаление существующей строки
“
Sender:
”, если вы не установили в истину
“
local_sender_retain
”. Невозможно одноыременно установить в истину эти две опции.
По умолчанию, для сообщений полученных по TCP/IP не производиться обработки заголовка
“
Sender:
”, или для сообщений посланных доверенными пользоватеями. Однако, когда сообщение посылается через TCP/IP в режиме передачи, и для управления передачей не задана
“
sender_retain
”, происходит следующая обработка:
Вначале, удаляются любые существующие строки
“
Sender:
”. Затем, если сессия SMTP аутентифицирована, и
“
$authenticated_id
” непуста, адрес отправителя создаётся следующим образом:
Если управлением передачей не задан домен, локальная часть -
“
$authenticated_id
”, и домен -
“
$qualify_domain
”.
Если настройками режима передачи задан непустой домен, локальная часть -
“
$authenticated_id
”, и домен - заданный домен
Если настройками режима передачи задан пустой домен,
“
$authenticated_id
” считается полным адресом.
Этот адрес сравнивается с адресом в заголовке
“
From:
”. Если они различны, добавляется строка
“
Sender:
”, содержащая созданный адрес. Префиксы и суффиксы для локальной части в
“
From:
” могут быть разрешены путём установки
“
local_from_prefix
” и
“
local_from_suffix
”, соответственно.
Отметтьте: Каждый раз, когда создаётся заголовок
“
Sender:
”, путь возврата сообщения (адрес отправителя конверта) изменяется на тот же самый адрес, исключая случай в режиме передачи, когда задана опция
“
sender_retain
”.
43.17 Добавление и удаление заголовков в роутерах и транспортах
Когда сообщение доставляется, дополнение и удаление строк заголовков может быть задано в системном фильтре, или любом роутере и транспорте, который обрабатывает сообщение. Раздел 42.6 содержит детали о модификации заголовков в системном фильтре. Строки заголовков, также могут быть добавлены в ACL, при получении сообщения (смотрите раздел 39.19).
В отличие от того, что происходит в системном фильтре, модификация заголовков заданная в роутерах и транспортах применяется лишь к специфическим адресам получателей, которые обрабатываются этими роутерами и транспортами. Эти изменения не актуальны, пока копия сообщения не транспортируется. Поэтому, они не применяются к базовым наборам заголовков, и они не применяются к значениям переменных, которые ссылаются на строки заголовков.
Отметтьте: В частности, это означает, что любые раскрытия в конфигурации транспорта не могут ссылаться на модифицированные строки заголовков, поскольку эти раскрытия происходят до реальной транспортировки сообщения.
Для обоих, роутеров и транспортов, результат раскрытия опции
“
headers_add
” должен быть одной или более строкой заголовков, в соответствии с RFC2822, разделённых новой строкой (код -
“\n
”). Например:
headers_add = X-added-header: added by $primary_hostname\n\
X-added-second: another added header line
|
Exim не проверяет синтаксис этих добавляемых заголовков.
Результат раскрытия
“
headers_remove
” должен состоять из списка имён заголовков разделённых двоеточиями. Это может запутывать, поскольку имена заголовков сами по себе завершаются двоеточием. В этом случае, двоеточие - разделитель списка, а не часть имени. Например:
headers_remove = return-receipt-to:acknowledge-to
|
Когда
“
headers_add
” и
“
headers_remove
” заданы в роутере, их значения раскрываются во время роутинга, и, затем, ассоциируются с каждым адресом, который принимается роутером, и, также, с любым новым адресом который им генерируется. Если адрес передаётся через несколько роутеров, как результат альясинга или форвардинга, изменения - кумулятивные.
Однако, это не применяется к нескольким роутерам, как результату использования опции
“
unseen
”. Любые модификации заголовков, заданные путём роутера
“unseen
” или его предшественников, применяются лишь к доставке
“unseen
”.
Адреса, которые заканчиваются различными установками
“
headers_add
” или
“
headers_remove
”, не могут быть доставлены вместе в пакете, таким образом, транспорт всегда имеет дело с рядом адресов, которые имеют теже самые требования к обработке заголовков.
Транспортировка начинается с записи оригинального набора заголовков прибывшего с сообщением, возможно, модифицированного системным фильтром. При выписке этих строк, exim консультируется со списком имён заголовков которые добавлены адресам получателей путём опции
“
headers_remove
” в роутере, и, также консультируется с транспортной опцией
“
headers_remove
”. Строки заголовков, чьи имена находятся в одном из этих списков - не выписываются. Если есть несколько любых перечисленных заголовков, все они пропускаются.
После записи оставшихся строк оригинальных заголовков, записываются новые строки заголовков, которые заданы опцией роутеров
“
headers_add
”, в порядке как они были добавлены к адресам. Они сопровождаются любыми строками заголовков заданными транспортной опцией
“
headers_add
”.
Этот способ обработки подфикации заголовоков в роутерах и транспортах имеет следующие последствия:
Оригинальный набор заголовков, возможно, модифицированных системным фильтром, остаётся
“видимым
”, в том смысле, что переменные
“
$header_xxx
” продолжают на них ссылаться всё время.
Строки заголовков, которые добавлены опцией
“
headers_add
” роутера - недоступны посредством синтаксиса раскрытия
“
$header_xxx
” в последующих роутерах или транспортах.
Наоборот, строки заголовков которые определены на удаление путём
“
headers_remove
” в роутере, остаются видимы в последующих роутерах и транспортах.
Заголовки добавленные к адресу путём
“
headers_add
” в роутере не могут быть удалены путём последующих роутеров или транспортами.
Добавленные заголовки могут ссылаться на содержимое оригинальных заголовков, которые должны быть удалены, даже если он имеет то же самое имя как и добавляемый заголовок. Например:
headers_remove = subject
headers_add = Subject: new subject (was: $h_subject:)
|
Предупреждение: Опции
“
headers_add
” и
“
headers_remove
” не могут использоваться в роутере
“
redirect
”, в котором установлена опция
“
one_time
”.
43.18 Конструирование адресов
Когда exim создаёт адрес отправителя для локально сгенерированных сообщений, он использует форму:
<user name> <login@qualify_domain>
|
Например:
Zaphod Beeblebrox <zaphod@end.univ.example>
|
Имя пользователя получается из установки
“
-F
” командной строки (если установлено), или, иначе, путём поиска вызвавшего пользователя
“
getpwuid()
” и извлечения поля
“gecos
” из вхождения пароля. Если поле
“gecos
” содержит символ
“&
”, он заменяется на логин с первой буквой в верхнем регистре, как обычно во множестве операционных систем. Смотрите опцию
“
gecos_name
” для способа приспособить обработку поля
“gecos
”. Опция
“
unknown_username
” может использоваться для задания имени пользователя в случаях, когда в файле паролей нет вхождения.
Во всех случаях, имя пользователя должно соответствовать RFC2822 путём квотирования всего, или частей, по необходимости. Кроме того, если оно содержит любые непечатаемые символы, оно кодируется как описано в RFC2047, определяющем способ включения не-ASCII символов в строки заголовков. Значение опции
“
headers_charset
” задаёт имя кодирования, которое используется (символы, как предполагается, в этой кодировке). Установка
“
print_topbitchars
” контролирует, считать ли символы с установленным высшим битом (т.е., с кодами больше 127) как печатные символы, или нет.
43.19 Регистры локальных частей
RFC2822 устанавливает, что регистр букв в локальных частях не может предполагаться незначащим. Exim сохраняет регистр локальных частей адресов, но, по умолчанию, он использует форму в нижнам регистре, при роутинге, поскольку на большинстве UNIX-систем имена пользователей в нижнам регистре, и требуется нечувствительный к регистру роутинг. Однако, любой специфический роутер можно заставить использовать оригинальный регистр для локальных частей, путём установки общей опции роутеров
“
caseful_local_part
”.
Если вам необходимо иметь имена пользователей в смешанном регистре на вашей системе, лучшим способом пеерйти, предполагая что вы хотите регистронезависимую обработку входящей почты, - установить ваш первый роутер на преобразование входящих локальных частей в ваших доменах в корректный регистр, путём поиска по файлу. Например:
correct_case:
driver = redirect
domains = +local_domains
data = ${lookup{
$local_part}cdb\
{/etc/usercased.cdb}{$value}fail}\
@$domain
|
Для этого роутера, локальная часть - приводится к нижнему регистру путём дефолтового действия (
“
caseful_local_part
” - не установлена). Локальная часть в нижнем регистре используется для поиска новой локальной части в корректном регистре. Тогда, если вы установите
“
caseful_local_part
” в любом последующем роутере, обрабатывающем ваши домены, то они будут оперировать локальными частями в корректном регистре, в регистрозависимой манере.
43.20 Точки в локальных частях
RFC2822 запрещает пустые компоненты в локальных частях. Таким образом, неквотированная локальная часть не может начинаться или заканчиваться точкой, или иметь две точки подряд в середине. Однако, кажется, многие MTA не принуждают к этому, таким образом, exim разрешает пустые компоненты для совместимости.
43.21 Перезапись адресов
Перезапись адресов отправителей и получателей, и адресов в заголовках, может происходить автоматически, или как результат конфигурационных опций, как описано в части 31. Заголовки, которые могут быть этим затронуты -
“
Bcc:
”,
“
Cc:
”,
“
From:
”,
“
Reply-To:
”,
“
Sender:
” и
“
To:
”.
Автоматическая перезапись включает перезапись, как указано выше. Другой случай, в котором это может случиться - когда дан неполный нелокальный домен. Процесс маршрутизации может вызвать его раскрытие в полное доменное имя. Например, заголовок типа
мог быть перезаписан как
To: hare@teaparty.wonderland.fict.example
|
Перезапись как результат роутинга - один из видов обработки сообщений которые не происходят во время прихода сообщения, так как она не может быть сделана до роутинга адреса.
Строго, нельзя производить никакие доставки сообщения, пока все адреса не будут сроучены, в случае, если любой заголовок был изменён в результате роутинга. Однако, выполнение этого, практически, задрежало бы много доставок на черезмерное время, лишь потому, что обин адрес не мог быть немедленно сроучен. Поэтому, exim не задерживает другие доставки, когда задерживается роутинг одного или более адресов.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
44. Обработка SMTP
Exim поддерживает множествро различных способов использования протокола SMTP, и его вариант LMTP, являющийся интерактивным протоколом для передачи сообщений в закрытое хранилище почты приложением. Эта глава содержит детали о обработке SMTP. Для входящей почты, доступно следующее:
SMTP через TCP/IP (даемон exim`a, или
“
inetd
”)
SMTP через стандартный ввод и вывод (опция
“
-bs
”)
Пакетный SMTP на стандартном вводе (опция
“
-bS
”)
Для доставки почты, доступно следующее:
SMTP через TCP/IP (транспорт
“
smtp
”)
LMTP через TCP/IP (транспорт
“
smtp
” с опцией
“
protocol
” установленной в
“lmtp
”)
LMTP через трубу к процессу, работающему на локальном хосте (транспорт
“
lmtp
”)
Пакетный SMTP в файл или трубу (транспорты
“
appendfile
” и
“
pipe
” с установленной опцией
“
use_bsmtp
”)
“
Пакетный SMTP
” - имя для процесса, в котором пакеты сообщений сохраняются или читаются из файлов (или труб), в формате в котором команды SMTP используются для вмещения информации конверта.
44.1 Исходящий SMTP и LMTP через TCP/IP
Исходящий SMTP и LMTP через TCP/IP, выполняется транспортом
“
smtp
”. Опция
“
protocol
” - выбирает какой протокол будет использоваться, но, фактическая обработка, одна и та же в обоих случаях.
Если, в ответе на его команду EHLO, exim`y сообщают, что поддерживается параметр SIZE, он добавляет SIZE=<n> к каждой последующей команде MAIL. Значение <n> - размер сообщения, плюс значение опции
“
size_addition
” (по умолчанию - 1024) для учёта дополнений к сообщению, типа транспортных заголовков, или производимых в транспортном фильтре изменений. Если
“
size_addition
” - отрицательна, использование SIZE - подавляется.
Если удалённый сервер оповещает о поддержке PIPELINING, exim использует конвейерное расширение для SMTP (RFC 2197), для уменьшения числа TCP/IP пакетов требуемых для транзакции.
Если удалённый сервер оповещает о поддержке команды STARTTLS, и exim собран с поддержкой шифрования TLS, он пробует начать TLS сессию, если хост не совпадает с
“
hosts_avoid_tls
”. Для дополнительных деталей, смотрите раздел 38.
Если удалённый сервер оповещает о поддержке команды AUTH, exim сканирует конфигурацию аутентификаторов на любые подходящие клиенту установки, как описано в разделе 33.
Предполагается, что ответы от удалённых хостов завершаются путём CR, сопровождаемого LF. Однако, известны хосты, которые не посылают символ CR, таким образом, для возможности взаимодействовать с такими хостами, exim обрабатывает LF как самостоятельный признак конца строки.
Если сообщение содержит несколько различных адресов, все с теми же самыми характеристиками (например, тот же отправитель конверта), резольвящимися к тем же самым наборам хостов, в том же самом порядке, посылаются в одной SMTP транзакции, даже если они для различных доменов, не более чем позволяет установка опции
“
max_rcpts
” в транспорте
“
smtp
”, в случае чего они разделяются на группы содержащие не более чем
“
max_rcpts
” адресов в каждой. Если
“
remote_max_parallel
” - больше одного, каждая группа может быть послана в параллельных сессиях. Порядок хостов с идентичными значениями MX - не существеннен при проверке, могут ли адреса быть пакетными в этом способе.
Когда транспорт
“
smtp
” переносит временную ошибку не связанную с сообщением, exim обновляет специфическую для транспорта БД, которая содержит записи, индексированные по имени хоста, которые помнят, какие сообщения ждут каждого специфического хоста. Также он обновляет БД повторов, с новыми временами повторов.
Подсказки повторов exim`a основаны на имени хоста, плюс IP-адрес, таким образом если, один адрес многоадресного хоста будет нерабочим, он будет пропущен в большинстве случаев. Смотрите следующую секцию, для дополнительных деталей о обработке ошибок.
Когда сообщение успешно доставлено через TCP/IP SMTP-соединение, exim просматривает БД подсказок для транспорта, чтобы увидеть, есть ли любые сообщения в очереди, ожидающие связанного с ними хоста. Если он находит один, он создаёт новый процесс exim`a, используя опцию
“
-MC
” (которая может быть использована процессом запущенным как root или пользователь exim`a) и передаёт ему сокет TCP/IP, чтобы он мог доставить другое сообщение используя тот же самый сокет. Новый процесс производит лишь те доставки, которые сроучены к подклченному хосту, и он может передать сокет третьему процессу, и так далее.
Опция
“
connection_max_messages
”, транспорта
“
smtp
”, может быть использована для ограничения числа сообщений отсылаемых через одно TCP/IP соединение.
Второе и последующие сообщения, отсылаемые в существующем подключении, идентифицируются в главном логе по дополнительной звёздочке после закрывающей квадратной скобки IP-адреса.
44.2 Ошибки в исходящем SMTP
Три различные вида ошибок распознаются для исходящего SMTP: ошибки хоста, ошибки сообщения, и ошибки получателя.
Ошибки хоста:
Ошибка хоста не ассоциирована со специфическим сообщением, или со специфическим получателем сообщения. Ошибки хоста:
Соединение отклонено, или таймаут.
Любой ошибочный код в соединении.
Любой ошибочный код в EHLO или HELO.
Потеря подключения в любое время, кроме как после
“.
”.
Ошибки ввода-вывода (I/O) в любое время.
Таймауты в течение сессии, кроме как в ответ на MAIL, RCPT, или
“.
” в конце данных.
Для ошибки хоста, постоянного ошибочного ответа при соединении, или в ответе на EHLO, вызывает ошибку всех роутящихся к хосту адресов. Любые другие ошибки хоста вызывают задержку всех адресов, и создание данных повторов для хоста. Он не пробуется снова, для любого сообщения, пока не наступит его время повтора. Если текущий набор адресов не весь доставляется за этот запуск (к некоторому альтернативному хосту), сообщение добавляется к списку сообщений, ожидающих этот хост, таким образом, если они всё ещё недоставлены когда произойдут последующие успешные доставки к хосту, оно тоже будет отослано в том же SMTP соединении.
Ошибки сообщения:
Ошибка сообщения ассоциирована со специфическим сообщением при посылке к специфическому хосту, но не со специфическим получателем сообщения. Ошибки сообщений таковы:
Любые коды ошибки на MAIL, DATA, или
“.
” в конце данных.
Таймаут после MAIL.
Таймаут или потеря соединения после
“.
”, завершающей данные. Таймаут после команды DATA обрабатывается как ошибка хоста, как потеря соединения в любое другое время.
Для ошибки сообщения, постоянный ошибочный ответ (5xx) вызывает ошибку всех адресов, и возвращение отчёта о ошибке доставки отправителю. Временный ошибочный ответ (4xx), или один из таймаутов, вызывает задержку всех адресов. Для хоста не создаются данные повторов, но, вместо этого, создаются записи повторов для хоста плюс идентификатор сообщения. Сообщение не добавляется к списку ожидающих этого хоста. Это обеспечивает что неудачное сообщение не будет послано к этому хосту до истечения вреемни повтора. Однако, другие сообщения сроученные к хосту не затрагиваются, таким образом, если ошибку вызывает какое-то свойство сообщения, она не остановит доставку другой почты.
Если удалённый хост указывает поддержку параметра SIZE в своём ответе на EHLO, exim добавляет к команде MAIL SIZE=nnn, таким образом, огромное сообщение вызовет ошибку, поскольку ошибка прийдёт в ответ на MAIL.
Ошибки получателя:
Ошибка получателя ассоциирована со специфическим получателем сообщения. Ошибки получателя таковы:
Любой ошибочный ответ на RCPT.
Таймаут после RCPT.
Для ошибки получателя, постоянный ответ ошибки (5xx) вызывает ошибку адресов получателей, и возврат рикошета отправителю. Ответ временной ошибки (4xx) или таймаут, вызывают задержку ошибочного адреса, и создание данных повтора для роутинга. Это используется для задержки обработки адресов в последующих запусках очереди, пока не истечёт время повтора роутинга. Это применяется ко всем сообщениям, но, поскольку, управляются лишь в запуски очереди, будет сделана одна попытка доставки нового сообщения на неудачный адрес до начала работы задержки. Это гарантирует, что если ошибка реально относится к сообщению, а не с получателем (
“message too big for this recipient
” - возможный пример), другие сообщения имеют шанс быть доставленными. Если доставка на адрес действительно успешна, информация повтора очищается, таким образом, все придержанные сообщения снова пробуются, и часы повтора сбрасываются.
Сообщение не добавляется к списку ожидающих этого хоста. Использование хоста для других сообщений - незатрагивается, и исключая случай таймаута, другие получатели обрабатываются независисмо, и могут быть успешно доставлены в текущей SMTP-сессии. После таймаута, разумеется, невозможно продолжить сессию, следовательно, все адреса задерживаются. Однако, остальные, кроме неудачного, не претерпевают последующих задержек. Поэтому, если один получатель вызывает проблемы, остальные имеют шанс на прохождение, когда последующие попытки доставки случаются до времени повтора неудачного получателя.
Во всех случаях, если есть другие хосты (или IP-адреса) доступные для текущего набора адресов (например, из нескольких MX-записей), они пробуются в этот запуск для любых недоставленных адресов, разумеется, подвергаясь собственным данным повторов. Другими словами, данные ошибок получателя не вступают в силу до следующей попытки доставки.
Некоторые хосты, как наблюдалось, давали ответ с временной ошибкой на каждую команду MAIL, в некоторые моменты времени (было замечено
“insufficient space
” (недостаточно места)). Было бы хорошо, если бы такие ситуации были распознаны, и данные для хоста задерживались, но это невозможно в текущем дизайне exim`a. Что происходит фактически - что создаются данные для каждой (хоста, сообщения) комбинации.
Причина, что таймаут после MAIL и RCPT обрабатывается специальным образом - что иногда он может происходить как результат процедуры проверки удалённым хостом. Exim делает это предположение, и обрабатывает их так, будто получен ответ с временной ошибкой. Таймаут после
“.
” обрабатывается специальным образом, поскольку известно, что некоторые кривые реализации не могут распознать конец сообщения, если последний символ в последней строке - бинарный ноль. Таким образом, полезно обработать этот случай как ошибку сообщения.
Таймауты в другие времена, обрабатываются как ошибки хоста, предполагая проблему с хостом, или соединением с ним. Если таймаут после MAIL, RCPT, или
“.
” - реальная проблема соединения, предполагается, что в следующую попытку таймаут, вероятно, произойдёт в той же точке диалога, вызывая последующую обработку как ошибки хоста.
Есть экспериментальные свидетельства, что некоторые MTA разрывают соединение после завершающей точки -
“.
”, если им не нравиться содержимое сообщения по каким-то причинам, в нарушение RFC, который указывает, что надо дать ответ 5xx. Именно поэтому, exim обрабатывает этот случай как ошибку собщения, а не хоста, чтобы не задерживать другие сообщения к тому же хосту.
44.3 Входящие SMTP сообщения через TCP/IP
Входящие SMTP сообщения могут быть приняты одним из двух способов: путём слушающего даемона, или путём использования
“
inetd
”. В последнем случае, в
“
/etc/inetd.conf
” должно быть что-то вроде этого:
smtp stream tcp nowait exim /opt/exim/bin/exim in.exim -bs
|
Exim различает этот случай, и случай локально выполняющегося пользовательского агента, использующего опцию
“
-bs
”, путём проверки, является ли стандартный ввод - сокетом. Когда это так, тот или другой порт должен быть привелигированным (меньше 1024), или вызывающий должен быть root или пользователь exim`a. Если любой другой пользователь передаётсокет с непривелигированным номером порта, exim выводит сообщение в стандартный поток ошибок, и выходит с кодом ошибки.
По умолчанию, exim не создаёт вхождения логов для соединения и отключений удалённых хостов (или через даемона, или через
“
inetd
”), если разъединение было ожидаемым. Можно записывать такие вхождения, путём установки селектора логов
“
smtp_connection
”.
Команды от удалённого хоста, как предполагается, должны быть завершены CR и LF. Однако, известны хосты не посылающие символ CR. Чтобы быть в состоянии работать с такими хостами, exim обходится с LF как с символом конца строки. Кроме того, поскольку для получения сообщений из всех источников используется общий код, самостоятельный CR интерпретируется как признак конца строки. Однако, последовательность
“CR, точка, CR
” не завершает входящие по SMTP данные.
Одна область, иногда дающая начало проблемам, касается команд EHLO или HELO. Некоторые клиенты посылают синтаксически недопустимые версии этих команд, которые, по умолчанию, отклоняются exim`ом. (Это - неимеет отношения к проверке посылаемых данных, таким образом,
“
helo_verify_hosts
” - неуместна.) Вы можете сказать exim`y не применять проверку синтаксиса, путём установки
“
helo_accept_junk_hosts
” в соответствие кривым хостам, посылающим недопустимые команды.
Количество доступного дискового пространства проверяется каждый раз при получении команды MAIL, независимо от того, сконфигурирована ли
“
message_size_limit
” или
“
check_spool_space
”, если
“
smtp_check_spool_space
” не установлена в ложь. Если места недостаточно, даётся временная ошибка. Если установлена
“
check_spool_space
”, проверка - на необходимое количество свободного места, плюс значение данное с SIZE, т.е. эта проверка будет проверять, что добавление входящего сообщения не уменьшит место ниже порога.
Когда сообщение успешно принято, exim включает локальный идентификатор сообщения в его ответ на финальную
“.
”, которая завершает данные. Если удалённый хост логгирует этот текст, он может помочь в трассировке - что случилось с сообщением.
Даемон exim`a может огриничить число одновременных входящих соединений, которые он готов обработать (смотрите опцию
“
smtp_accept_max
”). Также, он может ограничить число одновременных вхосдящих оединений от одного удалённого хоста (смотрите опцию
“
smtp_accept_max_per_host
”). Дополнительные попытки соединения отклоняются, используя 421 код временной ошибки SMTP.
Даемон exim`a не полагается на сигнал SIGCHLD, для детектирования, когда завершён подпроцесс, поскольку он может потеряться в загруженные моменты. Вместо этого, он при каждом пробуждении ищет завершённые субпроцессы. При условии, что происходят другие события (новые входящие вызовы, запуск обработчика очереди), завершивишиеся процессы уведомляются, и аккуратно убираются. В очень спокойных системах, иногда, вы можете увидеть слоняющиеся
“умершие
” процессы exim`a. Это не проблема; он будет замечен когда даемон проснётся в следующий раз.
Когад exim работает как даемон, он может резервировать некоторые слоты SMTP для специфических хостов, и, также, может быть установлен на отклонение SMTP вызовов от нерезервированных хостов во время высокой загрузки системы - для деталей, смотрите опции
“
smtp_accept_reserve
”,
“
smtp_load_reserve
” и
“
smtp_reserve_hosts
”. Проверка загрузки происходит в обих случаях - даемоне и
“
inetd
”.
Обычно, exim запускает процесс доставки для каждого полученного сообщения, хотя, это может быть изменено опцией командной строки
“
-odq
”, и опциями
“
queue_only
”,
“
queue_only_file
”, и
“
queue_only_load
”. Число одновременно работающих процессов доставки, начатых таким образом из ввода SMTP, может быть ограничено путём опций
“
smtp_accept_queue
” и
“
smtp_accept_queue_per_connection
”. Когда тот или другой лимит ичсерпан, последующие принятые сообщения просто кладутся во входную очередь, без запуска процесса доставки.
Средства управления, которые связаны с подсчётом входящих вызовов SMTP (
“
(smtp_accept_max
”,
“
smtp_accept_queue
”,
“
smtp_accept_reserve
”) недоступны, когда exim запущен из даемона
“
inetd
”, поскольку, в этом случае каждое соединение обрабатывается полностью независимым процессом exim`a. Однако, управление путём средней загрузки, доступно с
“
inetd
”.
Exim может быть сконфигурирован на проверку адресов во входящих SMTP командах, как они получены. Смотрите раздел 39, для деталей. Он, также, может быть сконфигурирован на перезапись адресов в это время - до какой-либо проверки синтаксиса. Смотрите раздел 39.9.
Также, exim может быть сконфигурирован на ограничение частоты, с которой клиентский хост посылает команды MAIL и RCPT в одной SMTP-сессии. Смотрите опцию
“
smtp_ratelimit_hosts
”.
44.4 Нераспознанные SMTP-команды
Если exim получает более чем
“
smtp_max_unknown_commands
” нераспознанных SMTP команд в одном SMTP соединении, он разрывает соединение после ответа о ошибке на последнюю команду. Значение по умолчанию для
“
smtp_max_unknown_commands
” - 3. Это - оборона против некоторых видов злоупотреблений, которые ломают WEB-сервера для создания соединения к SMTP-портам; в этих обстоятельствах, вначале посылаются несколько не-SMTP строк.
44.5 Синтаксис и ошибки протокола в командах SMTP
Синтаксическая ошибка детектируется, если команда SMTP распознана, но есть синтаксически неверные данные, например, неверно сформированный адрес электронной почты в команде RCPT. Ошибки протокола включают недопустимую последовательность команд, типа RCPT до MAIL. Если exim принимает более чем
“
smtp_max_synprot_errors
” таких команд, в одном SMTP cоединении,он разрывает соединение после отсыла сообщения о ошибке на последнюю команду. Значение по умолчанию для
“
smtp_max_synprot_errors
” - 3. Это - защита против кривых клиентов, которые циклически посылают неверные команды (да, было такое замечено).
44.6 Использование непочтовых SMTP команд
“non-mail
” команды SMTP - прочие кроме MAIL, RCPT, и DATA. Exim считает такие команды, и разрывает соединение если их слишком много в одной сессии SMTP. Это действие ловит некоторые попытки DoS, и вещи типа повторяющихся неудачных AUTH, или безумных клиентов, циклически посылающих HELO. Глобальная опция
“
smtp_accept_max_nonmail
” задаёт,
“как много
” - это много. Её значение по умолчанию - 10.
Когда ожидается новое сообщение, один случай RSET - не подсчитывается. Этим позволяется клиенту послать один RSET до сообщения (это не необходимо, но обычно клиенты так делают). Также, exim позволяет одно неподсчитываемое HELO или EHLO, и один STARTTLS до сообщения. После начала сессии TLS, ожидается иной EHLO, и, он также не подсчитывается.
Первое возникновение AUTH в соединении, или немедленно после STARTTLS - также не подсчитывается. Иначе, подсчитываются все иные команды, кроме MAIL, RCPT, DATA, и QUIT.
Вы можете управлять, какие хосты подчиняются ограничению, устанавливаемому путём
“
smtp_accept_max_nonmail
” путём установки
“
smtp_accept_max_nonmail_hosts
”. Значение по умолчанию -
“*
”, которое применяет ограничения ко всем хостам. Эта опция средство для того, чтобы вы могли исключить некоторые специфические хосты с плохим поведением, с которыми вы должны жить.
44.7 Команды VRFY и EXPN
Когда exim получает команду VRFY или EXPN по TCP/IP соединению, он запускает ACL заданную путём
“
acl_smtp_vrfy
” или
“
acl_smtp_expn
” (соответственно), чтобы решить, должны ли команда быть принята. Если нет заданных ACL, команда отклоняется.
Когда VRFY принимается, она запускает тот же самый код, как когда exim вызывается с опцией
“
-bv
”.
Когда принимается EXPN, производится одноуровневое раскрытие адреса. EXPN обрабатывается как
“тестирование адреса
” (подобно опции
“
-bt
”), а не проверка (опция
“
-bv
”). Если как аргумент EXPN даётся неквалифицированная локальная часть, она квалифицируется с
“
qualify_domain
”. Отклонения команд VRFY и EXPN логгируются в главном логе, и логе отклонённых, и ошибки проверки VRFY логгируются в главном логе для последовательности с ошибками RCPT.
44.8 Команда ETRN
RFC1985 описывает команду SMTP называемую ETRN, которая спроектирована для борьбы с проблемами безопасности команды TURN (которая вышла из употребления). Когда exim получает команду ETRN в TCP/IP соединении, он запускает ACL заданную путём
“
acl_smtp_etrn
”, чтобы решить, должна ли быть принята команда. Если нет заданных ACL, команда отклоняется.
Команда ETRN имеет отношение к выпуску сообщений, ожидающих доставки на определённые хосты. Поскольку exim не организовывает свою очередь сообщений по хостам, по умолчанию поддерживается лишь форма ETRN, где текст начинается с преффикса
“#
”, когда остаток текста задаёт сервер SMTP. Допустимая команда ETRN вызывает запуск exim с опцией
“
-R
”, с остатком от текста ETRN как аргумента. Например:
запускает команду
которая вызывает попытку доставки всех сообщений, чей недоставленный адрес содержит текст
“brigadoon
”. Когда установлена
“
smtp_etrn_serialize
” (по умолчанию), exim предотвращает одновременное выполнение более чем одного запуска очереди с той же самой строкой аргументов, как результат команды ETRN. Это останавливает клиентов с плохим поведением от запуска более чем одного обработчика очереди за раз.
Exim осуществяет преобразование в последовательную форму при помощи БД подсказок, в которую делается запись при каждом запуске процесса путём ETRN, и удаления, когда процесс завершён. Однако, exim не оставляет сессию SMTP ждать завершения процесса ETRN. Как только ETRN принята, клиенту посылается успешный код возврата. Очевидно, есть границы действия для записей подсказок, т.к. могла быть системная или программная ошибка (crash). Для принятия мер против этого, exim игнорирует любые записи, которые старше шести часов.
Для большего управления, чем даёт ETRN, может использоваться опция
“
smtp_etrn_command
”. Она задаёт команду, которая запускается при кадом получении ETRN, вне зависимости от аргументов. Например:
smtp_etrn_command = /etc/etrn_command $domain \
$sender_host_address
|
Строка разделяется на аргументы, которые незавсисмо раскрываются. Переменная раскрытия
“
$domain
” устанавливается в аргумент команды ETRN, и проверки синтаксиса не производится в содержимом аргументов. Exim не ждёт завершения команды, таким образом, код статуса не проверяется. Exim работает под его uid и gid при получении входящего SMTP, таким образом, их невозможно изменить перед запуском команды.
44.9 Входящий локальный SMTP
Некоторые пользовательские агенты используют SMTP для передачи сообщений к своим локальным МТА, используя стандарный ввод и вывод, в противоположность передаче конверта в командной строке, и записи сообщения в стандартный ввод. Это поддерживается путём опции
“
-bs
”. Эта форма SMTP обрабатывается точно таким же способом, как и входящие во TCP/IP сообщения (включая использование ACL), исключая что, отправитель конверта данный в команде MAIL, - игнорируется, если отправитель не доверенный. В ACL вы можете детектировать эту форму SMTP ввода путём проверки на пустой идентификатор хоста. Обычно, это первая строка в ACL, которая запускается для команд RCPT:
Этим принимаются SMTP сообщения от локальных процессов, без проверки любыми другими тестами.
44.10 Исходящий пакетный SMTP
Оба транспорта -
“
appendfile
” и
“
pipe
” могут быть использованы для обработки пакетного SMTP. Каждый обладает опцией, с именем
“
use_bsmtp
”, которая вызывает вывод сообщений в формате BSMTP. Для этой формы доставки невозможны SMTP ответы. Всё что она делает - использует команды SMTP как способ передать конверт вместе с сообщением.
Сообщение записывается в файл или трубу, с предшествующей командой MAIL и RCPT, и сопровождаемое строкой, содержащей единственную точку. Строки в сообщении, которые начинаются с точки, имеют дополнительную добавленную точку. Команда SMTP HELO, обычно, не используется. Если это требуется, для её задания может использоваться опция
“
message_prefix
”.
Поскольку обе опции -
“
appendfile
” и
“
pipe
” - локальные транспорты, они принмают, по умолчанию, лишь один адрес получателя одновременно. Однако, вы можете принять меры для обработки ими нескольких адресов за раз, путём установки опции
“
batch_max
”. Когда это сделано для BSMTP, сообщения могут содержать несколько команд RCPT. Для дополнительных деталей, смотрите часть 25.
Когда один или более адресов роутятся на транспорт BSMTP путём роутера, который установлен списком хостов, имя первого хоста в списке доступно в транспорте, в переменной
“
$host
”. Вот - пример такого транспорта и роутра:
begin routers
route_append:
driver = manualroute
transport = smtp_appendfile
route_list = domain.example batch.host.example
begin transports
smtp_appendfile:
driver = appendfile
directory = /var/bsmtp/$host
batch_max =
1000
use_bsmtp
user = exim
|
Он вызывает запись сообщений адресованных
“
domain.example
”, в формате BSMTP, в
“
/var/bsmtp/batch.host.example
”, с одной копией каждого сообщения (если не более 1000 получателей).
44.11 Входящий пакетный SMTP
Опция командной строки
“
-bS
” заставляет exim принимать одно или более сообщений путём чтения со стандартного ввода, но не производя никаких ответов. Если вызывающий - доверенный, оставляется отправитель из команды MAIL; иначе, отправитель - всегда будет вызвавший exim. Неквалифицированные отправители и получатели не отклоняются (это кажется маленькой точкой), но, вместо этого, просто квалифицируются. HELO и EHLO действуют как RSET; VRFY, EXPN, ETRN и HELP, действуют как NOOP; QUIT - выход.
Для BSMTP ввода, проверки политик не производится. Таким образом, в это время ACL не запускаются. В этом отношении, он - такой же как и локальный не-SMTP ввод.
Если при чтении сообщения обнаружена ошибка, включая остутсвие
“.
” в конце, exim немедленно его бросает. Он пишет детали о ошибке на стандартный вывод стилизированным способом, который вызывающая прогармма могла бы использовать автоматически, например:
554
Unexpected end of file
Transaction started in line
10
Error detected in line
14
|
Также он пишет более подробную версию, для использования люльми, в стандартный файл ошибок, например:
An error was detected while processing a file of BSMTP input.
The error message was:
501
'>' missing at end of address
The SMTP transaction started in line
10
.
The error was detected in line
12
.
The SMTP command at fault was:
rcpt to:<malformed@in.com.plete
1
previous message was successfully processed.
The rest of the batch was abandoned.
|
Код возврата из exim`a - ноль, лишь есть небыло ошибок. Он - 1, если какие-то сообщения были приняты до детектирования ошибки, и 2 - если не было принятых сообщений.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
45. Настройка рикошетов и предупреждающих сообщений
Когда сообщение невозможно доставить, или оно остаётся в очереди более чем сконфигурированное время, exim посылает сообщение оригинальному отправителю, или на альтернативный сконфигурированный адрес. Текст этих сообщений вкомпилен в код exim`a, но возможно его изменить, путём добавления одной строки, или путём замены каждого параграфа текстом, находящимся в файле.
Строки заголовков
“
From:
” и
“
To:
” - генерируются автоматически; вы можете вызвать добавление строки
“
Reply-To:
”, путём установки опции
“
errors_reply_to
”. Также, exim добавляет строку:
Auto-Submitted: auto-generated
|
ко всем предупреждающим сообщениям и рикошетам.
45.1 Настройка рикошетов
Если установлена
“
bounce_message_text
”, её содержимое включается в дефолтовое сообщение, немедленно после
“This message was created automatically by mail delivery software.
”. Строка не раскрывается. Она не используется, если
“
bounce_message_file
” установлена.
Когда установлена
“
bounce_message_file
”, она должна указывать на файл шаблона для конструирования сообщения о ошибке. Файл состоит из ряда текстовых элементов, разделённых строками состоящими ровно из четырёх звёздочек. Если файл не может быть открыт, используется дефолтовый текст и в главный лог и лог паники пишется сообщение. Если любой текстовый элемент в файле - пустой, для этого элемента используется дефолтовый текст.
Каждый элемент текста, читаемый из файла, раскрывается, и существуют две переменные раскрытия, которые могут тут использоваться:
“
$bounce_recipient
” - устанавливается в получателя сообщения о ошибке, когда оно создаётся, и
“
$bounce_return_size_limit
” содержит значение опции
“
return_size_limit
”, округлённое до целого числа.
Элементы должны появляться в файле в следующем порядке:
Первый элемент включается в заголовки, и должен включать, по крайней мере, заголовок
“
Subject:
”. Exim не проверяет синтаксис этих заголовков.
Второй элемент формирует начало сообщения о ошибке. После него, exim перечисляет неудачные адреса с их сообщениями о ошибке.
Третий элемент используется для ввода любого текста из транспортов трубы (pipe), который должен быть возвращён отправителю. Он опускается, если текста нет.
Четвёртый элемент используется для ввода копии сообщения, которое возвращается как часть отчёта о ошибке.
Пятый элемент добавляется после четвёртого, если возвращённое сообщение усечено, поскольку оно больше
“
return_size_limit
”.
Шестой элемент добавляется после копии оригинального сообщения.
Дефолтовое состояние (опция
“
bounce_message_file
” незадана) - эквивалентно следующему файлу, с пустым шестым элементом. Строка
“
Subject:
” и некоторые другие строки были разделены, чтобы вписать их в страницу:
Subject: Mail delivery failed
${if eq{$sender_address}{
$bounce_recipient}
{: returning message to sender}}
****
This message was created automatically by mail delivery software.
A message ${if eq{$sender_address}{
$bounce_recipient}
{that you sent }{sent by
<$sender_address>
}}could not be delivered to all of its recipients.
The following address(es) failed:
****
The following text was generated during the delivery attempt(s):
****
------ This is a copy of the message, including all the headers.
------
****
------ The body of the message is $message_size characters long;
only the first
------ $bounce_return_size_limit or so are included here.
****
|
45.2 Настройка предупреждающих сообщений
Опцией
“
warn_message_file
” может быть указан файл шаблона, для использования при создании предупреждений о задержках сообщений. В этом случае, есть лишь три секции текста:
Первый элемент включается в заголовки, и должен включать, по крайней мере, заголовок
“
Subject:
”. Exim не проверяет синтаксис этих заголовков.
Второй элемент формирует начало предупреждающего сообщения. После него exim перечисляет задержанные адреса.
Затем, третий элемент завершает сообщение.
Дефолтовое состояние, эквивалентно следующему текстовому файлу, исключая, что некоторые строки были разделены, для вписания в страницу:
Subject: Warning: message $message_exim_id delayed
$warn_message_delay
****
This message was created automatically by mail delivery software.
A message ${if eq{$sender_address}{
$warn_message_recipients}
{that you sent }{sent by
<$sender_address>
}}has not been delivered to all of its recipients after
more than $warn_message_delay on the queue on $primary_hostname.
The message identifier is: $message_exim_id
The subject of the message is: $h_subject
The date of the message is: $h_date
The following address(es) have not yet been delivered:
****
No action is required on your part. Delivery attempts will
continue for some time, and this warning may be repeated at
intervals if the message remains undelivered. Eventually the
mail delivery software will give up, and when that happens,
the message will be returned to you.
|
Однако, в дефолтовом состоянии, сроки темы и даты - пропущены, если не существуют соответствующие заголовки. В течение раскрытия этого файла, в
“
$warn_message_delay
” устанавливается время задержки, в одной из форм -
“<n> minutes
” или
“<n> hours
”, и
“
$warn_message_recipients
” содержит список получателей предупреждающего сообщения. Их может быть более чем одно, если есть несколько адресов с различными установками
“
errors_to
”, в обрабатывавших их роутерах.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
46. Некоторые общие конфигурационые опции
В этой главе обсуждаются некоторые конфигурационные настройки, которые кажутся наиболее общими. Дополнительные примеры и обсуждения могут быть найдены в книге о exim.
46.1 Отсылка почты на
“умный
” хост
Если вы хотите отсылать всю почту для нелокальных доменов на
“умный хост
” (
“smart host
”), вы должны заменить дефолтовый роутер
“
dnslookup
”, на роутер явно задающий роутинг:
send_to_smart_host:
driver = manualroute
route_list = !+local_domains smart.host.name
transport = remote_smtp
|
Если необходимо, вы можете использовать IP адрес умного хоста, вместо имени. Если вы используете exim лишь для передачи сообщений на умный хост, а не для получения входящих сообщений, вы должны принять меры для синхронизации подачи, путём установки опции
“
mua_wrapper
” (смотрите главу 47).
46.2 Использование exim для обработки списков рассылки
Exim может быть использован для запуска простого списка рассылки, но для больших и/или сложных требований, рекомендуется использование дополнительного ПО для управления списками рассылки, типа Majordomo или Mailman.
Роутер
“
redirect
” может быть использован для обработки списков рассылки, где каждый список поддерживается в отдельном файле, который, поэтому, может управляться независмыми манагерами. Опция
“
domains
”, роутера, может использоваться для запуска этих списков в отдельных доменах, от нормальной почты. Например:
lists:
driver = redirect
domains = lists.example
file = /usr/lists/$local_part
forbid_pipe
forbid_file
errors_to = $local_part-request@lists.example
no_more
|
Этот роутер пропущен для доменов, иных нежели
“
lists.example
”. Для адресов в этих доменах, он ищет файл, совпадающий с локальной частью. Если файла нет, роутер не выполняется, но, поскольку установлена
“
no_more
”, последующие роутеры не проверяются, и вся доставка заканчивается неудачей.
Опции
“
forbid_pipe
” и
“
forbid_file
” предотвращают раскрытие локальной части в доставку в трубу или файл, которая, обычно, неуместна в списках рассылки.
Опция
“
errors_to
” задаёт, что любые ошибки доставки, вызыванные адресами взятыми из списка рассылки, должны быть отосланы на заданный адрес, а не оригинальному отправителю сообщения. Однако, до этого действия, exim проверяет ошибочный адрес, и игнорирует, если его проверка неудачна.
Например, используя конфигурацию выше, почта посланная на
“
dicts@lists.example
” - передаётся на адреса содержащиеся в
“
/usr/lists/dicts
”, с направлением сообщений о ошибках на
“
dicts-request@lists.example
”, при условии, что этот адрес может быть проверен. Также возможно, что тут мог бы быть файл с именем
“
/usr/lists/dicts-request
”, содержащий адрес(а) манагер(a|ов) данного специфического списка, но иным подходом, типа установки более раннего роутера (возможно, использующего опции
“
local_part_prefix
” или
“
local_part_suffix
”) для обработки адресов в форме
“
owner-xxx
” или
“
xxx-request
”.
46.3 Синтаксические ошибки в списках рассылки
Если вхождение в данных перенаправления содержит синтаксическую ошибку, exim, обычно, задерживает доставку оригинального адреса. Это означает, что ошибка синтаксиса, в списке рассылки, задержит все доставки на этот список. Это может быть неподходящим, когда список обслуживается автоматически, из данных предоставленных пользователями, и адреса не проверены строго.
Если установлена опция
“
skip_syntax_errors
”, роутер
“
redirect
” просто пропускает вхождения, которые неможет распарсить, отмечая инцидент в логах. Если, дополнительно,
“
syntax_errors_to
” установлена в адрес который можно проверить, сообщение посылается на него при каждом пропуске битого адреса. Обычно,
“
syntax_errors_to
” устнавливается в тот же адрес, что и
“
errors_to
”.
46.4 Повторное раскрытие списков рассылки
Exim запоминает каждый индивидуальный адрес, на который было доставлено сообщение, для избежания дублирования, но, обычно, он сохраняет лишь оригинальный адрес получателя, сообщения. Если все доставки на список рассылки не могут быть завершены в первую попытку, список рассылки раскрывается повторно, когда происходит следующая попытка доставки. Это означает, что изменения списка примаются во внимание при каждой попытке доставки, таким образом, адреса, которые были добавлены к списку с того времени как пришло сообщение, также получат копию сообщения, несмотря на то, что оно предшествовало их подписке.
Если такое поведение - нежелательно, в роутере
“
redirect
” может быть установлена опция
“
one_time
”. Если это сделано, любые сгенерированные роутером адреса, которые не удалось доставить при первой попытке, добавляются к сообщению как
“верхний уровень
” (
“top level
”) адресов, и, сгенеривший их родительский адрес, помечается как
“доставленный
” (
“delivered
”). Таким образом, раскрытие списков рассылки не происходит заново, в последующие попытки доставки. Неудобство этого, в том, что если любой неудачный адрес - некоректен, его исправление в файле не имеет эффекта для предыдущих сообщений.
Оригинальный адрес высшего уровня запоминается с каждым сгенерированным адресом, и выводится в логах. Однако, любые промежуточные родительские адреса - не записываются. Это делает различие для логов лишь если установлен селектор
“
all_parents
”, но, так или иначе, для списков рассылки обычен лишь один уровень раскрытия.
46.5 Закрытые списки рассылки
Примеры, пока, предполагали открытые списки рассылки, в которые любой может послать почту. Также возможно настроить закрытые списки, где почта принимается лишь от специфических отправителей. Это производится путём использования общей опции
“
senders
”, для ограничения роутера обрабатывающего список.
Следующий пример использует один и тот же файл как список получателей, и как список разрешённых отправителей. Он требует трёх роутеров:
lists_request:
driver = redirect
domains = lists.example
local_part_suffix = -request
file = /usr/lists/$local_part
$local_part_suffix
no_more
lists_post:
driver = redirect
domains = lists.example
senders = ${if exists {/usr/lists/$local_part}\
{lsearch;/usr/lists/$local_part}{*}}
file = /usr/lists/$local_part
forbid_pipe
forbid_file
errors_to = $local_part-request@lists.example
no_more
lists_closed:
driver = redirect
domains = lists.example
allow_fail
data = :fail: $local_part@lists.example is a closed mailing list
|
Все три роутера имеют одну и ту же установку
“
domains
”, таким образом, для любых других доменов, они пропущены. Первый роутер запускается лишь если локальная часть завершается на
“
-request
”. Он обрабатывает сообщения к манагер(у|ам) списка, путём открытого списка рассылки.
Второй роутер запускается лишь если удовлетворено предварительное условие
“
senders
”. Он проверяет существование списка соответствующего локальной части, и, затем, с помошью линейного поиска проверяет, что отправитель находится в списке. До попытки поиска по файлу, необходимо проверить его существование, поскольку иначе exim подумает, что произошла конфигурационная ошибка. Если файл не существует, раскрытие
“
senders
” приводит к
“*
”, что соответствует всем отправителям. Это означает, что роутер работает, но, поскольку нет списка, от него отказываются, и
“
no_more
” гарантирует, что дальнейшие роутеры не запускаются. Адрес неудачен с ошибкой
“unrouteable address
”.
Третий роутер запускатся лишь если второй роутер пропущен, что происходит когда список рассылки существует, но отправитель не в нём. Этот роутер принудительно создаёт неудачу адреса, давая подходящее сообщение о ошибке.
46.6 Переменные пути возврата конверта (VERP)
Variable Envelope Return Paths - смотрите http://cr.yp.to/proto/verp.txt - являются способом помочь администраторам списков рассылок обнаружить, какой адрес подписки является причиной специфической неудачи доставки. Идея - в кодировании оригинального получателя адреса в исходящем адресе отправителя конверта, таким образом, если сообщение форвардится путём другого хоста, и, впоследствии, создаётся рикошет, оригинальный получатель может быть извлечён из адреса получателя рикошета.
Адрес отправителя конверта может быть модифицирован exim`ом используя два различных средства: опцию
“
errors_to
” в роутере (как показано в предыдущих примерах списков рассылки), или транспортную опцию
“
return_path
”. Второй из них эффективен лишь если сообщение успешно доставлено не иной хост; она не используется, для ошибок детектируемых на локальном хосте (смотрите описание
“
return_path
”в части 24). Вот - пример использования
“
return_path
” для осуществления VERP в транспорте
“
smtp
”:
verp_smtp:
driver = smtp
max_rcpt =
1
return_path = \
${if match {$return_path}{^(.+?)-request@your.dom.example\$}\
{$1-request=$local_part%$domain@your.dom.example}fail}
|
Он имеет эффект перезаписи обратного пути (отправителя конверта) в исходящих SMTP сообщениях, если локальная часть оригинального получателя завершается на
“-request
”, и домен -
“
your.dom.example
”. Перезапись вставляет локальную часть и домен получателя в путь возврата. Предположим, например, что сообщение, чей путь возврата установлен в
“
somelist-request@your.dom.example
” - посылается на
“
subscriber@other.dom.example
”. В транспорте, путь возврата переписывается как:
somelist-request=subscriber%other.dom.example@your.dom.example
|
Чтобы это работало, вы, также, должны сделать, чтобы исходящие сообщения, которые имеют в своём пути возврата
“-request
”, имели лишь одного получателя. Это достигается путём установки
“
max_rcpt
” в 1. Без этого, одна копия сообщения может быть послана нескольким различным получателям в одном домене, когда
“
$local_part
” недоступна в транспорте, поскольку она не уникальна.
Если ваш хост не только производит доставки списков рассылки, вы, вероятно, должны использовать отдельный транспорт для доставок VERP, чтобы не использовать дополнительные ресурсы для других. Это легко может быть сделано путём раскрытия опции
“
transport
” в роутере:
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = \
${if match {$return_path}{^(.+?)-request@your.dom.example\$}\
{verp_smtp}{remote_smtp}}
no_more
|
Если вы хотите изменить путь возврата используя
“
errors_to
” в роутере, вместо использования
“
return_path
” в транспорте, вам необходимо установить
“
errors_to
” во всех роутерах которые обрабатывают адреса списков рассылок. Это будет гарантировать, что все ошибки доставки, включая детектируемые на локальном хосте, посылаются на адреса VERP.
На хосте, который не делает локальных доставок, и не имет ручного роутинга, в изменении нуждается лишь роутер
“
dnslookup
”. Для доставко SMTP не нужен специальный транспорт. Каждый получатель списка рассылки имеет свой собственный путь возврата, и, таким образом, exim должен передать их транспорту по одному. Вот - пример роутера
“
dnslookup
”, который осуществляет VERP:
verp_dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
errors_to = \
${if match {$return_path}{^(.+?)-request@your.dom.example\$}}
{$1-request=$local_part%$domain@your.dom.example}fail}
no_more
|
До того, как вы начнёте рассылать сообщения с VERP путём возврата, вы, также, должны сконфигурировать exim на приём рикошетов, которые возвращаются с таким путём. Обычно, это производится путём установки опции
“
local_part_suffix
” для роутера, и использования этого для роутинга сообщения туда, где вы его хотели бы обработать.
Накладные расходы, при использовании VERP, очень сильно зависят от размера сообщения, числа получателей адресов, которые резольвятся на один и тот же удалённый хост, и скорости соединения, через которое посылается сообщение. Если много адресов резольвятся на один и тот же хост, и соединение медленное, посылка отдельной копии сообщения для каждого адреса может быть существенно дольше, чем посылка одной копии сообщения с многими получателями (что не может быть использоваться с VERP).
46.7 Виртуальные домены
Фраза
“
virtual domain
”, к сожалению, используется для двух различных смыслов:
Домен, для которого нет реальных почтовых ящиков; все действительные локальные части - альясы для лругих почтовых адресов. Общие примеры - организационные домены верхнего урвоня, и
“тщеславные
” (
“vanity
”) домены.
Один из множества незавсимых доменов, которые обрабатываются одним и тем же хостом, с почтовыми ящиками на этом хосте, но, где владельцы почтовых ящиков не обязательно обладают аккаунтом логина на этом хосте.
Первое использование, вероятно, наиболее часто, и действительно, кажется более
“виртуальным
” чем второе. Этот вид доменов может быть обработан exim`ом прямым роутером альясов. Один подход состоит в создании отдельного файла альясов для каждого виртуального домена. Exim может проверять существование файла альясов, для определения - существует ли домен. Тут полезен тип поиска
“
dsearch
”, приводя к роутеру такой формы:
virtual:
driver = redirect
domains = dsearch;/etc/mail/virtual
data = ${lookup{
$local_part}lsearch{/etc/mail/virtual/$domain}}
no_more
|
Опция
“
domains
” определяет, что роутер будет пропущен, если нет файла в директории
“
/etc/mail/virtual
”, чьё имя такое же, как и обрабатываемый домен КОгда роутер работает, он ищет локальную часть в файле, для нахождения нового адреса (или списка адресов). Установка
“
no_more
” обеспечивает, что если поиск неудачен (приводит к
“
data
”, являющейся пустой строкой), exim оставляет адрес, не пробуя последующие роутеры.
Этот роутер может обрабатывать все вирутальные домены, поскольку имена файлов альясов следуют за фиксированым шаблоном. Разрешения могут быть разданы так, чтобы соответствующие люди могли редактировать различные файлы альясов. Успешная операция альясинга приводит к новому адресу получателя конверта, который, затем, роутится с начала.
Другой вид
“виртуальных
” доменов, также может быть обработан прямым методом.Один подход состоит в создании файла для каждого домена, содержащего список действительных локальных частей, и используется в роутере типа такого:
my_domains:
driver = accept
domains = dsearch;/etc/mail/domains
local_parts = lsearch;/etc/mail/domains/$domain
transport = my_mailboxes
|
Адрес принимается если есть файл для домена, и локальная часть может быть найдена в файле. Опция
“
domains
” используется для проверки на существование файла, поскольку
“
domains
” проверяется до опции
“
local_parts
” (смотрите секцию 3.12). Вы не можете использовать
“
require_files
”, поскольку эта опция проверяется после
“
local_parts
”. Транспорт - таков:
my_mailboxes:
driver = appendfile
file = /var/mail/$domain/$local_part
user = mail
|
Он использует директорию почтовых ящиков для каждого домена. Установка
“
user
” - требуется, для задания какой uid будет использоваться для записи в почтовые ящики.
Конфигурация показанная здесь - лишь один пример, как вы можете поддерживать это требование. Есть много других путей, которыми может быть настроен этот вид конфигурации, например, путём использования ВД вместо раздельных файлов, для хранения всей информации о доменах.
46.8 Многочисленные пользовательские почтовые ящики
Большие пользователи почты часто хотят работать с многими почтовыми ящиками, в которых входящая почта сортируется автоматически. Популярный способ обработать это - разрешить пользователям использовать несколько адресов отправителя, таким образом, ответы могут быть легко идентифицированы. Для этой цели, пользователям разрешают добавлять преффиксы или суффиксы к их локальным частям. Для этой цели могут быть использованы средства групповых символов общих опций роутера -
“
local_part_prefix
” и
“
local_part_suffix
”. Например, рассмотрите такой роутер:
userforward:
driver = redirect
check_local_user
file = $home/.forward
local_part_suffix = -*
local_part_suffix_optional
allow_filter
|
Он запускает пользовательский файл
“
.forward
” для всех локальных частей формы
“
username-*
”. В пределах файла фильтра, пользователь может различать различные случаи путём проверки переменной
“
$local_part_suffix
”. Например:
if $local_part_suffix contains -special then
save /home/$local_part/Mail/special
endif
|
Если файл фильтра не существует, или не имеет дело с такими адресами, они передаются следующим маршрутизаторам, и, предполагая, что далее не используется опция
“
local_part_suffix
”, они, по видимому, будут неудачны. Таким образом, пользователь может контролировать, какие суффиксы являются действительными.
Альтернативно, суффикс может использоваться для вызова другого файла
“
.forward
” - который является способом воплощения подобного средства в другом MTA:
userforward:
driver = redirect
check_local_user
file = $home/.forward$local_part_suffix
local_part_suffix = -*
local_part_suffix_optional
allow_filter
|
Если нет никакого суффикса, используется
“
.forward
”; если суффикс -
“
-special
”, например, используется
“
.forward-special
”. Ешё раз, если соответствующий файл не существует, или не имеет дела с адресом, он передаётся последующим роутерам, которые, если требуется, ищут неполный файл
“
.forward
” для использования как дефолтового.
46.9 Упрощённая обработка отпуска (vacation)
Традиционный способ запуска программы
“
vacation
” для пользователей - установить команду трубы в файле
“
.forward
” (для деталей синтаксиса, смотрите раздел 26.6). Это распространённая ошибка у неопытных пользователей. Есть две особенности exim`a, которые могут быть использованы для упрощения этого процесса для пользователей:
Преффикс локальной части, типа
“vacation-
”, может быть задан для в роутере, который используется для непосредственной доставки сообщений к программе
“
vacation
”, или, альтернативно, может использоваться транспорт exim`a
“
autoreply
”. Тогда, содержимое пользовательского файла
“
vacation
”, намного более простое. Например:
Общая опция роутеров,
“
require_files
”, может использоваться для вызова доставки отпуска (:) - прим. lissyara), путём проверки существования определённого файла в домашнем каталоге пользователя. Также должна использоваться общая опция
“
unseen
”, для гарантии, что произойдёт оригинальная доставка. В этом случае, все использующие это пользователи, должны создать файл, называемый, скажем
“
.vacation
”, содержащий сообщение о отпуске.
Другое преимущество обоих этих методов состоит в том, что они оба работают даже когда пользователям запрещено использование произвольных труб.
46.10 Отбор копий сообщений
Некоторые инсталляции требуют, чтобы была сделана полная архивная копия всех сообщений. Одна копия каждого сообщения может быть легко взята путём соответствующей команды в системном фильтре, который мог бы, например, использовать для каждого дня разные файлы.
Также, есть теневой транспортный механизм, который может использоваться для отбора копий сообщения, которые успешно доставлены локальными транспортами, одна копия на доставку. Это может использоваться, кроме прочего, для осуществления автоматического уведомления о доставке, сайтам (серверам - прим. lissyara) которые наставивают на таких вещах.
46.11 Периодически подключенные хосты
Для хостов, стало весьма обычным (опскольку дешевле), подключаться к интернету периодически, а не всё время быть подключенными. Обычная настройка для таких хостов - что поста для них накапливается на системе постоянно соединенённой с интернетом.
Exim был разработан для использованя на постоянно подключенных хостах, и, таким образом, не особенно подходит для использования на периодически подключаемых хостах. Однако, есть особенности, которые могут использоваться.
46.12 Exim на вышестоящих серверных хостах
Exim принимает меры, чтобы входящая почта для периодически подключаемых хостов оставалася в очереди exim`a, пока клиент не подключится. Однако, этот подход не очень хорошо масштабируется. Два различных вида ожидания сообщения смешиваются в одной очереди - те, которые нельзя доставить из-за каких-то вреемнных проблем, и тех, которые ждут соединения их хоста предназначения. Это делает тяжёлым управление очередью, так же как и растрату ресурсов, поскольку каждый обработчик очереди сканирует всю очередь.
Лучший подход состоит в отделении тех сообщений, которые ждут временно подключаемых хостов. Это может быть сделано путём доставки этих сообщений в локальные файлы пакетного SMTP,
“mailstore
”, или иной формат сохраняющий конверт, из которого они передаются путём иного программного обеспечения к их месту назначения. Это облегчает сборку всей почты для одного хоста в одной директории, и применения правил локального таймаута на основании сообщений, если требуется.
Для очень небольшого масштаба, можно сделать чтобы exim оставлял почту в очереди. Если вы это делаете, вы должны сконфигурировать exim с длинным периодом повтора для временно подключенных хостов. Например:
cheshire.wonderland.fict.example * F,5d,24h
|
Этим останавливается множество неудачных попыток доставки, но exim запоминает какие сообщения находились в очереди для этого хоста. Как только непостоянный хост появляется в сети, принудительная доставка одного сообщения (или используя опции
“
-M
” или
“
-R
”, или путём использования команды ETRN SMTP (смотрите раздел 44.8)) вызывает доставку всех находящихся в очереди сообщений, часто - по одному соединению. Когда хост остаётся на связи, любые новые сообщения доставляются немедленно.
Если подключающиеся хосты не имеют фиксированного IP-адреса, т.е. хост появляется каждый раз с различным IP-адресом, механизмы повтора на хосте-владельце (почты - прим. lissyara) запутываются, поскольку IP-адрес, обычно, используется как часть ключевой строки для информации повторов. Этого можно избежать, путём сброса
“
retry_include_ip_address
” в
“
smtp
” транспорте. Так как это неудобно для хостов постоянно связанных с интернет, для периодически связанных хостов лучше организовать отдельный транспорт.
46.13 Exim на периодически подключаемом клиентском хосте
Значение
“
smtp_accept_queue_per_connection
”, вероятно, должно быть увеличено, или даже установленов ноль (т.е. отключено) на периодически подключаемых хостах, для того, чтобы все входящие сообщения немедленно отсылались по одному соединению.
Почта ожидающая отсылки с периодически подключаемого хоста, вероятно, не будет роутится, поскольку без соединения с DNS, поиски невозможны. Это означает, что нормальная обработка очереди завершаетс за время соединения, каждое сообщение, вероятно, будет отправлено в отдельной SMTP-сессии. Этого можно избежать, путём запуска обработки очереди с опциями командной строки, начинающимися с
“
-qq
” вместо
“
-q
”. В этом случае, очередь сканируется дважды. В первый проход, завершается роутинг, но доставки не происходит. Во второй проход - нормальная обработка очереди; так как все сообщения предварительно были сроучены, то предназначенные для одного и того же хоста, вероятно, будут отосланы в одном SMTP соединении.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
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`овых привилегий.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
50. Монитор exim`a
Монитор exim`a - приложение, которое показывает в оконной системе X информацию о состоянии очереди exim`a, и о том, что exim делает. Административный пользователь может выполнять определённые операции с сообщениями из интерфейса GUI; однако, все эти средства доступны из командной строки, и действительно, монитор использует командную строку для выполнения запрошенных действий.
50.1 Запуск монитора
Монитор запускается путём запуска скрипта, с именем
“
eximon
”. Это - скрипт shell, устанавливающий несколько переменных окружения, и, затем, запускающий бинарник с именем
“
eximon.bin
”. Дефолтовый внешний вид окна может быть изменён путём редактирования файла
“
Local/eximon.conf
” созданного путём редактирования
“
exim_monitor/EDITME
”. Комментарии в этом файле описывают для чего какие параметры.
Параметры которые заданы в скрипте
“
eximon
” могут быть перезаданы для специфического запроса, путём установки перемнных окружения с теми же именами, с предшествующим EXIMON_. Например, команда шелл, типа
EXIMON_LOG_DEPTH=
400
eximon
|
(для Bourne-совместимого шелла) запускает
“
eximon
” с перезаданным параметром LOG_DEPTH. Если в окружении задана EXIMON_LOG_FILE_PATH, она перезадаёт конфигурацию файлов логов exim`a. Это делает возможным просматривать
“
eximon
” данные логов, которые записаны в syslog, при условии, что MAIL.INFOсообщения syslog роутятся в файл на локальном хосте.
Ресурсы X могут использоваться для изменения появления окна обычным способом. Например, установка ресурса формы
Eximon*background: gray94
|
изменяет цвет фона бэкгроунда на светло-серый, вместо белого. Пропущенные графики (вообще, тут применено слово stripcharts - но на описанном месте - графики... - прим. lissyara) искажаются с обоими строками данных, и строками ссылок в чёрном. Это означает, что ссылающиеся строки не видимы когда они выше денных. Однако, их цвета могут быть изменены путём установки ресурса с именем
“highlight
” (странное имя, но это то, что используется виджетом графиков Athena). Например, если ваш X сервер работает под UNIX, вы могли бы установить более светлые строки ссылок в графиках, путём
xrdb -merge <<End
Eximon*highlight: gray
End
|
Чтобы увидеть содержимое сообщений в очереди, и оперировать ими,
“
eximon[/]
” ими нужно запускать от root`a или административного пользователя.
Окно монитора резделено на три части. Первая содержит один или несколько графиков, и две кнопки, второе содержит
“tail
” файла главного лога, и третье показывает очередь сообщений ожидающих доставки, с двумя кнопками. Следующие секции описывают различные отображаемые части.
50.2 Графики
Первый график - это всегда чётчик сообщений в очереди. Его имя может быть сконфигурировано путём установки QUEUE_STRIPCHART_NAME в файле
“[i]Local/eximon.conf
”. Оставшиеся графики задаются в конфигурационном скрипте путём регулярного выражения, совпадающего с вхождениями фала лога, делая возможным отображение, например, графика доставленных к определённым хостам сообщений, или использующих определённые транспорты. Графики предоставленные по дефолту - переданных и доставленных сообщений, локальных и SMTP доставок. Дефолтовый период между обновлениями графиков - одна минута; это может быть отрегулировано путём патаметра в файле
“
Local/eximon.conf
”.
Графики самосоятельно автоматически перемасштабируются, как только изменяется отображаемое значение. В каждой диаграмме всегда есть 10 горизонтальных линий; строка заголовка указывает значение каждого делителя, когда он более одного. Например,
“x2
” означает, что каждое деление имеет значение - 2.
Также возможен график, который показывает процент заполненности дискового раздела, что полезно, когда локальные доставки ограничены одним разделом.
Он рассчитывает на доступность функции
“
statvfs()
”, или эквивалентной, в системе. Большинство, но не все версии UNIX поддерживающие exim, имеют её. Для этого специфического графика, его вершина всегда будет 100%, и масштаб даётся как
“x10%
”. Эта диаграмма конфигурируется путём установки SIZE_STRIPCHART и (опционально) SIZE_STRIPCHART_NAME в файле
“
Local/eximon.conf
”.
50.3 Кнопки главного действия
Ниже графиков находятся кнопка для выхода из монитора. Рядом с ней, кнопка помеченная
“Size
”. Они располагаются тут так, чтобы уменьшая окно до дефолтового минимального размера, оставались видимы лишь счётчик очерееди и эти две кнопки. Нажатие кнопки
“Size
” вызывает разворачивание окна до его максимального размера, если оно ещё не максимальное, в случае чего оно минимизируется.
Раскрываясь до максимума, если окно не может быть полностью видимо там где оно находится в настоящее время, оно двигается туда, где было в последний раз, когда было полного размера. Когда оно раскрывается из минимального размера, старая позиция запоминается, и в следующий раз, при уменьшении, оно двигается обратно.
Идея в том, что вы можете оставить уменьшенное окно, показывающее один или два графика в удобном месте вашего экрана, легко раскрывая, когда необходимо для показа полного окна, и снова легко сворачивая к прежнему размеру и месту. Идея скопирована с оконнлшл менеджера
“
twm
”, который делает это действием
“
f.fullzoom
”. Минимальный размер окна может быть изменён путём установки значений MIN_HEIGHT и MIN_WIDTH в
“
Local/eximon.conf
”.
Обычно, монитор запускается с окном полного размера, но он может быть собран так, чтобы он запускался с окном минимального размера, путём установки START_SMALL=yes в
“
Local/eximon.conf
”.
50.4 Показ логов
Вторая секция окна - область в которой показывается конец файла главного лога. Для уменьшения места на экране, штамп времени каждого лога укорочен, путём удаления даты, и, если установлена
“
log_timezone
”, временной зоны. Просмотр конца логов недоступен, когда единственным местоназаначением для логгинга является syslog, исключая случай когда syslog направляет логи в локальный файл, чьё имя передаётся
“
eximon[/]
” через переменную окружения EXIMON_LOG_FILE_PATH.
Субокно логов имеет полосу прокрутки, в левой стороне, которая может использоваться для возврата назад, чтобы посмотреть более ранний текст, и клавиши вверх и вниз также приводят к эффекту прокрутки. Количество сохраняемых логов зависит от установки LOG_BUFFER в
“[i]Local/eximon.conf
”, определяющем используемое количество памяти. Когда она заполняется, отбрасываются 50% наиболее старых - это гораздо эффективнее, чем делать это построчно. Субокно, также, имеет полосу горизонтальной прокрутки, лоя доступа к концу длинных строк логов. Это - единственное средство горизонтальной прокрутки, правые и левые курсорные клавиши - недоступны. Текст в этой части окна может быть скопирован, используя мышь обычным способом. Размер этого субокна контролируется параметрами конфигурационного файла
“
Local/eximon.conf
”.
Поиск текста, в окне логов, может быть сделан путём нажатия
“^R
” и
“^S
”, которые, по умолчанию, обратный и прямой поиск, соответственно. Поиск охватывает лишь показанный в окне текст. Он не может двигаться дальше по логам.
Точка с которой начинается поиск обозначена знаком крышки (
“^
”). Обычно, это конец текста в окне, но он может быть явно помещён указывая и кликая левую кнопку мыши, и автоматически перемещается при успешном поиске. Если в окне появляется новый текст, когда оно прокручивается назад, крышка остаётся на месте, но если окно назад не прокручивается, крышка двигается до конца нового текста.
Нажатие
“^R
” и
“^S
” вызывает всплывающее окно, в котором может быть введён искомый текст. В нём есть кнопки для выбора - прямой или обратный поиск, для выполнения поиска и отмены. Если нажата кнопка
“Search
”, происходит поиск и окно остатёся таким образом, чтобы можно было производить дальнейшие поиски. Если нажата кнопка
“Return
”, завершается один поиск и окно закрывается. Если нажато
“^C
”, поиск отменяется.
Средство поиска осуществлено используя средства текстовых виджетов Athena. По умолчанию, это всплывающее окно содержит обе опции -
“search
” и
“replace
”. Для подавления нежелательной для
“
eximon[/]
” части
“replace
”, с exim`ом посталяется модифицированная версия виджета
“
TextPop
”. Однако, линковщики BSDI и HP-UX неспособны обработать предоставленную внешне версию
“
TextPop
”, когда оставшиеся части текстового виджета берутся из стандартной библиотеки. Компиляционная опция EXIMON_TEXTPOP может быть сброшена, для отключения модифицированного
“
TextPop
”, позволяя собирать
“[i]eximon[/]
” на этих системах, за счёт наличия нежелательных пунктов во всплывающем окне поиска.
50.5 Отображение очереди
Нижняя секция окна монитора содержит список всех сообщений в очереди, которые включают те, которые в данный момент получаются или доставляются, как и ждущие доставки. Размер этого субокна управляется параметрами в конфигурационном файле
“[i]Local/eximon.conf
”, и, частотой обновления, управляет другой параметр того же файла - по умолчанию - 5 минут, т.к. сканирование очереди может быть весьма накладным. Однако, есть кнопка
“Update
”, которая может использоваться для обновления отображения очереди в любой момент времени.
Когда хост некоторое время лежит, для него может собраться много ожидающей почты, и может быть трудным иметь дело с другими сообщениями в очереди. Для помощи в этой ситуации, есть кнопка рядом с
“Update
”, с именем
“Hide
”. Если она нажата, появляется оконо с диалогом
“Hide addresses ending with
”. Если вы введёте что-либо в него, и нажмёте
“Return
”, текст добавится к цепочке такх текстов, и если каждый недоставленный адрес в сообщении совпадает с одним из этих текстов, сообщение не показывается.
Если есть адрес, который не совпадает с каким бы то ни было текстом, все адреса показываются как обычно. Совпадение происходит с концом адресов, таким образом, например,
“
cam.ac.uk
” определяет все адреса в Cambridge, тогда как
“
xxx@foo.com.example
” задаёт лишь один специфический адрес. Когда настроено какое-либо сокрытие, отображается конпка с именем
“Unhide
”. Если нажать, она отменяет все сокрытия. Также, для гарантии, что скрытые сообщения не будут забыты, запрос на скрытие автоматически отменяется через час.
Когда показан диалог, вы не можете нажать какую либо кнопку, или ещё что-то сделать в окне монитора. Поэтому, если вы хотите вырезать текст показываемой очереди для использования в диалоге, вы должны его скопировать до нажатия кнопки
“Hide
”.
Отображение очереди содержит, для каждого нескрытого сообщения в очереди, период времени который оно находится в очереди, размер сообщения, идентификатор сообщения, отправителя сообщения, и первого недоставленного получателя, всё в одной строке. Если это - рикошет, отправитель показывается как
“<>
”. Если в нём более одного получателя которому ещё не доставлено сообщение, последующие перечислены в дополнительных строках, до максимального сконфигурированного числа, следом за которым показан эллипс. Получатели, которые уже получили сообщение, не отображаются.
Если сообщение заморожено, в левой стороне показывается звёздочка.
У показа очереди есть вертикальная прокрутка, также оно может быть прокручено при помощи курсорных клавиш. Текст может быть скопирован, используя мышь обычным способом. Средства поиска по тексту, как описано выше, для окна логов, также доступны, но символ вставки всегда перемещается до конца текста, когда обновляется отображение очереди.
50.6 Меню очереди
Если удерживается клавиша
“
shift
”, и кликается левая клавиша когда курсор мыши над текстом любого сообщения, всплывает меню действия, и первая строка очереди для сообщения подсвечивается. Это не имеет эффекта для любого выбранного текста.
Если вы хотите использовать какое-то другое событие для всплывающего меню, вы можете задать паметр MENU_EVENT в
“
Local/eximon.conf
” для изменнеиея значения по умолчанию, или установить переменную окружения EXIMON_MENU_EVENT до запуска монитора. Значение устанавливаемое в этот параметр - стандартное примечение события X. Например, для запуска eximon используя
“
ctrl
” вместо
“
shift
”, вы можете использовать:
EXIMON_MENU_EVENT='Ctrl<Btn1Down>' eximon
|
Заголовок меню - идентификатор сообщения, и он содержит следующие записи:
“
message log
”: Содержимое лога сообщений для сообщения показывается в новом текстовом окне.
“
headers
”: Информация из файла спула, которая содержит информацию конверта и заголовки, показанную в новом окне. Смотрите раздел 52, для описания формата файлов спула.
“
body
”: Содержимое файла спула, содержащее тело сообщения, показывается в следующем окне. лимит по умолчанию - 20000 байт, для отображаемых данных. Он может быть изменён путём установки опции BODY_MAX при компиляции, или опции EXIMON_BODY_MAX во время работы.
“
deliver message
”: Вызов exim`a делается используя опцию
“
-M
”, для запроса доставки сообщения. Это вызывает автоматическое оттаивание, если сообщение заморожено. Также, установлена опция
“
-v
”, и вывод exim`a показывается в новом текстовом окне. Доставка запускается в отдельном процессе, для избежания удержания окна монитора пока происходит доставка.
“
freeze message
”: Вызывается exim с использованием опции
“
-Mf
”, для запроса заморозки сообщения.
“
thaw message
”: Вызывается exim с использованием опции
“
-Mt
”, для запроса оттаивания сообщения.
“
give up on msg
”: Вызывается exim с использованием опции
“
-Mg
”, для запроса exim`a, чтобы он попробовал доставить сообщение. Для любых осташихся недоставленных адресов генерится рикошет.
“
remove message
”: Вызывается exim с использованием опции
“
-Mrm
”, для запроса удаления сообщения из системы без генерации рикошета.
“
add recipient
”: Показывается диалоговое окно, в которое может быть введён адрес получателя. Если адрес не квалифицирован, и в
“
Local/eximon.conf
” установлен параметр QUALIFY_DOMAIN, адрес квалифицируется с заданным доменом. Иначе, должен быть введён полностью квалифицированный адрес. Нажатие RETURN вызывает exim для использования с опцией
“
-Mar
”, для запроса добавления дополнительного получателя к сообщению, если же поле ввода пусто, никаких действий не предпринимается.
“
mark delivered
”: Отображается окно диалога в котором может быть введён адрес получателя. Если адрес не квалифицирован, и в
“
Local/eximon.conf
” установлен параметр QUALIFY_DOMAIN, адрес квалифицируется с заданным доменом. Иначе, должен быть введён с полностью квалифицированный адрес. Нажатие RETURN вызывает exim с использованием опции
“
-Mmd
” для пометки занного адреса получателя как уже доставленного, если же поле ввода пусто, никаких действий не предпринимается.
“
mark all delivered:
”: Вызывает exim с использованием опции
“
-Mmad
”, для пометки всех адресов получателей как уже доставленных.
“
edit sender
”: Окно диалога инициализируется с текущим адресом отправителя. Нажатие RETURN вызывает exim с использованием опции
“
-Mes
” для замены адреса отправителя, если же поле ввода пусто, никаких действий не предпринимается. если вы хотите использовать пустой адрес отправителя (как в рикошете), вы должны задать
“<>
”. Иначе, если адрес не квалифицирован, и в
“
Local/eximon.conf
” установлен параметр QUALIFY_DOMAIN, адрес квалифицируется с заданным доменом.
Когда доставка форсируется, показывается окно с выводом
“
-v
”. В других случаях, когда сделан вызов exim`a, если есть какой-либо вывод из exim`a (в частности, если команда неудачна), показывается окно, содержащее команду и вывод. Иначе, результат действия, обычно, очевиден из показа логов и очереди. Однако, если вы установите в
“
Local/eximon.conf
” опцию ACTION_OUTPUT=yes, окно, отображающее что делает exim открывается всегда, даже если вывод не генерится.
Отображение очереди автоматически обновляется для действий типа заморозки и оттаивания, если не задана ACTION_QUEUE_UPDATE=no в
“
Local/eximon.conf
”. В этом случае, может использоваться кнопка
“Update
” для принудительного обновления после обного из этих действий.
В любом текстовом окне, которое показывает результат действия меню, доступны обычные средства - копировать-вставить, и может быть выполнен поиск, используя
“^R
” и
“^S
”, как описано выше, для окна просмотра хвоста логов.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
51. Обсуждение безопасности
Эта глава обсуждает множество проблем связанных с безопасностью, некоторые из которых также охвачены в других частях этого руководства.
По причинам, которые автор не понимает, некоторые люди продвигают exim как
“особенно безопасный
” почтовый сервер. Возможно - из-за существования этой главы документации. Однако, цель главы - просто описать способы работы exim`a относительно проблем безопасности, а не сделать утверждения относительно эффективности его безопасности в сравнении с другими MTA.
То, что следует далее - описание того, каким exim должен быть. Наибольшие усилия были направлены на попытку гарантировать, что код соответствует теории, но отсутствие ошибок гарантировать нельзя. Любая о которой сообщено, будет исправлена как только возможно.
51.1 Сборка более
“защищённого
” exim`a
Есть несколько компиляционных опций, которые могут быть установлены в
“
Local/Makefile
”, для создания более
“защищённого
” от атак exim`a, в частности от жуликоватых администраторов exim`a, которые не владеют паролем root`a, или кого-то, кто проник через аккакунт exim`a (но не root`a). Эти опции таковы:
“ALT_CONFIG_PREFIX
” - может быть установлена в строку, которая должна совпадать с началом любых имён файлов используемых с опцией
“
-C
”. Когда она установлена, этим именам файлов, также, не разрешается содержать последовательность
“/../
”. (Однако, если значение опции
“
-C
” идентично со значением CONFIGURE_FILE в
“
Local/Makefile
”, exim игнорирует
“
-C
” и работает как обычно.) Для
“
ALT_CONFIG_PREFIX
” нет значения по умолчанию.
Если разрешённые конфигурационные файлы ограничены директорией к которой имеет доступ только root, это предохраняет тех, кто взломал аккаунт exim`a от работы с произвольным конфигурационным файлом, и использования его для взлома других аккаунтов.
“ALT_CONFIG_ROOT_ONLY
” - если она задана, привилегии root`a сохраняются для опций
“
-C
” и
“
-D
” лишь если вызывающий exim - root. Без этого, пользователь exim`a также может использовать
“
-C
” и
“
-D
” и сохранять привилегии. Установка этой опции блокирует возможность тестирования конфигурации используя
“
-C
” напрямую через приём и доставку сообщения, если вызывающий - root. Приём работает, но к этому времени exim работает как пользователь exim`a, таким образом, когда он перезапускается для восстанавления привилегий для доставки, использование
“
-C
” вызывает потерю привилегий. Однако, root может тестировать приём и доставку используя две раздельные команды. По умолчанию, ALT_CONFIG_ROOT_ONLY не установлена.
“DISABLE_D_OPTION
” - если задана, отключено использование
“
-D
” в командной строке.
“FIXED_NEVER_USERS
” - может быть установлена в список пользователей, разделённый двоеточиями, которые никогда не могут использоваться для доставки. Это похоже на рабочую опцию
“
never_users
”, но не может быть перезадана; рабочая опция добавляет дополнительных пользователей в этот список. Дефолтовая установка -
“root
”; это предотвращает не-root`овых пользователей, кому разрешено изменять файл рабочей конфигурации, от использования exim как способ получить root`овые привилегии.
51.2 root`овые привилегии
На бинарник exim`a, обычно, установлен бит setuid на root`a, что означает, что в начале выполнения он получает root`овые привилегии (работает от root). В некоторых специальных случаях (например, когда не используется даемон, и нет локальных доставок), возможно запускать exim с setuid на иного пользователя, чем root. Это обсуждается в следующей секции. Однако, в большинстве инсталляций, root`овые привилегии требуются по двум причинам:
Для установления соединения сокета на стандартный порт SMTP (25) при инициализации слушающего даемона. Если exim запускается из
“
inetd
”, это привелигированное действие не требуется.
Чтобы быть в состоянии изменить uid и gid для чтения пользовательских файлов
“
.forward
”, и выполнения локальных доставок от получающего пользователя или как задано в конфигурации.
Не требуется root`овых привилегий для ещё чего-то, что делает exim, типа получения сообщений и доставки их наружу через SMTP, и очевидно, более безопасно, если exim не работает от root`a кроме случаев, когда это необходимо. Поэтому, пользователь и группа exim`a должны быть заданы в
“
Local/Makefile
”. Они известны как
“the Exim user
” и
“the Exim group
”. Их значения могут быть изменны в рабочей конфигурации, хотя это не рекомендуется. Часто используется пользователь с именем
“
exim
”, но некоторые сервера используют вместо него
“
mail
” или другой имя пользователя.
Exim использует
“
setuid()
” каждый раз, когда он сбрасывает привилегии root`a. Это - постоянное сложение полномочий; впоследствии, процесс не может восстановить привлегии. До релиза 4.00,
“
setuid()
” использовалась в некоторых обстоятельствах, но больше такого не имеет места.
После того, как новый процесс exim`a интерпретировал опции своей командной строки, он изменяет uid и gid в следующих случаях:
Если используется опция
“
-C
” для задания альтернативного конфигурационного файла, или bcgjkmpetncz опция
“
-D
” для определения макрозначения для конфигурации, и вызывающий процесс не запущен как root или пользователь exim`a, uid и gid изменяются на заданные вызывающим процессом. Однако, если в
“
Local/Makefile
” задана ALT_CONFIG_ROOT_ONLY, лишь вызывающий root может использовать
“
-C
” и
“
-D
” без потери привилегий, и если задана DISABLE_D_OPTION, опция
“
-D
” не может использоваться вообще.
Если используется опция тестирования раскрытия (
“
-be
”), или одна из опций тестирования фильтра (
“
-bf
” или
“
-bF
”), uid и gid изменяются на таковые из вызывающего процесса.
Если процесс - не процесс даемона, и не процесс обработчика очереди, или процесс доставки, или процесс тестирования роутинга адреса (запущенный с
“
-bt
”), uid и gid изменяются на пользователя и группу exim`a. Это означает, что при получении сообщений exim всегда работает под своим собственным uid и gid. Это также применяется когда тестируется проверка адреса (опция
“
-bv
”), и тестируется политика входящих сообщений (опция
“
-bh
”).
Для даемона, обработчика очереди, доставки, или процесса тестирования адресов, на данном этапе uid остаётся root, но gid изменяется на группу exim`a.
Процессы, которые изначально сохраняют root`овые привилегии, ведут себя следующим образом:
Процесс даемона изменяет gid на группу exim`a и uid на пользователя exim`a после установки одного или нескольких слушающих сокетов. Вызывается функция
“
initgroups()
”, таким образом, чтобы если пользователь exim`a находится в каких-то дополнительных группах, они использовались в процессе доставки.
Процесс обработчика очереди сохраняет привилегии root`a в процессе выполнения. Его работа - запустить контролируемую последовательность процессов доставки.
Процесс доставки сохраняет привилегии root`a в большинстве своих выполнений, но любые актуальные доставки (т.е. - непосредственно транспорты) запускаются в субпроцессах, которые всегда изменяются на не-root`овые uid и gid. Для локальных доставок, это, обычно, uid и gid владельца почтового ящика; для удалённых доставок, используются uid и gid пользователя exim`a. Как только все субпроцессы доставки запущены, процесс доставки изменяется на uid и gid exim`a, пока производятся последоставочные работы, типа обновления БД повторов, и генерации рикошетов и предупреждающих сообщений.
Когда роутятся адреса получателей сообщения, процес доставки работает от root`a. Однако, если обрабатывается пользовательский файл фильтра, он завершается в субпроцессе который работает под индивидуальным пользовательским gid и uid. Системный фильтр запускается от root`a, если не задана
“
system_filter_user
”.
Проверяющий адреса процесс (опция
“
-bt
”), запускатеся от root`a, таким образом роутинг делается в том же окуржении, что и доставка сообщения.
51.3 Работа exim без привилегий
Некоторые инсталляции любят запускать exim под непривилигированным пользователем, для дополнительной безопасности. Поддержка для этого режима предоставляется путём глобальной опции
“
deliver_drop_privilege
”. Когда она установлена, uid и gid изменяются на пользователя и группу exim`a в начале процесса доставки (и, также, обработчик очереди и процесс тетстирования адресов). Это означает, что роутинг адресов не работает от root`a, и сами доставки не могут измениться на иной uid.
Оставление на бинарнике setuid на root`a, но установка
“
deliver_drop_privilege
” означает, что даемон всё ещё может запуститься обычным способом, и он может корректно ответить на SIGHUP, поскольку перевызов восстанавливает привилегии root`a.
Альтернативный подход состоит в том, чтобы сделать exim setuid на пользователя exim`a, и, также, сделать его setgid на группу exim`a. Если вы сделаете это, даемон должен запускаться с root`овыми правами. (Вызов exim`a из процесса root`a заставляет его вести себя так, как он себя ведёт когда setuid на root.) Однако, даемон не может перезапуститься после сигнала SIGHUP, поскольку он не может восстановить привилегии.
В этом случае, всё ещё полезно установить
“
deliver_drop_privilege
”, поскольку это помещает exim`y повторно перевызвать самого себя, для проведения доставки после получения сообщения. Такой перевызов - растрата ресурсов, поскольку он не имеет эффекта.
Если перезапуск даемона - не проблема (например, если установлен
“
mua_wrapper
”, или вместо даемона используется
“
inetd
”), обладание бинарником setuid на пользователя exim кажется совершенным подходом, но есть одно осложнение:
В этом стиле действия, exim работает с реальным uid и gid, установленным к тем же что и увызывающего процесса, и эффективный uid/gid установлен в значения exim`a. Идеально, любая ассоцииация с uid/gid вызывающего процесса должан быть отброшена, т.е. реальный uid/gid должен быть сброшен в эффективные значения, чтобы отказаться от любых привилегий, которые мог иметь вызывавший. Некоторые операционные системы обладают функцией, которая разрешает это действие для не-root`ового эффективного uid, но многие её не имеют. Из-аз этой недостаточной стандартизации, exim не обращается к этой проблеме в настоящее время.
Поэтому, рекомендованный подход для
“совсем непривелигированного
” запуска состоит в том, чтобы оставить бинарник exim`a setuid на root, и установить
“
deliver_drop_privilege
”. Это, также, имеет преимущество - разрешение работы даемона прямым способом.
Если вы конфигурируете exim не начинать процесс доставки от root`a, есть множество ограничений на то, что вы можете сделать:
Вы можете доставлять лишь как пользователь/группа exim`a. Вы должны явно использовать опции
“
user
” и
“
group
” для перезадания роутеров и локальных транспортов которые обычно доставляют под получателем. Этим удостоверяется, что конфигурация работающая в этом режиме работает точно таким же способом как ив обычном режиме. Любое явное или неявное задание другого пользователя вызывает ошибку.
Использование файлов
“
.forward
” строго ограничено, так что, обычно, не стоит их включать в конфигурацию.
Пользователи использующие
“
.forward
” должны сделать чтобы их домашний каталог был доступен пользователю exim`a. Трубы и добавления в файл, и их эквививаленты в фильрах exim`a, не могут использоваться. Можно было бы включить их под пользователем exim`a, что небезопасно и не очень полезно.
Если не все локальные почтовые ящики принадлежат пользователю exim`a (возможно в некоторых окружениях использующих только POP3 или IMAP):
1. Они должны принадлежать группе exim`a и у этой группы должно быть право записи в них. Это подразумевает, что вы должны установить
“
mode
” в конфигурации
“appendfile
”, так же как режим для самих почтовых ящиков.
2. Вы должны установить
“
no_check_owner
”, поскольку большинство или все файлы не будут принадлежать пользователю exim`a.
3. Вы должны установить
“
file_must_exist
”, поскольку exim не может корректно установить владельца новых создаваемых почтовых ящиков, когда у него нет привилегий. Также это подразумевает, что новые почтовые ящики необходим создавать вручную.
Эти ограничения строго ограничивают то, что может быть сделано в локальных доставках Однако, они не оказывают влияния на удалённые доставки. Если вы запускаете шлюз, не делающий локальных доставок, установка
“
deliver_drop_privilege
” не добавляет безопасности.
Если вы используете средство
“
mua_wrapper
” (смотрите раздел 47), опция
“
deliver_drop_privilege
” обязательно должна быть истинной.
51.4 Доставка в локальные файлы
Полная детализация проверок применяемых путём
“
appendfile
” до записи в файл даны в главе 26.
51.5 Источник роутинга IPv4
Много операционных систем подавляют пакеты IP маршрутизации источника в ядре, но некоторые не делают этого, таким образом, exim производит свою собственную проверку. Он логгирует входящие вызовы TCP маршрутизации источника IPv4, и, затем, обрывает их. Это отличается от IPv6. В настоящее время, никакой специальной проверки не делается.
51.6 Команды VRFY, EXPN, и ETRN в SMTP
Поддержка этих SMTP команд по умолчанию отключена. Если требуется, они могут быть включены путём задания подходящих ACL.
51.7 Привелигированные пользователи
Exim распознаёт два набора пользователей со специальными привилегиями. Доверенные пользователи имеют возможность локально посылать новые сообщения exim`y, подставляя их собственные адреса отправителя и информацию о хосте отсылки. Для других пользователей посылающих локальные сообщения, exim устанавливает адрес отправителя из uid, и не позволяет задавать удалённый хост.
Однако, недоверенным пользователям разрешено использовать опцию командной строки
“
-f
”, в специальной форме
“
-f <>
”, для индикации, что неудача доставки не должна вызвать отчёт о ошибке. Это затрагивает конверт сообщения, но не затрагивает заголовок
“
Sender:
”. Недоверенным пользователям также может быть разрешено использовать специфическую форму адресов с опцией
“
-f
”, путём установки опции
“
untrusted_set_sender
”.
Доверенные пользователи используются для запуска процессов которые получают почтовые сообщения с одних почтовых доменов и передают их exim`y для их локальной доставки, или через интернет. Exim доверяет вызывающему работающему от root`a, от пользователя exim`a, или под любым пользователем перечисленным в конфигурационной опции
“
trusted_users
”, или под любой группой перечисленной в опции
“
trusted_groups
”.
Административным пользователям разрешено производить действия над сообщениями в очереди exim`a. Они могут замораживать или оттаивать сообщения, вызывать их возвращение к их отправителю, полностью удалять их, или модифицировать их различными способами. Дополнительно, административные пользователи могут запускать монитор exim`a и видеть всю информацию которую он может предоставить, включая содержимое файлов спула.
По умолчанию, использование опций
“
-M
” и
“
-q
”, вызывающих exim для попытки доставить сообщения в его очереди, ограничено административными пользователями. Это ограничение может быть ослаблено путём установки опции
“
no_prod_requires_admin
”. Точно также, использование
“
-bp
” (и её вариантов) для получения списка содержимого очереди, также ограничено административными пользователями. Это ограничение может быть ослаблено путём установки опции
“
no_queue_list_requires_admin
”.
Exim распознаёт административного пользователя если вызывающий процесс запущен как root или как пользователь exim`a, или любая группа ассоциированная с процессом - группа exim`a. Нет необходимости фактически работать от группы exim`a. Однако, если административные пользователи не являющиеся root`ом или пользователем exim`a должны получить доступ к содержимому файлов spool`a через монитр exim`a (который работает непривелигированным), exim должен быть собран с разрешением группе доступа на чтение к его файлам спула.
51.8 Файлы спула
Директория спула exim`a, и всё что она содержит, принадлежит пользователю exim`a и его группе. Режим файлов спула задаётся в конфигурационном файле
“
Local/Makefile
”, и по умолчанию - 0640. Это означает, что любой, кто является пользователем группы exim`a может получить доступ к этим файлам.
51.9 Использование argv[0]
Exim проверяет последний компонент
“
argv[0]
”, и если он совпадает с одной из установленных специфических строк, exim предполагает определённые опции. Например, вызов exim с последним компоненом
“
argv[0]
” установленным в
“rsmtp
” - точный эквивалент его вызова с опцией
“
-bS
”. Никаких значенией безопасности в этом нет.
51.10 Использование форматирования %f
Единственное использование сделанное exim`ом с использованием
“%f
” - форматирование значений средней загрузки. Фактически они сохранены в цифровых переменных как 1000 времён средней загрузки. Следовательно, их диапазон ограничен, и поэтому - это длина конвертированного вывода.
51.11 Встроенные пути exim`a
Exim использует своё собственное имя пути, которое встроенно в код, лишь когда ему необходимо перезапуститься для восстановления root`овых привилегий. Поэтому, он не работает от root`a, когда это делает. Если бы какая-то ошибка позволила перезадать путь, это привело бы к запуску произвольной программы от root`a, а не exim`a.
51.12 Использование
“
sprintf()
”
Большое количество
“sprintf
” в коде - фактические вызовы
“
string_sprintf()
”, функции которая возвращает результат сохранения malloc. Промежуточное форматирование сделано в большой фиксированный буфер, путём функции которая запускается через непосредственное форматирование строки, и проверки длинны каждого преобразования до его выполнения, что предотвращает переполнение буфера.
Оставшиеся использования
“
sprintf()
” происходят при контролируемых обстоятельствах, где выходной буфер заведобо достаточной длинны, чтобы содержать конвертированную строку.
51.13 Использование
“
debug_printf()
” и
“
log_write()
”
Обоим этим функциям передаются произвольные строки, но они производят их форматирование путём вызова функции
“
string_vformat()
”, которая непосредственно обрабатывает форматируемую строку, и проверяет длину каждого преобразования.
51.14 Использование
“
debug_printf()
” и
“
log_write()
”
Они используются лишь когда известно, что выходной буфер достаточно большой для хранения результата.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
52. Формат файлов спула
Сообщение в очереди exim`a состоит из двух файлов, чьи имена - идентификатор сообщения, сопровождаемый
“-D
” и
“-H
”, соответственно. Часть данных сообщения сохранется отдельно в файле
“-D
”. Конверт сообщения, статус и заголовки сохраняются в файле
“-H
”, чей формат описан в этой части. Каждый из этих двух файлов содержит финальный компонент его собственного имени, как его первая строка. Это страховка от дисковых ошибок, когда директория потеряна, но сами файлы - восстановимы.
Некоторые люди соблазняются редактированием файлов
“-D
” с целью модифицировать сообщения. Вы должны быть черезвычайно осторожными, если делаете это; это не рекомендуется, и вы делаете это на свой страх и риск. Вот, некоторые из ловушек:
Вы должны гарантировать, что exim не попытается доставить сообщение в тот момент когда вы играетесь с ним. Самый безопасный способ - заблокировать
“-D
” файл, также как это делает exim - используя
“
fcntl()
”. Если вы обновите файл на месте, блокировка останется. Если вы запишете новый файл и переименуете его, блокировка будет потеряна в момент переименования.
Если вы измените число строк в файле, значение
“
$body_linecount
”, которое сохранено в файле
“-H
”, будет некорректным. В настоящее время, это значение не используется exim`ом, но нет никаких гарантий, что так будет и дальше.
Если сообщение в формате MIME, вы должны позаботиться, чтобы не повредить его.
Если сообщение криптографически подписано, любое изменение делает подпись недействительной.
Файлы, чьи имена заканчиваются на
“-J
”, также могут быть замечены в директории
“
input
” (или в её субдиректориях, когда установлена
“
split_spool_directory
”). Это файлы журналов, используемые для записи адресов на которые сообщение было доставлено во времяработы доставки. В конце доставки, файл
“-H
” обновляется, и файл
“-J
” - удаляется.
52.1 Формат файла
“-H
”
Вторая строка файла
“-H
” содержит имя логина для uid процесса который вызвал exim для чтения сообщения, сопровождаемое цифровым uid и gid. Для локально сгенерённых сообщений, обычно это - пользователь пославший сообщение. Для сообщения полученного через TCP/IP - обычно, это пользователь exim`a.
Третья строка файла содержит адрес отправителя сообщения как передано в конверте, содержащийся в угловых скобках. Для рикошетов - адрес отправителя пустой. Для входящей SMTP почты, отправитель даётся в команде MAIL. Для локально сгенерированных сообщений, адрес отправителя создаётся exim`ом из имени логина текущего пользователя и сконфигурированного
“
qualify_domain
”. Однако, это может быть перезадано путём опции
“
-f
” или начальной строки
“From
”, если вызывающий - доверенный, или если предоставленный адрес -
“<>
”, или адрес совпадает с
“
untrusted_set_senders
”.
Четвёртая строка содержит два числа. Первое - время когда сообщение было получено, в обычном формате UNIX - число секунд от начала эпохи. Второе число - счётчик посланных отправителю предупреждений о задержанной доставке получателю.
Далее следует множество строк, начинающихся с дефиса. Они могут появляться в любом порядке, и пропущены, если неуместны:
“
-acl <number> <length>
” - Этот элемент является устаревшим, и не генерится начиная с релиза exim`a 4.61; вместо него используются
“
-aclc
” и
“
-aclm
”. Однако,
“
-acl
” всё ещё распознаётся, для обеспечения обратной совместимости. В старом формате, строки этой формы пристутствуют для каждой переменной ACL которая непуста. Число идентифицирует переменную; переменные
“
acl_cx
” нумеруются 0-9 и переменные
“
acl_mx
” нумеруются от 10 до 19. Длинна - длинна строки данных для переменной. Сама строка начинается со следующей строки, и сопровождается символом новой строки. Она может содержать внутренние новые строки.
“
-aclc <number> <length>
” - Строка этой формы представлена для каждой переменной ACL соединения, которая не пуста. Число идентифицирует перемнную. Длинна - длинна строки данных для переменной. Сама строка начинается со следующей строки, и сопровождается символом новой строки. Она может содержать внутренние новые строки.
“
-aclm <number> <length>
” - Строка этой формы представлена для каждой переменной ACL сообщения, которая не пуста. Число идентифицирует перемнную. Длинна - длинна строки данных для переменной. Сама строка начинается со следующей строки, и сопровождается символом новой строки. Она может содержать внутренние новые строки.
“
-active_hostname <hostname>
” - Она присутствует, если сообщение было передано через SMTP, и значение
“
$smtp_active_hostname
” отличается от значения
“
$primary_hostname
”.
“
-allow_unqualified_recipient
” - Она представлена если в строках заголовков разрешён неквалифицированный адрес получателя (для предотвращения таких адресов от квалификации, если перезапись происходит в транспортное время). Локальные сообщения, которые были введены используя
“
-bnq
” и удалённые сообщеняи от хостов, которые совпадают с
“
recipient_unqualified_hosts
” устанавливают этот флаг.
“
-allow_unqualified_sender
” - Она представлена если в строках заголовков разрешён неквалифицированный адрес отправителя (для предотвращения таких адресов от квалификации, если перезапись происходит в транспортное время). Локальные сообщения, которые были введены используя
“
-bnq
” и удалённые сообщеняи от хостов, которые совпадают с
“
sender_unqualified_hosts
” устанавливают этот флаг.
“
-auth_id <text>
” - Идентификационная информация для сообщения, полученного в аутентифицированной сессии - значение переменной
“
$authenticated_id
”.
“
-auth_sender <address>
” - Адрес аутентифицированного отправителя - значение переменной
“
$authenticated_sender
”.
“
-body_linecount <number>
” - Тут записано число строк сообщения, и присутстсвует всегда.
“
-body_zerocount <number>
” - Тут зписано число бинарных нулей в теле сообщения, и она представлена если число больше нуля.
“
-deliver_firsttime
” - Она записывается когда новое сообщение первый раз добавляется в спул. Когда файл спула обновлятся после задержки, она опускается.
“
-frozen <time>
” - Сообщение заморожено, и заморозка произошла в
“
<time>
”.
“
-helo_name <text>
” - Она записывает имя хоста заданное удалённым хостом в команде HELO или EHLO.
“
-host_address <address>.<port>
” - Она записывает IP-адрес хоста с которого передано сообщение и номер использованного удалённого порта. Она опускается для локально сгенерённых сообщений.
“
-host_auth <text>
” - Если сообщение передано через аутентифицированное SMTP соединение, она записывает имя аутентификатора - значение переменной
“
$sender_host_authenticated
”.
“
-host_lookup_failed
” - Она представлена если попытка поиска имени хоста отправителя по его IP-адресу была неудачной. Она соответствует переменной
“
$host_lookup_failed
”.
“
-host_name <text>
” - Она записывает имя удалённого хоста с которого было передано сообщение, если имя хоста найдено из IP-адреса, когда сообщение было получено. Она отстутствует, если обратный поиск не был завершён.
“
-ident <text>
” - Для локально переданных сообщений, эта запись - логин исходного пользователя, кроме случая когда пользователь доверенный и для задания значения ident использовалась опция
“
-oMt
”. Для сообщений переданных через TCP/IP, эта запись - строка ident, предоставленная удалённым хостом, если она была.
“
-interface_address <address>.<port>
” - Это - запись IP-адреса локального интерфейса и имя порта через который сообщение было принято с удалённого хоста. Она опущена для локально сгенерированных сообщений.
“
-local
” - Сообщение от локального отправителя.
“
-localerror
” - Сообщение - локально сгенерированный рикошет.
“
-local_scan <string>
” - Она записывает строку данных которую вернула функция
“
local_scan()
”, когда сообщение было получено - значение переменной
“
$local_scan_data
”. Она опущена, если данных возвращено не было.
“
-manual_thaw
” - Сообщение было заморожено, но было оттаяно вручную, т.е. явной командой exim`a, а не процессом автооттаивания.
“
-N
” - Процесс тестирования был начат используя опцию
“
-N
” для подавления любых актуальных доставок, но доставка задержана. Для любых последующих попыток доставки,
“
-N
” - присутствует.
“
-received_protocol
” - Она записывает значение переменной
“
$received_protocol
”, которая содержит имя протокола, по которому было получено сообщение.
“
-sender_set_untrusted
” - Отправитель конверта этого сообщения был установлен недоверенным локальным вызовом (используется для гарантии, что вызывающий показан в списках очереди).
“
-spam_score_int <number>
” - Если сообщение было просканировано SpamAssassin, она присутствует Она записывает значение
“
$spam_score_int
”.
“
-tls_certificate_verified
” - TLS сертификат был получен от клиента, который послал это сообщение, и сертификат был проверен сервером.
“
-tls_cipher <cipher name>
” - Когад сообщение получено через шифрованное соединение, она записывает имя использовавшегося алгоритма шифрования.
“
-tls_peerdn <peer DN>
” - Когда сообщение было получено по шифрованному соединению, и сертификат был передан с клиента, она записывает Distinguished Name (DN) этого сертификата.
После опций присутствует список тех адресов на которые сообщение не было доставлено. Этот набор адресов инициализируется из командной строки когда используется опция
“
-t
” и установлена
“
extract_addresses_remove_arguments
”; иначе она выпускается пустой. Каждый раз, когда произведена успешная доставка, адрес добавляется к этому набору. Адреса сохраняются внутренне, как балансированное бинарное дерево, и это - представление того деревакоторое пишется в файл спула. Если адрес раскрывается через файл альясов или форвардов, оригинальный адрес добавляется к дереву, когда завершается доставка всех дочерних адресов.
Если дерево пусто, присутствует единственная строка в файле спула, содержащая лишь текст
“XX
”. Иначе, каждая строка содержит две буквы, являющиеся
“Y
” или
“N
”, сопровождаемые адресом. Адрес - значение для узла дерева, и буквы индицируют, имеет ли узел присоединенннёю левую ветвь и/или правую ветвь, соответственно. Если ветви существуют, они следуют немедленно. Вот пример дерева с тремя узлами:
YY darcy@austen.fict.example
NN alice@wonderland.fict.example
NN editor@thesaurus.ref.example
|
После дерева неполучателей,есть список получателей сообщения. Это простой список, с предществующим счётчиком. Он включает оригинальных получателей сообщения, включая те, кому сообщение уже доставлено. В простом случае, список содержит один адрес на строку. Например:
4
editor@thesaurus.ref.example
darcy@austen.fict.example
rdo@foundation
alice@wonderland.fict.example
|
Однако, когда дочерний адрес добавляется к списку вышестоящих адресов как результат использования опции
“
one_time
” в роутере
“
redirect
”, каждая строка имеет следующую форму:
<top-level address> <errors_to address> <length>,<parent number>#<flag bits>
|
Флаг 01 указывает присутствие трёх других полей, которые сопровождают адрес высшего уровня. Иные биты могут использоваться в будущем, для поддержки дополнительных полей. Смещение
“
<parent number>
” в списке получателей оригинального родителя адресов
“one time
” (нифига не понzл чё написал - прим. lissyara). Первые два поля - отправитель конверта, который ассоциирован с этим адресом и его длиной. если длинна - ноль, специальный отправитель конверта отстутствует (тогда в строке два символа пробела). Непустое поле может являться результатом роутера
“
redirect
” у котором установлена
“
errors_to
”.
Пустая строка отделяет конверт и статутсную информацию от следующих заголовков. Заголовок может занять несколько строк файла, и с целью экономии усилий при его чтении, каждому заголовку предшествует число и идентификационный символ. Число - чисто символов в заголовке, включая любые встроенные новые строки и завершающую новую строку. Символ - один из следующиж:
символ
|
значение
|
<blank>
|
заголовок который не интересует exim
|
B
|
заголовок Bcc:
|
C
|
заголовок Cc:
|
F
|
заголовок From:
|
I
|
заголовок Message-id:
|
P
|
заголовок Received: (P - означает почтовый штемпель)
|
R
|
заголовок Reply-To:
|
S
|
заголовок Sender:
|
T
|
заголовок To:
|
*
|
заменённый или удалённый заголовок
|
|
Удалённые или заменённые (перезаписанные) заголовки остаются в файле спула для отладки. Они не передаются при доставке сообщения. Вот - типичный набор заголовков:
111P Received: by hobbit.fict.example with local (Exim
4
.
00
)
id 14y9EI-00026G-
00
; Fri,
11
May
2001
10
:
28
:
59
+
0100
049
Message-Id: <E14y9EI-00026G-00@hobbit.fict.example>
038* X-rewrote-sender: bb@hobbit.fict.example
042* From: Bilbo Baggins <bb@hobbit.fict.example>
049F From: Bilbo Baggins <B.Baggins@hobbit.fict.example>
099* To: alice@wonderland.fict.example, rdo@foundation,
darcy@austen.fict.example, editor@thesaurus.ref.example
104T To: alice@wonderland.fict.example, rdo@foundation.example,
darcy@austen.fict.example, editor@thesaurus.ref.example
038
Date: Fri,
11
May
2001
10
:
28
:
59
+
0100
|
Заголовки помеченные звёздочкой индицируют, что отправитель конверта, заголовок
“
From:
”, и заголовок
“
To:
” были перезаписаны, последний потому что роутинг привёл к неквалифицированному домену
“
foundation
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
53. Добавление новых драйверов или типов поисков
Следующие действия должны быть предприняты для добавления нового роутера, транспорта, аутентификатора или типа поиска к exim`y:
1. Выберите название для драйвера или типа поиска, которое не конфиликтует с любыми существующими именами; в дальнейшем, я буду использовать
“newdriver
”.
2. Добавьте в
“
src/EDITME
” строку:
где
“
<type>
” - ROUTER, TRANSPORT, AUTH, или LOOKUP. Если, по умолчанию, код не должен быть включен в бинарник, закомментируте эту строку. Также вы должны добавить любые уместные комментарии о драйвере или типе поиска.
3. Добавьте в
“
src/config.h.defaults
” строку:
4. Отредактируйте
“
src/drtables.c
”, добавьте условный код к частному заголовку и созайте запись в таблице как сделано для всех других драйверов и типов поиска.
5. Отредактируйте
“
Makefile
” в соответствующей субдиректории (
“
src/routers
”,
“
src/transports
”,
“
src/auths
” или
“
src/lookups
”); добавьте строку для новго драйвера или типа поиска, и добавьте его к определению OBJ.
6. Создайте
“
newdriver.h
” и
“
newdriver.c
” в соответствующей субдиректории
“
src
”.
7. Отредактируйте
“
scripts/MakeLinks
” и добавьте команды для связи файлов
“
.h
” и
“
.c
”, как для других драйверов и поисков.
Затем, всё что вам нужно сделать - написать код! Хороший способ начать, состоит в том, чтобы сделать проформу путём копирования существующего модуля того же типа, глобально изменяя все встречи с именем, и вырезая большинство кода. Отметтьте, что любые создаваемые вами опции должны быть перечислены в алфавитном порядке, поскольку поиск по таблицам производится с использованием бинарной процедуры chop.
Ожидается, что в каждой из субдиректорий
“
src
” присутствует файл
“
README
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
Exim's interfaces to mail filtering
1. Форвардинг и фильтрация в exim
1.1. Введенеие
1.2. Работа фильтра
1.3. Тестирование нового файла фильтра
1.4. Инсталляция файла фильтра
1.5. Тестирование проинсталлированного файла фильтра
1.6. Детали фильтрующих команд
2. Файлы фильтра sieve
2.1. Распознание фильтров sieve
2.2. Сохранение в заданные каталоги
2.3. Строки содержащие имена заголовков
2.4. Тест
“exists
” с пустыми списками заголовков
2.5. Тесты заголовков с неверной кодировкой MIME в заголовке
2.6. Тестирование адреса для нескольких адресов на заголовок
2.7. Семантика
“keep
”
2.8. Семантика
“fileinto
”
2.9. Семантика
“redirect
”
2.10. Строковые аргументы
2.11. Множественные единицы
2.12. Соответствие RFC
3. Файлы фильтра exim`a
3.1. Формат файлов фильтра exim`a
3.2. Значения данных в командах фильтра
3.3. Раскрытие строки
3.4. Некоторые полезные общие переменные
3.5. Переменные заголовков
3.6. Пользовательские перемeнные
3.7. Текущая директория
3.8. Важные доставки
3.9. Команды фильтра
3.10. Команда
“add
”
3.11. Команда
“deliver
”
3.12. Команда
“save
”
3.13. Команда
“pipe
”
3.14. Почтовые команды
3.15. Команды логгинга
3.16. Команда
“finish
”
3.17. Команда
“testprint
”
3.18. Команда
“fail
”
3.19. Команда
“freeze
”
3.20. Команда
“headers
”
3.21. Удовлетворение условий команд
3.22. Условия тестирования строк
3.23. Тестирование числовых условий
3.24. Тестирование важных доставок
3.25. Тестирование на сообщения о ошибке
3.26. Тестирование списка адресов
3.27. Тестирование на персональность почты
3.28. Адреса альясов для персональных условий
3.29. Детали персональных условий
3.30. Тестирование статуса доставки
3.31. Пользовательские мультипочтовые ящики
3.32. Игнорирование ошибок доставки
3.33. Примеры команд фильтра exim`a
1 Форвардинг и фильтрация в exim
Этот документ описывает пользовательский интерфейс к встроенному средству фильтрации exim`a, и имеет копирайты University of Cambridge 2006. Это относится к exim версии 4.62.
1.1 Введенеие
Большинство почтовых агентов UNIX (программ, которые доставляют почту) дают возможность индивидуальным пользователям задать автоматический форвардинг их почты, обычно, путём помещения списка адресов форвардинга в файле с именем
“
.forward
” в их домашних директориях. Exim расширяет это средство, путём разрешения установки в инструкции форвардинга, более чем просто списка адресов, в смысле предоставления
“
.forward с условиями
”. Операция установки правил называется фильтрацией (filtering), а, файл который их содержит, называется файлом фильтра (filter file).
Exim поддерживает два различных вида файлов фильтра. Фильтр exim`a содержит инструкции в формате, который уникален для exim`a. Фильтр sieve содержит инструкции в формате Sieve, который задан в RFC3028. Так как это стандартный формат, фильтры sieve уже могут быть знакомы некоторым пользователям. Файлы sieve, также, могут быть портируемы между различными окружениями. Однако, средство фильтрации exim`a содержит больше особенностей (типа раскрытия переменных), и лучше интегрируются с окружением хоста (типа использования внешних процессов и труб).
Выбор, какой вид фильтра использовать, может быть оставлен конечному пользователю, при условии, что системный администратор сконфигурировал exim для обоих видов фильтра. Однако, если важна совместимость, sieve - единственный выбор.
Способность использовать фильтрацию, или традиционный форвардинг, может быть включена системным администратором, и некоторые индвидуальные средства могут быть отдельно включены или отключены. Текущий документ должен предоставить описание, что должно быть включено. В отсутствие этого, проконсультируйтесь у вашего системного администратора.
Этот документ описывает, как использовать файл фильтра, и формат его содержимого. Он предназначен для использования конечными пользователями. Охватываются оба - фильтры sieve и фильтры exim`a. Однако, для фильтров sieve, обсуждается лишь то, что воплощено в exim`e, с тех пор, как sieve описан самостоятельно.
Содержимое традиционных файлов
“
.forward
” тут не описывается. Они, обычно, содержат лишь список адресов, имён файлов, или команд труб, разделённых запятыми или новыми строками, но, также доступны иные типы элементов. Полная детализация может быть найдена в части спецификации exim`a, посвящённой роутеру
“
redirect
”, которая также описывает, как системный администратор может установить и контролировать использование фильтрации.
1.2 Работа фильтра
Обратите внимание на понимание того, в exim`e не происходят доставки при обработке файла фильтра, или традиционного файла
“
.forward
”. Работа фильтра или обработка традиционного файла
“
.forward
”, устанавливает дальнейшие операции доставки, но не проводит их.
Результат обработки фильтра или файла
“
.forward
” - список назначений, к которым будут доставлены сообщения. Сами доставки происходят позднее, вместе со всеми доставками для сообщения. Это означает, что невозможно тестирование успешной доставки при фильтрации. Также, это означает, что любые дубликаты адресов, которые сгенерированы - уничтожаются, поскольку exim никогда не доставляет то же смое сообщение на один и тот же хост более чем один раз.
1.3 Тестирование нового файла фильтра
Файлы фильтра, особенно в сложных случаях, всегда должны быть протестированы, для нахождения ошибок. Exim предоставляет средство для предварительного тестирования файла фильтра до его инсталляции. Тестируется синтаксис файла и его базовые операции, и, также, может быть использовано с традиционными файлами
“
.forward
”.
Поскольку фильтр может тестировать содержимое сообщения, требуется тестовое сообщение. Предполагается, что вы имеете новый файл фильтра, называемый
“
myfilter
”, и тестовое сообщение в файле с именем
“
test-message
”. Предполагается, что exim инсталлирован с обычным именем
“
/usr/sbin/sendmail
” (некоторые операционные системы используют
“
/usr/lib/sendmail
”), может быть использована следующая команда:
/usr/sbin/sendmail -bf myfilter <test-message
|
Опция
“
-bf
” говорит exim`y, что следующий элемент командной строки - имя файла фильтра для тестирования. Также есть подобная опция
“
-bF
”, но используется для тестирования файлов системного фильтра, как противоположность пользовательским файлам фильтра, и по этой причине используется только системным администратором.
Тестовое сообщение предоставляется на стандартном вводе. Если в фильтре нет тестов зависящих от сообщения, может использоваться пустой файл (
“
/dev/null
”). Предоставляемое сообщение должно начинаться со строк заголовков, или разделительной строки сообщения
“From
”, которая находится во многих файлах каталогов мульти-сообщений. Отметтьте, что пустые строки завершают строки заголовков. Выдаётся предупреждающее сообщение, если нет прочитанных строк заголовков.
Результат запуска этой команды, при условии, что в файле фильтра не было обнаружено ошибок, - список действий, которые exim предпринял бы, если бы представленное сообщение было реальным. Например, для фильтра exim`a, вывод:
Deliver message to: gulliver@lilliput.fict.example
Save message to: /home/lemuel/mail/archive
|
означает, что одна копия сообщения будет послана на
“
gulliver@lilliput.fict.example
”, и другая будет добавлена к файлу
“
/home/lemuel/mail/archive
”, если всё пройдёт хорошо.
Сами действия, при тестировании фильтра этим способом, не производятся; тут нет проверок, например, что любые адреса форвардинга действительны. Для фильтра exim`a, если вы хотите знать причины, почему были предприняты такие действия, добавьте к команде опцию
“
-v
”. Это заставляет exim выводить результаты любых условных тестов и к отступу вывода в зависимости от глубины вложенности команд
“
if
”. Дальнейший дополнительный вывод от тестирования фильтра мошет быть сгенерён путём команды
“
testprint
”, как описано ниже.
Когда exim выводит список действий которые он предпринял бы, если любые текстовые строки включены в вывод, непечатаемые символы конвертируются в их символьные последовательности. В частности, если любая текстовая строка содержит символ новой строки, в тестовом выводе он отображается как
“\n
”.
При тестировании фильтра этим способом, exim создаёт
“конверт
” (
“envelope
”) для сообщения. Получатель, по умолчанию, пользователь запустивший команду, он же и отправитель, но команда может запущена с опцией
“
-f
”, для предоставления иного отправителя. Например:
/usr/sbin/sendmail -bf myfilter \
-f islington@never.where <test-message
|
Альтернативно, если не используется опция
“
-f
”, но первая строка предоставленного сообщения - разделитель
“From
” файл каталога сообщений (не то же самое, что и строка заголовка
“
From:
”), отправитель берётся из неё. Если присутствует
“
-f
”, содержимое любых строк
“From
” - игнорируется.
“return path
” - тоже самое что и отправитель конверта, если сообщение не содержит заголовка
“
Return-path:
”, в случае чего он берётся оттуда. Вам не нужно беспокоится о этом, если вы хотите тестировать возможности файла фильтра который полагается на адрес отправителя или путь возврата.
Возможно изменить получателя конверта, путём задания дальнейших опций. Опция
“
-bfd
” изменяет домен адреса получателя, тогда как опция
“
-bfl
” изменяет
“локальную часть
” (
“local part
”), т.е. часть до символа
“@
”. Это может использоваться для тестирования некоторых файлов фильтра.
Опции
“
-bfp
” и
“
-bfs
” определяют преффикс или суффикс локальной части. Они уместны лишь когда осуществляется поддержка для мульти-персональных почтовых ящиков; смотрите описание в секции 3.31, ниже.
1.4 Инсталляция файла фильтра
Файл фильтра, обычно, инсталлируется под именем
“
.forward
”, в вашей домашней директории - он отличается от обычного файла
“
.forward
” первой строкой (описано ниже). Однако, имя файла конфигурируемо, и некоторые системные администраторы могут его изменить на какое-то иное имя, или местоположение для файлов фильтров.
1.5 Тестирование проинсталлированного файла фильтра
Тестирование файла фильтра до инсталляции не может выявить все потенциальные проблемы; например, реально не запускаются команды передачи сообщений в трубы. Некоторые
“живые
” тесты следует провести когда фильтр проинсталлирован.
Если это возможно, протестируйте ваш фильтр путём посылки сообщений от одного из иных аккаунтов. Если вы посылаете сообщение себе от фильтруемого аккаунта, и доставка неудачна, сообщение о ошибке будет послано назад на тот же аккаунт, который может вызвать иную ошибку доставки. Это может вызвать бесконечную последовательность таких сообщений, поскольку сообщение о неудачной доставке самостоятельно генерирует последующие сообщения. Однако, обычно, что ошибка возвращается вам, и, что постмастер захочет исследовать приложенное сообщение.
Если вы хотите тестировать фильтр exim`a от того же самого аккаунта, разумная предострожность - включить строку
if error_message then finish endif
|
как первую команду фильтра, возле тестирования. Это вызывает фильтрацию брошенных сообщений об ошибке доставки, и с тех пор не имеющих сгенерированного места назначения, сообщения не будут доставлены на оригинальный адрес. Если нет хорошей причины так не делать, рекомендуется делать вышеуказанный тест для всех файлов фильтров exim`a. (Это не применяется к файлам sieve.)
1.6 Детали фильтрующих команд
Команды фильтрации для фильтров sieve и exim совершенно различаются в синтаксисе и семантике. Механизм sieve определён в RFC3028; в следующей части мы описываем, как он интегрирован в exim. Последующие части детально охватывают фильтрацию exim`a.
2 Файлы фильтра sieve
Код для фильтрации sieve в exim был пожертвован Michael Haardt, и большинство содержимого этой части взято из примечаний, которые он предоставил. Поскольку sieve - расширяемый язык, обратите внимание на понимание
“Sieve
” в этом контексте как
“специфическая реализация Sieve для Exim
” (
“the specific implementation of Sieve for Exim
”).
Эта часть не содержит описание sieve, поскольку оно может быть найдено в RFC3028, который может быть прочитан вместе с этими примечаниями.
Реализация exim sieve представляет ядро описанное в RFC3028, сравнительные тесты, расширения
“
copy
”,
“
envelope
”,
“
fileinto
”, и
“
vacation
”, но не расширение
“
reject
”. Exim не подерживает уведомления о доставке сообщений (MDNs), таким образом добавление этого к фильтру sieve (как требуется для
“
reject
”) вызовет недоразумение.
С целью корректной работы sieve в exim системному администратору необходимо создать некоторые настройки в конфигурации exim`a. Это описано в части роутера
“
redirect
”, в полной спецификации exim`a.
2.1 Распознание фильтров sieve
Файл фильтра интерпретируется как фильтр sieve, если его первая строка
Это - отличает его от обычного файла
“
.forward
”, или файла фильтра exim`a.
2.1 Сохранение в заданные каталоги
Если системный администратор сделал установки как описано в спецификации exim`a, и вы используете
“
keep
” или
“
fileinto
” для сохранения почты в директорию, абсолютные файлы сохраняются где задано, относительные файлы сохраняются в
“
$home
” и
“
inbox
” находится в стандартном местоположени почтового ящика.
2.3 Строки содержащие имена заголовков
RFC3028 не определяет, что происходит если строка указывает на поле заголовка не содержащее допустимое имя заголовка, например, оно содержит двоеточие. Эта реализация генерирует ошибку, вместо игнорирования поля заголовка, с целью облегчить отладку скриптов, которые вписаны в общую реализацию sieve.
2.4 Тест
“exists
” с пустыми списками заголовков
Тест
“
exists
” успешен лишь если все заданные заголовки существуют. RFC3028 неясно определяет что происходит на пустом списке заголовков. Эта реализация вычисляет, условие как истинное, интерпретируя RFC в строгом смысле.
2.5 Тесты заголовков с неверной кодировкой MIME в заголовке
Некоторые MUA обрабатывают данные неправильно закодированные base64, генерируя чушь. Иные - игнорируют хлам после символа равно в данных кодированных base64. RFC2047 не определяет как реагировать в этом случае, лишь заявляет, что клиент не должен запрещать обработку сообщения по этой причине. RFC2045 определяет, что неверные даные должны быть проигнорированы (повидимому, найдя конец строки символов). Также он определяет, что неверные данные могут вызвать отклонение сообщения с ними (и там он указывает на переговоры о истинном нарушении кодирования), что начисто противоречит их игнорированию.
RFC3028 не определяет как обрабатывать некорректные слова MIME. Эта реализация обращается с ними буквально, как будто слова корректны, но их набор символов не может быть конвертирован в UTF-8.
2.6 Тестирование адреса для нескольких адресов на заголовок
Заголовок может содержать несколько адресов. RFC3028 неясно определяет как с ними работать, но затем адреса тестируются проверкой, если что угодно совпадает с чем-то ещё, совпадение одного адреса хватает для удовлетворения условия. Тестирование становится невозможным если заголовок содержит некоторый набор адресов и не более, но он более логичен чем позволение неудачи теста если заголовок содержит дополнительные адреса, кроме того для которого проводилось тестирование.
2.7 Семантика
“keep
”
Команда
“
keep
” эквивалентна
Она сохраняет сообщение и сбрасывает неявный флаг keep. Она не устанавливает неявный флаг keep; нет команды для установки его как только он был сброшен.
2.8 Семантика
“fileinto
”
RFC3028 не определяет должен ли
“
fileinto
” пробовать создать почтовую директорию, если она не существует. Эта реализация позволяет системным администраторам конфигурировать использование опций
“
create_directory
”,
“
create_file
” и
“
file_must_exist.
” транспорта
“
appendfile
”. Для дополнительных деталей, смотрите транспорт
“
appendfile
” в спецификации exim`a.
2.9 Семантика
“redirect
”
Скрипты sieve предполагаются совместимыми между серверами, таким образом эта реализация не позволяет редирект почты на неквалифицированные адреса, поскольку домен зависит от используемой системы. На системах с виртуальными почтовыми доменами, дефолтовый домен, вероятно, не то, что ожидает пользователь.
2.10 Строковые аргументы
Могут быть недоразумения, если строка аргументов к
“
require
” сравнивается регистрозависимо или регистронезависмо. Эта реализация сравнивает их с типом сравнения
“
:is
” (значение по умолчанию, смотрите раздел 2.7.1 RFC) и компаратором
“
i;ascii-casemap
” (значение по умолчанию, смотрите раздел 2.7.3 RFC). RFC ясно определяет дефолтовую команду, таким образом, любые отличающиеся реализации грубо нарушают RFC3028. То же самое каасается имён компатарторов, также заданных как строки.
2.11 Множественные единицы
В RFC3028 есть ошибка: суффикс
“G
” означает гига-, а не терабайт. Эта ошибка очевидна, поскольку RFC3028 определяет
“G
” как означающее 2^30 (что является гига, а не тера) и это - то, что данная реализация использует как фактор масштабирования для суффикса
“G
”.
2.12 Соответствие RFC
Exim требует, чтобы первая строка фильтра sieve была:
Разумеется, RFC не определяют эту строку. Однако, не ожидайте, что примеры будут работать без её добавления.
RFC3028 требует использования CRLF для завершения строки. Рационально, что CRLF универсально используется в сетевых протоколах для обозначения конца строки. Эта реализация не встраивает sieve в сетевой протокол, а использует скрипты sieve как часть MTA exim. Поскольку все части exim используют LF как символ новой строки, эта реализация делает точно также, по умолчанию, что может изменить системный администратор (во время компиляции exim`a), для использования вместо этого - CRLF.
Exim нарушает RFC2822, секцию 3.6.8, путём приёма 8-ми битных имён заголовков, таким образом, эта реализация повторяет это нарушение для сохранения совместимости с exim. Это - подготовка к данным в UTF-8.
Скрипты sieve не могут содержать символы NUL в строках, но почтовые заголовки могут содержать символы NUL закодированные MIME, которые никогда не смогут совпасть со скриптами sieve, использующими точное сравнение. По этой причине, эта реализация расширяет синтаксис экранированных строк sieve на
“\0
” - для описания символа NUL, нарушение
“\0
” создаёт тоже самое что и 0 в RFC3028. Одинаковые без использования
“\0
”, следующие тесты все истинны в этой реализации. Реализации которые используют строки С-стиля приводят лишь к оценке первого теста как истинного.
Subject: =?iso-
8859
-1?q?abc=00def
header :contains "Subject" ["abc"]
header :contains "Subject" ["def"]
header :matches "Subject" ["abc?def"]
|
Отметтьте, что учитывая что sieve бывает в MUA, RFC2074 может быть интерпретировано, что NUL символы укорачивающие строку разрешены для реализаций sieve, однако не рекомендуются. В будущем, позволяется использование кодированных символов NUL в заголовках, но это не рекомендуется. Примеры выше показывают как.
RFC3028 сообщает, что если реализация не в сосотоянии конвертировать набор символов в UTF-8, две строки не могут быть эквивалентны, если одна содержит октеты более чем 127. Предполагается, что все неизвестные наборы символов - однобайтовые наборы символов, с нижними 128 октетами не существующими в US-ASCII, таким образом эта реализация нарушает RFC3028 и обрабатывает такие слова MIME буквально. Этим способом они иногда могут сравнены.
Директория определеённая путём
“
fileinto
” не должна содержать последовательность символов
“..
”, для избежания проблем с безопасностью. RFC3028 не определяет синтаксис директорий, отделяя
“
keep
” эквивалентом к
Эта реализация вместо этого использует
“
inbox
”.
Ошибки скриптов sieve, сейчас, вызывают тихое помещение сообщений в
“
inbox
”. RFC3028 требует, чтобы пользователь был уведомлён об этом условии. Это может быть реализовано в будущем, путём добавления строки заголовка к почте, которая была помещена в
“
inbox
” из-за ошибок в фильтре.
3 Файлы фильтра exim`a
Эта часть содержит полное описание содержимого файлов фильтра exim`a.
3.1 Формат файлов фильтра exim`a
Отдельно от начального пустого постранства, первый текст в файле фильтра exim`a должен быть
Это - то, что отличает его от обычного файла
“
.forward
”, или файла фильтра sieve. Если у файла нет этой начальной строки (или эквивалентной для фильтра sieve), он обрабатывается как обычный файл
“
.forward
”, и тот и другой, когда доставляется почта, и когда используется механизм тестирования
“
-bf
”. Пустое пространство в строке - опционально, и может использоваться любая капитализация (Слово capitalization - переводится однозначно, и что оно значит в этом предложении - я не знаю - прим. lissyara). Дальнейший текст в этой строке обрабатывается как комментарий. Например, вы могли бы иметь
# Exim filter <<== do not edit or remove this line!
|
Оставшаяся часть файла - последовательность фильтрующих команд, которые состоят из ключевых слов и значений данных. Например, в команде
deliver gulliver@lilliput.fict.example
|
ключевое слово -
“deliver
”, и значение данных -
“gulliver@lilliput.fict.example
”. Пустое пространство или новые строки отделяются от компонентов команд, исключая случай условия для команды
“
if
”, где круглые скобки также действуют как разделители. Полные команды отделяются от каждой другой путём пустого пространства или перевода строки; нет специальных терминаторов. Таким образом, некоторые команды могут находится в одной строке, или одна команда может располагаться на нескольких строках.
Если символ
“#
” сопровождает разделитель где угодно в команде, всё, что следует за
“#
” до следующего символа новой строки - игнорируется. Это предоставляет способ включения комментариев в файл фильтра.
3.2 Значения данных в командах фильтра
Есть два способа, которыми значения данных могут быть введены:
Если текст не содержит пустого пространства, они могут быть набраны дословно. Однако, если это - часть условия, оно также должно быть свободно от круглых скобок, так как они используются для группирования в условиях.
Иначе, текст должен быть заключён в двойные кавычки. В этом случае, символ
“\
” (обратный слэш) обрабатывается как
“экранирующий символ
” (
“escape character
”) в строке, вызывая специальную обработку следующего символа, или символов:
последовательность
|
значение
|
\n
|
замещается на новую строку
|
\r
|
замещается на возврат каретки
|
\t
|
замещается на табуляцию
|
|
Обратный слэш сопровождаемый тремя восьмеричными цифрами - замещается на символ определённый этими цифрами, и
“\x
” сопровождаемый вплоть до двух шестнадцатеричных цифр - обрабатывается подобным образом. Обратный слэш сопровождаемый иными символами - замещается на второй символ, таким образом, в частности,
“\"
” превращается в
“"
”, и
“\\
” превращается в
“\
”. Элементы данных помещённый в двойные кавычки могут быть продолжены на следующей строке путём завершения первой строки обратным слэшом. Любое начальное пустое пространство в начале строки продолжения - игнорируется.
В дополнение к символу экранирования, обрабатывающему, что происходит когда строка помещена в кавычки, много значений данных подчиняются
“
раскрытию строк
” (
“
string expansion
”, как описано в следующей секции), в случае чего символы
“$
” и
“\
” - также многозначимы. Это способ, если действительно в строке требуется один символ обратного слэша, и строка, также помещена в кавычки, должена быть введена последовательность
“\\\\
”.
Максимальная разрешённая длинна строки данных до раскрытия - 1024 символа.
3.3 Раскрытие строки
Большинство значений данных раскрываются до использования. Раскрытие состоит из замещения подстрок начинающихся на
“$
”, иным текстом. Полные средства раскрытия, доступные в exim`e - обширны. Если вы хотите знать всё, что exim может делать со строками, вы должны проконсультироваться с частью посвящённой раскрытию строк, в документации exim`a.
В файлах фильтра, наиболее частым использованием раскрытия строк является замещение содержимого переменных. Например, подстановка
заменяется адресом, на который должны быть посланы ответы на сообщение. Если имя переменной сопровождается буквой, цифрой, или подчёркиванием, оно должно быть помещено в фигурные скобки, например
Если символ
“$
” реально требуется в раскрываемой строке, он должен быть экранирован обратным слэшом, и, поскольку обратный слэш также экранируется внутри кавычек в вводимых строках, в этом случае, он должен быть удвоен. Следующие два примера иллюстрируют два различных пути тестирования на символ
“$
” в сообщении:
if $message_body contains \$ then ...
if $message_body contains "\\$" then ...
|
Вы можете предотвратить часть строки от раскрытия, путём помещения её между двумя
“\N
”. Например,
if $message_body contains \N$$$$\N then ...
|
тестирует на четыре символа доллара.
3.4 Некоторые полезные общие переменные
Полный список переменных доступен в документации exim`a. Это - сокращённый список наиболее полезных в персональном файле фильтра:
“
$body_linecount
”: Число строк в теле сообщения.
“
$body_zerocount
”: Число символов бинарных нулей в теле сообщения.
“
$home
”: В обычных конфигурациях, эта переменная, обычно, содержит пользовательскую домашнюю директорию. Однако, системный администратор может это изменить.
“
$local_part
”: Часть почтового адреса которая предшествует символу
“@
”, обычно, логин пользователя. Если включена поддержка мультиперсональных ящиков (смотрите ниже, секцию 3.31) и преффикс или суффикс локальной части распознан, он удаляется из строки в этой переемнной.
“
$local_part_prefix
”: Если включена поддержка мультиперсональных ящиков (смотрите ниже, секцию 3.31) и преффикс или суффикс локальной части распознан, эта переменная содержит преффикс. Иначе, она содержит пустую строку.
“
$local_part_suffix
”: Если включена поддержка мультиперсональных ящиков (смотрите ниже, секцию 3.31) и преффикс или суффикс локальной части распознан, эта переменная содержит суффикс. Иначе, она содержит пустую строку.
“
$message_body
”: Начальная часть тела сообщения. По умолчанию, в эту перемнную считывается до 500 символов, но системный администратор может сконфигурировать иное значение. Новые строки в теле, конвертируются в единичные пробелы.
“
$message_body_end
”: Финальная часть тела сообщения, отформатированная и ограниченная тем же способом что и
“
$message_body
”.
“
$message_body_size
”: Размер тела сообщения, в байтах.
“
$message_exim_id
”: Локальная идентификационная строка сообщения, которая уникальна для каждого сообщения обрабатываемого одним хостом.
“
$message_headers
”: Строки заголовоков сообщения, объединённые в одну строку, с символами новой строки между ними.
“
$message_size
”: Размер всего сообщения, в байтах.
“
$original_local_part
”: Когда адрес который прибывает с сообщением обрабатывается, эта переменная содержит то же самое значение, что и переменная
“
$local_part
”. Однако, если адрес сгенерирован путём альясинга, форвардинга, или обработки файла фильтра, эта переменная содержит локальную часть оригинального адреса.
“
$reply_address
”: Содержимое заголовка
“
Reply-to:
”, если сообщение его содержит; иначе, содержимое заголовка
“
From:
”. Это - адрес, на который обычно посылаются ответы на сообщение.
“
$return_path
”: Путь возврата, это - поле, отправителя, которое было передано как часть конверта сообщения, если сообщение послано на иной хост. Это - адрес, на который отправляются ошибки доставки. Во многих случаях, эта переменная имеет то же значение, что и
“
$sender_address
”, но если, например, раскрывается входящее сообщение на список рассылки,
“
$return_path
” может быть изменено на адрес ответственного за список рассылки.
“
$sender_address
”: Адрес отправителя, который был принят в конверте сообщения. Это - не обязательно содержимое строк заголока
“
From:
” или
“
Sender:
”. Для доставки сообщений о ошибке (
“рикошетов
”), у них нет адреса отправителя, и эта переменная пуста.
“
$tod_full
”: Полная версия времени и даты, например: Wed, 18 Oct 1995 09:51:40 +0100. Временная зона, всегда даётся как числовое смещение от GMT.
“
$tod_log
”: Время и дата в формате используемом для записи в файлы логов exim`a, без временной зоны, например: 1995-10-12 15:32:29.
“
$tod_zone
”: Смещение локальной временной зоны, например: +0100.
3.5 Переменные заголовков
Это - специальный набор раскрываемых переменных, содержащих строки заголовков при обработке сообщения. Эти переменные имеют имена начинающиеся с
“
$header_
”, сопровождаемое именем строки заголовка, завершаемое двоеточием. Например,
$header_from:
$header_subject:
|
Весь элемент, включая завершающее двоеточие, заменяется содержимым строки заголовка. Если есть более одного заголовка с одним и тем же именем, их содержимое объединяется. Для строк заголовков, чьи данные состоят из списка адресов (например,
“
From:
” и
“
To:
”), запятые и символы новой строки вставляются между каждым набором адресов. Для всех других строк заголовоков, используется лишь символ новой строки.
Начальное и завершающее пустое пространство - удаляется из данных строки заголовка, и если в них есть любые слова MIME, которые закодированы как задано в RFC2047 (поскольку они содержат не-ASCII символы), они декодируются и переводятся, если возможно, в локальную кодировку. Попытка перевода предпринимается лишь в операционных системах, которые обладают функцией
“
iconv()
”. Это создаёт такой же поиск по строкам заголовков, как и при показе MUA. Дефолтовая кодировка устанвливается в ISO-8859-1, но это может быть изменено средством команды
“
headers
” (смотрите ниже).
Если вы хотите видеть фактическую кодировку, в которой созданы строки заголовков, вы можете определить
“
$rheader_
” вместо
“
$header_
”. Этим вставляются
“сырые
” (
“raw
”) строки заголовков, немодифицированные.
Также есть промежуточная форма, запрашиваемая путём
“
$bheader_
”, с удалёнными начальными и конечными пробелами, и декодированными
“словами
” MIME, но не переведённой кодировкой. Если попытка декодирования того, что на первый взгляд показалось
“словами
” MIME - неудачна, возвращается сырая строка. Если декодирование производит бинарные нули, они заменяются знаком вопроса.
Капитализация (невкурил - но перевод именно такой - прим. lissyara) следующего за
“
$header_
” - несущественна. Поскольку любые печатные символы, исключая двоеточие, могут находится в имени заголовка сообщения (это - требование RFC2822, документ описывает формат почтовых сообщений), в этом случае не должны использоваться фигурные скобки, так как они будут взяты как часть имени заголовка. Два укорочения (блин - несмог подобрать более корректное слово - прим. lissyara) разрешены в именовании переменных заголовков:
Начальные
“
$header_
”,
“
$rheader_
”, или
“
$bheader_
” могут быть заменены
“
$h_
”,
“
$rh_
”, или
“
$bh_
”, соответственно.
Завершающее двоеточие может быть опущено, если следующий символ - пустое пространство. Символ пустого пространства поддерживается в раскрываемых строках. Однако, это не рекомендуется, поскольку вы можете забыть двоеточие когда оно действительно необходимо.
Если сообщение не содержит заголовок с данным именем, подставляется пустая строка. Это важно для корректного правописания имён заголовков. Не используйте
“
$header_Reply_to
”, когда вам реально нужен
“
$header_Reply-to
”.
3.6 Пользовательские перемeнные
Есть десять пользовательских переменных с именами
“
$n0
” -
“
$n9
”, число которых может быть увеличено путём команды
“
add
” (смотрите секцию 3.10). Они могут использоваться для
“подсчёта очков
” сообщения, различными способами. Если exim сконфигурирован на работу системного фильтра (
“system filter
”) для каждого сообщения, значения в этих переменных копируются в переменные
“
$sn0
” -
“
$sn9
” в конце системного фильтра, таким образом, делая их доступными в пользовательских фильтрах. Как эти переменные используются - полностью зависит от индивидуальной инсталляции.
3.7 Текущая директория
Содержимое вашего файла фильтра не должно предполагать какую-то рабочую директорию. Лучше всего - использовать абсолютные пути для имён файлов; вы можете использовать переменную
“
$home
” обычным способом, для ссылки на вашу домашнюю директорию. Команда
“
save
” автоматически вставляет
“
$home
” в начало всех неабсолютных путей.
3.8 Важные доставки
Когда в ходе доставки сообщение обрабатывается файлом фильтра, то, что происходит дальше, т.е. после обработки файлом фильтра, зависит от того, установил ли фильтр какие-либо
“
важные доставки
” (
“
significant deliveries
”). Если установлена хоть одна важная доставка, фильтр подготовливается к обработке доставки для текущего адреса, и дальнейшая обаботка более не имеет места. Однако, если нет установленных важных доставок, exim продолжает обработку текущего адреса как будто не было файла фильтра, и, обычно, производит доставку копии сообщения в локальный почтовый ящик. В частности, это происходит в специальном случае, когда файл фильтра содержит лишь комментарии.
Команды доставки -
“
deliver
”,
“
save
” и
“
pipe
”, по умолчанию - важные. Однако, если такой команде предшествует слово
“unseen
”, эта доставка не рассматривается как важная. В противоположность, иные команды, типа
“
mail
” и
“
vacation
” не устанавливают важность доставки, если им не предшествует слово
“seen
”. Следующие примеры команд устанавливают важные доставки:
deliver jack@beanstalk.example
pipe $home/bin/mymailscript
seen mail subject "message discarded"
seen finish
|
Следующие примеры команд не устанавливают важные доставки:
unseen deliver jack@beanstalk.example
unseen pipe $home/bin/mymailscript
mail subject "message discarded"
finish
|
3.9 Команды фильтра
Команды фильтра которые описаны в последующих секциях, перeчисланы ниже, секция, где они описаны - в круглых скобках:
“
add
” - увеличивает пользовательскую переменную (секция 3.10)
“
deliver
” - доставка на почтовый адрес (секция 3.11)
“
fail
” - принудительная ошибка доставки (используется системным администратором) (секция 3.18)
“
finish
” - конец обработки (секция 3.16)
“
freeze
” - заморозка сообщения (используется системным администратором) (секция 3.19)
“
headers
” - установить кодировку заголовков (секция 3.20)
“
if
” - условие(-я) тестирования (секция 3.21)
“
logfile
” - задать файл логов (секция 3.15)
“
logwrite
” - записать в лог файл (секция 3.15)
“
mail
” - послать ответное сообщение (секция 3.14)
“
pipe
” - труба к команде (секция 3.13)
“
save
” - сохранить в файл (секция 3.12)
“
testprint
” - напечатать при тестировании (секция 3.17)
“
vacation
” - заказная форма
“
mail
” (секция 3.14)
Команда
“
headers
” имеет дополнительные параметры, которые могут использоваться лишь в системном фильтре. Команды
“
fail
” и
“
freeze
” доступны лишь когда средство фильтрации exim`a используется как системный фильтр, и, поэтому, используется лишь системным администратором, а не обычными пользователями. Они упоминаются лишь в этом документе; для дополнительной информации, смотрите главную спецификацию exim`a.
3.10 Команда
“add
”
add <number> to <user variable>
e.g. add
2
to n3
|
Есть 10 пользовательских переменных этого типа, с именами
“
$n0
” -
“
$n9
”. Их значения могут быть получены путём обычного синтаксиса раскрытия (например,
“
$n3
”) в этих командах. В начале фильтрования, все эти переменные содержат ноль. Оба аргумента команды
“
add
” раскрываются до начала использования, делая возможным добавление переменной к самой себе. Вычитание может приводить к добавлению отрицательных чисел.
3.11 Команда
“deliver
”
deliver <mail address>
e.g. deliver "Dr Livingstone <David@somewhere.africa.example>"
|
Эта команда обеспечивает операцию форвардинга. Доставка устаналивается важной, если команде не предшествует
“unseen
” (смотрите раздел 3.8). Сообщение шлётся на данный адрес, точно также, как происходит если адрес появился в традиционном файле
“
.forward
”. Если вы хотите доставить сообщение к нескольким различным адресам, вы можете использовать несколько, а не одну команду
“
deliver
” (каждый может иметь лишь один адрес). Однако, от повторяющихся адресов - отказываются.
Для доставки копии сообщения в ваш обычный почтовый ящик, ваше имя логина должно быть дано как адрес. Один раз адрес обрабатыватся механизмом фильтрации, идентичный сгенерированный адрес не будет обработан снова, таким образом не вызывая петель.
Однако, если вы обладаете почтовым альясом, вы не должны ссылаться на него. Например, если почтовый адрес
“
L.Gulliver
” приводит к альясу на
“
lg303
”, затем все ссылки в файле
“
.forward
” Gulliver`a должны быть на
“
lg303
”. Ссылки на альяс не работают для сообщений которые адресованы на этот альяс, поскольку, как и обработка файл
“
.forward
”, альясинг выполняется лишь раз для адреса, для предотвращения петель.
Может появляться, опционально, следующий новый адрес, второй адрес, с предшествующим
“errors_to
”. Этим изменяется адрес, на который посылаются ошибки доставки форвардившихся сообщений. Вместо отправки сообщения оригинальному отправителю, они идут на новый адрес. Для обычных пользователей, разрешено лишь значение пользователя которому принадлежит обрабатываемый фильтр. Например, пользователь
“
lg303
”, чей почтовый ящик в домене
“
lilliput.example
” мог бы иметь файл фильтра, который содержит
deliver jon@elsewhere.example errors_to lg303@lilliput.example
|
Очевидно, использование этой особенности имеет смысл лишь в ситуациях, когда не все сообщения форвардятся. В частности, рикошеты не должны форвадится этим способом, так как вероятны почтовые петли, если что-то пойдёт не так.
3.12 Команда
“save
”
save <file name>
e.g. save $home/mail/bookfolder
|
Эта команда определяет, что копия сообщения будет добавлена к заданному файлу (т.е., файл будет использован как почтовая директория). Доставка которая установлена
“
save
” - важна, если команде не предшествует
“unseen
” (смотрите раздел 3.8).
Может быть более одной команды
“
save
”; каждая вызывает запись копии сообщения в файл являющийся её аргументом, при условии, что они различны (дублирующиеся команды
“
save
” - игнорируются).
Если имя файла не начинается с символа
“/
”, добавляется содержимое переменной
“
$home
”, если она не пуста. В обычных конфигурациях, эта переменная, обычно, установлена в пользовательском фильтре в пользовательскую домашнюю директорию, но системный администратор может установить её в другой путь. В некоторых конфигурациях,
“
$home
” может быть незадана, в случае чнго могут быть сгенерированы неабсолютные пути. Такие конфигурации конвертируют его в абсолютный путь, когда имеет место доставка. В системном фильтре,
“
$home
” никогда не установлена.
Пользователь, разумеется, должен обладать разрешением записывать в файл, и запись файла происходит в процессе работающем от пользователя, под основной группой пользователя. Любые вторичные группы, к которым может принадлежать пользователь, обычно, не используются в аккаунте, однако, системный администратор может сконфигурировать exim для их установки. В дополнение, способность использовать эту команду всеми, контролируется системным администратором - она может быть запрещена на некоторых системах.
Опциональное значение режима, может быть задано после имени. Значение режима интерпретируется как восьмеричное число, даже если оно не начинается с нуля. Например:
Это даёт возможность пользователям перезадавать общесистемный режим для доставки в файл, который обычно 600. Если существующий файл не имеет корректный режим, он изменяется.
Альтернативная форма доставки может быть включена на вашей системе, в которых каждое сообщение доставляется в новый файл в заданной директории. В этом случае, эта функциональность может быть запрошена путём задания, после команды
“
save
”, имени директории, завершаемой слэшом, например:
Есть несколько различных форматов для таких доставок; проконсультируйтесь с вашим системным администратором, или локальной документацией чтобы узнать, какая (или какие) доступны в вашей системе. Если эта функциональность не включена, использование пути завершающегося слэшом вызывает ошибку.
3.13 Команда
“pipe
”
pipe <command>
e.g. pipe "$home/bin/countmail $sender_address"
|
Эта команда определяет, что сообщение будет доставлено к заданной команде, используя трубу. Доставка, которую она устанавливает, - важна, если команде не предшествует
“unseen
” (смотрите раздел 3.8). Помните, однако, что доставки не закончатся пока обрабатывается фильтр. Все доставки происходят позже. Таким образом, результат работы трубы недоступен в фильтре.
Когда доставки завершены, запускается отдельный процесс, и копия сообщения передаётся на стандартный ввод. Процесс работает от пользователя, под первичной группой пользователя. Любые вторичные группы, к которым может принадлежать пользователь, обычно, не используются в аккаунте, однако, системный администратор может сконфигурировать exim для их установки. Может быть более одной команды
“
pipe
”; каждая вызывает запись копии сообщения в аргумент
“
pipe
”, при условии, что они различны (дублирующиеся команды
“
pipe
” - игнорируются).
Когда приходит время транспортировки сообщения, команда предоставленная
“
pipe
” разделяется exim`ом на имя команды и несколько аргументов. Они разделяются пустым пространством, исключая аргументы в двойных кавычках, в случае чего обратный слэш интерпретируется как символ экранирования, или в одиночных кавычках, в случае чего экранирование не распознаётся. Отметтьте, что вся команда, обычно, предоставляется в двойных кавычках, второй уровень помещения в кавычки - требуется для внутренних двойных кавычек. Например:
pipe "$home/myscript \"size is $message_size\""
|
Раскрытие строки выполняет отдельные компоненты после разделения строки, после чего команда запускается непосредственно exim`ом, она не запускается под шеллом. Поэтому, подстановка не может изменить число аргументов, ни кавычек, обратных слэшей, или иных метасимволов shell в переменных, вызывая недоразумение.
Документация для некоторых программ, которые обычно запускаются через этот вид трубы, часто советует что команда должна начинаться с
Это - команда shell, и она не должна присутствовать в файлах фильтра exim`a, поскольку ему ненормально запускать команду под shell.
Однако, есть опция, которую администратор может установить, вызывая использование shell. В этом случае, вся команда раскрывается как одна строка, и передаётся shell`y для интерпретации. Этого рекомендуется избегать всегда, когда возможно, поскольку это может вызвать проблемы, когда вставленные переменные сожержат метасимволы shell`a.
Дефолтовая PATH устанавливаемая для команды - определяется системным администратором, обычно содержит,самое малое,
“
/bin
” и
“
/usr/bin
”, таким образом, большинство команд доступны без задания полного пути имени файла. Однако, системный администратор может ограничить средство трубы, так, что имя команды не сможет содержать любые символы
“/
”, и должно быть найдено в одной из директорий в сконфигурированном PATH. Системный администратор также может вообще заблокировать использование команды
“
pipe
”.
Когда команда запущена, установлено множество переменных окружения. Полный список для доставок в трубы может быть найден в руководстве exim`a. Те, которые могут быть полезны для доставок
“
pipe
” из файлов пользовательских фильтров, таковы:
Имя
|
Значение
|
DOMAIN
|
домен адреса
|
HOME
|
ваша домашняя директория
|
LOCAL_PART
|
смотрите ниже
|
LOCAL_PART_PREFIX
|
смотрите ниже
|
LOCAL_PART_SUFFIX
|
смотрите ниже
|
LOGNAME
|
ваше имя логина
|
MESSAGE_ID
|
уникальный идентификатор сообщения
|
PATH
|
путь поиска команды
|
RECIPIENT
|
полный адрес получателя
|
SENDER
|
отправитель сообщения
|
SHELL
|
/bin/sh
|
USER
|
смотрите ниже
|
|
LOCAL_PART, LOGNAME, и USER установлены в одно и то же значение, а именно, в ваш логин. LOCAL_PART_PREFIX и LOCAL_PART_SUFFIX могут быть установлены, если exim скнфигурирован распознавать префиксы или суффиксы локальных частей адресов. Например, сообщение адресованное на
“
pat-suf2@domain.example
” может вызвать запуск фильтра для пользователя
“
pat
”. Если установлена доставка в
“
pipe
”, LOCAL_PART_SUFFIX будет
“-suf2
”, когда работает команда трубы. Системный администратор должен специально сконфигурировать exim для доступности этой особенности.
Если вы запускаете команду, которая является скриптом shell, будте очень осторожны в использовании данных из входящего сообщения в командах вашего скрипта. RFC2822 очень щедро в символах, которым разрешено появляться в почтовых адресах, и, в частности, адрес пожет начинаться с вертикальной черты, или слэша. По этой причине, вы всегда должны окружать кавычками любые аргументы, которые связаны с данными сообщения, как тут:
таким образом, метасимволы shell не вызовут неожиданных эффектов.
Запомните, что ранее объяснявшаяся команда трубы не запускается во время интерпретации файла фильтра. Фильтр лишь определяет, какие доставки требуются для одного из частных адресов сообщения. Сами доставки происходят позднее, когда exim htibn что всё что необходимо сообщению - завершено.
В следствии этого, вы не можете проверять код возврата из команды трубы, внутри фильтра. Тем не менее, код возврата команды - важен, поскольку exim использует его для принятия решения - была ли доставка удачной или неудачной.
Команда должна возвращать код завершения ноль, если всё прошло успешно. Большинство ненулевых кодов рассматриваются exim`ом как индицирующие ошибку трубы. Это - рассматривается как неудача доставки, вызывая возврат сообщения к отправителю. Однако, есть некоторые коды, которые рассматриваются как временные ошибки. Сообщение остаётся на диске, в спуле exim`a, и доставка пробуется снова, позднее, пока время повторов ошибки доставки не будет слишком долгим. Окончательный код для этого случая может быть задан системным администратором, значение по умолчанию - 73 и 75.
Команда трубы, обычно, не должна ничего записывать в свой стандартный выод или файловый дескриптор стандартной ошибки. Если это происходит, вне зависмости от записанного, оно, обычно, возвращается отправителю как ошибка доставки, хотя это действие может быть изменено системным администратором.
3.14 Почтовые команды
Есть две команды, которые вызывают создание нового почтового сообщения, каждай из которых считается важной доставкой, если команде не предшествует
“seen
” (смотрите раздел 3.8). Это - мощщное средство, но оно должно использоваться с осторожностью, поскольку есть опасность создания бесконечных последовательностей сообщений. Системный администратор может полностью запретить использование этих команд.
Для помощи в избежении последовательности сообщений, эти команды не имеют силы, когда когда входящее сообщение - рикошет (сообщение о ошибке доставки), и сообщения посылаемые этим способом, обрабатываются как отчёт о ошибке доставки. Таким образом, они не вызывают возврата рикошетов. Базовая команда посыла почты - такова:
mail [to <address-list>]
[cc <address-list>]
[bcc <address-list>]
[from <address>]
[reply_to <address>]
[subject <text>]
[extra_headers <text>]
[text <text>]
[[expand] file <filename>]
[return message]
[log <log file name>]
[once <note file name>]
[once_repeat <time interval>]
e.g. mail text "Your message about $h_subject: has been received"
|
Каждый
“
<address-list>
” может содержать несколько адресов, разделённых запятыми, в формате строк заголовков
“
To:
” и
“
Cc:
”. Фактически, текст, который вы тут помещаете, копируется с воответствующие строки заголовоков. Он может содержать дополнительную информацию, как почтовый адрес. Например:
mail to "Julius Caesar <jc@rome.example>, \
<ma@rome.example> (Mark A.)"
|
Подобным образом, текст предоставленный для
“
from
” и
“
reply_to
” копируется в соответтсвующие строки заголовков.
Для удобства использования в большинстве случаев, также есть команда с именем
“
vacation
”. Она ведёт себя таким же образом как и
“
mail
”, за исключением что по умолчанию опции
“
subject
”,
“
file
”,
“
log
”,
“
once
” и
“
once_repeat
”, таковы:
subject "On vacation"
expand file .vacation.msg
log .vacation.log
once .vacation
once_repeat 7d
|
соответственно. Те же самые имена файлов м периоды повторов используются традиционной командой UNIX
“
vacation
”. Значения по умолчанию могут быть перезаданы явным заданием установок, но если дано имя файла, его содержимое раскрывается лишь если запрошено явно.
Предупреждение: Команда
“
vacation
” всегда должна использоваться условно, подчиняясь наименьшему условию
“
personal
” (смотрите ниже, раздел 3.27), так, чтобы не посылать автоматические ответы на не персональные сообщения от списков рассылки, или ещё каких-то. Отсылка автоматических ответов на списки рассылки или управляющему списком рассылки - Интернетный Грех (дословно :) - прим. lissyara).
Для обеих команд, пара аргументов ключ/значение, может фигурировать в любом порядке. Должен фигурировать по меньшей мере один из
“
text
” или
“
file
” (исключение с
“
vacation
”, где умолчание -
“
file
”); если представлены обе, текстовая строка фигурирует первой в сообщении. Если
“
expand
” предшествует
“
file
”, каждая строка файла подчиняется раскрытию строк до её включения в сообщение.
Несколько строк текста могут быть предоставлены к
“
text
” путём включения экранирующей последовательности
“\n
” в строке где требуется новая строка. Если команда - вывод в течение тестирования файла фильтра, новые строки в тексте отображаются как
“\n
”.
Отметтьте, что ключевое слово для создания заголовка
“
Reply-To:
” -
“
reply_to
”, поскольку ключевые слова exim`a могут содержать подчёркивания, но не дефисы. Если представлено ключевое слово
“
from
”, и данный адрес не совпадает с пользователем владеющим файлом
“
.forward
”, exim, обычно, добавляет к сообщению заголовок
“
Sender:
”, если не сконфигурировано не делать этого.
Ключевое слово
“
extra_headers
” позволяет вам добавлять нестандартные строки заголовков к сообщению. Предоставляемые текст должен быть одной или более синтаксически верными строками заголовоков, в соответствии с RFC2822. Вы можете использовать
“\n
” внутри текста в кавычках, для задания новых строк между заголовками, и, также, для задания продолжающихся строк заголовков. Например:
extra_headers "h1: first\nh2: second\n continued\nh3: third"
|
В конце финальной строки заголовков не будет новой строки.
Если аргумент
“
to
” не присутствует, сообщение посылается на адрес в переменной
“
$reply_address
” (смотрите выше, раздел 3.3). Все заголовки
“
In-Reply-To:
” автоматически включаются в создаваемое сообщение, давая ссылку на идентификатор входящего сообщения.
Если задана
“
return message
”, входящее сообщение вызвавшее запуск файла фильтра, добавляется к концу сообщения, и на каждый адрес посылается не более одного сообщения, если не задана
“
once_repeat
”. Этим определяется временной интервал после которого посылается иная копия сообщения. Интервал задаётся как последовательность чисел, каждая сопровождаемая начальной буквой одного из
“seconds
”,
“minutes
”,
“hours
”,
“days
”, или
“weeks
”. Например,
вызывает отсылку нового сообщения если прошло 5 дней и 4 часа после того как было послано последнее. Не должно быть пробелов (в смысле - пустого пространства - прим. lissyara) во временном интервале.
Обычно, имя файла заданное для
“
once
”, используется как базовое имя для прямых файловых операций (DBM). Существует несколько различных библиотек DBM. Некоторые операционные системы предоставляют по умолчанию одну, но даже в этом случае, при сборке exim`a могут использоваться иные. С некоторыми библиотеками DBM, для определения результата
“
once
” используются два файла с суффиксами
“
.dir
” и
“
.pag
” добавляемыми к именам. В некоторых других, используется один файл с суффиксом
“
.db
”, или имя используется неизменным.
Использование файла DBM для реализация возможности
“
once
” означает, что файл растёт до такого размера, как необходимо. Обычно, это не проблема, но некоторые администраторы хотя его ограничить. Средство может быть сконфигурировано, чтобы не использовать файл DBM, но вместо этого, используется обычный файл с максимальным размером. Данные в таком файле ищутся последовательно, и, если файл запоняется, старые вхождения удаляются, для добавления новых. Это средство, которым некоторые корреспонденты могут передавать вторую копию сообщения после непредсказуемого интервала. Проконсультируйтесь с вашей локальной информацией, чтобы убедиться, что ваша система сконфигурирована таким способом.
Более чем одна команда
“
mail
” или
“
vacation
” может фигурировать в одном запуске файла фильтра; они все не выполняются, когда они все для одного и того же получателя (не уверен что правильно перевёл - прим. lissyara).
3.15 Команды логгинга
Логи могут быть взяты при помощи файла фильтра. Это средство, обычно, доступно в обычных конфигурациях, но есть некоторые ситуации когда они не могут быть получены. Также, системный администратор может их отключить. Проверьте вашу локальную информацию, если сомневаетесь.
Логгинг имеет место когда файл фильтра интерпретируется. Он не находится в очереди до более позднего времени, как команды доставки. Причина этого в том, что файл логов необходимо открывать лишь один раз для каждой операции записи. Есть две команды, ни одна из которых не назначает важную доставку. Первая - задаёт файл, в который впоследствии выводится логгинг:
logfile <file name>
e.g. logfile $home/filter.log
|
Имя файла должно быть полностью квалифицированным. Вы можете использовать
“
$home
”, как в этом примере, для ссылки на вашу домашнюю директорию. Имя файла может опционально сопровождаться режимом для этого файла, который используется, если файл создаётся. Например:
logfile $home/filter.log
0644
|
Число интепретируется как восьмеричное, если оно не начинается с нуля.Дефолтовый режим - 600. Это предполагает, что команда
“
logfile
”, обычно, появляется как первая команда в файле фильтра. Как только появился файл логов, для записи в него может быть использована команда
“
logwrite
”:
logwrite "<some text string>"
e.g. logwrite "$tod_log $message_id processed"
|
Возможно иметь более, чем одну команду
“
logfile
”, для задания записи в различные файлы логов, в различных ситуациях. Запись имеет место в конце файла, и символ новой строки добавляется в конце каждой строки, если его там нет. Новая строка может быть помещена в середине строки, используя экранирующую последовательность
“\n
”. Строки от одновременных доставок могут чередоваться в файле, так как тут нет взаимной блокировки, таким образом, вы должны планировать ваш логгинг с учётом этого. Однако, данные не теряются.
3.16 Команда
“finish
”
Команда
“
finish
”, которая не имеет аргументов, вызывает остановку интепретации файла фильтра exim`ом. Она не важное действие, если её не предшествует
“seen
”. Фильтр может содержать лишь одну команду
“seen finish
” - это, чёрная дыра.
3.17 Команда
“testprint
”
Иногда, полезна возможность распечатать значения переменных, когда тестируется файл фильтра. Команда
testprint <text>
e.g. testprint "home=$home reply_address=$reply_address"
|
ничего не делает, когда почта доставляется. Однако, когда код фильтра тестируется при помощи опции
“
-bf
” (смотрите выше, секцию 1.3), значение строки пишется на стандартный вывод.
3.18 Команда
“fail
”
Когда средство фильтрации exim`a используется как системный фильтр, доступна команда
“
fail
”, для принудительной неудачи доставки. Поскольку эта команда, обычно, используется лишь системным адмнистратором, и не включена для использования обычными пользователями, она более описана в главной спецификации exim`a более подробно, чем в этом документе.
3.19 Команда
“freeze
”
Когда средство фильтрации exim`a используется как системный фильтр, доступна команда
“
freeze
”, для заморозки сообщения в очереди. Поскольку эта команда, обычно, используется лишь системным адмнистратором, и не включена для использования обычными пользователями, она более описана в главной спецификации exim`a более подробно, чем в этом документе.
3.20 Команда
“headers
”
Команда
“
headers
” может использоваться для изменения целевой кодировки, которая используется при переводе содержимого сообщения кодированных строк заголовков, для вставки путём механизма
“
$header_
” (смотрите секцию 3.5, выше). Значение по умолчанию может быть установлено в конфигурации exim`a; если не задано, используется ISO-8859-1. На данный момент, поддерживаемый формат
“
headers
” в файлах пользовательских фильтрах, как в этом примере:
headers charset "UTF-
8
"
|
Т.е.,
“
headers
” сопровождается словом
“charset
”, и, затем, именем кодировки. Этот частный пример может быть полезным, если вы хотите сравнить содержимое заголовков со строкой UTF-8.
В файлах системного фильтра, команда
“
headers
” может использоваться для добавления или удаления строк заголовков из сообщения. Эти особенности описаны в главной спецификации exim`a.
3.21 Удовлетворение условий команд
Большинство силы фильтрования происходит из способности тестировать условия и удовлетворять условия различных команд, зависящих от результата. Команда
“
if
” используется для выполнения специальных условий, и её общая форма - такова:
if <condition>
then <commands>
elif <condition>
then <commands>
else <commands>
endif
|
Тут может быть любое число секций
“
elif
” и
“
then
” (включая отсутствие), и опциональная секция
“
else
”. Любое число команд, включая вложенные команды
“
if
”, могут фигурировать в секции
“
<commands>
”.
Условия могут быть скомбинированы используя слова
“
and
” и
“
or
”, и, для задания как комбинируются отдельные условия, могут использоваться круглые скобки. Без скобок,
“
and
” - более приоритетна, чем
“
or
”. Например:
if
$h_subject: contains "Make money" or
$h_precedence: is "junk" or
($h_sender: matches ^\\d{8}@ and not personal) or
$message_body contains "this is not spam"
then
seen finish
endif
|
Условию может предшествовать
“
not
”, для его отрицания, и, также, есть некоторые отрицательные формы условия, которые более похожи на английский язык.
3.22 Условия тестирования строк
Есть несколько условий, которые оперируют текстовыми строками, используя слова
“begins
”,
“ends
”,
“is
”,
“contains
” и
“matches
”. Если вы хотите применить тот же самый тест к более чем одной строке заголовков, вы можете легко объединить их в одну строку для тестирования, как в этом примере:
if "$h_to:, $h_cc:" contains me@domain.example then ...
|
Если имя условия тестирования строки написано в нижнем регистре, тестирование букв происходит без учёта регистра; если оно написано в верхнем регистре (например,
“CONTAINS
”), регистр букв берётся в расчёт.
<text1> begins <text2>
<text1> does not begin <text2>
e.g. $header_from: begins "Friend@"
|
Тест
“begins
” проверяет присутствие второй строки в начале первой, обе строки будут раскрыты.
<text1> ends <text2>
<text1> does not end <text2>
e.g. $header_from: ends "public.com.example"
|
Тест
“ends
” проверяет присутствие второй строки в конце первой, обе строки будут раскрыты.
<text1> is <text2>
<text1> is not <text2>
e.g. $local_part_suffix is "-foo"
|
Тест
“is
” проверяет точное соответствие между строками, вначале раскрывая обе.
<text1> contains <text2>
<text1> does not contain <text2>
e.g. $header_subject: contains "evolution"
|
Тест
“contains
” проверяет частичное соответствие строк, обе строки будут раскрыты.
<text1> matches <text2>
<text1> does not match <text2>
e.g. $sender_address matches "(bill|john)@"
|
Для теста
“matches
”, после раскрытия обеих строк, вторая интерпретируется как регулярное выражение. Exim использует библиотеку регулярных выражений PCRE, которая предоставляет регулярные выражения совместимые с perl.
Сравнение успешно, если регулярное выражение совпадает с любой частью первой строки. Если вы хотите, чтобы регулярное выражение совпадало лишь с началом или концом строки, вы должны явно закодировать требования, используя метасимволы
“^
” или
“$
”.
Верхний пример, являющийся неестественным, совпадает со всеми этими адресами:
bill@test.example
john@some.example
spoonbill@example.com
littlejohn@example.com
|
Для совпадения лишь с двумя первыми, вы могли бы использовать это:
if $sender_address matches "^(bill|john)@" then ...
|
Нужно быть внимательным, если вам необходим обратный слэш в регулярном выражении, поскольку обратный слэш интерпретируется как экранирующий символ обоими, кодом раскрытия строк, и обычной обработкой строк в кавычках exim`ом. Например, если вы хотите проверить адрес отправителя на домен завершающийся на
“
.com
”, то регулярное выражение - таково:
Обратный слэш и символ доллара, в этом выражении, должны быть экранированы, при использовании в команде фильтра, так как они будут интерпретированы кодом раскрытия. Таким образом, реально вы напишете:
if $sender_address matches \\.com\$
|
Альтернативным способом обработки этого, является использование флагов раскрытия
“\N
”, для подавления раскрытия:
if $sender_address matches \N\.com$\N
|
Всё, что между двумя вхождениями
“\N
”, копируется без раскрытия строки (и, фактически, вам не нужна финальная последовательность, поскольку она в конце строки). Если регулярное выражения дано в кавычках (обязательно, лишь если оно содержит пустое пространство), вы должны написать дважды:
if $sender_address matches "\\\\.com\\$"
|
или
if $sender_address matches "\\N\\.com$\\N"
|
Если регулярное выражение содержит субвыражение в квадратных скобках, то после успешного сравнения в последующих действиях могут использоваться числовые переменные, типа
“
$1
”. Если сравнение неудачно, значения числовых переменных остаются неизменными. Предыдущие значения не восстанавливаются после
“
endif
”. Другими словами, всегда доступен лишь один набор значений. Если условие содержит несколько подусловий, соединённых с помощью
“
and
” или
“
or
”, эта строка извлекается из последнего успешного совпадения, которое доступно в последующих действиях. Числовые значения из любых единичных субусловий также доступны для использования в последующих субусловиях, поскольку раскрытие строки условия происходит до его тестирования.
3.23 Тестирование числовых условий
Следующие условия доступны для выполнения числовых тестов:
<number1> is above <number2>
<number1> is not above <number2>
<number1> is below <number2>
<number1> is not below <number2>
e.g. $message_size is not above 10k
|
Аргументы
“
<number>
” должны раскрываться в строку цифр, опционально сопровождаемую одной из букв
“K
” или
“M
” (верхнего или нижнего регистра), которые вызывают умножение на 1024 или 1024x1024, соответственно.
3.24 Тестирование важных доставок
Вы можете использовать условие
“
delivered
”, для тестирования выполняла ли предыдущая команда фильтра установку важной доставки. Например:
if not delivered then save mail/anomalous endif
|
“Delivered
” - возможно, плохой выбор имени для этого условия, поскольку сообщение не было реально доставлено ранее, доставка была установлена для последующей обработки.
3.25 Тестирование на сообщения о ошибке
Условие
“
error_message
” - истинно, если входящее сообщение - рикошет (ошибка доставки сообщения). Помещение команды
if error_message then finish endif
|
в начале вашего файла фильтра - полезная страховка от неправильно происходящих вещей, типа невозможности доставить отчёт о ошибке. Отметтьте:
“
error_message
” - условие, а не переменная раскрытия, и поэтому ей не предшествует
“$
”.
3.26 Тестирование списка адресов
Это - средство для циклического обхода списка адресов, и применения условия к каждому из них. Оно имеет форму
foranyaddress <string> (<condition>)
|
где
“
<string>
” - интерпретируется как список адресов RFC2822, как в типичной строке заголовка, и
“
<condition>
” - любое допустимое условие фильтра, или комбинация условий. Синтаксис
“group
”, который задан для некоторых строк заголовков содержащих адрес - поддерживается.
Круглые скобки, окружающие условие, - обязательны, для определения границ от возможных последующих субусловий вложенных команд
“
if
”. Внутри условия, переменная раскрытия
“
$thisaddress
” - установлена в некомментирующую часть каждого адреса в строке, по очереди. Например, если строка
B.Simpson <bart@sfld.example>, lisa@sfld.example (his sister)
|
тогда
“
$thisaddress
” будет принимать значение
“bart@sfld.example
” и
“lisa@sfld.example
”, по очереди.
Если в списке больше нет действительных адресов, всё условие - ложно. Если внутреннее условие истинно, для одного любого из адресов, общее условие - истинно, и цикл завершается. Если внутреннее условие ложно для всех адресов в списке, общее условие - ложно. Этот пример тестирует на присутствие восьмицифровой локальной части в любом адресе в заголовке
“
To:
”:
if foranyaddress $h_to: ( $thisaddress matches ^\\d{8}@ ) then ...
|
Когда истинно общее условие, значение
“
$thisaddress
” в команде которая следует за
“
then
”, берётся последнее значение внутри петли. В конце команды
“
if
”, значение
“
$thisaddress
” сбрасывается к тому, каким оно было до этого. Это полезно для избегания использования многочисленных
“
foranyaddress
”, вложенных, или иначе, в одну команду
“
if
”, если значение
“
$thisaddress
” используется впоследствии, поскольку оно всегда очищается. Вместо этого, следовало бы использовать вложенные команды
“
if
”.
Строки заголовков могут быть соединены вместе, если проверка применяется более чем к одному из них. Например:
if foranyaddress $h_to:,$h_cc: ....
|
Этим сканируются адреса в обоих заголовках -
“
To:
” и
“
Cc:
”.
3.27 Тестирование на персональность почты
Обычное требование - различать входящую персональную почту, и почту от почтовых рассылок, или от роботов, или иных автоматических процессов (например, рикошеты). В частности, это тестирование, обычно, требуется для
“vacation messages
”.
Условие
“
personal
” проверяет, что сообщение - не рикошет, и что почтовый адрес текущего пользователя присутствует в строке заголовка
“
To:
”. Также, оно проверяет, что отправитель - не текущий пользователь, или один из множества обычных даемонов, и что в сообщении нет строки заголовка, начинающейся с
“
List-
”. В конце, оно проверяет содержимое строки заголовка
“
Precedence:
”, если она есть.
Вы должны всегда использовать условие
“
personal
”, когда генерируете автоматические ответы. Этот пример показывает использование
“
personal
” в файле фильтра, который отсылает сообщение о отпуске:
if personal then
mail to $reply_address
subject "I am on holiday"
file $home/vacation/message
once $home/vacation/once
once_repeat 10d
endif
|
Это - замачиво, когда пишется команда, типа вышеприведённой, для цитирования оригинальной темы в ответе. Например:
subject "Re: $h_subject:"
|
Однако - это опасно делать. Это может позволить кому-то иному подписать вас на выбранный список рассылки, при условии, что список принимает рикошеты как подтверждения о подписке. (Из фильтров, сообщения всегда шлются как рикошеты.) Хорошо управляемые списки требуют ,чтобы сообщение было не-рикошетом, для подтверждения подписки, таким образом, опасность относительно мала.
Если для локальных частей используются преффиксы или суффиксы - что-то, что зависит от конфигурации exim`a (смотрите ниже, раздел 3.31), тесты для текущего пользователя завершаются с полным адресом (включая преффикс и суффикс, если они есть), как с удалённым преффиксом и суффиксом. Если система сконфигурирована для перезаписи локальных частей почтовых адресов, например, для перезаписи
“dag46
” как
“Dirk.Gently
”, перезаписанная форма адресов также используется в тестах.
3.28 Адреса альясов для персональных условий
Вполне обычно для людей имеющих почтовые аккаунты на нескольких различных системах - форвардить всю их почту на одну систему, и в этом случае проверка на персональную почту должна проверять все их различные почтовые адреса. Для разрешения этого, ключевое условие
“
personal
” может сопровождаться
любое число раз, например:
if personal alias smith@else.where.example
alias jones@other.place.example
then ...
|
Адреса альясов обрабатываются как альтернативы пользовательскому почтовому ящику, при тестировании содержимого строк заголовков.
3.29 Детали персональных условий
Основной тест
“
personal
” примерно эквавалентен следующему:
not error_message and
$message_headers does not contain "\nList-Id:" and
$message_headers does not contain "\nList-Help:" and
$message_headers does not contain "\nList-Subscribe:" and
$message_headers does not contain "\nList-Unsubscribe:" and
$message_headers does not contain "\nList-Post:" and
$message_headers does not contain "\nList-Owner:" and
$message_headers does not contain "\nList-Archive:" and
(
"${if def h_auto-submitted:{present}{absent}}" is "absent" or
$header_auto-submitted: is "no"
) and
$header_precedence: does not contain "bulk" and
$header_precedence: does not contain "list" and
$header_precedence: does not contain "junk" and
foranyaddress $header_to:
( $thisaddress contains "$local_part
$domain" ) and
not foranyaddress $header_from:
(
$thisaddress contains "$local_part@$domain" or
$thisaddress contains "server@" or
$thisaddress contains "daemon@" or
$thisaddress contains "root@" or
$thisaddress contains "listserv@" or
$thisaddress contains "majordomo@" or
$thisaddress contains "-request@" or
$thisaddress matches "^owner-[^@]+@"
)
|
Переменная
“
$local_part
” содержит локальную часть почтового адреса пользователя, файл фильтра которого работает, обычно - это ваш логин. Переменная
“
$domain
” - содержит почтовый домен. Как объяснено выше, если заданы альясы или перезапись, или если используются преффиксы и суффиксы, тесты для текущего пользователя завершаются с альтернативными адресами.
3.30 Тестирование статуса доставки
Есть два условия, которые предназначены, главным образом, для использования в файлах системного фильтра, но которые также доступны в файлах пользовательских фильтров. Условие
“
first_delivery
” - истинно, если это - первый процесс, пытающийся доставить сообщение, и ложно в других случаях. Этот индикатор не сбрасывается после успешного завершения первого процесса доставки; если происходит сбой, или неполадки с питанием (например), следующая доставка предпринимается также, как первая (
“first delivery
”).
В пользовательском файле фильтра
“
first_delivery
” будет ложно, если до этого в фильтре были ошибки, или доставка для пользователя неудачна, например, из-за ошибки квоты, или если форвардинг к удалённому адресу был задержан по каким-то причинам.
Условие
“
manually_thawed
” - истинно, если сообщение было заморожено по каким-то причинам, и впоследствии разморожено системным администратором. Оно - необычно для использования в пользовательских файлах фильтров.
3.31 Пользовательские мультипочтовые ящики
Системный администратор может сконфигурировать exim так, что пользователи могут установить варианты их почтовых адресов, и обрабатывать их раздельно. Проконсультируйтесь с вашим системным администратором или локальной документацией, чтобы узнать, включено ли это средство в вашей системе, и если так, каковы его детали.
Средство включает в себя использование преффикса или суффикса в почтовом адресе. Например, вся поста адресованая на
“
lg303-<something>
” была бы собственностью пользователя
“
lg303
”, который мог бы определить, как она должна быть обработана, в зависмости от значения
“
<something>
”.
Возможны два способа, которыми это можно сделать. Первая возможность - использование нескольких файлов
“
.forward
”, которые должны быть файлами фильтра, таким образом, они могут различать разные случаи, путём ссылки на переменные
“
$local_part_prefix
” или
“
$local_part_suffix
”, как в последнем примере, в секции 3.33, ниже.
Возможно сконфигурировать exim на поддержку обоих схем одновременно. В этом случае, специфический файл
“
.forward-foo
” ищется первым; если он не найден, используется основной файл
“
.forward
”.
Тест
“
personal
” (смотрите раздел 3.27) включает преффиксы и суффиксы в свои проверки.
3.32 Игнорирование ошибок доставки
Как было объяснено выше, фильтрация лишь устанавливает адреса для доставки - доставки реально не происходят, пока активен файл фильтра. если любой сгенерированный адрес, впоследствии переносит ошибку доставки, сообщение о ошибке генерируется обычным способом. Однако, если команда фильтра, которая устанавливает доставку, предваряется словом
“noerror
”, ошибки для этой доставки, и любых доставок в результате её (т.е. - из альясинга, форвардинга, или вызыванных файлом фильтра) - игнорируются.
3.33 Примеры команд фильтра exim`a
Простой форвардинг:
# Exim filter
deliver baggins@rivendell.middle-earth.example
|
Обработка отпуска, используя традиционные средства, предполагая, что
“
.vacation.msg
” и иные файлы находятся в вашей домашней директории:
# Exim filter
unseen pipe "/usr/ucb/vacation \"$local_part\""
|
Обработка отпуска внутри exim`a, вначале должен быть создан файл с именем
“
.vacation.msg
”, в вашей домашней директории:
# Exim filter
if personal then vacation endif
|
Файлы некоторых сообщений по теме:
# Exim filter
if $header_subject: contains "empire" or
$header_subject: contains "foundation"
then
save $home/mail/f+e
endif
|
Сохранение всех несрочных сообщений по будним дням:
# Exim filter
if $header_subject: does not contain "urgent" and
$tod_full matches "^(...),"
then
save $home/mail/$1
endif
|
Отбрасывание прочь (ф топку - прим. lissyara :) - как вы думаете, какое у меня щас настроение и состояние, после того, как больше года ушло на перевод и до конца осталось два абзаца? :)) всех сообщений от одного сайта, исключая письма от postmaster:
# Exim filter
if $reply_address contains "@spam.site.example" and
$reply_address does not contain "postmaster@"
then
seen finish
endif
|
Обработка персональных мультипочтовых ящиков:
# Exim filter
if $local_part_suffix is "-foo"
then
save $home/mail/foo
elif $local_part_suffix is "-bar"
then
save $home/mail/bar
endif
|
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
36. Аутентификатор Cyrus_sasl
Код для этого аутентификатора был предоставлен Matthew Byng-Maddick of A L Digital Ltd (http://www.aldigital.co.uk).
Аутентификатор
“
cyrus_sasl
” предоставляет серверную поддержку для реализации RFC 2222 (
“Simple Authentication and Security Layer
”) библиотекой Cyrus SASL. Эта библиотека поддерживает множество аутентификационных механизмов, включая PLAIN и LOGIN, а также несколько других, которые exim не поддерживает непосредственно. В частности, есть поддержка для аутентификации Kerberos.
Аутентификатор
“
cyrus_sasl
” предоставляет шлюзовой механизм напрямую к интерфейсу Cyrus, таким образом, ваша билиотека Cyrus может, например, CRAM-MD5, что может аутентификатор
“
cyrus_sasl
”. По умолчанию, им используется публичное имя драйвера, для определения, какой механизм поддерживать.
Когда требуется доступ к какому-то секретному файлу, например, в GSSAPI или CRAM-MD5, нужно отметить, что аутентификатор выполняется от пользователя exim`a, и, что библиотека Cyrus SASL не может повысить дефолтовые привилегии. Также, вам может понадобиться установить переменные окружения, в зависимости от используемого драйвера.
36.1 Использование cyrus_sasl в качестве сервера
Аутентификатор
“
cyrus_sasl
” обладает четырьмя частными опциями. Он помещает имя пользователя (из успешной аутентификации) в
“
$auth1
”. Для совместимости с предыдущими релизами exim`a, имя пользователя, также, помещается в переменную
“
$1
”. Однако, использование этой переменной для данной цели, в настоящее время осуждается, поскольку может привести к беспорядку при раскрытиях строк, использующих цифровые переменные для других целей.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_hostname
|
cyrus_sasl
|
string†
|
$primary_hostname
|
|
Эта опция выбирает имя хоста, используемое при связи с библиотекой. Она выше нижележащего плугина SASL, который работает с этими данными.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_mech
|
cyrus_sasl
|
string
|
public_name
|
|
Эта опция выбирает аутентификационный механизм который должен использовать этот драйвер. Она возволяет вам использовать иной основной механизм для объявленного имени. Например:
sasl:
driver = cyrus_sasl
public_name = X-ANYTHING
server_mech = CRAM-MD5
server_set_id = $auth1
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_realm
|
cyrus_sasl
|
string
|
незадана
|
|
Эта опция определяет область SASL, в которой осуществляется сервер.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_service
|
cyrus_sasl
|
string
|
smtp
|
|
Это - сервис SASL, в области которого осуществлется сервер.
Для прямых случаев, вы не должны устанавливать какую-либо из частных опций аутентификатора. Всё что вам необходимо сделать - задать соответствующий механизм как публичное имя. Таким образом, если у вас есть билиотека SASL, поддерживающая CRAM-MD5 и PLAIN, вы могли бы обладать двумя аутентификаторами, как показано далее:
sasl_cram_md5:
driver = cyrus_sasl
public_name = CRAM-MD5
server_set_id = $auth1
sasl_plain:
driver = cyrus_sasl
public_name = PLAIN
server_set_id = $auth1
|
Cyrus SASL действительно осуществляет аутентификационный метод LOGIN, несмотря на то, что это - нестандартный метод. По умолчанию, это отключено в исходных кодах, но присутствует во многих двоичных дистрибутивах.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
Philip Hazel
Copyright ╘ 2006 University of Cambridge
Revision 4.62 27 April 2006 PH
--------------------------------------------------------------------------------
Содержание
1. Введение
1.1. Документация exim
1.2. FTP и WEB сайты
1.3. Листы рассылки
1.4. Курсы exim
1.5. Сообщения об ошибках
1.6. Где найти дистрибутив exim
1.7. Список пожеланий
1.8. Материалы содействия
1.9. Ограничения
1.10. Рабочая (выполняемая) конфигурация
1.11. Интерфейс вызова
1.12. Терминология
2. Включенный код
3. Как еxim получает и доставляет почту
3.1. Полная философия
3.2. Управление политиками
3.3. Пользовательские фильтры
3.4. Идентификация сообщений
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. Сбой доставки рикошета
4. Сборка и инсталляция Exim
4.1. Распаковка
4.2. Разнообразие архитектур и операционных систем
4.3. DBM библиотеки
4.4. Предсборочная конфигурация
4.5. поддержка
“
iconv()
”
4.6. Включение TLS/SSL шифрования
4.7. Использование tcpwrappers
4.8. Включение поддержики IPv6
4.9. Процесс сборки
4.10. Выходные данные после
“make
”
4.11. Отмена опций при сборке Exim
4.12. OS-cпецифические заголовки
4.13. Отмена опций при сборке монитора
4.14. Установка бинарных файлов и скриптов Exim'а
4.15. Инсталляция документации
4.16. Определение директории spool
4.17. Тестирование
4.18. Замещение другого MTA, Exim'ом
4.19. Обновление Exim
4.20. Остановка демона Exim на Solaris'е
5. Командная строка Exim
5.1. Установка опций именем программы
5.2. Доверенные и административные пользователи
5.3. Опции командной строки
6. Конфигурационный файл exim во время выполнения
6.1. Использование иного конфигурационного файла
6.2. Формат конфигурационного файла
6.3. Включения файлов в конфигурационый файл
6.4. Макросы в конфигурационном файле
6.5. Макроподстановка
6.6. Переопределение макроса
6.7. Отмена значения макроса
6.8. Пример использования макроса
6.9. Условные пропуски в конфигурационном файле
6.10. Общий синтаксис опции
6.11. Булевы опции
6.12. Целочисленные значения
6.13. Целочисленные восьмеричные значения
6.14. Числовые значения с фиксированной точкой
6.15. Значения временных интервалов
6.16. Строковые значения
6.17. Раскрытие строк
6.18. Имена пользователей и групп
6.19. Построение списков
6.20. Пустые элементы в списках
6.21. Формат конфигурации драйвера
7. Дефолтовый конфигурационный файл
7.1. Главные конфигурационные настройки
7.2. Конфигурация ACL
7.3. Конфигурация роутера (маршрутизатора)
7.4. Транспортная конфигурация
7.5. Дефолтовые правила повторов
7.6. Конфигурация перезаписи
7.7. Конфигурация аутентификаторов
8. Регулярные выражения
8.1. Tестирование регулярных выражений
9. Поиски в файлах и базах данных
9.1. Примеры различных синтаксисов поиска
9.2. Типы поиска
9.3. Одноключевые типы поиска
9.4. Типы поиска в стиле запроса
9.5. Временные ошибки в поисках
9.6. Дефолтовые значения в одноключевых поисках
9.7. Частичное совпадение в одноключевых поисках
9.8. Кэширование поиска
9.9. Квотирование (помещение в двойные кавычки) данных поиска
9.10. Дополнительные сведения о dnsdb
9.11. Псевдо-
“dnsdb
” типы записей
9.12. Множественные поиски
“dnsdb
”
9.13. Дополнительные сведения о LDAP
9.14. Формат запросов LDAP
9.15. Квотирование (использование двойных кавычек и спецсимволов) в LDAP
9.16. Соединения LDAP
9.17. Аутентификация LDAP и управляющая информация
9.18. Формат данных возвращённых LDAP
9.19. Дополнительные сведения о NIS+
9.20. Поиски SQL
9.21. Дополнительные сведения о MySQL, PostgreSQL, Oracle, и Interbase
9.22. Специальные возможности MySQL
9.23. Специальные возможности PostgreSQL
9.24. Дополнительные сведения о SQLite
10. Списки доменов, узлов, адресов и локальных частей [почтового] адреса
10.1. Раскрытие списков
10.2. Отрицаемые элементы в списках
10.3. Имена файлов в списках
10.4. Файл
“lsearch
” не нелинейный список
10.5. Именованные списки
10.6. Сравнение именованных списков с макросами
10.7. Кэширование именованных списков
10.8. Списки доменов
10.9. Списки хостов
10.10. Специальные паттерны списка хостов
10.11. Паттерны списка хостов, совпадающие с IP-адресом
10.12. Паттерны списка хостов для одноключевого поиска по имени хоста
10.13. Паттерны списка хостов совпадающие по имени хоста
10.14. Поведение, когда IP-адрес не может быть найден
10.15. Список шаблонов хостов для одноключевого поиска по имени хоста
10.16. Список шаблонов хостов для поиска в стиле запросов
10.17. Смешивание безразличных имён хостов и адресов в списках хостов
10.18. Списки адресов
10.19. Регистр букв в списках адресов
10.20. Списки локальных частей
11. Раскрытие строк
11.1. Дословный текст в раскрываемых строках
11.2. Последовательности с обратным слэшем, в расширенных строках
11.3. Тестирование раскрываемых строк
11.4. Принудительный отказ от раскрытия строки
11.5. Элементы раскрытия
11.6. Операторы раскрытия
11.7. Условия раскрытия
11.8. Комбинирование условий раскрытия
11.9. Переменные раскрытия
12. Встроенный perl
12.1. Настройка использования perl
12.2. Вызов подпрограмм perl
12.3. Вызов функций exim`a из perl`a
12.4. Использование стандартного вывода и ошибок perl`ом
13. Запуск даемона, и использование сетевых интерфейсов
13.1. Запуск слушающего даемона
13.2. Специальный IP слушающий адреса
13.3. Отмена
“local_interfaces
” и
“daemon_smtp_ports
”
13.4. Поддержка устаревшего протокола SSMTP (или SMTPS)
13.5. Области адресов IPv6
13.6. Отключение IPv6
13.7. Примеры запуска слушающего даемона
13.8. Распознание локального хоста
13.9. Доставка к удалённому хосту
14. Главная конфигурация
14.1. Разное
14.2. Параметры exim
14.3. Настройки привелегий
14.4. Логгинг
14.5. Замороженные сообщения
14.6. Поиск данных
14.7. Идентификаторы сообщений
14.8. Запуск встроенного perl`a
14.9. Даемон
14.10. Контроль ресурсов
14.11. Управление политиками
14.12. Кэш обратных вызовов
14.13. TLS
14.14. Локальная обработка пользователей
14.15. Все входящие сообщения (SMTP и не-SMTP)
14.16. Входящие не-SMTP сообщения
14.17. Входящие не-SMTP сообщения
14.18. Расширения SMTP
14.19. Обработка сообщений
14.20. Системный фильтр
14.21. Роутинг и доставка
14.22. Рикошеты и предупрждающие сообщения
14.23. Алфавитный список главных опций
15. Общие опции для роутеров
16. Роутер ACCEPT
17. Роутер dnslookup
17.1. Проблемы с поиском в DNS
17.2. Частные опции для dnslookup
17.3. Эффект опций qualify_single и search_parents
18. Роутер ipliteral
19. Роутер iplookup
20. Роутер manualroute
20.1. Частные (private) опции manualroute
20.2. Правила маршрутизации в опции
“route_list
”
20.3. Правила маршрутизации в опции
“route_data
”
20.4. Формат списка узлов
20.5. Формат одного элемента хоста
20.6. Как используется список узлов
20.7. Как используются опции
20.8. Примеры
“manualroute
”
21. Роутер queryprogram
22. Роутер redirect
22.1. Данные для перенаправления
22.2. Файлы пересылки (forward files) и проверка адреса
22.3. Обработка данных перенаправления
22.4. Элементы списка перенаправления
22.5. Перенаправление в локальный почтовый ящик
22.6. Специальные конструкции в списках перенаправления
22.7. Дублирование адресов
22.8. Повторяющееся преобразование перенаправления
22.9. Ошибки в списках перенаправления
22.10. Частные опции роутера
“redirect
”
23. Среда для работы локальных транспортов
23.1. Одновременные доставки
23.2. Uid`ы и gid`ы
23.3. Текущая и домашняя директории
23.4. Переменные раскрытия произведённые из адреса
24. Общие опции для транспортов
25. Группировка адресов в локальных транспортах
26. Транспорт appendfile
26.1. Опции
“file
” и
“directory
”
26.2. Частные опции для
“appendfile
”
26.3. Операционные детали для добавления
26.4. Операционные детали для доставки в новый файл
26.5. Доставка
“maildir
”
26.6. Использование тэгов для записи размера сообщений
26.7. Использование файла
“maildirsize
”
26.8. Доставка
“mailstore
”
26.9. Неспециальная доставка в новый файл
27. Транспорт autoreply
27.1. Частные опции для
“autoreply
”
28. Транспорт lmtp
29. Транспорт
“pipe
”
29.1. Конкурирующие доставки
29.2. Возвращаемый статус и данные
29.3. Как выполняется команда
29.4. Переменные окружения
29.5. Частные опции для
“pipe
”
29.6. Использование внешнего (стороннего) агента локальной доставки
30. Транспорт SMTP
30.1. Несколько сообщений в одном соединении
30.2. Использование переменной
“
$host
”
30.3. Частные опции для
“smtp
”
30.4. Как ограничить число хостов используемых для проверки
31. Перезапись адресов
31.1. Явно сконфигурированная перезапись адресов
31.2. Когда происходит перезапись?
31.3. Тестирование правил перезаписи применяемых на входе
31.4. Правила перезаписи
31.5. Шаблоны перезаписи
31.6. Перезапись замен
31.7. Флаги перезаписи
31.8. Флаги, определяющие какие заголовки и адрес конверта перезаписывать
31.9. Флаг перезаписи во время SMTP
31.10. Флаги контролирующие процесс перезаписи
31.11. Примеры перезаписи
32. Конфигурация повторов
32.1. Правила повторов
32.2. Выбор, какие правила используются для ошибок адреса
32.3. Выбор, какое правило используется для хоста и сообщения о ошибке
32.4. Правила повтора для специфических ошибок
32.5. Правила повторов для специфических отправителей
32.6. Параметры повтора
32.7. Примеры правил повтора
32.8. Таймаут для данных повторов
32.9. Долгосрочные ошибки
32.10. Доставки работающие с перерывами
33. SMTP-аутентификация
33.1. Общие опции для аутентификаторов
33.2. Параметр AUTH в команде MAIL
33.3. Аутентификация на сервере exim
33.4. Проверка серверной аутентификации
33.5. Аутентификация exim`a как клиента
34. Аутентификатор plaintext
34.1. Использование plaintext в сервере
34.2. Аутентификационный механизм PLAIN
34.3. Аутентификационный механизм LOGIN
34.4. Поддержка для иных видов аутентификации
34.5. Использование
“plaintext
” как клиента
35. Аутентификатор cram_md5
35.1. Использование cram_md5 как сервера
35.2. Использование cram_md5 как клиента
36. Аутентификатор cyrus_sasl
36.1. Использование cyrus_sasl в качестве сервера
37. Аутентификатор spa
37.1. Использование spa как сервера
37.2. Использование
“spa
” как клиента
38. Шифрование соединений с использованием TLS/SSL
38.1. Поддержка для наследственного
“ssmtp
” (или
“smtps
”) протокола
38.2. OpenSSL против GnuTLS
38.3. Вычисление параметра GnuTLS
38.4. Требование специфических шифров в OpenSSL
38.5. Специфические шифры требующиеся в GnuTLS
38.6. Конфигурирование сервера exim для использования TLS
38.7. Запрос и проверка клиентских сертификатов
38.8. Отменённые сертификаты
38.9. Конфигурирование клиента exim`a для использования TLS
38.10. Несколько сообщений через одно шифрованное TCP/IP соединение
38.11. Сертификаты и всё такое
38.12. Цепочки сертификатов
38.13. Самоподписанный сертификаты
39. Списки Контроля Доступа
39.1. Тестирование ACL
39.2. Определение, когда используются ACL
39.3. Не-SMTP ACL
39.4. ACL подключения
39.5. ACL DATA
39.6. ACL MIME
39.7. ACL QUIT
39.8. Нахождение ACL для использования
39.9. Коды возврата ACL
39.10. Незаданные опции ACL
39.11. Данные для ACL сообщений
39.12. Данные для ACL не-сообщений
39.13. Формат ACL
39.14. Команды ACL
39.15. Переменные ACL
39.16. Обработка условий и модификаторов
39.17. Модификаторы ACL
39.18. Использование модификатора
“control
”
39.19. Добавление строк заголовков в ACL`ах
39.20. Условия ACL
39.21. Использование списков DNS
39.22. Задание IP-адреса для поиска в списках DNS
39.23. DNS-списки основанные на именах доменов
39.24. Поиски в DNS основанные на нескольких ключах
39.25. Данные возвращаемые списками DNS
39.26. Переменные устанавливаемые из списков DNS
39.27. Дополнительные совпадения условий для списков DNS
39.28. Отрицательные условия сравнения DNS
39.29. Списки DNS и IPv6
39.30. Ограничение нормы отправителей
39.31. Проверка адресов
39.32. Проверка обратным вызовом
39.33. Дополнительные параметры для обратных вызовов
39.34. Кэширование обратных вызовов
39.35. Отчёты проверки адресов отправителя
39.36. Перенаправление при проверке
39.37. Клиентская SMTP-авторизация (CSA)
39.38. Проверка тега адреса рикошета
39.39. Использование ACL для упавления релеингом
39.40. Проверка конфигурации релея
40. Контентное сканирование во время ACL
40.1. Сканирование на вирусы
40.2. Сканирование с SpamAssassin
40.3. Вызов SpamAssassin из ACL exim`a
40.4. Сканирование частей MIME
40.5. Сканирование с регулярными выражениями
40.6. Условие
“demime
”
41. Добавляем функцию local scan в Exim
41.1. Сборка Exim с использованием функции local scan
41.2. API для local_scan()
41.3. Опции конфигурации для local_scan()
41.4. Доступные переменные Exim
41.5. Структура header_line
41.6. Структура recipient_item
41.7. Доступные функции Exim
41.8. Больше об обработке памяти Exim'ом
42. Системная фильтрация сообщений
42.1. Установка системного фильтра
42.2. Тестирование системного фильтра
42.3. Содержимое системного фильтра
42.4. Дополнительные переменные для системных фильтров
42.5.
“Defer
”,
“freeze
”, и
“fail
” команды системного фильтра
42.6. Добавление и удаление заголовков в системном фильтре
42.7. Установка адреса ошибок в системном фильтре
42.8. Фильтрация по адресам
43. Обработка сообщения
43.1. Режим передачи для нелокальных сообщений
43.2. Завершения строк
43.3. Неквалифицированные адреса
43.4. Строка
“From
” UUCP
43.5. Строки заголовков
“Resent-
”
43.6. Строка заголовка
“Auto-Submitted:
”
43.7. Строка заголовка
“Bcc:
”
43.8. Строка заголовка
“Date:
”
43.9. Строка заголовка
“Delivery-date:
”
43.10. Строка заголовка
“Envelope-to:
”
43.11. Строка заголовка
“From:
”
43.12. Строка заголовка
“Message-ID:
”
43.13. Строка заголовка
“Received:
”
43.14. Строка заголовка
“References:
”
43.15. Строка заголовка
“Return-path:
”
43.16. Строка заголовка
“Sender:
”
43.17. Добавление и удаление заголовков в роутерах и транспортах
43.18. Конструирование адресов
43.19. Регистры локальных частей
43.20. Точки в локальных частях
43.21. Перезапись адресов
44. Обработка SMTP
44.1. Исходящий SMTP и LMTP через TCP/IP
44.2. Ошибки в исходящем SMTP
44.3. Входящие SMTP сообщения через TCP/IP
44.4. Нераспознанные SMTP-команды
44.5. Синтаксис и ошибки протокола в командах SMTP
44.6. Использование непочтовых SMTP команд
44.7. Команды VRFY и EXPN
44.8. Команда ETRN
44.9. Входящий локальный SMTP
44.10. Исходящий пакетный SMTP
44.11. Входящий пакетный SMTP
45. Настройка рикошетов и предупреждающих сообщений
45.1. Настройка рикошетов
45.2. Настройка предупреждающих сообщений
46. Некоторые общие конфигурационые опции
46.1. Отсылка почты на
“умный
” хост
46.2. Использование exim для обработки списков рассылки
46.3. Синтаксические ошибки в списках рассылки
46.4. Повторное раскрытие списков рассылки
46.5. Закрытые списки рассылки
46.6. Переменные пути возврата конверта (VERP)
46.7. Виртуальные домены
46.8. Многочисленные пользовательские почтовые ящики
46.9. Упрощённая обработка отпуска (vacation)
46.10. Отбор копий сообщений
46.11. Периодически подключенные хосты
46.12. Exim на вышестоящих серверных хостах
46.13. Exim на периодически подключаемом клиентском хосте
47. Использование exim`a как клиента без очереди сообщений
48. Файлы логов
48.1. Где пишутся логи
48.2. Логгинг в локальные файлы, которые периодически ротируются
48.3. Штамп даты на файлах логов
48.4. Логгинг в syslog
48.5. Флаги строк логов
48.6. Логирование приёма сообщений
48.7. Логгинг доставок
48.8. Доставки от которых отказались
48.9. Отсроченные доставки
48.10. Ошибки доставки
48.11. Поддельные доставки
48.12. Завершение
48.13. Краткое изложение полей в строках логов
48.14. Другие записи логов
48.15. Сокращение или увеличение того, что логгируется
48.16. Лог сообщения
49. Утилиты exim`a
49.1. Поиск, что делают процессы exim`a (exiwhat)
49.2. Селективный просмотр очереди (exiqgrep)
49.3. Подведение итогов очереди (exiqsumm)
49.4. Извлечение специфической информации из лога (exigrep)
49.5. Отбор сообщений по различным критериям (exipick)
49.6. Ротация лог-файлов (exicyclog)
49.7. Почтовая статистика (eximstats)
49.8. Проверка политики доступа (exim_checkaccess)
49.9. Создание файлов DBM (exim_dbmbuild)
49.10. Нахождение индивидуальных времён повторов (exinext)
49.11. Обслуживание БД подсказок
49.12. exim_dumpdb
49.13. exim_tidydb
49.14. exim_fixdb
49.15. Обслуживание почтового ящика (exim_lock)
50. Монитор exim`a
50.1. Запуск монитора
50.2. Графики
50.3. Кнопки главного действия
50.4. Показ логов
50.5. Отображение очереди
50.6. Меню очереди
51. Обсуждение безопасности
51.1. Сборка более
“защищённого
” exim`a
51.2. root`овые привилегии
51.3. Работа exim без привилегий
51.4. Доставка в локальные файлы
51.5. Источник роутинга IPv4
51.6. Команды VRFY, EXPN, и ETRN в SMTP
51.7. Привелигированные пользователи
51.8. Файлы спула
51.9. Использование argv[0]
51.10. Использование форматирования %f
51.11. Встроенные пути exim`a
51.12. Использование
“
sprintf()
”
51.13. Использование
“
debug_printf()
” и
“
log_write()
”
51.14. Использование
“
debug_printf()
” и
“
log_write()
”
52. Формат файлов спула
52.1. Формат файла
“-H
”
53. Добавление новых драйверов или типов поисков
54. Возможности Exim для фильтрации почты
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
Часть перевода взята отсюда
1. Введение
Exim - агент передачи почты (MTA) для хостов, на которых запущена UNIX, или UNIX-like операционная система. Он был спроектирован с учетом, что будет выполняться на хостах, постоянно связанных с интернетом. Однако, он может использоваться и на хостах, которые периодически связывабтся с Internet, с соответствующей корректировкой конфигурационных настроек.
В настоящее время, конфигурационные файлы существуют для следующих операционных систем: AIX, BSD/OS (иначе - BSDI), Darwin (Mac OS X), DGUX, Dragonfly, FreeBSD, GNU/Hurd, GNU/Linux, HI-OSF (Hitachi), HI-UX, HP-UX, IRIX, MIPS RISCOS, NetBSD, OpenBSD, OpenUNIX, QNX, SCO, SCO SVR4.2 (иначе - UNIX-SV), Solaris (aka SunOS5), SunOS4, Tru64-Unix (formerly Digital UNIX, formerly DEC-OSF1), Ultrix, и Unixware. Некоторые из этих операционных систем более не используются и не могут быть легко проверены, таким образом, конфигурационные файлы, возможно нерабочие.
Также есть конфигурационные файлы для сборки exim в среде Cygwin, которая может быть установлена на системах с работающей ОС Windows. Однако, этот документ не содержит какойбы-то ни было информации о работе exim в среде Cygwin.
Сроки и условия для использования и распространения exim содержатся в файле
“
NOTICE
”. Exim распространяется в соответствии с GNU General Public Licence, копия которой может быть найдена в файле
“
LICENCE
”.
Использование, поставка, или реклама exim для массовой рассылки непрошенной электронной почты несовместимо с основными целями программы, которые сосредоточены вокруг бесплатных сервисов, которые увеличивают качество персональной связи. Автор exim расценивает массовую беспорядочную рассылку электронной почты как антиобщественное, безответственное злоупотребление Интернетом.
Exim многим обязан Smail 3 и его автору, Рону Карру (Ron Karr). Без опыта запуска и работы кода Smail 3, я, возможно, никогда бы и не собрался писать новый MTA. Многие из идей и пользовательских интерфейсов были первоначально взяты от Smail 3, хотя фактический код exim полностью новый, и развился далеко за пределы начальной концепции.
Много людей, и в Кембридже и во всём мире внесли свой вклад в разработку и тестирование exim, а также в портирование его на различные опреационные системы. Я благодарен им всем. Дистрибутив, теперь, содержит файл с именем
“
ACKNOWLEDGMENTS
”, в котором я начал запись имён всех, кто помог.
1.1 Документация exim
Эта редакция спецификации exim применима к версии 4.62. Независимые изменения от версии 4.61 отмечены в некоторых вариантах документа; этот пареграф отмечен таким же образом, если версия документа способна отображать изменения.
Этот документ - справочное руководство; это не обучающий документ. Как ожидается, читатель будет иметь некоторое представление о почтовом протоколе SMTP и общим администрированием UNIX-систем. Хотя в некоторых местах есть примеры, информация, по большей части, организована для облегчения поиска, а не в естественном порядке для последовательного чтения. Кроме того, это руководство стремится подробно охватить каждый аспект exim, включая множество редко используемых особенностей специального назначения, которые врядли будут представлять широкий интерес.
Более
“лёгкое
” обсуждение Exim, с более многосторонними обяснительными и вводными материалами может быть найдено в книге
“
The Exim SMTP Mail Server
”, изданной в Кембридже (http://www.uit.co.uk/exim-book/).
Также, эта книга содержит главу, дающую общее введение в SMTP и интернет-почту. Однако, неизбежно, что книга врятли будет полностью совместима с последним выпуском exim. (Отметтьте, что более ранняя книга о exim, изданная O'Reilly, посвящена exim 3, и много тонкостей изменились в exim4.)
Если вы используете exim из дистрибутива debian, вы можете найти информацию о особенностях этого дистрибутива в файле
/usr/share/doc/exim4-base/README.Debian
|
Команда
“man update-exim.conf
” - иной источник debian-специфичной информации.
Поскольку программа развивается, в новых версиях могут быть особенности, которые ещё не внесены в этот документ, обновляемый лишь когда изменяется самая существенная цифра дробной части версии. Спецификации новых возможностей, ещё не находящихся в этом документе, помещены в файл
“
doc/NewStuff
” дистрибутива exim.
Некоторые особенности могут быть классифицированы как
“экспериментальные
”. При разработке они могут несовметимо измениться, или вообще быть убраны. Поэтому они не описаны в этом руководстве. Информацию о экспериментальных особенностях можно найти в файле
“
doc/experimental.txt
”.
Все изменения в программе (новые особенности, исправления ошибок, или другие изменения) кратко описаны в файле
“
doc/ChangeLog
”.
Эта спецификация доступна в качестве ASCII файла
“
doc/spec.txt
”, таким образом поиск легко осуществим любым текстовым редактором. Другие файлы в директории
“
doc
”:
“
OptionLists.txt
” - список всех опций в алфавитном порядке
“
dbm.discuss.txt
” - обсуждение библиотек DBM
“
exim.8
” - страница man опций командной строки exim
“
experimental.txt
” - документация экспериментальных особенностей
“
filter.txt
” - спецификация языка фильтра
“
pcrepattern.txt
” - спецификация регулярных выражений PCRE
“
pcretest.txt
” - спецификация программы тестирования PCRE
“
Exim3.upgrade
” - примечания обновления с релиза 2 до релиза 3
“
Exim4.upgrade
” - примечания обновления с релиза 3 до релиза 4
Главная спецификация и спецификация языка фильтрации также доступны в других форматах (HTML, PostScript, PDF, и Texinfo). Раздел 1.6, ниже, описывает как получить их.
1.2 FTP и WEB сайты
Главный сайт исходных кодов exim, в настоящее время, FTP-сайт университета Кембрижда, сожержание которого описано ниже, в
“
Где найти дистрибутив exim
”. Кроме того, есть веб- и ftp-сайт exim.org. Также, сейчас здесь хостится университет Кембриджа. Раньше, сайт exim.org хостился много лет на Energis Squared, ранее Planet Online Ltd, за поддержку которого я благодарен.
Кроме файлов tar, дистрибутива exim, веб-сайт exim`a содержит множество различно отформатированых версий документации, включая FAQ в HTML и текстовом форматах. Версия HTML идёт с индексным файлом ключевых слов. Недавнее дополнение к онлайн-документации exim - wiki (http://www.exim.org/eximwiki/). Мы надеемся, что это облегчит внесение примеров, подсказок и хав-ту пользователей exim.
1.3 Листы рассылки
Это - три главных листа расылки exim:
“
exim-users@exim.org
” - общий список обсуждения
“
exim-dev@exim.org
” - обсуждение ошибок, расширений и т.п.
“
exim-announce@exim.org
” - модерируемый, небольшой по объёму список анонсов
Вы можете подписаться на эти списки, изменить ваши существующие подписки, и просматривать или искать в архивах по ссылке на список рассылки на домашней странице exim. Если вы используете exim из дистрибутива debain, вы можете подписаться на дебиан-специфичную рассылку
“
pkg-exim4-users@lists.alioth.debian.org
”.
1.4 Курсы exim
Время от времени (приблизительно ежегодно, на момент написания), автор exim проводит учебные курсы в университете Кембриджа, в Англии. Детали предстоящих курсов можно найти на сайте http://www-tus.csx.cam.ac.uk/courses/exim/.
1.5 Сообщения об ошибках
Сообщения об очевидных ошибках должны посылаться по электронной почте на адрес bugs@exim.org. Однако, если вы неуверены, является ли такое поведение ошибкой, лучше всего будет отправить сообщение на лист рассылки
“
exim-dev
” и обсудить его.
1.6 Где найти дистрибутив exim
Главный ftp-сайт дистрибутива exim это
ftp://ftp.csx.cam.ac.uk/pub/software/email/exim
|
Это его зеркало:
ftp://ftp.exim.org/pub/exim
|
Ссылки на файлы даны относительно директории
“
exim
” на этом сайте. Также есть много независмых зеркал по всему миру. Те, которые я знаю, перечислены в файле
“
Mirrors
”.
Внутри каталога
“
exim
” есть подкаталоги с именами
“
exim3
” (для дредыдущего дистрибутива exim3),
“
exim4
” (для последнего дистрибутива exim4) и
“
Testing
” - для тестовых версий. в подкаталоге
“
exim4
”, всегда может быть наёден текущий релиз в файлах с именами:
exim-n.nn.tar.gz
exim-n.nn.tar.bz2
|
где
“
n.nn
” - самый большой номер номер версии в директории. Два файла содержат идентичные данные; различие лишь в типе компрессии. Файл
“
.bz2
”, обычно, намного меньше чем
“
.gz
”.
В настоящее время, дистрибутивы подписываются GPG ключом Филипа Хазэля. Соответствующий открытый ключ доступен на множестве ключевых серверов, и также скопирован в файл
“
Public-Key
”. Подписи для tar находятся в:
exim-n.nn.tar.gz.sig
exim-n.nn.tar.bz2.sig
|
Для каждой выпущенной версии, лог изменений доступен отдельно в директории
“
ChangeLogs
”, таким образом, можно узнать, что изменилось без необходимости загружать весь дистрибутив.
Главный дистрибутив содержит ASCII версию этой спецификации и другую документацию; другие форматы документации доступны на FTP-сайте, внутри директории
“
exim4
”, в отдельных файлах:
exim-html-n.nn.tar.gz
exim-pdf-n.nn.tar.gz
exim-postscript-n.nn.tar.gz
exim-texinfo-n.nn.tar.gz
|
Эти tar-файлы содержат только директорию
“
doc
”, а не полный дистрибутив, и также доступны в форматах
“
.bz2
” и
“
.gz
”. FAQ доступен для загрузки в двух различных форматах:
exim4/FAQ.txt.gz
exim4/FAQ.html.tar.gz
|
Первый из них - один файл ASCII, в котом можно искать текстовым редактором. Второй - директоря с HTML файлами, к которой можно обратиться начиная с файла
“
index.html
”. HTML-версия FAQ (которая также включена в тарболл с HTML-документацией), включает индекс по ключевым словам, который часто является самым удобным средством поиска.
1.7 Список пожеланий
Список пожеланий поддерживается, он содержит идеи представленных новых возможностей. Время от времени файл экспортируется на FTP-сайт в файл
“
exim4/WishList
”. Элементы удаляются из списка по мере их реализации.
1.8 Материалы содействия
На FTP-сайте есть директория с именем
“
Contrib
”, содержащая разные файлы, внесённые в сообщество exim`a его пользователями. Также есть коллекция примеров конфигурации в
“
exim4/config.samples.tar.gz
”. На эти примеры ссылаются из FAQ.
1.9 Ограничения
Exim спроектирован для использования как интернет-MTA, и поэтому обрабатывает адреса только в формате доменов по RFC2822. Он не может обрабатывать адреса UUCP с восклицательными знаками, хотя простые двухкомпонентные адреса с восклицательными знаками могут быть конвертированы конфигурацией перезаписи адресов. Это ограничение не препятствует привязке exim`a, через интерфейс, к UUCP, как транспортного механизма, при условии, что используются адреса доменов.
Exim настаивает на прикреплении каждому обрабатываемому адресу домена. Для входящих локальных сообщений, адреса без домена автоматически квалифицируются (дополняются доменом - прим. lissyara) сконфигурированным значением домена. Опции конфигурации определяют, от каких удалённых систем неквалифицированные адреса являются допустимыми. Тогда они квалифицируются по прибытию.
Единственные внешние транспортные механизмы, реализованные на данный момент, это SMTP и LMTP по сети TCP/IP (включая поддержку IPv6). Однако, доступен транспорт pipe, и есть средства для записи сообщений в файлы и трубы (pipe), опционально в пакетном SMTP-формате; эти средства могут использоваться для отсылки сообщений другим транспортным механизмам, типа UUCP, если они могут обработать адреса в доменном стиле. Также обслуживается пакетный SMTP-ввод.
Exim не спроектирован для хранения почты для хостов соединяющихся по модему. Когда объём такой почты является большим, то лучше доставить сообщения в файлы (т.е. убрать из очереди exim`a) и впоследствии передать её, дозванивающимся хостам, другими средствами.
Хотя exim имеет базовые возможности для сканирования входящих сообщений, они не являются достаточно полными для полной проверки на вирусы и спам. Такие операции лучше осуществлять используя пакеты сторонних программ. Если вы скомпилите exim с контентным сканированием, то поддержится множество сканеров прямо на интерфейсах.
1.10 Рабочая (выполняемая) конфигурация
Рабочая конфигурация exim`a находится в одном текстовом файле, разделённом на множество секций. Вхождения, в этом файле, состоят из ключевых слов и значений, в стиле конфигуреционного файла Smail 3. Дефолтовый конфигурационный файл, поставляемый с дистрибутивом, подходит для простых вариантов, и описан далее, в разделе 7.
1.11 Интерфейс вызова
Как и множество других MTA, exim принял интерфейс командной строки sendmail, таким образом, чтобы он мог быть прямой заменой для
“
/usr/lib/sendmail
” или
“
/usr/sbin/sendmail
” при отправке почты, но вы не нуждаетесь в каких-либо знаниях о sendmail для запуска exim. Для других действий, кроме отсылки почты, также существуют sendmail-совместимые опции, но те, которые производят вывод (например,
“-bp
”, которая выводит сообщения находящиеся в очереди) делают это в собственном формате exim`a. также есть дополнительные опции, совместимые с Smail 3, и некоторые будущие опции, являющиеся новыми в exim`e. Раздел 5 документирует все опции командной строки exim. Из этой информации автоматически составляется man-страница, являющаяся частью дистрибутива exim.
Управление сообщениями, находящимися в очереди, может осуществляться через привелигированные опции командной строки. Также, существует дополнительная программа, называющаяся eximon, отображающая информацию в иксах (X window), и содержащая графический интерфейс к административным опциям командной строки exim.
1.12 Терминология
“
Тело
” (
“
body
”) сообщения - это фактические данные, которые хочет передать отправитель. Это последняя часть сообщения, отделённая от
“
заголовка
” (
“
header
”, см. ниже) пустой линией.
Когда сообщение не может быть доставлено, то обычно, оно возвращается отправителю в виде сообщения о ошибке доставки, или
“
сообщения о недоставке
” (
“
non-delivery report
” - NDR). Для этого действия, обычно, используется термин
“
рикошет
” (
“
bounce
”), и отчёты об ошибках часто называют
“
рикошетами
” (
“
bounce messages
”). Это - короткая запись
“
ошибочного сообщения о неудаче доставки
” (
“
delivery failure error report
”). У этих сообщений пустой адрес отправителя в
“
конверте
” (
“
envelope
” - смотрите ниже) сообщения, для того чтобы гарантировать, что они не станут причинами будущих рикошетов.
Термин
“
по-умолчанию
” (
“
default
”) часто появляется в этом руководстве. Он используется дл определения значения, использующегося при отсутствии настроек (этой конкретной опции - прим. lissyara) в конфигурационном файле. Оно, также, может задать действие выполняемое при условии, что в конфигурационном файле не указано иное.
Термин
“
отсрочка
” (
“
defer
”, иногда - задержка) используется когда доставка сообщения адресату не может быть осуществлена немедленно, по каким-либо причинам (хост может быть в дауне, или переполнен локальный почтовый ящик пользователя). Такие доставки
“
отсрочиваются
” (
“
deferred
”, или - задерживаются) до более позднего времени.
Слово
“
домен
” (
“
domain
”) иногда используется для обозначения всего, кроме первого компонента имени хоста. Это не используется здесь в этом смысле, в данном документе, обычно, оно означает часть e-mail адреса, следующую за символом
“@
”.
Сообщение, находящееся в пути, имеет привязанный
“
конверт
” (
“
envelope
”), также как заголовок и тело. Конверт содержит адрес отправителя (тот, кому будут доставляться рикошеты), и любое число адресов получателей. Ссылки на отправителя, или получателей сообщения, обычно означают адреса в конверте. MTA использует эти адреса для доставки, и для возврещения рикошетов, а не адреса фигурирующие в строках заголовков.
“
Заголовок
” (
“
header
”) сообщения - это первая часть текста сообщения, состоящая из множества строк, каждая из которых имеет имя, типа
“
From:
”,
“
To:
”,
“
Subject:
” и т.п. Длинные строки заголовка могут быть разрезаны на несколько строк, с выравниванием продолжений. Заголовок отделён от тела пустой линией.
Термин
“
локальная часть
” (
“
local part
”), взятый из RFC2822, используется для того, чтобы обозначить часть адреса электронной почты, предшествующую символу
“@
”. Часть следующая за
“@
”, называется
“
домен
” (
“
domain
”) или
“
почтовый домен
” (
“
mail domain
”).
Термины
“
локальная доставка
” (
“
local delivery
”) и
“
удалённая доставка
” (
“
remote delivery
”) используются для различения доставки в файл или трубу (pipe) на локальном хосте, от доставки по SMTP через TCP/IP, на другой хост. Все хосты, кроме того на котором запущен exim, считаются
“
удалёнными
” (
“
remote
”).
“
Обратный путь
” (
“
Return path
”) - другое имя использующееся для адреса отправителя, в конверте сообщения.
Термин
“
очередь
” (
“
queue
”) используется для того, чтобы ссылаться на сообщения ожидающие доставки, этот термин широко используется в контексте MTA. Однако в случае exim, действительность больше походит на объединение (ещё можно перевесть как пруд, водоём, и т.п. - прим. lissyara), потому что обычно нет упорядочивания ожидающих сообщений.
Термин
“
обработчик очереди
” (
“
queue runner
”) используется для описания процесса, просматривающего очередь и пытающегося доставить те сообщения, у которых наступило время доставки. Этот термин используется и в других MTA, и также имеет отношение к команде
“runq
”, но в exim, обычно, ожидающие сообщения обрабатываются в непредсказуемом порядке.
Термин
“
директория подкачки
” (
“
spool directory
”) используется как директория, в которой exim сохраняет сообщения своей очереди - т.е. те, которые находятся в процессе доставки. Это не должно путаться с директорией, в которой хранятся локальные почтовые ящики, и которую некоторые люди также называют
“
spool directory
”. В документации exim, слово
“spool
” всегда используется в первом смысле.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
2. Включенный код
В дистрибутив exim включено много внешнего кода.
Регулярные выражения поддерживаются в exim`e и в мониторе exim`a с использованием свободно распространяемой библиотеки PCRE, ╘ Университета Кембриджа. Исходные коды находятся в директории
“
src/pcre
”. Однако, это сокращённая версия PCRE. Если вы хотите использовать библиотеку PCRE в других программах, то нужно загрузить и установить полную версию с ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre.
Поддержка метода поиска cdb (Constant DataBase) обеспечивается кодом внесённым Найджелом Метэринэмом (в то время, когда он внес это), Planet Online Ltd. Выполняемая часть полностью содержится в коде exim. Она не связана с внешней библиотекой cdb. Код содержит следующие заявления:
Copyright ╘ 1998 Nigel Metheringham, Planet Online Ltd
This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
This code implements Dan Bernstein's Constant DataBase (cdb) spec. Information, the spec and sample code for cdb can be obtained from http://www.pobox.com/~djb/cdb.html. This implementation borrows some code from Dan Bernstein's implementation (which has no license restrictions applied to it).
Клиентская поддержка Microsoft
“
Secure Password Authentication
” обеспечивается кодом внесённым Marc Prud'hommeaux. Поддержка сервера была внесена Томом Кистнером. Это включает некоторый код взятый из проекта Samba, выпущенного под Gnu GPL.
Поддержка вызовов Cyrus
“
pwcheck
” и
“
saslauthd
” даемонов обеспечивается кодом, взятым из библиотеки Cyrus-SASL и адаптирован Alexander S. Sabourenkov (русский товарищ - но пришлось писать по аглицки - непонятно как правильно перевести фамилию с аглицкого транслита... - прим. lissyara). Уведомление о разрешении представлено ниже, в соответствии с условиями оговорёнными в нём.
Copyright ╘ 2001 Carnegie Mellon University. All rights reserved.
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
The name
“Carnegie Mellon University
” must not be used to endorse or promote products derived from this software without prior written permission. For permission or any other legal details, please contact
Office of Technology Transfer
Carnegie Mellon University
5000
Forbes Avenue
Pittsburgh, PA
15213
-
3890
(
412
)
268
-
4387
, fax: (
412
)
268
-
7395
tech-transfer@andrew.cmu.edu
|
Redistributions of any form whatsoever must retain the following acknowledgment:
“This product includes software developed by Computing Services at Carnegie Mellon University (http://www.cmu.edu/computing/.
”
CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Программа Exim Monitor, являющаяся приложением X-Window, включает модифицированные версии Athena StripChart и украшательств TextPop. Авторские права на этот код у DEC и MIT, в соответствии с их условиями, представленными ниже.
Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts, and the Massachusetts Institute of Technology, Cambridge, Massachusetts.
All Rights Reserved
Permission to use, copy, modify, and distribute this software and its documentation for any purpose and without fee is hereby granted, provided that the above copyright notice appear in all copies and that both that copyright notice and this permission notice appear in supporting documentation, and that the names of Digital or MIT not be used in advertising or publicity pertaining to distribution of the software without specific, written prior permission.
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Много людей внесли фрагменты кода, некоторые большие, некоторые маленькие, которые не были охвачены никакими определенными лицензионными требованиями. Предполагается, что эти вкладчики рады видеть их код включённым в exim под GPL.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
3. Как еxim получает и доставляет почту
3.1 Полная философия
Exim спроектирован для работы на системах, постоянно связанных с интернетом, и обрабатывающих значительный поток писем. В таких условиях, большинство сообщений можно доставить немедленно. Следовательно, exim не поддерживает независимые очереди сообщений для специфических доменов или хостов, хотя в действительности, пробует послать несколько сообщений в течение одного SMTP-соединения, после того как хост был в дауне (отключен, недоступен и т.п. - прим. lissyara), и это поддерживается в информации повторов по хостам.
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`a, пользователи могут запускать частные (собственные) фильтры, устанавливая соответствующие файлы
“
.forward
” в своих домашних директориях. Смотрите раздел 22 (о переадресовывающем маршрутизаторе) для конфигурации поддерживающей это, и отдельный документ
“
интерфейсы фильтрации почты exim`a
” (
“
Exim's interfaces to mail filtering
”) для получения дополнительных деталей. Доступны два различных вида фильтрации:
Фильтры Sieve написаные на стандартном языке фильтров, как определно в RFC3028.
Фильтры 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
”, сообщение читается неинтерактивно (обычно через трубу (pipe)), с получателями взятыми из командной строки, или из тела сообщения, если также используется опция
“-t
”.
Если процесс запускает exim с опцией
“-bS
”, сообщение также читается неинтерактивно, но в этом случае получатели перечислены в начале сообщения в ряде команд SMTP RCPT, завершаемых командой DATA. Это - так называемый
“пакетный SMTP
” (
“batch SMTP
”) формат, но реально, это не SMTP. Команды SMTP - это лишь иной способ передать адреса конверта в неинтерактивном представлении.
Если процесс запускает exim с опцией
“-bs
”, сообщение читается интерактивно, с использованием протокола SMTP. Двухсторонняя труба (pipe) обычно используется для прохождения данных между локальным процессом и процессом exim`a. Это
“реальный
” 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 используется для задания этих адресов (имеется ввиду - адресов отправителя - прим. lissyara). Смотрите раздел 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-директории до полной доставки получателям или ошибочному адресу (адресу куда шлют сообщения об ошибках - прим. lissyara), или до уничтожения администратором или пользователем изначально создавшим его. В случае, когда доставка не может быть произведена - например, когда сообщение не может быть доставлено получателю, и не может быть возвращено отправителю, то оно отмечается как
“замороженное
” в spool`e и больше не предпринимается попыток его доставки.
Администратор может
“разморозить
” такие сообщения, когда проблема исправлена, а также может вручную заморозить отдельные сообщения. Кроме того, администратор может вызывать принудительную ошибку доставки, вызвав отсыл сообщения о недоставке (рикошет).
Эти опции, называемые
“
ignore_bounce_errors_after
” и
“
timeout_frozen_after
”, отбрасывают замороженные сообщения после определённого времени. Первое применяется только к замороженным сообщениям о недоставке, вторые - к любым замороженным сообщениям.
Когда exim работает с сообщением, он он записывает информацию о каждой попытке доставки в свой лог-файл. Туда включаются успешные, неуспешные и отложенные доставки для каждого получателя (смотрите главу 48). Строки логов также пишутся в отдельные файлы
“
message log
” для каждого сообщения. Эти логи - исключительно для использования администратором, и обычно удаляются вместе вместе с файлами spool`a, когда обработка сообщения завершена. Использование индивидуальных логов сообщений может быть отключено установкой опции
“
no_message_logs
”; это может дать прирост производительности на очень загруженных системах.
Вся информация необходимая exim`y для доставки созраняется в первом spool-файле, наряду со строками заголовка. Когда происходит успешная доставка, адрес немедленно вписывается в конец журнального файла, имя которого - идентификатор сообщения с добавленным
“-J
”. В конце выполненной доставки, если остались адреса, которые необходимо доставить позднее, первый spool-файл (
“-H
” - файл) обновляется, для указания какой момент доставки сейчас, и журнальный файл удаляется. Обновление spool-файла завершается записью нового фала и переименовыванием его, для минимизации возможной потери данных.
Если происходит падение системы или программы после успешной доставки, но до обновления spool-файла, журнал остаётся лежать (на диске, видимо - прим. lissyara). В следующий раз, когда exim пытается доставить сообщение, он читает журнал и обновляет spool-файл до обработки. Это минимизирует возможность двойной доставки, вызванную сбоями.
3.8 Обработка адреса для доставки
Главную доставку обрабатывают элементы exim называемые
“роутеры
” (
“routers
”) и
“транспорты
” (
“transports
”), и вместе они известны как
“драйверы
” (
“drivers
”). Их код распространяется с исходным дистрибутивом, и опции компиляции задают, какие из них включаются в бинарный файл. Опции выполнения (во время выполнения) определяют, какие из них фактически используются для доставки сообщения.
Каждый драйвер, который задан в выполняемой конфигурации -
“
экземпляр
” (
“
instance
”) того специфического типа драйвера. Многократное использование одного роутера разрешается; например, вы можете задать несколько различных транспортов
“
smtp
”, каждый с различными значениями опций, которые могли бы определять иные порты или иные таймауты. В дальнейшем, обычно, будет использоваться само название драйвера (т.е. одна, определённая конфигурация), и общее название драйвера, при обсуждении общих особенностей драйвера.
“
Роутер
” (
“
router
”, или
“
маршрутизатор
”) - драйвер, работающий с адресами, также определяет каким образом должна произойти его доставка, задавая определённый транспорт, или преобразуя адрес в один или несколько новых адресов (например, через файл альясов). Маршрутизатор также может явно (в смысле, целенаправленно - прим. lissyara) вызвать ошибку адреса, вызывая доставку сообщения о недоставке.
“
Транспорт
” (
“
transport
”) - драйвер, который передаёт копию сообщения из spool-директории exim`a в другое место назначения. Есть два вида транспортов: локальный, с местоназначением в файле или трубе на локальном хосте, и удалённый - с местом назначения на иных хостах. Сообщение передаётся определённому транспорту как результат успешной маршрутизации. Если у сообщения несколько получателей, оно может быть передано нескольким различным транспортам.
Адрес обрабатывается передачей его каждому сконфигурированному роутеру, по очереди, подчиняясь опредедлённым условиям, пока роутер примет адрес, или определит, что надо вызвать ошибку адреса (принудительно - прим. lissyara). Скоро этот процесс будет описан в деталях. Вначале, как простой пример, рассмотрим, как каждый адрес получателя в сообщении обрабатывается в небольшой конфигурации из трёх роутеров.
Для того, чтобы сделать это более конкретным примером, описание сделано в терминах некоторых актуальных роутеров, но помните, что это лишь пример. Вы можете сконфигурить роутеры exim`a несколькими разными способами, и может быть любое число роутеров в конфигурации.
Первый маршрутизатор, определённый в конфигурации, обычно, который обрабатывает адреса в доменах которые не распознаны как относящиеся к локальному хосту. Обычно это адреса произвольных доменов интернета. Установлено предварительное условие ищущее домены относящиеся к локальному хосту, и маршрутизатор выполняется для адресов не соответствующих условию. Обычно, этот роутер ищет домены в DNS, для нахождения хостов к которым направляется этот адрес. Если поиск успешен, адрес передаётся подходящему SMTP-транспорту; если неуспешен, роутер сконфигурен на отказ адреса (генерится сообщение о недоставке - прим. lissyara).
Второй роутер достигается лишь в случае, если домен распознан как
“принадлежаший
” локальной машине. Этот роутер делает редирект - также он известен как альясинг и форвардинг. Когда он генерит один или больше новых адресов из оригинального, каждый из них роутится независимо от начального. Иначе маршрутизатор может вызвать отказ адреса, или просто отказаться обрабатывать его, передав следующему роутеру.
Последний роутер во многих конфигурациях проверяет, принадлежит ли адрес локальным почтовым ящикам. Предварительное условие может содержать проверку - является ли локальная часть именем логина пользователя, или он ищет её в файле или базе данных. Если эти предварительный условия не выполнены, роутер отклоняется, и на этом маршрутизаторы заканчиваются. Когда такое происходит (адрес не ушёл ни по одному из маршрутизаторов - прим. lissyara), и происходит рикошет (шлётся письмо отправителю с сообщением, что не удалось доставить письмо - прим. lissyara).
3.9 Обработка адреса для проверки
Роутеры exim`a используются для принятия решения о том, ка доставлять почту, а также для
“
проверки адреса
” (
“
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`a, описанный в отдельном документе называющемся
“
Exim's interfaces to mail filtering
”. (Отметтьте: Sieve не может использоваться в файлах системного фильтра.)
Некоторые дополнительные особенности доступны в системном фильтре - смотрите раздел 42 для получения дополнительной информации. Заметтьте, что сообщение передаётся системному фильтру только одина раз за попытку доставки, однако он установлен у многих получателей. Однако, если происходит несколько попыток доставки, при невозможности доставить немедленно один, или несколько адресов, системный фильтр выполняется каждый раз. Условие
“first_delivery
” может использоваться для обнаружения первого запуска системного фильтра.
Каждый адрес получателя предлагается по очереди каждому сконфигуренному роутеру, следуя его предварительным условиям, пока один не сможет его обработать. Если ни один маршрутизатор не может обработать адрес, т.е. они все отклоняются, адрес неверный. Поскольку роутеры могут быть целями разных доменов, несколько разных локальных доменов можно обработать независимо друг от друга.
Роутер принимающий адрес, может назначить его локальному или удалённому транспорту. Однако, в это время транспорт не выполняется. Вместо этого адрес помещается в список специфического транспорта, который будет выполнен позже. Альтернативно, маршрутизатор может генерить один, или несколько новых адресов (обычно, из альясов, форвардов, или файлов фильтров). Новый адреса возвращаются назад к началу процесса, но во избежание петель, маршрутизатор игнорирует любой адрес имеющий одноимённого предка, обрабатывающегося отдельно.
Когда вся маршрутизация завершена, успешно обработанные адреса передаются назначенным им транспортам. Когда локальные транспорты делают действительно локальные доставки, они обрабатывают только один адрес за раз, но если локальный транспорт используется как псевдо-удалённый (например, для сборки пакетов SMTP-сообщений, для передачи каким-то другим средствам), могут быть обработаны несколько адресов. Удалённые транспорты всегда могут обрабатывать более одного сообщения за раз, но они могут быть сконфиигурированы не делать так, или ограничены в нескольких одновременных обращениях к некоторым доменам.
Каждая локальная доставка в файл, или трубу, запускается отдельным процессом под непривелигированным uid, и выполняются они по одной. Удалённые доставки также выполняются отдельными процессами, обычно под частным uid exim`a (
“пользователь exim
”), но в этом случае, несколько удалённых доставок могут выполняться параллельно. Максимальное число одновременных удалённых доставок, для любого сообщения, устанавливается опцией
“remote_max_parallel
”. Порядок, в котором производятся доставки, не определён, за тем исключением, что все локальные доставки происходят до удалённых.
Если происходит встреча с локальной доставкой, в течение работы очереди, exim проверяет базу повторов для поиска - была ли временная ошибка ранее, для адреса перед выполнением работы локального транспорта. Если ранее была ошибка, exim не делает новую попытку доставки, пока для этого адреса не достигнуто время повторения. Однако, это случается лишь для попыток доставки являющихся частью работающей очереди. Локальные доставки всегда предпринимаются, когда доставка следует сразу за приёмом сообщения, даже если для них установлено время повтора. Это делается для улучшения поведения в случае если одно сообщение вызывает проблемы (например, вызывает переполнение квоты, или ошибку в фильтре).
Удалённые транспорты выполняют собственную обработку повторов, так как адрес может доставляться к одному из множества хостов, каждый из которых может иметь различное время повтора. Если были предыдущие временные сбои, и никакой хост не достиг своего времени повтора, попытка доставки не предпринимается, независимо от того работала очередь или нет. Смотрите раздел 32, для деталей о стратегии повторения.
Если были какие-то постоянные ошибки, рикошет возвращается к соответствующему адресу (отправитель, в общем случае), с подробностями о ошибки для каждого ошибочного адреса. Exim может быть сконфигурирован для отправки копий сообщений рикошета на другие адреса.
Если один или несколько адресов потерпели временный сбой, сообщение остаётся в очереди, для дальнейших попыток. Доставка этих адресов, как говорят,
“
задержана
” (
“
deferred
”).
Когда все адреса получателей доставлены, или сорвались, обработка сообщения завершена. Файлы спула и логи сообщения удаляются, хотя лог, опционально, может быть сохранён, в случае необходимости.
3.14 Механизм повтора
Механизм exima`a для повтора сообщения предназначен для повтора сообщений, которые не удалось доставить с первой попытки обработчика очереди. Вы должны запустить демона exim`a, использующего опцию
“-q
” с интервалом времени, для запуска обработчика очереди с регулярными интервалами времени, или использовать другие средства (например, cron)? чтобы запустить его. Если вы не будете предпринимать мер к запуску обработчика очереди, сообщения, недоставленные при первой попытке, навсегда останутся в очереди. Обрабочик очереди обрабатыает очередь, одно сообщение за раз, пробуя каждую доставку с прошедшим временем повторения. Вы можете запустить несколько обрабочиков очереди одновременно.
Exim использует набор конфигурационных правил для определения, когда следующий повтор ошибочного адреса (смотрите раздел 32). Эти же правила определяют, когда exim должен прекратить попытки доставки адреса, и по когда генерить рикошет. Если для частного хоста, адреса или комбанации ошибок не установлены правила повтора, то временные ошибки обрабатываются как постоянные.
3.15 Временные ошибки доставки
Существует много причин, по которым сообщение не доставляется немедленно по частному адресу. Сбой подключения к удалённой машине (поскольку хост, или подключение к нему, отключились) - одна из самых распространённых. Временные ошибки могут быть обнаружены в процессе роутинга, а также в течение транспортной стадии доставки. Локальные доставки могут быть задержаны, если недоступны NFS файлы, или почтовый ящик находится в файловой системе, в которой у пользователя превышена квота. Exim может быть сконфигурировандля использования собственных квот на локальные почтовые ящики; где системные квоты применяются, они также применяются.
Если хост недоступен некоторое время, множество сообщений может ожидать его, к тому времени, когда он станет доступен, и их отправка в течение одного SMTP-соедиенения явно выгодна. Всякий раз, когда доставка на удалённый компьютер задерживается, exim делает примечание в своей БД хинтов (можно перевести как БД намёков - прим. lissyara), и всякий раз когда происходит успешная SMTP-доставка, он смотрит, есть ли другие сообщения для этого же хоста. Если они найдены, они отправляются оп тому же самому SMTP-соединению, ограниченные указанным в конфигурации числом максимальных сообщений через одно соединение.
3.16 Постоянные ошибки доставки
Когда сообщение невозможно дотавить к нескольким или всем его получателям, генериться сообщение рикошета. Временные ошибки доставки превращаются в постоянные ошибки, когда истекает их время ожидания. Все адреса, которые ошибочны в данной попытке доставки, перечисляются в оном сообщении. Если у оригинального сообщения много получателей, возможно что некоторые адреса недоставлены в первую попытку, и другие были неудачны в последующие попытки, породив более одного рикошета. Формулировка сообщения рикошета может быть настроена администратором. Для дополнительных деталей, смотрите раздел 45.
Сообщения рикошета содержат строку заголовка
“
X-Failed-Recipients:
”, содержащую список неудачных адресов, для программ которые автоматически анализируют такие сообщения.
Рикошет, обычно, отправляется отправителю оригинального сообщения, полученного из адреса конверта. Для входящих SMTP-сообщений, это адрес, данный в команде MAIL. Однако, когда раскрывается через форвардинг или альясинг, может быть задан альтернативный адрес для доставки рикошетов от сгенерённых адресов. Для раскрытия списков рассылки (смотрите раздел 46.2), обычно, направляется сообщение рикошета менеджеру списка рассылки.
3.17 Сбой доставки рикошета
Если с рикошетом (сгенерированным локально, или пришедшим с удалённого хоста) происходит сбой доставки, сообщение остаётся в очереди, но оно заморожено, в ожидании уведомления администратора. Существуют опции, которые могут использоваться для того, чтобы заставить exim отбросить такие сообщения, или хранить их короткий период времени (смотрите опции
“timeout_frozen_after
” и
“ignore_bounce_errors_after
”).
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
4. Сборка и инсталляция Exim
4.1 Распаковка
Exim распространяется как bzip или gzip tar файл, который при распаковке создает директорию с именем настоящего релиза (например
“
exim-4.62
”) куда помещаются следующие файлы:
файл
|
описание
|
ACKNOWLEDGMENTS
|
содержит слова благодарности
|
CHANGES
|
содержит указания на изменения в документе
|
LICENCE
|
GNU лицензия
|
Makefile
|
главный make файл
|
NOTICE
|
условия использования Exim
|
README
|
список файлов; директорий и небольшие инструкции по сборке
|
|
Другие файлы, чьи имена начинаются словом
“
README
” могут так же присутствовать.
файл
|
описание
|
Local
|
пустая директория для локальных файлов
|
OS
|
специфические файлы для операционных систем
|
doc
|
документация
|
exim_monitor
|
исходные файлы exim monitor'а
|
scripts
|
скрипты использующиеся для сборки
|
src
|
исходный код
|
util
|
независимые утилиты
|
|
Главные утилиты содержаться в
“
src
” директории, и собираются вместе с бинарным файлом exim. Директория
“
util
” содержит несколько дополнительных скриптов, которые могут быть полезны на некоторых этапах.
4.2 Разнообразие архитектур и операционных систем
Процесс сборки exim'а устроен таким образом, что бы облегчить получение бинарных файлов для разных архитектур и операционных систем из одного и того же набора исходных кодов. Компилирование происходит не в директории
“
src
”. Вместо этого создается
“
build directory
”, для различных операционных систем. Символические ссылки инсталлируются в директорию, где происходит сборка. В большинстве случаев exim способен распознать архитектуру компьютера и операционную систему, но в случае необходимости, это может быть изменено.
4.3 DBM библиотеки
Даже, если вы не используете каких-либо DBM файлов в вашей конфигурации, Exim нуждается в библиотеке что бы использовать индексированные файлы базы данных. К сожалению, присутствует множество DBM библиотек и зачастую, различные операционные системы требуют, различные установленные библиотеки.
Если вы используете Solaris, IRIX, какую-либо современную BSD систему, или дистрибутив Linux, конфигурация DBM должна пройти автоматически, и вы можете не читать этот раздел. В противном случае, Вам придется узнать больше о DBM библиотеках, чем Вы хотели.
Лицензионные версии Unix обычно содержат библиотеку функций DBM, работающую через интерфейс
“
ndbm
”, на это Exim расчитывает по умолчанию. В свободных версиях Unix понятие стандарт варьируется. В частности в ранних версиях Linux по умолчанию не было никакой библиотеки DBM, и различные распространители клали различные версии DBM в свои дистрибутивы. Как бы то ни было, свежие версии стандартизировались на библиотеке DB от Berkley.
Различные DBM библиотеки имеют разные соглашения об именовании файлов, которые они используют. Когда программа открывает файл с именем
“
dbmfile
”, существует несколько вероятностей:
1. Традиционное
“
ndbm
” исполнение, такое как то, которое идет, как часть Solaris, оперирует с двумя файлами
“
dbmfile.dir
” и
“
dbmfile.pag
”.
2. GNU библиотека,
“
gdbm
”, оперирует одним файлом. Если используется
“
ndbm
” совместимость, то создаются две жесткие ссылки на файлы
“
dbmfile.dir
” и
“
dbmfile.pag
”, если используется родной интерфейс, тогда используемое имя не изменяется.
3. Пакет DB от Беркли, если вызывается как
“
ndbm
” совместимость, оперирует единственным файлом
“
dbmfile.db
”, но программируется так же как и традиционное
“
ndbm
” выполнение.
4. Если пакет от Беркли используется в родном режиме, он оперирует одним файлом
“
ndbm
”dbmfile; интерфейс программирования несколько отличен от
“
ndbm
”.
5. Углубляясь далее - есть несколько DB пакетов от Беркли. Версия 1.85 считалась долгое время стабильной, версии 2.x и 3.x были текущими, последняя версия нумерована как 4.x. Поддержка некоторых, более ранних версий прекращена. Все версии DB пакетов от Беркли могут быть получены на http://www.sleepycat.com/.
6. Еще одна библиотека, с названием
“
tdb
”, доступна по адресу: http://download.sourceforge.net/tdb. Она также обладает собственным интерфейсом, и, также, оперирует одним файлом.
Exim и его утилиты могут быть скомпилированы с для использования любого из этих интерфейсов. Что бы использовать пакеты от Беркли, в родном режиме вы должны добавить строку USE_DB в файле конфигурации (обычно
“
Local/Makefile
”). Например:
Точно так же, для использования gdbm, Вы добавляете строку USE_GDBM, а для tdb. USE_TDB. При использовании нескольких интерфейсов вы получите ошибку.
На низком уровне, при построении конфигурации не устанавливается ни одна из этих опций, таким образом присваивается интерфейс типа (1). Однако некоторые конфигурационные файлы операционных систем (например, BSD и Linux) принимают тип (4), устанавливая в USE_DB себя по умолчанию, и в файлы конфигурации для Cygwin устанавливается USE_GDBM. Все, что вы определите в
“
Local/Makefile
”, отменяет значения принимаемые по умолчанию.
Так же как и определение USE_DB, USE_GDBM, или USE_TDB, может возникнуть необходимость добавить DBMLIB, что бы вызвать включение этой библиотеки для следующих установок:
DBMLIB = -ldb
DBMLIB = -ltdb
|
Такие настройки будут работать, если библиотека DBM установлена в стандартной директории. В тех случаях, когда это не так, файлы c заголовками для библиотеки могут также находиться не в директории принятой по умолчанию, тогда Вам придется определить директиву INCLUDE и указать местоположение файла с заголовками для библиотеки, а так же определить полный путь к библиотеке, как в этом примере:
INCLUDE=-I/usr/local/include/db-
4
.
1
DBMLIB=/usr/local/lib/db-
4
.
1
/libdb.a
|
Более детальное рассмотрение разных DBM библиотек находиться в файле
“
doc/dbm.discuss.txt
” в дистрибутиве Exim.
4.4 Предсборочная конфигурация
Перед сборкой Exim, локальный файл конфигурации определяет опции независимые от любой операционной системы, которые будут созданы, в файле
“
Local/Makefile
”. Шаблон для этого файла, поставляется как файл
“
src/EDITME
”, и содержит в себе полные описания всех параметров настройки. Эти описания здесь не рассматриваются. Если вы собираете Exim впервые, то самый лучший способ скопировать
“
rc/EDITME
” в
“
Local/Makefile
”, затем его прочитать отредактировать соответствующим образом.
Есть три параметра в настройках, которые Вы должны оставить, потому, что Exim не соберется без них. Это - местоположение конфигурационного файла (CONFIGURE_FILE), директории, куда будут инсталлированы бинарные файлы Exim (BIN_DIRECTORY), и пользователь Exim (EXIM_USER и возможно также, EXIM_GROUP). Значения CONFIGURE_FILE в списке файлов могут разделятся двоеточием, Exim использует первое из них, при его существовании.
Есть так же, несколько других параметров которые могут быть определены, например: время сборки, время загрузки, разрешить использовать тот же бинарный файл некоторому количеству других машин. Однако, если местоположение директории spool или log (если она не внутри директории spool) фиксировано, то рекомендуется указать его в файле
“
Local/Makefile
”, вместо рабочей конфигурации, что бы ошибки, которые возникают на стадии запуска (например "кривой" файл конфигурации) Exim могли быть отражены в log файле.
Интерфейсы Exim'а для вызова антивирусов и спамфильтров из access control lists, не собираются по умолчанию. Если вы хотите включить эти программы, вам нужно вписать следующую строку:
в файле
“
Local/Makefile
”. Более детально об этих возможностях в главе 40.
Если вы собираетесь собирать Exim монитор, необходим схожий процесс конфирурирования. Файл
“
exim_monitor/EDITME
” должен быть отредактирован в соответствии с вашими параметрами установки и сохранен под именем
“
Local/eximon.conf
”. Если вы довольствуетесь настройками по умолчанию, описанными в файле
“
exim_monitor/EDITME
”, то
“
Local/eximon.conf
” может быть пустым, но он должен существовать.
Это вся конфигурация, которая может быть необходима для большинства известных операционных систем. Однако, процесс сборки настроен таким образом, что очень легко изменить настройки принимаемые по умолчанию операционной системой. Например, изменить компилятор C, которым по умолчанию является
“
gcc
”. Смотрите подраздел 4.11 о том, как это сделать.
4.5 поддержка
“
iconv()
”
Содержание заголовков в сообщении может быть закодировано согласно RFC-2047. Это позволяет передавать символы, которые отсутствуют в таблице определений ASCII символов и отмечать, их как являющиеся частью этих таблиц. Когда Exim проверяет строки заголовка, с помощью
“
$h_
” механизма, он расшифровывает их и пе реводит их в специфический набор символов (по умолчанию ISO-8859-1). Перевод возможен, если операционная система поддерживает функцию
“
iconv()
”.
Однако, некоторые операционные системы которые поставляются с функцией
“
iconv()
”, не поддерживают очень много преобразований. Библиотека GNU
“
libiconv
” (доступна по адресу http://www.gnu.org/software/libiconv/) может быть установлена на таких системах, что бы исправить этот недостаток, так же как и на системах, которые не поддерживают
“
iconv()
” вообще. После инсталляции
“
libiconv
” вы должны добавить
в файл
“
Local/Makefile
”, и пересобрать Exim.
4.6 Включение TLS/SSL шифрования
Exim может быть собран с поддержкой шифрованных SMTP соединений, используя STARTSSL команду согласно RFC 2487. Он так же поддерживает клиентское ПО которое ожидает немедленного соединения на нестандартном порте (смотрите
“
tls_on_connect_ports
” во время выполнения и
“
tls-on-connect
” опцию командной строки).
Если вы хотите собрать Exim c поддержкой TLS, то вы должны сперва инсталлировать OpenSSL или GnuTLS библиотеку. В Exim отсутствует непосредственная поддержка SSL соединения.
Если OpenSSL инсталлирована, то вы должны добавить:
SUPPORT_TLS=yes
TLS_LIBS=-lssl -lcrypto
|
в файл
“
Local/Makefile
”. Вам может так же потребуется определить путь к библиотекам Open SSL и include файлам. Например:
SUPPORT_TLS=yes
TLS_LIBS=-L/usr/local/openssl/lib -lssl -lcrypto
TLS_INCLUDE=-I/usr/local/openssl/include
|
Если используется GnuTLS:
SUPPORT_TLS=yes
USE_GNUTLS=yes
TLS_LIBS=-lgnutls -ltasn1 -lgcrypt
|
в файле
“
Local/Makefile
” и опять таки, вам может потребоваться указать полный путь к включаемым файлам и библиотекам. Например:
SUPPORT_TLS=yes
USE_GNUTLS=yes
TLS_LIBS=-L/usr/gnu/lib -lgnutls -ltasn1 -lgcrypt
TLS_INCLUDE=-I/usr/gnu/include
|
Вам не нужно устанавливать TLS_INCLUDE если такая директория уже определена в INCLUDE. Более подробное описание, как сконфигурировать Exim с поддержкой TLS дано в главе 38.
4.7 Использование tcpwrappers
Exim может быть слинкован с библиотекой
“
tcpwrappers
”, что бы проверять входящие запросы SMTP используя файлы
“
tcpwrappers
”. Данная возможность может использоваться в качестве альтернативы собственным средствам Exim'а для проверки обеспечения которое использует
“
tcpwrappers
” в других целях. Для того что бы сделать это, вам нужно внести строку USE_TCP_WRAPPERS в файл
“
Local/Makefile
”, убедитесь что файл
“
tcpd.h
” доступен во время компиляции, а библиотека
“
libwrap.a
” доступна во время линковки, включая
“
-lwrap
” в EXTRALIBS_EXIM. Для примера, если
“
tcpwrappers
” инсталлирован в
“
/usr/local
” вы должны внести соответсвующие строки:
USE_TCP_WRAPPERS=yes
CFLAGS=-O -I/usr/local/include
EXTRALIBS_EXIM=-L/usr/local/lib -lwrap
|
в файл
“
Local/Makefile
”. Имя используемое в файле
“
tcpwrappers
” - "exim". Например строка:
exim : LOCAL
192
.
168
.
1
. .friendly.domain.example
|
в файле
“
/etc/hosts.allow
” разрешает соединения от локального хоста, от подсети 192.168.1.0/24, и от всех хостов в
“
friendly.domain.example
”. Остальные соединения запрещаются. Для более детальной информации загляните в документацию
“
tcpwrappers
”.
4.8 Включение поддержики IPv6
Exim содержит код для использования в системах с поддержкой Ipv6. Установите значение HAVE_IPV6=YES в файле
“
Local/Makefile
”, что бы код поддерживающий Ipv6 был включен; также может потребоваться установить IPV6_INCLUDE и IPV6_LIB в системах, где поддержка Ipv6 не полностью включена в библиотеки и include файлы.
Два различных типа записи DNS были определены для поддержки адресов Ipv6. AAAA записи (аналоги записей Ipv4) используются в настоящий момент и похоже, использование стало массовым. Другой тип записи называемый A6 расценивается как более лучший, нежели AAAA, потому как он более гибкий. Однако он считается более сложным и его статус был уменьшен до "экспериментального". Доподлинно не известно, использует ли кто-либо записи A6. Exim поддерживает A6 записи, если вы установили SUPPORT_A6=YES в файл
“
Local/Makefile
”. Поддержка не проверялась.
4.9 Процесс сборки
Как только
“
Local/Makefile
” (и
“
Local/eximon.conf
”, если необходимо) будет создан, запустите make в директории с Exim. Оперделяется архитектура компьютера и операционная система и создается директория в которой происходит сборка. Например компьютер Sun с операционной системой Solaris 8, создаваемая директория будет именоваться
“
build-SunOS5-5.8-sparc
”. Символические ссылки на исходные файлы будут созданы в директории, где происходит сборка.
Внимание: флаг
“
-j
” не должен использоваться с make; процесс сборки завершиться с ошибкой, если он установлен.
Если
“
make
” запущен впервые, то вызывается скрипт, который создает
“
make
” файл внутри директории, где происходит сборка, используя конфигурационный файл в директории
“
Local
”. Новый make файл передается новому экземпляру
“
make
”. Он выполняет работу по созданию сервисных скриптов, затем компилирует и линкует бинарный файл Exim монитора (если сконфигурировано), некоторое количество утилит и, наконец, сам Exim. Команда
“make makefile
” используется для принудительного создния нового
“
make
” файла в директории со сборкой, по мере необходимости.
Если у вас есть затруднения со сборкой Exim, то загляните в файл README согласно вашей операционной системе, и так же поглядите в FAQ, где поясняются часто встречающиеся проблемы.
4.10 Выходные данные после
“make
”
Выходные данные создаваемый
“
make
” собираются в строки, которые зачастую нечитабельны, ибо они очень длинные. Поэтому нормальные выходные данные не используются, а заменяются данными схожими с теми, которые вы видите при компиляции Linux ядра версии 2.6, только короткие строки для каждого скомпилированного или слинкованного модуля. Однако, возможно получить нормальный вывод вызывая
“
make
” следующим образом:
Значение FULLECHO по умолчанию
“@
” значение флага, которое подавляет сокращенный вывод
“
make
”. Когда вы запрашиваете полный вывод выходных данных, она расширяет стандартный выходные данные
“
make
”.
4.11 Отмена опций при сборке Exim
Главный
“
make
” файл, который создается в начале процесса сборки, состоит из связи некоторого количества файлов, с определенными конфигурационными значениями, сопровождаемые фиксированным набором
“
make
” инструкций. Если значение установлено неоднократно, последнее значение отвергает все предыдущие. Это является удобным способом изменения настроек по умолчанию. Файлы которые идут в следующем порядке:
OS/Makefile-Default
OS/Makefile-<ostype>
Local/Makefile
Local/Makefile-<ostype>
Local/Makefile-<archtype>
Local/Makefile-<ostype>-<archtype>
OS/Makefile-Base
|
где
“
<ostype>
” - тип операционной системы, и
“
<archtype>
” - тип архитектуры компьютера. Local/Makefile должен существовать, иначе процесс сборки будет завершен с ошибкой, остальные три
“
Local
” файла опциональны, и зачастую, могут быть не нужны.
Значения используемые для
“
<ostype>
” и
“
<archtype>
” получены от скриптов
“
scripts/os-type
” и
“
scripts/arch-type
”, соответственно. Если так же установлены значения переменных EXIM_OSTYPE или EXIM_ARCHTYPE используются их значения, таким образом являясь средством принудительной настройки. Иначе, скрипты пытаются получить значения из команды uname. Если это сделать не удается, осматриваются переменные shell OSTYPE и ARCHTYPE. Тогда применяются некоторые быстрые преобразования для получения стандартных имен, которые распознаются Exim'ом. Вы можете запускать эти скрипты напрямую из шелла, для того что бы выяснить, какие значения используются в вашей системе.
“
OS/Makefile-Default
” содержит комментарии к переменным, которые там находятся. Некоторые (но не все) рассматриваются ниже. Если что-то нужно изменить, посмотрите содержимое этого файла, и содержимое файла make для вашей операционной системы (
“
OS/Makefile-<ostype>
”), что бы узнать какие настройки по используются по умолчанию.
Если вам нужно изменить любое значение в
“
OS/Makefile-Default
” или в
“
OS/Makefile-<ostype>
” или добавить новое, вам не нужно менять оригинальные файлы. Вместо этого вам нужно записать необходимые изменения в соответствующем
“
Local
” файле. Для примера, когда сборка происходит в операционной системе Tru64-Unix (бывший Digital UNIX, бывший DEC-OSF1) необходимо изменить компилятор языка C, с
“
gcc
” на
“
сс
”. Так же компилятор должен вызываться с опцией
“
-stdl
” для того, что бы некоторые особенности Стандартного C, которые Exim использует (большинство других компиляторов распознают Стандартный C по умолчанию). Для того что бы это сделать, нужно создать файл
“
Local/Makefile-OSF1
”Local/Makefile-OSF1 содержащий следующие строки:
Если компиляция производится для одной операционной системы, то будет гораздо проще записать необходимые строки в
“
Local/Makefile
”.
Хранение локальный файлов конфигурации отдельно, от файлов идущих с дистрибутивом позволяет проще передавать настройки новым версиям Exim, путем копирования их в директорию Local.
Exim содержит поддержку LDAP, NIS, NIS+, и другие виды поисков файла, но не во все системы инсталлированы эти компоненты, поэтому по умолчанию данный код не включается в бинарный файл. Все различные типы файлов и баз данных которые поддерживает Exim, подключены как раздельные модули, которые включаются, если установлены соответствующие опции компиляции. Для LDAP, NIS, NIS+ параметры файла Local/Makefile следующие:
LOOKUP_LDAP=yes
LOOKUP_NIS=yes
LOOKUP_NISPLUS=yes
|
похожие установки применимы для других типов поиска. Они перечислены в файле
“
src/EDITME
”. Во многих случаях некоторые включаемые файлы и библиотеки интерфейсов должны быть установлены до инсталляции Exim'а. Однако, есть некоторые типы поисков (такие как cdb), код для которых содержиться в Exim и не требуется никаких внешних библиотек и включаемых файлов. Когда поиск не включен в бинарный файл, попытка сконфигурировать Exim использовать такой тип вызовет ошибку.
Exim может быть слинкован встроенным интерпретатором Perl, позволяющим процедурам Perl, вызывается внутри строк расширения. Включение этой возможности:
должно быть установлено в файле
“
Local/Makefile
”. Более подробно это рассматривается в главе 12.
Расположение библиотек X11 варьируется между различными операционными системами. Сам по себе Exim не использует X11, но если вы компилируете Exim монитор, то библиотеки X11 должны быть доступны. Последние три переменные определены в
“
OS/Makefile-Default
”:
X11=/usr/X11R6
XINCLUDE=-I$(X11)/include
XLFLAGS=-L$(X11)/lib
|
Они отменяются в некоторых файлах конфигурации операционных систем. Например, в файле
“
OS/Makefile-SunOS5
”:
X11=/usr/openwin
XINCLUDE=-I$(X11)/include
XLFLAGS=-L$(X11)/lib -R$(X11)/lib
|
Если вам нужно отменить значения по умолчанию, запишите эти значения переменных в файл
“
Local/Makefile-<ostype>
”.
Если вам необходимо добавить какую либо дополнительную библиотеку положите переменную называемую EXTRALIBS, которая принимается при линковке но по умолчанию не включена. Напротив, EXTRALIBS_EXIM используется только для линковки бинарного файла Exim, а не для дополнительных утилит.
Так же есть DBMLIB, который появляется в командах линковки бинарного файла использующего функции DBM (смотрите раздел 4.3). И наконец, есть EXTRALIBS_EXIMON которая появляется только на этапе линковки бинарного файла монитора Exim, и может использоваться, например, для добавления дополнительных библиотек X11.
Сборочные файлы справляются с пересборкой Exim'а корректно, если отредактированы конфигурационные файлы. Однако, если дополнительный конфигурационный файл удален, то необходимо создать связанный файл (то есть,
“
Local/Makefile
” или
“
Local/eximon.conf
”) перед пересборкой.
4.12 OS-cпецифические заголовки
Директория
“
OS
” содержит файлы, которые именуются, как
“
os.h-<ostype>
”. Это специфические заголовки C, которые не должны меняться. Есть список макропараметров которые находятся в файле
“
OS/os.configuring
”, в которые нужно посмотреть, если вы портируете Exim на новую операционную систему.
4.13 Отмена опций при сборке монитора
Схожие процессы используются при сборке монитора Exim. Необходимые файлы:
OS/eximon.conf-Default
OS/eximon.conf-<ostype>
Local/eximon.conf
Local/eximon.conf-<ostype>
Local/eximon.conf-<archtype>
Local/eximon.conf-<ostype>-<archtype>
|
Так же как и сам Exim, последние три файла необязательно должны присутствовать, в таком случае файл
“
OS/eximon.conf-<ostype>
” опционален. Значения по умолчанию в файле
“
OS/eximon.conf-Default
” могут быть отменены динамически, установкой переменных с теми же именами, которые используются EXIMON_. Например, установка EXIMON_LOG_DEPTH, отменяет значение LOG_DEPTH при загрузке.
4.14 Установка бинарных файлов и скриптов Exim'а
Команда
“make install
” запускает скрипт
“
exim_install
” без аргументов. Скрипт копирует бинарные файлы и другие скрипты в директорию чье имя определено в переменной BIN_DIRECTORY в файле
“
Local/Makefile
”. Инсталляционный скрипт замещает файлы только в том случае, если копируемые файлы более новые, нежели, установленные. Владельцем бинарного файла Exim должен являться root c установленым битом
“
setuid
”, для обычной конфигурации. Поэтому вы должны запустить
“make install
” от имени пользователя root, что бы таким образом настроить права бинарного файла Exim. Однако, в некоторых особенных ситуациях, (например, когда хост не осуществляет локальных доставок) можно запускать Exim не выставляя
“
setuid
” root. (для более детальной информации смотрите главу 51).
Загрузочный файл конфигурации Exim'а определяется переменной CONFIGURE_FILE в файле
“
Local/Makefile
”. Если указывается один файл и он не существует до файл по умолчанию
“
src/configure.default
” копируется инсталляционным скриптом. Если CONFIGURE_FILE содержит список разделенный двоеточием, то по умолчанию ничего установлено не будет.
Одно изменение делается в конфигурационном файле устанавливаемым по умолчанию: конфигурация по умолчанию содержит путь к файлу псевдонимов в системе. Путь к этому файлу устанавливается в переменной SYSTEM_ALIASES_FILE в файле
“
Local/Makefile
” (
“
/etc/aliases
” по умолчанию). Если файл системных псевдонимов отсутствует то инсталляционный скрипт создает его и выводит комментарий пользователю.
Созданный файл не содержит псевдонимов, но он содержит комментарии о псевдонимах сайтов, которые должны существовать. Почтовые псевдонимы по умолчанию хранятся в /etc/aliases. Однако, некоторые операционные системы используют
“
/etc/mail/aliases
”. Вы должны убедиться справедливо ли это, по отношению к вашей операционной системе и, при необходимости, изменить конфигурацию Exim'а.
Конфигурация по умолчанию использует имя localhost'а, как единственный локальный домен и настраивает локальную доставку в общую директорию
“
/var/mail
” исполняясь как локальный пользователь. Системные псевдонимы и
“
.forward
” файлы в домашних директориях пользователей поддерживаются, но поддержка NIS или NIS+ не конфигурируется. Домены отличные от локального маршрутизируются с помощью DNS, с доставкой через SMTP.
Возможно инсталлировать Exim для особых целей (например распространения бинарного файла), в специальные пути операционной системы. Можно сделать это командой:
make DESTDIR=/some/directory/ install
|
Этот путь будет применяться ко всем файлам, кроме файла с системными именами который присутствует в конфигурации по умолчанию (если файл псевдонимов по умолчанию создан, он модифицируется). Для обратной совместимости используется ROOT, если DESTDIR не установлена, однако это не одобряется.
Запуск
“
make install
” не скопирует Exim скрипт
“
convert4r4
”, или тестовую программу
“
pcretest
”. Первый из этих скриптов вы запустите только единожды, (если вы апгрейдите Exim 3), а второй не является частью Exim. Ни один из файлов документации в директории doc не будет скопирован, кроме информационных файлов которые вы установили в переменной INFO_DIRECTORY как описано в разделе 4.15, выше.
Для утилит, старые версии переименовываются с добавлением суффикса
“
.O
” к именам файлов. Бинарный файл Exim обрабатывается по-другому. Он инсталлируется с именем которое включает в себя номер версии и номер компиляции, например
“
exim-4.62-1
”. Скрипт создает символическую ссылку c названием
“
exim
” на бинарный файл Exim. Если вы обновляете предыдущую версию, то скрипт заботится о том, что бы имя
“
exim
” никогда не отсутствовало в директории (как видимое другими процессами).
Если вы хотите увидеть, что происходит после команды
“
make install
”, без непосредственной инсталляции, вы можете добавить ключ -n в инсталляционный скрипт следующей командой:
make INSTALL_ARG=-n install
|
Содержимое переменной INSTALL_ARG передается инсталляционному скрипту. Вам не потребуются права root, что бы запустить этот тест. В качестве альтернативы вы можете управлять инсталляционным скриптом непосредственно, но это должно быть сделано в директории где происходит сборка. Например в верхней директории Exim используйте следующую команду:
(cd build-SunOS5-
5
.
5
.
1
-sparc; ../scripts/exim_install -n)
|
Существуют две опции которые распознаются инсталляционным скриптом:
“
-no_chown
” - пропускает вызов смены владельца инсталлированого бинарного файла, на root и вызов установки бита setuid.
“
-no_symlink
” - пропускает процедуру создания символической ссылки на бинарный файл
“
exim
”.
INSTALL_ARG может быть использована, для передачи этих опций скрипту. Например:
make INSTALL_ARG=-no_symlink install
|
Инсталляционному скрипту можно так же дать аргументы, определяющие какие должны быть скопированы. Например, что бы инсталлировать только бинарный файл exim, без символических ссылок, нужно использовать следующую комманду:
make INSTALL_ARG='-no_symlink exim' install
|
4.15 Инсталляция документации
Не все системы используют GNU
“
info
” для документации и по этой причине, исходники Texinfo документации не включены в главный дистрибутив. Они доступны отдельно на ftp сайте (смотрите раздел 1.6).
Если вы определили INFO_DIRECTORY в файле
“
Local/Makefile
” и исходники Texinfo документации найдены в дереве исходников, запуск
“
make install
” автоматически создаст info файлы и инсталлирует их.
4.16 Определение директории spool
При загрузке Exim пытается создать директорию spool, если она отсутствует. gid и uid применяются к директории spool те же, что и у Exim. Поддиректории в директории spool создаются автоматически, по мере необходимости.
4.17 Тестирование
Проинсталлировав Exim вы можете проверить что конфигурационный файл синтаксически верен, запустив следующую команду, которая предполагает что путь к бинарному файлу Exim находится в PATH.
Если в файле конфигурации содержатся ошибки, Exim выведет ошибку. В противном случае, он выведет номер версии и дату сборки, какая DBM библиотека используется, информацию о драйверах и других программных модулях включеных в бинарный файл. Используются простые тесты с адресом в качестве параметра. Например:
exim -bt <local username>
|
должен подтвердить что распознается локальный почтовый ящик, и:
exim -bt <remote address>
|
при использовании удаленного. Теперь проверим доставку почты удаленно и локально. Это может быть сделано с помощью пропуска сообщения непосредственно через Exim, без прохождения через пользовательскую почтовую программу. Например:
exim -v postmaster@your.domain.example
From: user@your.domain.example
To: postmaster@your.domain.example
Subject: Testing Exim
This is a test message.
^D
|
Опция
“
-v
” заставляет Exim выводить проверку происшедшего. В этом случае, вы должны увидеть три строки отчета, одно о прибытии сообщения, одно о его доставке, и одно содержащее
“Completed
”.
Если вы сталкиваетесь с проблемами, загляните в log файлы (
“
mainlog
” и
“
paniclog
”) что бы проверить наличие какой-либо полезной информации в них. Другой источник информации, запуск Exim в отладочном режиме, с опцией
“
-d
”. Если сообщение застряло в spool'е Exim'а, вы можете осуществить принудительную доставку в отладочном режиме c помощью команды:
exim -d -M <exim-message-id>
|
Для того что бы это сделать, вы должны быть root'ом или "admin user". Опция
“
-d
” выводит очень много информации, но вы можете вырезать специальные области. Например, если вы используете
“
-d-all+route
” то будет использована информация только касающаяся пути письма. (Для дополнительных деталей о опции
“
-d
”, смотрите раздел 5.)
Одна проблема, которая обнаружилась на некоторых этапах, - невозможность локальной доставки в директорию с общим ящиком, потому как она не имеет установленный
“sticky bit
”. По умолчанию Exim пытается создать закрытый файл, до записи в файл-почтовый ящик и если он не может создать закрытый файл, то почта не доставляется. Это можно обойти путем присвоения директории
“sticky bit
” или создавая определенную группу для локальной доставки и разрешить этой группе доставку в эту директорию (смотрите выше про переменную
“
local_delivery
” в конфигурационном файле). Другой подход к конфигурированию Exim, не использовать закрытые файлы, вместо этого полагаясь на функцию
“
fcntl()
”. Однако вы должны делать это только если уверены, что пользовтельская почтовая программа так же используют
“
fcntl()
”. Для более подробной информации о закрытии обратитесь к главе 26.
Одна вещь, которая не может быть протестирована в системе, в которой уже запущен MTA - это получение входящей SMTP почты на стандартном порту SMTP. Однако, опция
“
-oX
” может быть использована для запуска демона Exim, который слушает другой порт, или может использоваться inetd. Опция
“
-bh
” и утилита
“
exim_checkaccess
” может быть использована для проверки политик на входящую SMTP почту.
Проверка новой версии в системе, на которой уже установлен Exim может быть легко произведена сборкой бинарного файла с другой установкой переменной CONFIGURE_FILE. Внутри конфигурационного файла, все файлы и директории с именами которые использует Exim могут быть изменены, дабы сохранить чистоту версии.
4.17 Замещение другого MTA, Exim'ом
Сборка и инсталляция Exim производящаяся впервые не использует себя по умолчанию. Название MTA который вызывают пользовательский почтовый агент, находится в
“
/usr/sbin/sendmail
” или
“
/usr/lib/sendmail
” (в зависимости от системы) и необходимо указать использование Exim'а, что бы mua могли передавать письма Exim'у. Обычно это делается с помощью переименования любого существующего файла в
“
/usr/sbin/sendmail
” или
“
/usr/lib/sendmail
” и создания символической ссылки на бинарный файл
“
exim
”. Хорошей идеей является удаление setuid и снятие флага x со старого MTA. Необходимо остановить и перезапустить почтового демона, если он загружен.
Некоторые операционные системы предоставляют иные пути переключения на другие MTA. Например, если вы используете FreeBSD, вам нужно отредактировать файл
“
etc/mail/mailer.conf
” вместо создания символической ссылки, как было только что описано. Содержание файла, загружающего Exim следующее:
sendmail /usr/exim/bin/exim
send-mail /usr/exim/bin/exim
mailq /usr/exim/bin/exim -bp
newaliases /usr/bin/true
|
Как только вы сделали символическую ссылку, или отредактировали
“
/etc/mail/mailer.conf
” ваш инсталлированый Exim "ожил". Проверьте это, получив письмо вашей любимой почтовой программой.
Вы должны осознавать, что скажете пользователям по поводу смены MTA. Exim может иметь разную совместимость с тем, что ранее использовалось, и могут быть различия в сообщениях командной строки и в отторгнутых сообщениях. Если вы позволите пользователям использовать возможности фильтрования Exim'а сделать доступным для них документ с названием
“
Интерфейс Exim для фильтрования почты
” (
“
Exim's interface to mail filtering
”).
4.19 Обновление Exim
Если у вас уже загружен Exim на вашем хосте, сборка и инсталляция новой версии автоматически доступна для использования MUA или других программ которые вызывают MTA напрямую. Однако, если у вас загружен демон Exim, то вам нужно отправить ему HUP сигнал, для того, что бы он перезагрузил себя и загрузил новый бинарный файл. Вы не должны прекращать обработку почты для того что бы инсталлировать новую версию Exim. Инсталляционный скрипт не модифицирует существующий конфигурационный файл.
4.20 Остановка демона Exim на Solaris'е
Стандартной командой остановки демона на Solaris'е является:
/etc/init.d/sendmail stop
|
Если
“
/usr/lib/sendmail
” является символической ссылкой, скрипт не сможет остановить Exim, потому, что он использует команду
“
ps -e
” и
“
grep
” для вывода текста "sendmail", а ее не будет, потому что настоящее имя программы ("exim") дается команде ps с этими опциями. Решение состоит в том, что бы заменить эту строку на идентификатор системного процесса, например:
pid=`cat /var/spool/exim/exim-daemon.pid`
|
который получим из файла в который Exim сохраняет его.
Стоит отметить, что остановка демона, не означает остановки Exim. Сообщения все еще могут получаться от локальных процессов и если автоматическая доставка сконфигурирована (вероятный случай), то доставка будет происходить.
translated by Andy
verifying by lissyara
5. Командная строка Exim
Командная строка exim имеет стандартную UNIX-форму последовательности опций, которые начинаются с символа дефиса, за которым следует несколько параметров. Опции совместимы с основными опциями Sendmail, и также есть дополнительные опции, некоторые из которых совместимы с Smail 3. Определённые комбинации опций не имеют смысла, и при попытке их использования происходит ошибка. Форма агрументов (параметров) зависит от того, какие опции заданы.
5.1 Установка опций именем программы
Если exim вызывается под именем
“
mailq
”, он ведёт себя как будто перед другими опциями присутствует опция
“
-bp
”. Опция
“
-bp
” запрашивает список содержимого почтовой очереди и выводит его на стандартный вывод. Эта возможность имеется для совместимости с некоторыми системами, содержащими команды с использованием этого имени в одной из стандартных библиотек, символически связанных с
“
/usr/sbin/sendmail
” или
“
/usr/lib/sendmail
”.
Если exim вызывается под именем
“
rsmtp
”, он ведёт себя как будто перед другими опциями присутствует опция
“
-bS
”, для совместимости со Smail. Опция
“
-bS
” используется для подсчёта числа сообщений в пакетном SMTP-формате.
Если exim вызывается под именем
“
rmail
”, он ведёт себя как будто перед другими опциями присутствуют опции
“
-i
” и
“
-oee
”, для совместимости со Smail. Имя
“
rmail
” используется как интерфейс некоторыми UUCP системами.
Если exim вызывается под именем
“
runq
”, он ведёт себя как будто перед другими опциями присутствует опция
“
-q
”, для совместимости со Smail. Опция
“
-bS
” используется для запуска одиночного процесса обработчика очереди.
Если exim вызывается под именем
“
newaliases
”, он ведёт себя как будто перед другими опциями присутствует опция
“
-bi
”, для совместимости со Sendmail. Эта опция используется для пересборки файла альясов Sendmail`a. Exim понятия не имеет о одиночном (отдельном?) файле альясов, но может быть сконфигурирован для выполнения данной команды, если он вызван с опцией
“
-bi
”.
5.2 Доверенные и административные пользователи
Некоторые опции exim`a доступны только для
“
доверенных пользователей
” (
“
trusted users
”), и другие доступны лишь для
“
административных пользователей
” (
“
admin users
”). В описании ниже, фразы
“пользователь exim`a
” (
“Exim user
”) и
“группа Exim
” (
“Exim group
”) означают пользователя и группу заданных как
“EXIM_USER
” и
“EXIM_GROUP
” в
“
Local/Makefile
”, или установленных опциями
“
exim_user
” и
“
exim_group
” конфигурационного файла. Они не обязательно должны использовать имя
“exim
”.
Доверенные пользователи - это root, пользователь exim`a, и любой пользователь перечисленный в конфигурационной опции
“
trusted_users
”, и любой пользователь, текущая или дополнительная группа которого перечислена в конфигурационной опции
“
trusted_groups
”. Обратите внимание, что группе exim доверие автоматически не устанавливается.
Доверенным пользователям всегда разрешено использовать опцию
“
-f
” или продолжение строки
“From
”, для определения (имеется ввиду, что можно изменить имя отправителя - прим. lissyara) отправителя конверта сообщения, принятого exim`ом через локальный интерфейс (смотрите ниже, опции
“
-bm
” и
“
-f
”). Смотрите опцию
“
untrusted_set_sender
” для способа разрешить недоверенным пользователям устанавливать отправителя конверта.
Для доверенных пользователей никогда не проверяется содержимое заголовков
“
From:
” и никогда не добавляется строка заголвка
“
Sender:
”. Кроме того, любые существующие строки
“
Sender:
” во входящих локальных (не по TCP/IP) сообщениях не удаляются.
Также, доверенные пользователи могут задать имя хоста, адрес хоста, адрес интерфейса, имя протокола, значение ident, и аутентификационные данные, при отправке сообщения локально. Таким образом, они могут вставить в локальную очередь exim`a сообщения, которые имеют характеристики сообщений полученных с удалённых хостов. Недоверенные пользователи, при некоторых обстоятельствах, используют
“
-f
”, но никогда не могут устанавливать другие значения, доступные для доверенных пользователей.
Административный пользователь - root, пользователь exim`a, и любые другие пользователи, которые являются членами группы exim`a (несколько расходится с описанным парой абзацев выше, не находите? Надо проверять живьём. - прим. lissyara), или любой группы перечисленной в конфигурационной опции
“
admin_groups
”. Текущая группа не должна быть одной из этих групп.
Административным пользователям разрешено просматривать список очереди, и выполнять определённые операции над сообщениями, например, вызывать принудительную ошибку доставки сообщения. Также, необходимо быть административным пользователем, чтобы видеть полную информацию предоставляемую монитором exim`a, и полную отладочную информацию.
По дефолту, использование опций
“
-M
”,
“
-q
”,
“
-R
” и
“
-S
” для попытки доставки доставки сообщения в очереди, доступно только административным пользователям. Однако, это ограничение может быть ослаблено, установкой опции
“
prod_requires_admin
” в
“false
” (т.е. задав
“
no_prod_requires_admin
”).
Точно также, использование опции
“
-bp
” для получения списка всех сообщений в очереди доступно лишь административным пользователям, если
“
queue_list_requires_admin
” не установлена в
“false
”.
Предупреждение: Если вы конфигурируете вашу систему так, чтобы администативные пользователи имели возможность редактировать конфигурационный файл exim`a, вы даёте этим пользователям простой способ получить root`овый доступ. Дальнейшее обсуждение этой проблемы в начале главы 6.
5.3 Опции командной строки
Командные опции описаны в алфавитном порядке, ниже.
“
--
” - Это псевдо-опция, назначение которой - указать конец опций, и обработать последующие параметры как параметры а не опции, даже если они начинаются с дефисов.
“
--help
” - Эта опция заставляет exim вывести несколько фраз о том, что он такое (какой он). Тот же самый вывод генерится при запуске бинарного файла exim`a без опций и параметров.
“
-B<type>
” - Это опция sendmail`a, для выбора обработки - 7-ми или 8-ми битной. Exim - полностью 8-ми битный; он игнорирует эту опцию.
“
-bd
” - Эта опция запускает exim как даемон, ожидающий входящих SMTP-соединений. Обычно, опция
“
-bd
” комбинируется с опцией
“
-q<time>
”, для задания, что даемон обработчика очереди, также должен периодически выполняться.
Опция
“
-bd
” может использоваться только административными пользователями. Если установлены опции
“
-d
” (отладка) или
“
-v
” (проверка), даемон не отключается от контрольного терминала. При работе таким способом, он может быть остановлен нажатием Ctrl+C.
По-умолчанию, exim ждёт входящие подключения на стандартном SMTP-порту на всех работающих интерфейсах хоста. Однако, он может слушать на других портах, на нескольких портах и только на определённых интерфейсах. Раздел 13 сожержит описание опций, управляющих этим.
Когда слушающий даемон запущен без использования
“
-oX
” (т.е. не отменяя нормальную конфигурацию), он пишет идентификатор процесса в файл с именем
“
exim-daemon.pid
” находящийся в директории спула exim`a. Это местоположение может быть перезадано установкой
“PID_FILE_PATH
” в
“
Local/Makefile
”. Файл записывается в то время, когда exim всё ещё работает от пользователя root.
Когда
“
-oX
” используется в командной строке, для запуска слушающего даемона, идентифкатор процесса не записывается в pid-файл находящийся по нормальному пути. Однако, опция
“
-oP
” может быть использована для задания пути в командной строке, если pid-файл необходим.
Сигнал
“SIGHUP
” может быть использован для непосредсвенного перевызова даемона. Это необходимо сделать всякий раз, когда конфигурационный файл exim`a или файл непосредсвенно в него включенный посредством
“
.include
”, изменён, а также всякий раз, когда установлена новая версия exim. Нет необходимости делать это, когда изменяются другие файлы, на которые ссылаются из конфигурации (например, файлы альясов), поскольку они перечитываются при каждом использовании.
“
-bdf
” - Эта опция имеет такой же эффект, как и
“
-bd
”, за исключением, что процесс никогда не отключается от терминала, даже если отладка не задана.
“
-be
” - Запускает exim в режиме тестирования раскрытий. Exim снимает с себя root`овые привилегии, чтобы предотвратить использование этого режима обычными пользователями для чтения недоступных им файлов. Если не задано никаких аргументов, exim выполняется в интерактивном режиме, запрашивая строки данных. Иначе, он обрабатывает каждый параметр по очереди.
Если exim собран с
“USE_READLINE=yes
” в
“
Local/Makefile
”, то он пробует динамически загрузить библиотеку
“
libreadline
” каждый раз, когда опция
“
-be
” используется без параметров командной строки. В случае успеха, он использует функцию
“
readline()
”, которая предоставляет обширные средства редактирования строки, для чтения тестовых данных. История строк поддерживается.
Длинные выражения раскрытия могут быть разбиты на несколько строк, используя продолжения с обратным слэшем. Как в рабочей конфигурации exim`a, пустые символы игнорируются в начале строк продолжения. Каждый аргумент или строка данных проходят через механизм раскрытия строк, и результат выводится. Значения переменных из конфигурационного файла (например,
“
$qualify_domain
”) доступны, но значения специфичные для сообщения (например,
“
$domain
”) не установлены, поскольку нет сообщения в обработке.
“
Примечание
”: Если вы используете этот механизм для тестирования поиска, и вы изменяете файлы данных или БД, которые используете, вы должны выйти и рестартануть exim перед новой попыткой такого же поиска. Иначе, поскольку каждый процесс exim`a r'ibhetn результаты поисков, вы получите такой же результат как и прежде.
“
-bF <filename>
” - Эта опция тоже самое, что и
“
-bf
”, за тем исключением, что предполагается что тестируемый фильтр - системный фильтр. Дополнительные команды, которые доступны только в ситемном фильтре, также равпознаются.
“
-bf <filename>
” - Эта опция запускает exim в режиме тестрования пользовательского фильтра; файл - это файл фильтра который будет тестироваться, и тестовое сообщение должно быть предоставлено на стандартном вводе. Если в фильтре нет зависимых от сообщения тестов, может быть предоставлен пустой файл.
Если вы хотите тестировать системный фильтр, используйте
“
-bF
” вместо
“
-bf
”. Вы можете использовать обе опции
“
-bF
” и
“
-bf
” в одной команде, для проверки сисемного фильтра и пользовательского одновременно. Например:
exim -bF /system/filter -bf /user/filter </test/message
|
Это полезно, когда системный фильтр добавляет строки заголовка или устанавливает переменные фильтра используемые пользовательским фильтром.
Если тестируемый файл фильтра не начинается с одной из специальных строк
# Exim filter
# Sieve filter
|
то он берётся как нормальный файл
“
.forward
”, и проверяется на валидность в этой интерпретации. Смотрите секции 22.4 и 22.6 для описания возможного содержимого нефильтровых списков перенаправления.
Результаты команды exim, использующей
“
-bf
”, если не обнаружены ошибки, является списком действий которые exim попробовал бы предпринять, если бы это было реальное сообщение. Более подробное рассмотрение тестирования фильтров дано в отдельном документе, озаглавленном
“
Exim's interfaces to mail filtering
”.
Когда тестируется файл фильтра, отправитель конверта может быть задан при помощи опции
“
-f
”, или при помощи строки
“From
” в начале тестового сообщения. Различные параметры, которые бы обычно брались из адреса получателя конверта сообщения, могут быть установлены посредством дополнительных опций командной строки (смотрите последующий четыре опции).
“
-bfd <domain>
” - Эта опция устанавливает домен адреса получателя, когда файл фильтра тестируется с использованием опции
“
-bf
”. Дефолтовое значение -
“
$qualify_domain
”.
“
-bfl <local part>
” - Эта опция устанавливает локальную часть адреса получателя, когда файл фильтра тестируется с использованием опции
“
-bf
”. По дефолту - имя пользователя, процесса вызвавшего exim. Локальная часть должна быть указана с любым префиксом или суффиксом, поскольку имено в таком виде он появляется в фильтре при фактической доставке сообщения.
“
-bfp <prefix>
” - Эта опция устанавливает префикс локальной части адреса получателя, когда файл фильтра тестируется с использованием опции
“
-bf
”. Дефолтовое значение - пустой преффикс.
“
-bfs <suffix>
” - Эта опция устанавливает суффикс локальной части адреса получателя, когда файл фильтра тестируется с использованием опции
“
-bf
”. Дефолтовое значение - пустой суффикс.
“
-bh <IP address>
” - Эта опция запускает поддельную SMTP-сессию как будто от заданного IP-адреса, с использованием стандартного ввода и вывода. IP-адрес может включатьномер порта, в конце, после точки. Например:
exim -bh
10
.
9
.
8
.
7
.
1234
exim -bh fe80::a00:20ff:fe86:a061.
5678
|
Когда задан адрес IPv6, он конвертируется в каноническую формую В случае второго примера, выше, значение
“
$sender_host_address
” после преобразования будет
“fe80:0000:0000:0a00:20ff:fe86:a061.5678
”.
Комментарии, относительно происходящего, пишутся в стандартный файл ошибок. Они включают строки начинающиеся с
“LOG
”, для того, что должно быть залоггировано. Это средство предоставлено для того, чтобы тестировать конфигурационные опции входящих сообщений, для удостверения, что они реализуют необходимую политику. Например, вы можете тестировать элементы управления релеем, используя
“
-bh
”.
Предупреждение 1: Вы не можете тестировать конфигурационные возможности которые зависят от обратных вызовов ident (RFC1413). Их нельзя произвести в тестировании, с использованием опции
“
-bh
”, поскольку отсутсвует входящее SMTP-соединение.
Предупреждение 2: Обратные вызовы проверки адреса (смотрите раздел 39.32) также пропускаются, при тестировании, с использованием опции
“
-bh
”. Если вы хотите, чтобы эти обратные вызовы произошли, используйте опцию
“
-bhc
” вместо
“
-bh
”.
Сообщения доставленные в течение сессии тестирования отбрасываются, и никакие данные не записываются ни в один из реальных логов. Могут быть паузы, когда присходит поиск в DNS (или другой), и они могут исчерпать лимит времени (вывалиться по таймауту - прим. lissyara). Опция
“
-oMi
” может использоваться для определения специфического IP-адреса и порта, если есть такая необходимость.
Утилита
“
exim_checkaccess
” -
“упакованная
” (
“packaged
”) версия
“
-bh
”, чей вывод только лишь говорит - допустим ли данный адрес получателя для данного хоста, или нет. Смотрите раздел 49.8.
“
-bhc <IP address>
” - эта опция работает таким же образом, как и
“
-bh
”, исключая, что обратный вызов проверки адреса выполняется, если требуется. Это включает запрос и обновление БД обратных вызовов.
“
-bi
” - Sendmail интерпретирует опцию
“
-bi
” как запрос на ребилдинг своей БД альясов. Exim не имеет представления об одиночном файле альясов, и таким образом, он не может подражать такому поведению. Однако, вызовы
“
/usr/lib/sendmail
” с опцией
“
-bi
” имеют тенденцию появляться в различных скриптах, типа NIS make-файлах, таким образом, эта опция должна быть распознана.
Если встречатеся опция
“
-bi
”, то запускается команда, определённая как
“
bi_command
” в конфигурационном файле, под uid и gid вызывашего exim. Если используется опция
“
-oA
”, её значение передаётся команде как параметр. Команда, установленная
“
bi_command
” может не содержать аргументов. Команда может использовать
“
exim_dbmbuild
”, или другие срадства, для перестройки файла альясов, если это необходимо. Если опция
“
bi_command
” не задана, вызов exim с
“
-bi
” - пустая команда.
“
-bm
” - Эта опция запускает процесс exim принимающий входящие, локально сгенерированные сообщения на текущем вводе. Получатели даются как аргументы команды (кроме тех случаев, когда присутсвует опция
“
-t
” - см. ниже). Каждый аргумент может быть списком адресов, согласно RFC2822, с разделителем в виде запятой. Это - дефолтовая опция, для выбора полного действия при вызове exim; предполагается, что не присутствует никакая другая конфликтующая опция.
Если какие-либо адреса в сообщении неквалифицированные (не имеют домена), они квалифицируются значением опции
“
qualify_domain
” или
“
qualify_recipient
”. Опция
“
-bnq
” (смотрите ниже) - является способом подавить это, для особых случаев.
Проверки политик на содержимое локальных сообщений могут быть осуществлены при помощи не-SMTP ACL. Для дополнительных деталей, смотрите главу 39.
В случае упешного приёма сообщения, код возврата - ноль. Иначе, действием управляет установка опции
“
-oe
x
” - смотрите ниже.
Формат сообщения должан соответствовать RFC2822, за тем исключением, что для совместимости с Sendmail и Smail, строка в одной из форм
From sender Fri Jan
5
12
:
55
GMT
1997
From sender Fri,
5
Jan
97
12
:
55
:
01
|
(опционально, с днём недели, и возможно, дополнительным тексом после даты) может присутствовать в начале сообщения. Тут форматом спецификации на описывается эта строка. Exim распознаёт её по совпадению с регулярным выражением, заданным опцией
“
uucp_from_pattern
”, которая может быть изменена, в случае необходимости.
Указанный отправитель обрабатывается, как если бы он давался как параметр опции
“
-f
”, но, если опция
“
-f
” присутствует, её параметр используется вместо адреса взятого из сообщения. Вызывающая exim программа должна работать от доверенного пользователя, для установки отправителя сообщения.
“
-bnq
” - По дефолту, exim автоматически квалифицирует неквалифицированные адреса (т.е. без домена), которые появляются в сообщениях посылаемых локально (не по TCP/IP). Эта квалификация применяется и к адресам конверта, и к строкам заголовков. Адрес отправителя квалифицируется с использованием значения опции
“
qualify_domain
”, и адрес получателя с использованием
“
qualify_recipient
” (у которой значение по-умолчанию -
“
qualify_domain
”).
Иногда, квалификация не требуется. Например, если используется
“
-bS
” (пакетный SMTP) для повторной передачи сообщений пришедших с удалённого хоста, после контентного сканирования, вы, вероятно,не хотите квалифицировать неполные адреса в строках заголовков. (Такие строки будут присутствовать только если вы не захотели включить проверку синтаксиса заголовков в соответствующей ACL.)
Опция
“
-bnq
” подавляет всю квалификацию неквалифицированных адресов в сообщениях приходящих на локальный хост. Когда она используется, неполный адрес в конверте вызывает ошибки (вызывающие отклонение сообщения) и неполные адреса в строках заголовка оставляются как есть.
“
-bP
” - Если эта опция даётся без параметров, то она выводит все конфигурационные опции exim`a на стандартный вывод. Значения одного или нескольких специфических параметров можно запросить дав их имена как аргументы, например:
exim -bP qualify_domain hold_domains
|
Однако, любой параметр настройки, которому в конфигурационном файле предшествует слово
“hide
” не показывается полностью никому, кроме административного пользователя. Для других пользователей, вывод - как в этом примере:
mysql_servers = <value not displayable>
|
Если
“
configure_file
” дан как аргумент, выводится имя конфигурационного файла работающей конфигурациию. Если список конфигурационных файлов был задан, выводимое значение - имя реально использующегося файла.
Если дан
“
log_file_path
” или
“
pid_file_path
”, выводятся имена директорий, где пишутся логи и pid даемона, соответственно. Если эти значения не установлены, логи пишутся в субдиректории спула, с именем
“
log
”, и pid-файл пишется непосредственно в каталог спула.
Если опция
“
-bP
” сопровождается именем с предшествующим ему
“+
”, например,
ищется соответствие именованного списка любого типа (доменов, хостов, адресов или локальных частей) и выводится найденное.
Если дано одно из слов -
“
router
”,
“
transport
” или
“
authenticator
”, сопровождаемое именем соответствующего драйвера, выводятся параметры настройки этого драйвера. Например:
exim -bP transport local_delivery
|
Вначале выводятся общие опции драйверов, сопровождаемые частными опциями драйвера. Список имён драйверов специфического типа может быть получен использованием слов
“
router_list
”,
“
transport_list
” или
“
authenticator_list
”, и полный список всех драйверов с их параметрами настройки можно получить используя
“
routers
”,
“
transports
” или
“
authenticators
”.
“
-bp
” - Эта опция запрашивает список содержимого почтовой очереди на стандартный вывод. Если опция
“
-bp
” сопровождается списком идентификаторов сообщений, то показываются только эти сообщения.
Каждое сообщение очереди отображается как в этом примере:
25m
2
.9K 0t5C6f-0000c8-
00
<alice@wonderland.fict.example>
red.king@looking-glass.fict.example
<other addresses>
|
Первая строка содержит временной отрезок, который сообщение находится в очереди (в данном случае - 25 минут), размер сообщения (2.9kb), уникальный локальный идентификатор сообщения, и отправителя сообщения, как содержится в конверте. Для рикошетов, адрес отправителя пуст, и появляется как
“<>
”. Если сообщение послано локально, недоверенным пользователем, который изменил дефолтовый адрес отправителя, имя логина пользователя показывается в круглых скобках, перед адресом отправителя.
Если сообщение заморожено (приостановлена попытка его доставки), тогда в конце этой строки показывается текст
“*** frozen ***
”.
Получатели сообщения (взятые из конверта, не из заголовков) показаны в последующих строках. Адреса по которым сообщение уже доставлено отмечены символом
“D
”. Если оригинальный адрес раскрывается в несколько адресов через файл альясов или форвардов, оригинальный показывается с
“D
” только когда завершены доставки для всех дочерних адресов.
“
-bpa
” - Эта опция работает также как и
“
-bp
”, но кроме того, она показывает доставленные адреса, сгенерённые из оригинального адреса верхнего уровня в каждом сообщении при помощи альясинга или форвардинга. Эти адреса помечены
“+D
”, вместо просто
“D
”.
“
-bpc
” - Эта опция подсчитывает число сообщений в очереди, и пишет общее количество на стандарный вывод. Пользование этим ключом разрешено только административным пользователям, если
“
queue_list_requires_admin
” не является ложью.
“
-bpr
” - Эта опция работает также как и
“
-bp
”, но вывод не сортируется в хронологическом порядке по прибытию сообщений. Это может ускорить вывод, когда в очереди много сообщений, и особенно полезно, если вывод будет обработан способом не нуждающимся в сортировке.
“
-bpra
” - Эта опция является комбинацией
“
-bpr
” и
“
-bpa
”.
“
-bpru
” - Эта опция является комбинацией
“
-bpr
” и
“
-bpu
”.
“
-bpu
” - Эта опция работает как
“
-bp
”, но показывает только недоставленные адреса верхнего уровня, для каждого отображённого сообщения. Адреса сгенерённые альясингом и форвардингом не показываются, если сообщение не было задержано после обработки роутером с установленной опцией
“
one_time
”.
“
-brt
” - эта опция для тестирования правил повторов, и должна сопровождается до трёх параметров. Она заставляет exim искать правила повтора которые совпадают со значением и вывести их на стандартный вывод. Например:
exim -brt bach.comp.mus.example
Retry rule: *.comp.mus.example F,2h,15m; F,4d,30m;
|
Смотрите раздел 32 для информации о правилах повторов exim`a. Первый аргумент, являющийся обязательным, может быть полным адресом в форме
“
local_part@domain
”, или может быть только именем домена. Если второй аргумент содержит точку, он интерпретируется как опциональный второе имя домена; если не найдено правил повтора для первого аргумента, используется второй. Это связано с поведением exim`a, когда ищется правило повтора для удалённого хоста - если правило не найдено, исмользуется общее совпадение с почтовым доменом. В конце можно дать, для использования в правилах повторов, параметр являющийся именем для специфической ошибки доставки. Например:
exim -brt haydn.comp.mus.example quota_3d
Retry rule: *@haydn.comp.mus.example quota_3d F,1h,15m
|
“
-brw
” - Эта опция, для тестирования правил перезаписи адресов, и она должна сопровождаться одним аргументом, состоящим из локальной части, без домена, или полным адресом с полным доменом. Exim выводит как этот адрес был бы перезаписан, для каждого возможного места его появления. Для дальнейших подробностей, смотрите раздел 31.
“
-bS
” - Эта опция используется для пакетного ввода SMTP, который является альтернативным интерфейсом для локальной неинтерактивной передачи сообщений. Можно передавать много сообщений за один запуск. Однако, несмотря на его название, в действительности, это не SMTP-ввод. Exim читает конверт каждого сообщения из SMTP-команд со стандартного ввода, но не генерит никаких ответов. Если вызывающему доверяют, или установлена опция
“
untrusted_set_sender
”, то отправителям в командах SMTP MAIL верят; иначе, отправителем всегда будет пользователь вызвавший exim.
Само сообщение читается из стандартного ввода, содержимое входящих пакетных SMTP-сообщений может быть проверено, используя не-SMTP ACL (смотрите раздел 39). Неквалифицированные адреса автоматически квалифицируются с использованием
“
qualify_domain
” и
“
qualify_recipient
”, соответственно, если не используется опция
“
-bnq
”.
Некоторые другие SMTP команды распознаются во вводе. HELO и EHLO действуют как RSET; VRFY, EXPN, ETRN, и HELP как NOOP; QUIT - выход, игнорируя остальную часть стандартного ввода.
Если встречается какая-то ошибка, отчёт записывается на стандартный вывод и в потки ошибок, и exim прекращает обработку. Возвращаемый код равен 0, если ошибок не было, 1 - если одно и более сообщение было принято до обнаружения ошибки, иначе он - 2.
Более подробно о использовании пакетного ввода SMTP рассказано в секции 44.11.
“
-bs
” - Эта опция заставляет exim принимать одно или более соббщений путём чтения SMTP команд со стандатного ввода, и создавать ответы на стандартный вывод. SMTP ACL применяются (смотрите раздел 39). Некоторые пользовательские агенты используют этот интерфейс как способ передать локально сгенерённые сообщения MTA.
В этом использовании если вызывающему доверяют, или установлена опция
“
untrusted_set_sender
”, то отправителям в командах SMTP MAIL верят. Иначе, содержимое этих команд игнорируется и отправителем всегда будет пользователь вызвавший exim. Неквалифицированные адреса автоматически квалифицируются с использованием
“
qualify_domain
” и
“
qualify_recipient
”, соответственно, если не используется опция
“
-bnq
”.
Опция
“
-bs
” также используется для запуска exim из
“
inetd
”, как альтернативу использованию слушающего даемона. Exim может различать эти два случая, проверяя является ли стандартный ввод TCP/IP сокетом. Когда exim вызывается из
“
inetd
”, придполагается что источник почты - удалённый, и описанное выша, относительно квалификации неполных адресов не применяется. В этой ситуации exim ведёт себя точно также как и слушающий даемон, при приёме сообщения.
“
-bt
” - Эта опция запускает exim в режиме тестирования адресов, в котором каждый параметр берётся как адрес, который будет тестироваться на доставку. Результаты пишутся на стандартный вывод. Если тест неудачен, и вызывающий - не административный пользователь, детали о ошибке не выводятся, поскольку они могут содержать секретную информацию, типа имён пользователей и паролей для поиска в БД.
Если аргументов не дано, exim запускается в интерактивной манере, запрашивая с правой угловой скобкой, адреса для тестирования.
В отличие от тестовой опции
“
-be
”, вы не можете заставить exim использовать функцию
“
readline()
”, поскольку он запущен от root и это вопрос безопасности.
Каждый адрес обрабатыватся, как будто он - адрес получателя сообщения (сравните опцию
“
-bv
”). Он передаётся роутерам, и результат записывается на стандартный вывод. Однако, некоторые роутеры, у котрых установлено
“
no_address_test
”, обходятся. Это может сделать опцию
“
-bt
” более лёгкой для использования в настоящих тестах роутеров, если первый маршрутизатор передаёт всё программе сканирования.
Код возврата 2, если какой-либо адрес напрямую потерпел неудачу; 1 - если никакой адрес не потерпел неудачу напрямую, но по крайней мере один не мог быть разрешён по некоторым причинам. Код возврата 0 даёётся лишь в случае, если все адреса были удачны.
Предупреждение: Опция
“
-bt
” может сделать только относительно простое тестирование. Если любой из маршрутизаторов проводит тестирование адреса отправителя сообщения, вы можете использовать опцию
“
-f
” для установки соответствующего отправителя. Без этого, предполагается что отправитель - пользователь вызываший программу, квалифицируемый дефолтовым доменом. Однако, если вы установили (например) маршрутизаторы, поведение которых зависит от содержимого входящего сообщения, вы не сможете протестировать эти условия с использованием
“
-bt
” Опция
“
-N
” - предоставляет один из способов сделать такие тесты.
“
-bV
” - Эта опция заставляет exim вывести на стандартный вывод текущий номер версии, номер компиляции, и дату компиляции бинарного файла exim. Также перечисляются используемые DBM библиотеки, опциональные модули (тпа специфических типов поиска), драйверы, включенные в бинарник, и имя используемого файла конфигурации.
Как часть этой операции,
“
-bV
” заставляет exim читать и проверять синтаксис конфигурационного файла. Однако - это лишь статическая проверка. Он не может проверить значения, которые должны быть раскрыты. Например, хотя ACL с орфографическими ошибками находится, ошибки в параметрах не находятся. Вы не можете положиться только на
“
-bV
” для нахождения всех опечаток (например); необходимо боле-мене реалистичное тестирование. Опции
“
-bh
” и
“
-N
” предоставляют более реалистичные средства тестирования.
“
-bv
” - Эта опция запускает exim в режиме тестирования адресов, в котором каждый параметр берётся как адрес, который будет проверяться. В нормальных условиях, проверка, обычно, происходит обработкой условий
“
verify
” в ACL (смотрите раздел 39). Если вы хотите протестировать всю ACL, смотрите опцию
“
-bh
”.
Если проверка неудачна, и вызывающий не административный пользователь, детали о ошибке не выводятся, поскольку они могут содержать секретную информацию, например имя пользователя и пароль для доступа к БД.
Если аргументов не дано, exim запускается в интерактивном режиме, с приглашением в виде правой угловой скобки, запрашивая адреса для проверки.
В отличие от тестовой опции
“
-be
”, вы не можете заставить exim использовать функцию
“
readline()
”, поскольку он запущен от пользователя exim и это вопрос безопасности.
Проверка отличается от тестирования адресов (опция
“
-bt
”) к которой роутеры, имеющие
“
no_verify
” пропускаются, и если адрес принят роутером имеющим установленную опцию
“
no_verify
”, проверка непройдена. Адрес проверяется как получатель, если используется опция
“
-bv
”; для тестирования проверки адреса отправителя должна использоваться опция
“
-bvs
”.
Если
“
-v
” опция не задана, вывод состоит из одной строки для каждого адреса, начинающейся с заявления прошёл адрес проверку, или нет, в последнем случае приводится причина. Иначе, даётся больше деталей о том, как адрес был обработан, и в случае перенаправления адреса, все сгенерённые адреса также рассматриваются. Без
“
-v
”, генериться более одного адреса, по перенаправлению, заставляя верификацию завершиться полностью.
Возвращённый код 2, если любой адрес был напрямую неудачен; он 1 - если нет напрямую неудачных адресов, но по крайней мере один не мог быть разрешён (в DNS - прим. lissyara) по каким-либо причинам. Возвращённый код 0 - если все адреса успешны.
Если какой-то роутер, в конфигурации, производит какие-либо тесты для адресов отправителя сообщения, то вы должны использовать опцию
“
-f
”, для установки соответствующего отправителя, при запуске тастов с опцией
“
-bv
”. Без этого, предполагается, что отправитель, - вызвавший программу пользователь, с соответствующим дефолтовым доменом.
“
-bvs
” - Эта опция работает как
“
-bv
”, но проверяет адрес отправителя как адрес получателя. Это затрагивает любую перезапись и квалификацию, которая могла бы произойти.
“
-C <filelist>
” - Эта опция заставляет exim находить файл рабочей конфигурации заданного списка, вместо списка определённого
“CONFIGURE_FILE
” при компиляции. Обычно, список состоит из одного файла, но это может быть несколько файлов, разделённых двоеточием. В этом случае, используется первый существующий файл. Ошибка открытия существующего файла останавливает exim, не давая ему просматирвать остальные файлы из списка, и генерится ошибка.
Когда эта опция используется программой работающей не от рута, или пользователя exim`a, и список отличается от указанного при компиляции, exim сбрасывает свои рутовые привилегии, и выполняется под реальным и эффективным uid и gid пользователя, что его вызвал. Однако, если в
“
Local/Makefile
” задана опция
“ALT_CONFIG_ROOT_ONLY
”, рутовые права доступа оставляются для опции
“
-C
”, лишь в случае если вызвавший exim пользователь - root.
Таким образом, пользователю exim`a не даются привилегии в отношении этого. Эта компиляционная опция по дефолту не установлена в исходном тарболле exim`a. Однако, если вы используете версию exim`a из
“пакаджей
”, то тот, кто собирал программу, мог включить эту опцию.
Установка
“ALT_CONFIG_ROOT_ONLY
” блокирует возможность тестирования конфигурации с использованием опции
“
-C
” через приём и отправку сообщений, даже если вызывающий пользователь - root. Приём работает, но к тому времени exim уже работает под своим пользователем, таким образом, когда он перезапускается для восстановления привилегий, для доставки, использование
“
-C
” заставляет привилегии сброситься. Однако, root может тестировать и приём и доставку используя две раздельные команды (одну, чтобы поместить сообщение в очередь, используя
“
-odq
”, и другую для доставки, используя
“
-M
”).
Если в
“
Local/Makefile
” задана опция
“ALT_CONFIG_PREFIX
”, это определяет строку преффикса с которой должен начинаться любой файл в строке с
“
-C
”. Кроме того, имя не должно содержать последовательность
“/../
”. Однако, если значение опции
“
-C
” идентично значению
“CONFIGURE_FILE
” в
“
Local/Makefile
”, exim игнорирует
“
-C
” и работает как обычно. Дефолтовые настройки для
“ALT_CONFIG_PREFIX
” отсутствуют; когда он сброшен, в опции
“
-C
” может использоваться любое имя файла.
“ALT_CONFIG_PREFIX
” может использоваться чтобы ограничить альтернативные конфигурационные файлы директорией, доступ к которой имеет только root. Это предотвратит того, кто взломал учётную запись exim`a от привелигированного exim`a с произвольным конфигурационным файлом.
Средство
“
-C
” полезно для того, чтобы гарантировать что конфигурационный файл синаксически корректен, но не может использоваться для тестовых доставок, если у вызвавшего пользователя нет привилегий, или в случае экзотической конфигурации, не требующей прав доступа. Проверки пользователя или группы файла фигурирующего в этой опции не производятся.
“
-D<macro>=<value>
” - Эта опция может использоваться для отмены макроопределений заданных в конфигурационном файле (смотрите раздел 6.4). Однако, как и
“
-C
”, если она используется непривелигированным пользователем, она заставляет exim снять свои рутовые привилегии. Если опция
“DISABLE_D_OPTION
” задана в
“
Local/Makefile
”, использование опции
“
-D
” полностью заблокировано, и попытка её использования вызывает ошибку, и немедленный выход.
Вся опция (включая равно, если оно присутствует) должна быть в пределах одной строки.
“
-D
” может использоваться для установки значения макрокоманды в виде пустой строки, в этом случае, символ равно опционален. Эти две команды синонимичны:
exim -DABC ...
exim -DABC= ...
|
Для включения пробелов в макроопределения, могут использоваться кавычки. Если вы используете кавычки, пробелы разрешены вокруг имён макрокоманд и символа равно. Например:
exim '-D ABC = something' ...
|
Опция
“
-D
” может быть повторена до 10 раз, в одной командной строке.
“
-d<debug options>
” - Эта опция заставляет exim писать отладочную информацию на стандартный вывод ошибок. Её использование ограничено административными пользователями, поскольку вывод может показать запросы к БД, содержащие пароли. Кроме того, детали пользовательских фильтров должны быть защищены. Когда используется опция
“
-d
”,
“
-v
” включается автоматически. Если задан только
“
-d
”, выводится много отладочной информациию Количество может быть увеличено, или уменьшено, включением некоторой редко используемой информации, путём помещения сразу после
“
-d
” строки, составленной из имён с предшествующим плюсом или минусом. Этим, соответственно, добавляются или удаляются отладочные данные. Например,
“
-d+filter
” позвоялет выбрать только отладку фильтра. Обратите внимание, что пробелы не используются. Доступны следующие категории:
acl ACL interpretation
auth authenticators
deliver general delivery logic
dns DNS lookups (see also resolver)
dnsbl DNS black list (aka RBL) code
exec arguments for execv() calls
expand detailed debugging for string expansions
filter filter handling
hints_lookup hints data lookups
host_lookup all types of name-to-IP address handling
ident ident lookup
interface lists of local interfaces
lists matching things in lists
load system load checks
local_scan can be used by local_scan() (see chapter
41
)
lookup general lookup code and all lookups
memory memory handling
pid add pid to debug output lines
process_info setting info for the process log
queue_run queue runs
receive general message reception logic
resolver turn on the DNS resolver's debugging output
retry retry handling
rewrite address rewriting
route address routing
timestamp add timestamp to debug output lines
tls TLS logic
transport transports
uid changes of uid/gid and looking up uid/gid
verify address verification logic
all almost all of the above (see below), and also -v
|
Опция
“all
” исключает
“memory
”, когда используется как
“+all
”, но включает её (в смысле, тоже убирает эту отладку - прим. lissyara), когда используется как
“-all
”. Причина этого в том, что
“+all
” - то, что люди чаще всего используют для генерации отладки для разработчиков exim`a. Если включено
“+memory
”, вывод будет огромен, и он редко представляет интерес, таким образом, теперь его нужно явно затребовать. Однако,
“-all
” действительно отключает всё.
Опция
“resolver
” создаёт вывод лишь в случае, если DNS-резольвер был скомпилен с включенным DEBUG. Это не так, на некоторых операционных системах. Также, к сожалению, отладочный вывод DNS-резольвера пишется на стандартный вывод, а не стандартный вывод ошибок.
По дефолту (
“
-d
” без аргументов) не включает
“expand
”,
“filter
”,
“interface
”,
“load
”,
“memory
”,
“pid
”,
“resolver
” и
“timestamp
”. Однако выбор
“pid
” принудителен, когда отладка включена для даемона, который передаёт её другому, перезапускаясь. Exim, также, автоматически добавляет pid к строкам отладки, когда параллельно выполняются несколько удалённых доставок.
Опция
“timestamp
” - причина появления текущего времени в начале всех выводимых строк отладки. Она может быть полезной при попытках найти задержки в обработке.
Если опция
“
debug_print
” установлена в любом драйвере, он создаёт вывод каждый раз когда выбрана отладка, даже если опция
“
-v
” не используется.
“
-dd<debug options>
” - Эта опция ведёт себя точно также как и
“
-d
”, кроме случаев использования с командой запускающей процесс даемона. В этом случае, отладка выключается для всех создаваемых подпроцессов. Таким образом, это может быть полезным для наблюдения поведения даемона не создавая такой же большой вывод как при полной отладке.
“
-dropcr
” - Это - устаревшая опция, которая сейчас является пустой командой. Она использовалась для изменения способа обработки exim`ом символов
“CR
” и
“LF
” во входящих сообщениях. Что происходит сейчас, описано в разделе 43.2.
“
-E
” - Эта опция определяет, что входящее сообщение - сгенерированный локально отчёт о ошибке доставки. Она используется внутри exim`a и не предназначена для внешнего использования. Её единственый эффект - останавливать генерацию exim`ом определённых сообщений постмастеру, поскольку в небольшом числе ситуаций могли бы возникнуть каскады сообщений. Как часть этой опции, идентификатор сообщения может следовать за символами
“
-E
”. Если такое происходит, строка лога для получателя нового сообщения содержит идентификатор, сразу после
“R=
”, как перекрёстная ссылка.
“
-e
x
” - Есть множество опций Sendmail, начинающихся с
“
-oe
”, которые вызываются различными программами без
“
o
” в опции. Например, программа
“
vacation
” использует
“
-eq
”. Exim обрабатывает все опции формы
“
-e
x
” как синонимичные опциям
“
-oe
x
”.
“
-F <string>
” - Эта опция устанавливает полное имя отправителя, которое используется, когда принимается сгенерённое локально сообщение. В отсутствие этой опции, используется элемент
“
gecos
” из данных пароля пользователя. Поскольку, обычно, пользователям разрешено менять их поля
“
gecos
”, не включены никакие вопросы безопасности. Пробел между
“
-F
” и
“
<string>
” опционален.
“
-f <address>
” - Эта опция устанавливает адрес отправителя конверта в локально созданных сообщениях. Обычно, она может использоваться только доверенными пользователями, но
“
untrusted_set_sender
” может разрешить её использование недоверенным пользователям.
Процессам, запущенным как пользователь root или пользователь exim`a, всегда доверяют. Прочие доверенные пользователи задаются опцией
“
trusted_users
” или
“
trusted_groups
”. В отсутствии
“
-f
”, или когда вызывающему не доверяют, отправитель локального сообщения задаётся из имени логина пользователя и квалифицируется дефолтовым доменом.
Есть одно исключение из ограничения на использование
“
-f
”: пустой отправитель может быть задан любым пользователем, доверенным или нет, для создания сообщения, которое никогда не сможет вызвать срыв. Пустой отправитель может быть указан как пустая строка, или как пара угловых скобок без чего-либо между ними, как в этих примерах команд оболочки:
exim -f '<>' user@domain
exim -f "" user@domain
|
Кроме того, использование
“
-f
” не ограничено тестированием файлов фильтра с
“
-bf
”, тестированием или проверкой адресов с использованием опций
“
-bt
” или
“
-bv
”.
Разрешение недоверенным пользователям изменять адрес отправителя создаёт возможность отправлять анонимную почту. Exim всё равно проверяет, ссылается ли на локального пользователя, заголовок
“
From:
”, и если это не так, он добавляет заголовок
“
Sender:
”, хотя и это может быть отменено установкой опции
“
no_local_from_check
”.
Пробелы между
“
-f
” и
“
<address>
” - опциональны (т.е. можно давать как два параметра, так и один, объединённый). Отправитель, созданного локально сообщения, также может быть установлен (когда разрешено) инициалом
“From
” - строкой в сообщении, смотрите выше примечание к
“
-bm
”, но если присутствует
“
-f
”, оно перезаписывает
“From
”.
“
-G
” - Эта опция Sendmail`a игнорируется exim`ом.
“
-h <number>
” - Эта опция используется для совместимости с sendmail, но не имеет никакого эффекта. (В sendmail`e она она перезадаёт
“счётчик хопов
” (
“hop count
”), получемый подсчётом заголовков
“
Received:
”)
“
-i
” - Эта опция имеет такой же эффект как и
“
-oi
”, задавая, чтобы отдельная точка в строке не завершила входящее не-SMTP сообщение. Я не смог найти документацию по этой опции в sendmail Solaris 2.4, но команда
“
mailx
” в нём использует эту опцию. Смотрите также
“
-ti
”.
“
-M <message id> <message id> ...
” - Эта опция вызывает exim для попытки доставки каждого сообщения, по очереди. Если любое из сообщений заморожено, оно автоматически размораживается перед попыткой доставки. Значения
“
queue_domains
”,
“
queue_smtp_domains
” и
“
hold_domains
” игнорируются.
Совпадения повторов для любого из адресов отменяются - exim пробует произвести доставку даже когда нормальное время повтора не наступило. Эта опция требует, чтобы вызывающий пользователь был административным. Однако, существует опция называемая
“
prod_requires_admin
” которая может быть установлена в ложь, для ослабления этого ограничения (и тоже самое требуется для опций
“
-q
”,
“
-R
” и
“
-S
”).
Доставки происходят синхронно, т.е. оригинальный процесс exim`a не завершается, пока не завершатся все попытки доставки. Вывода нет, если нет серьёзных ошибок. Если вы хотите видеть, что происходит, используйте опцию
“
-v
”, или просматривайте основной лог exim`a.
“
-Mar <message id> <address> <address> ...
” - Эта опция вызывает exim для добавления адреса в список получателей сообщения (
“
ar
” значит
“add recipients
”). Первый аргумент должен быть идентификатором сообщения, а последующие - адресами e-mail. Однако, если сообщение активно (находится в попытке доставки), оно не изменяется. Эта опция может использоваться только административными пользователями.
“
-MC <transport> <hostname> <sequence number> <message id>
” - Эта опция не предназначена для использования внешними вызывающими программами. Она используется внутри exim`a, для вызова собственной копии, чтобы доставить ожидающее сообщение с использованием существующего SMTP-соединения, передавая его через стандартный ввод. Детали даны в разделе 44. Это должно быть последней опцией, и вызывающий пользователь должен быть root или пользователь exim`a, для возможности её использовать.
“
-MCA
” - Эта опция не предназначена для использования внешними вызывающими программами. Она используется внутри exim`a вместе с опцией
“
-MC
”. Она указывает, что подключение с удалённым хостом аутентифицированное.
“
-MCP
” - Эта опция не предназначена для использования внешними вызывающими программами. Она используется внутри exim`a вместе с опцией
“
-MC
”. Она указывает, что сервер, к которому подключен exim, поддерживает конвейеризацию.
“
-MCQ <process id> <pipe fd>
” - Эта опция не предназначена для использования внешними вызывающими программами. Она используется внутри exim`a вместе с опцией
“
-MC
”, когда оригинальная доставка была начата обработчиком очереди. Она передаёт идентификатор процесса обработчика очереди, вместе с номером дескриптора открытого канала (трубы). Закрытие трубы свидетельствует о завершении последовательности процессов, которые передавали сообщение через тоже самое SMTP-подключение.
“
-MCS
” - Эта опция не предназначена для использования внешними вызывающими программами. Она используется внутри exim`a вместе с опцией
“
-MC
”, и передаёт факт, что опция SMTP SIZE должна использоваться на сообщениях, доставляемых через существующее подключение.
“
-MCT
” - Эта опция не предназначена для использования внешними вызывающими программами. Она используется внутри exim`a вместе с опцией
“
-MC
”, и передаёт факт, что хост, с которым связан (с которым установлено соединение - прим. lissyara) exim поддерживает шифрование TLS.
“
-Mc <message id> <message id> ...
” - Эта опция вызывает exim для запуска попытки доставки каждого сообщения по очереди, но, в отличие от опции
“
-M
”, эта проверяет повторы и использует найденные значения. Эта опция не очень полезна для внешних программ. Она применяется, главным образом, для внутреннего использования exim`ом, когда ему необходимо перевызывать себя, для восстановления root`овых прав необходимых для доставки (смотрите раздел 51). Однако, опция
“
-Mc
” может быть полезной при тестировании доставки, которая использует время повторов, и другие опции, например
“
hold_domains
”, которые отменяются при использовании
“
-M
”. Такая доставка не считается запуском обработчика очереди. Если вы хотите запустить специфическую доставку, как будто работал обработчик очереди, вы должны использовать опцию
“
-q
” с идентификатором сообщения, как аргументом. Различие между доставкой обработчиком очереди и другими доставками состоит в одном или двух местах.
“
-Mes <message id> <address>
” - Эта опция вызывает exim для изменения адреса отправителя в сообщении на заданный адрес, который должен быть полностью квалифицированным адресом, или
“<>
” (
“es
” означает
“edit sender
”). Обязательно должны быть два параметра. Первый аргумент должен быть идентификатором сообщения, и второй e-mail адресом. Однако, если сообщение активно (находится в процессе попытки доставки), его статус не меняется. Эта опция может использоваться только административными пользователями.
“
-Mf <message id> <message id> ...
” - Эта опция вызывает exim, чтобы отметить перечисленные сообщения как
“замороженные
” (
“frozen
”). Этим предотвращаются любые имеющие место попытки доставки, до тех пор, пока сообщение не будет разморожено вручную, или в результате конфигурационной опции
“
auto_thaw
”. Однако, если сообщение активно (находится в процессе доставки), его статус не будет изменён. Эта опция может использоваться только административными пользователями.
“
-Mg <message id> <message id> ...
” - Эта опция вызывает exim, чтобы отменить доставку перечисленных сообщений, включая те, что заморожены. Однако, если сообщение активно (находится в процессе доставки), его статус не будет изменён. Для сообщений, не являющихся рикошетами, сообщение об ошибке доставки шлётся отправителю, содержа текст
“отменено администратором
” (
“cancelled by administrator
”). Рикошеты только отбрасываются. Эта опция может использоваться только административными пользователями.
“
-Mmad <message id> <message id> ...
” - Эта опция вызывает exim, чтобы пометить все адреса получателей в сообщениях как уже доставленные (
“mad
” означает
“mark all delivered
”). Однако, если сообщение активно (находится в процессе доставки), его статус не будет изменён. Эта опция может использоваться только административными пользователями.
“
-Mmd <message id> <address> <address> ...
” - Эта опция вызывает exim, чтобы пометить заданные адреса как уже доставленные (
“md
” означает
“mark delivered
”). первый аргумент должен быть идентификатором сообщения, и последующие должны быть адресами e-mail. Они совпадают с адресами получателей с учётом регистра. Если сообщение активно (находится в процессе доставки), его статус не будет изменён. Эта опция может использоваться только административными пользователями.
“
-Mrm <message id> <message id> ...
” - Эта опция вызывает exim, чтобы удалить заданные сообщения из очереди. Рикошеты не шлются; про сообщения просто забывают. Однако, если сообщение активно (находится в процессе доставки), его статус не будет изменён. Эта опция может использоваться только административными пользователями, или пользователем изначально поместившим сообщение в очередь.
“
-Mt <message id> <message id> ...
” - Эта опция вызывает exim, чтобы разморозить перечисленные сообщения, которые заморожены, в итоге попытки их доставить продолжатся. Однако, если сообщение активно (находится в процессе доставки), его статус не будет изменён. Эта опция может использоваться только административными пользователями.
“
-Mvb <message id>
” - Эта опция выводит на стандартный вывод содержимое тела сообщения (-D), из спула. Эта опция может использоваться только административными пользователями.
“
-Mvh <message id>
” - Эта опция выводит на стандартный вывод содержимое заголовков сообщения (-H), из спула. Эта опция может использоваться только административными пользователями.
“
-Mvl <message id>
” - Эта опция выводит на стандартный вывод содержимое лог-файла сообщения, из спула. Эта опция может использоваться только административными пользователями.
“
-m
” - Эта опция является синонимом для
“
-om
”, используемой sendmail`ом, таким образом, exim её также обрабатывает.
“
-N
” - Это опция отладки, которая запрещает доставку на транспортном уровне. Она подразумевает опцию
“
-v
”. Exim проделывает все движения (обработки) доставки - лишь не транспортирует сообщение, но вместо этого ведёт себя так, будто успешно произвёл транспортировку. Однако он не производит какие-либо обновления БД повторов, и в логах о доставки строки будут содержать флаги
“*>
” вместо
“=>
”.
Поскольку
“
-N
” сбрасывает любой сообщение к которому применяется, только root или пользователь exim`a разрешается использовать эту опцию с
“
-bd
”,
“
-q
”,
“
-R
” или
“
-M
”. Другими словами, обычный пользователь может использовать эту опцию только когда предоставляет входящее сообщение к которому будет применена эта опция.Хотя транспортировка никогда не бывает неудачной, при установленной опции
“
-N
”, адрес может быть задержан из-за конфигурационных проблем транспорта, или роутинга. Как только
“
-N
” используется для попытки доставки, она прилипает к сообщению, и применяется для всех последующих попыток доставки сообщения, которые могут быть для этого сообщения.
“
-n
” - Эта опция интерпретируется sendamil`om как
“не производить альясинг
” (
“no aliasing
”). Она игнорируется exim`ом.
“
-O <data>
” - Эта опция интерпретируется sendamil`om как
“установить опцию
” (
“set option
”). Она игнорируется exim`ом.
“
-oA <file name>
” - Эта опция использкется sendmail`ом вместе с
“
-bi
” для задания альтернативного имяни файла альясов. Exim обрабатывает
“
-bi
” иначе; смотрите описание выше.
“
-oB <n>
” - Это отладочная опция, которая ограничивает максимальное число сообщений, которые могут быть доставлены по SMTP-соединению, отменяя значение заданное в любом транспорте
“
smtp
”. Если
“
<n>
” отсутствует, ограничение устанавливается в 1.
“
-odb
” - Эта опция применяется ко всем режимам в которых exim принимает входящие сообщения, включая слушающего даемона. Она запрашивает
“фоновую
” (
“background
”) доставку таких сообщений, означающую, что принимающий процесс автоматически запускает процесс доставки для каждого полученного сообщения, но не жёдт окончания процесса доставки.
Когда все сообщения получены, принимающие процессы завершаются, оставляя процессы доставки завершаться самостоятельно. Стандартный вывод и поток ошибок закрываются в начале каждого процесса доставки. Это - дефолтовое действие, если не задана опция
“
-od
”.
Если одна из опций организации очереди, в конфигурационном файле (
“
queue_only
” или
“
queue_only_file
”, например), включена,
“
-odb
” перезадаёт её, если
“
queue_only_override
” установлена в истину, что является настройкой по умолчанию. Если
“
queue_only_override
” установлена в ложь,
“
-odb
” не имеет эффекта.
“
-odf
” - Эта опция запрашивает
“foreground
” (синхронную) доставку, когда exim принимает созданные локально сообщения. (Для даемона это точно также как с
“
-odb
”) Процесс доставки автоматически запускает доставку сообщения, и exim ждёт его завершения до последующей работы.
Оригинальный принимающий процесс exim`a не завершается пока процесс доставки сообщения не завершится. Стандартный поток ошибок остаётся открытым в течение доставки.
Однако, как
“
-odb
”, эта опция не имеет эффекта, если
“
queue_only_override
” установлена в ложь, и установлена одна из опций организации очереди, в конфигурационном файле.
Если происходит временная ошибка доставки во время текущей синхронной доставки, сообщение остаётся в очереди, для дальнейшей доставки, и оригинальные процессы приёма завершаются. Смотрите раздел 47 для подробностей о способе установить ограничения конфигурации, чтобы с этой опцией сообщения никогда не ставились в очередь.
“
-odi
” - Эта опция - синоним
“
-odf
”. Она присутствует для совместимости с sendmail.
“
-odq
” - Эта опция применяется ко всем режимам exim`a, когда он принимает входящие сообщения, включая слушающего даемона. Она определяет, чтобы процесс принимающий сообщения не производил автоматический запуск процесса доставки для каждого принятого сообщения. Сообщения кладутся в очередь, и остаются там, пока следующий процесс обработчика очереди не обнаружит их. Есть несколько конфигурационных опций (например,
“
queue_only
”), которые могут быть использованы для постановки входящих сообщений в очередь, при определённых условиях. Эта опция отменяет их, а также опцию
“
-odqs
”. Она всегда вызывает организецию очередей.
“
-odqs
” - Эта опция гибридная, между
“
-odb
”/
“
-odi
” и
“
-odq
”. Однако, как
“
-odb
” и
“
-odi
”, эта опция не имеет эффекта, если
“
queue_only_override
” установлена в ложь, и одна из опций организации очереди, в конфигурационном файле, имеет силу.
Когда
“
-odqs
” работает, процесс доставки запускается для каждого входящего сообщения, по дефолту - в фоновом режиме, но в режиме переднего плана (foreground), тока если есть опция
“
-odi
”. Адреса получателя роутятся, и локальные доставки происходят нормальным способом. Однако, если требуются какие-либо доставки по SMTP, они не завершаюся сразу, таким образом, сообщение остаётся в очереди, пока следующий процесс обработчика очереди не найдёт его. Поскольку роутинг завершён, exim знает, какие сообщения жрут, для каких хостов, и таким образом, несколько сообщений к одному хосту могут быть посланы в одном SMTP-соединении. Конфигурационная опция
“
queue_smtp_domains
” имеет такой же эффект для специфических доменов. Смотрите также опцию
“
-qq
”.
“
-oee
” - Если обнаружена ошибка, во время получений не-SMTP-сообщения (например неправильный адрес), об ошибке сообщают отправителю, в почтовом сообщении.
Если это сообщение об ошибках успешно отправлено, получающий процесс exim выходит с кодом возврата ноль. Если нет, возвращаемый код 2, если проблема в том, что оригнальное сообщение не имеет получателей, или 1 - для любой другой ошибки. Эта опция - значение по умолчанию -
“
-oe
x
”, если exim вызывается под именем
“
rmail
”.
“
-oem
” - Это тоже самое, что и
“
-oee
”, за тем исключением, что exim всегда выходит с ненулевым кодом возврата, независимо, были ли ошибки при отправке сообщения, или нет. Эта опция - значение по умолчанию -
“
-oe
x
”, если exim вызывается не под именем
“
rmail
”.
“
-oep
” - Если обнаружена ошибка, во время получений не-SMTP-сообщения, об ошибке сообщается путём записи в стандартный файл ошибок (поток ошибок). Возвращаемый код равер единице для всех ошибок.
“
-oeq
” - Эта опция поддерживается для совместимости с sendmail, но имеет такой же эффект как и
“
-oep
”.
“
-oew
” - Эта опция поддерживается для совместимости с sendmail, но имеет такой же эффект как и
“
-oem
”.
“
-oi
” - Эта опция даёт такой же эффект, как и
“
-i
”, задавая, чтобы точка в отдельной строке не завершала входящее не-SMTP сообщение. В обратном случае, точка в отдельной строке завершает сообщение, хотя exim не производит специальной обработки для других строк, которые начинаются с точки. Эта опция установлена по дефолту, при вызове exim`a под именем
“
rmail
”. Смотрите также опцию
“
-ti
”.
“
-oitrue
” - Эта опция обрабатывается как синоним
“
-oi
”.
“
-oMa <host address>
” - Множество опций, начинающихся с
“
-oM
” могут использоваться для установки значений связанных с удалёнными хостами на локально переданных сообщениях (т.е. сообщения полученные на по TCP/IP). Эти опции могут использоваться для любым вызывающим пользователем с тестовыми опциями
“
-bh
”,
“
-be
”,
“
-bf,
”,
“
-bF
”,
“
-bt
” или
“
-bv
”. В других обстоятельствах, они игнорируются, если вызывающий не является доверенным пользователем.
Опция
“
-oMa
” устанавливает адрес хоста отправителя. Здесь может использоваться и номер порта, в конце, после точки. Например:
exim -bs -oMa
10
.
9
.
8
.
7
.
1234
|
Альтернативный синтаксис должен включать IP-адрес в квадратных скобках, сопровождаемый двоеточием и номером порта:
exim -bs -oMa [
10
.
9
.
8
.
7
]:
1234
|
IP-адрес помещается в переменную
“
$sender_host_address
”, и порт, если он есть, в
“
$sender_host_port
”.
“
-oMaa <name>
” - Смотрите выше, опцию
“
-oMa
” для общих сведений о опциях
“
-oM
”. Опция
“
-oMaa устанавливает значение переменной
“
$sender_host_authenticated
” (аутентификационное имя). Смотрите раздел 33 для подробностей о SMTP-аутентификации.
“
-oMai <string>
” - Смотрите выше, опцию
“
-oMa
” для общих сведений о опциях
“
-oM
”. Опция
“
-oMai устанавливает значение переменной
“
$authenticated_id
” (идентификатор аутентификации). Это отменяет дефолтовое значение адреса отправителя (логин вызвавшего пользователя), для сообщений из локальных источников. Смотрите раздел 33 для подробностей о идентификаторах SMTP-аутентификации.
“
-oMas <address>
” - Смотрите выше, опцию
“
-oMa
” для общих сведений о опциях
“
-oM
”. Опция
“
-oMas устанавливает значение аутентифицированного отправителя в переменную
“
$authenticated_sender
”. Эта опция перезадаёт адрес отправителя, созданный из имени входа пользователя, вызвавшего exim, для сообщений из локальных источников. Смотрите раздел 33 для подробностей о аутентифицированных SMTP-отправителях.
“
-oMi <interface address>
” - Смотрите выше, опцию
“
-oMa
” для общих сведений о опциях
“
-oM
”. Опция
“
-oMi устанавливает значение адреса IP-интерфейса. Номер порта может быть включён, с использованием синтаксиса как для
“
-oMa
”. Адрес интерфейса помещается в переменную
“
$interface_address
” и номер порта, если задан, в переменную
“
$interface_port
”.
“
-oMr <protocol name>
” - Смотрите выше, опцию
“
-oMa
” для общих сведений о опциях
“
-oM
”. Опция
“
-oMr устанавливает значение протокола по которому получено сообщение в переменную
“
$received_protocol
”. Однако, это применяется лишь когда опция
“
-bs
” не используется. Для интерактивного SMTP ввода (
“
-bs
”), протокол всегда
“local-
” сопровождаемый одним из стандартных имён протоколов SMTP (смотрите примечания о
“
$received_protocol
” в разделе 11.19). Однако, для опции
“
-bS
” (пакетный SMTP), протокол может быть установлен в опции
“
-oMr
”.
“
-oMs <host name>
” - Смотрите выше, опцию
“
-oMa
” для общих сведений о опциях
“
-oM
”. Опция
“
-oMs устанавливает значение имени хоста отправителя в переменную
“
$sender_host_name
”. Когда эта опция присутствует, exim не пытается разрешить (найти в DNS - прим. lissyara) имя хоста по IP-адресу; он использует имя данное в этой опции.
“
-oMt <ident string>
” - Смотрите выше, опцию
“
-oMa
” для общих сведений о опциях
“
-oM
”. Опция
“
-oMt устанавливает значение ident отправителя в переменную
“
$sender_ident
”. Дефолтовое значение для локальных вызовов - имя логина вызвавшего пользователя или процесса.
“
-om
” - В sendmail, эта опция означает
“меня также
” (
“me too
”), указывая что отправитель сообщения, должен получить копию сообщения, если отправитель появится в результате раскрытия альясов. Exim всегда так поступает, поэтому эта опция ничего не значит.
“
-oo
” - Эта опция игнорируется. В sendmail она задаёт
“заголовки старого стиля
” (
“old style headers
”), независмо от того, что это значит.
“
-oP <path>
” - Эта опция полезна только вместе с опцией
“
-bd
” или
“
-q
” со значением времени. Опция задаёт файл в который записывается pid даемона. Когда
“
-oX
” используется с
“
-bd
”, или когда
“
-q
” используется со временем, но без
“
-bd
”, это единственный способ заставить exim записать pid-файл, поскольку в этих случаях pid не используется.
“
-or <time>
” - Эта опция устанавливает значение таймаута для входящих не-SMTP сообщений. Если она не задана, exim будет вечно ждать на стандартном вводе. Значение также может быть установлено опцией
“
receive_timeout
”. Формат, используемый для задания времени, описан в разделе 6.15.
“
-os <time>
” - Эта опция устанавливает значение таймаута для входящих SMTP сообщений. Таймаут применяется к каждой SMTP-команде, и блоку данных. Значение также может быть установлено опцией
“
smtp_receive_timeout
”; по дефолту оно 5 минут. Формат, используемый для задания времени, описан в разделе 6.15.
“
-ov
” - Эта опция обладает точно таким же эффектом, как и
“
-v
”.
“
-oX <number or string>
” - Эта опция релевантна лишь когда используется опция
“
-bd
” (запуск слушающего даемона). Она контролирует, какие порты и интерфейсы использует даемон. Детали синтаксиса, и как она взаимодействует с конфигурационным файлом, даны в разделе 13. Когда опция
“
-oX
” используется для запуска даемона, pid-файл не пишется, если не задана опция
“
-oP
” для задания имени pid-файла.
“
-pd
” - Эта опция применяется когда встроенный интерпретатор Perl слинкован с exim`ом (смотрите раздел 12). Она перезадаёт установки опции
“
perl_at_start
”, вызывая отсрочку запуска интерпретатора, насколько это необходимо.
“
-ps
” - Эта опция применяется когда встроенный интерпретатор Perl слинкован с exim`ом (смотрите раздел 12). Она перезадаёт установки опции
“
perl_at_start
”, вызывая запуск интерпретатора при старте exim`a.
“
-p<rval>:<sval>
” - Для совместимости с sendmail эта опция эквивалентна:
Она устанавливает входящий протокол и имя хоста (для вызывающих доверенных пользователей). Имя хоста и его двоеточие могут быть опущены, лишь когда протокол не задан. Отметтьте, что exim уже имеет две закрытые опции
“
-pd
” и
“
-ps
”, ссылающиеся на строенный perl. Поэтому невозможно установить значение протокола
“p
” или
“s
” используя эту опцию (но это не кажется реальным ограничением).
“
-q
” - Использование этой опции, обычно, ограничено административными пользователями. Однако, есть конфигурационная опция, называемая
“
prod_requires_admin
”, которая может быть установлена в ложь для ослабления этого ограничения (и тоже самое требуется для опций
“
-M
”,
“
-R
” и
“
-S
”).
Опция
“
-q
” запускает один процесс обработчика очереди. Он сканирует очередь ждущих сообщений, и запускает процесс доставки для каждого сообщения, по очереди. Процесс доставки может не производить доставку, если время повтора для адреса не наступило. Используйте
“
-qf
” (смотрите ниже), если вы хотите отменить это.
Если процесс доставки порождает другие процессы, для доставки других сообщений по SMTP-соединениям, обработчик очереди ждёт пока они завершаться, пеерд продолжением работы (работы обрабочика очереди, видимо - прим. lissyara).
Когда все стоящие в очереди сообщения были просмотрены, оригинальный процесс обработчика очереди завершается. Другими словами, делается один проход по ожидающей почте, одно сообщение одновременно. Используйте время с опцией
“
-q
” (смотрите ниже), если вы хотите, чтобы просмотр происходил периодически.
Exim обрабатывает ожидающие сообщения в непредсказуемом порядке. Он не очень случаен, но, вероятно, будет разным в каждый запуск. Если одно сообщение портит (подвешивает ли, ещё ли как... - прим. lissyara) удалённый MTA, другие сообщения имеют шанс пройти, к тому же самому MTA, если они будут первыми при обработке.
Возможно произвести обработку сообщений в лексическом порядке, по идентификаторам сообщений, по существу являющимся, порядком в котором они прибыли, установив опцию
“
queue_run_in_order
”, но это не рекомендуется для нормального использования.
“
-q<qflags>
” - Опция
“
-q
” может сопровождаться одним или несколькими флагами, изменяющими её поведение. Все они являются опциональными, но если присутствует более чем один, они должны появляться в правильном порядке. Каждый флаг описан отдельным пунктом, ниже.
“
-qq...
” - Опция начинающаяся с
“
-qq
” запрашивает двухступенчатое выполнение очереди. На првой стадии, сканируется очередь, как будто опция
“
queue_smtp_domains
” совпадает с каждым доменом. Адреса роутятся, происходят локальные доставки, но удалённые транспорты не запускаются.
База данных совпадений, в которой хранится какие сообщения ждут специфических удалённых хостов, обновляется, как будто доставка на те хосты задержана. После завершения этого, происходит нормальное сканирование очереди, с нормальной маршрутизацией и доставкой. Сообщения которые роутятся на один и тот же хост, в основном, идут через одно SMTP-соединенеие, из-за данных БД совпадений, которые были установлены при первом сканировании очереди. Эта опция может быть полезной для хостов, которые подключаются к интернету периодически.
“
-q[q]i...
” - Если флаг
“
i
” присутствует, обработчик очереди запускает процессы доставки только для тех сообщений, которые до этого не были проверены (видимо, имеется ввиду, что не было попыток их доставки - прим. lissyara). (
“
i
” - значит
“initial delivery
”.) Это может быть полезным, если вы помещаете сообщения в очередь, используя
“
-odq
”, и хотите, чтобы обработчик очереди обработал именно новые сообщения.
“
-q[q]f...
” - Если присутствует один флаг
“[i]f
”, попытка доставкивызывается для каждого незамороженного сообщения, тогда как без
“
f
” пробуются лишь те незамороженные адреса, у которых прошлов ремя повтора.
“
-q[q]ff...
” - Если флаг
“[i]ff
” присутствует, попытка доставки осуществляется для каждого сообщения, независимо от того, заморожено оно или нет.
“
-q[q][f[f]]l
” - Флаг
“[i]l
” (строчная буква
“
L
”) определяет, что нужно делать только локальные доставки. Если сообщению требуются удалённые доставки, оно остаётся в очереди, для более поздней доставки.
“
-q<qflags> <start id> <end id>
” - Когда сканируется очередь, exim может пропустить сообщения, идентификаторы которых лексически меньше чем значение стартового идентификатора сообщения, следующего за опцией
“
-q
”. Например:
exim -q 0t5C6f-0000c8-
00
|
Сообщения, полученные ранее чем 0t5C6f-0000c8-00 не просматриваются. Если дан второй идентификатор сообщения, сообщения, идентификатор которых лексически больше него, также пропускаются. Если один и тотже идентификатор задан дважды, например:
exim -q 0t5C6f-0000c8-
00
0t5C6f-0000c8-
00
|
то процесс доставки запускается только для него. Это отличается от
“
-M
”, в том, что учитываются данные повторов, и также отличается от
“
-Mc
” в том, что в обработчике очереди, это засчитывается как доставка. Обратите внимание, что механизм выбора не затрагивает порядок, к котором сообщения сканируются. Есть и другие способы выбрать специфичные наборы для доставки в обработчике очереди - смотрите опции
“
-R
” и
“
-S
”.
“
-q<qflags><time>
” - Когда присутствует значение времени, опция
“
-q
” заставляет exim работать как даемон, запуская обработчик очереди с заданными интервалами времени (чей формат описан в разделе 6.15). Эта форма опции
“
-q
”, обычно, комбинируется с опцией
“
-bd
”, когда один процесс даемона обрабатывает обе функции. Общий способ запуска комбинированного даемона, при загрузке системы, заключается в использовании команды типа:
/usr/exim/bin/exim -bd -q30m
|
Такой даемон слушает входящие SMTP вызовы, а также запускает процесс обработчика очереди каждые 30 минут.
Когда даемон запускается с
“
-q
” и с параметром времени, но без
“
-bd
”, pid-файл не записывается, если явно не указана опция
“
-oP
”.
“
-qR<rsflags> <string>
” - Эта опция синоним с
“
-R
”. Она предусмотрена для совместимости с sendmail.
“
-qS<rsflags> <string>
” - Эта опция синоним
“
-S
”.
“
-R<rsflags> <string>
” -
“
<rsflags>
” может быть пустым, в случае когда пустое местодо строки опционально, если строка не
“
f
”,
“
ff
”,
“
r
”,
“
rf
” или
“
rff
”, которые являются возможными значениями для
“
<rsflags>
”. Пробел требуется, если
“
<rsflags>
” не пустое.
Эта опция похожа на
“
-q
”, без значения времени, т.е. она заставляет exim выполнить один запуск обработки очереди, за исключением того, что, сканируя сообщения в очереди, exim обрабатывает только те, которые имеют хотябы один недоставленный адрес получателя, содержащий данную строку, проверенную регистронезависимым способом. Если
“
<rsflags>
” начинается с
“
r
”,
“
<string>
” интерпретируется как регулярное выражение; иначе - это литеральная строка.
Когда сообщение выбрано, обрабатываются все его адреса. Для первого выбранного сообщения, exim пререзадаёт любую информацию повторов и вызывает попытку доставки для каждого недоставленного адреса. Это означает, что если доставка какого-либо адреса в первом сообщении успешна, любая существующая информация повторов удаляется, и таким образом попытки доставки для этого адреса во впоследствии выбранных сообщениях (которые обрабатываются без форсирования), будут запущены. Однако, если доставка любого адреса неуспешна, информация повторов обновляется, и во впоследствии выбранных сообщениях неудачные адреса будут пропущены.
Если
“
<rsflags>
” содержит
“
f
” или
“
ff
”, принудительная доставка применяется ко всем выбранным сообщениям, не только к первому; замороженные сообщения включаются, когда присутсвует
“
ff
”.
Опция
“
-R
”, напрямую создаёт инициализацию доставки всех сообщений для данного домена, после того как хост был недоступен некоторое время. Когда SMTP команда ERTN принимается её ACL (смотрите раздел 39), её дефолтовый эффект - запуск exim`a с опцией
“
-R
”, но это может быть изменено для запуска произвольной команды вместо неё.
“
-r
” - Это документированная (для sendmail`a), устаревшее альтернативное имя для
“
-f
”.
“
-S<rsflags> <string>
” - Эта опция работает как
“
-R
”, за исключением того, что, она проверяет строку каждого отправителя сообщения, вместо получателя. Если, также задана опция
“
-R
”, оба условия должны выполняться для каждого выбранного сообщения. Если опции имеют флаги
“
f
” или
“
ff
”, предпринимаются ассоциированные с ними действия.
“
-Tqt <times>
” - Эта опция исключительно для набора тестирования exim`a. Она не распознаётся, когда exim запущен нормально. Она позволяет установку
“времён очереди
” (
“queue times
”), таким образом могут быть протестированы различные возможности предупреждений/повторов.
“
-t
” - Когда exim получает созанное локально, не-SMTP сообщение, на стандартный ввод, опция
“
-t
” заставляет получателей сообщения получить строки заголовков
“
To:
”,
“
Cc:
” и
“
Bcc:
” из сообщения, ане из аргументов команды. Адреса извлекаются до любых перезаписей адресов, и в случае наличия строки
“
Bcc:
”, она удаляется.
Если у команды заданы каки-либо параметры, они задают адреса которым сообщение не будет доставлено. Таким образом, аршументы адресов удаляются из списка получателей, полученного из заголовков. Это совместимо со Smail 3 и соответствует документированному поведению некоторых версий sendmail, как описано в man-страницах ряда операционных систем (например Solaris 8, IRIX 6.5, HP-UX 11). Однако, некоторые версии sendmail добавляют аргументы адресов к полученным из заголовков, и книга O'Reilly
“Sendmail
” документирует этот способ.
Если есть любой заголовок
“
Resent-
” в сообщении, exim извлекает получателей из всех заголовков
“
Resent-To:
”,
“
Resent-Cc:
” и
“
Resent-Bcc:
”, вместо
“
To:
”,
“
Cc:
” и
“
Bcc:
”. Эта опция для совместимости с sendmail и другими MTA. (До релиза 4.20, exim содержал ошибку, если опция
“
-t
” использовалась вместе со строкой заголовка
“
Resent-
”.)
RFC 2822 говорит о разных
“
Resent-
” строках заголовков (для случая ,когда сообщение перевысылалось несколько раз). RFC, также, определяет, что они должны быть добавлены в начале сообщения, и разделены строками
“
Received:
”. Непонятно, как опция
“
-t
” должна работать в случае многих наборов (
“sets
”), и вообще неясно что подразумевается под
“набором
” (
“set
”). Практически, кажется что MUA не следуют RFC. Строки
“
Resent-
” часто добавляются в конце заголовка, и если сообщение послано более одного раза, часто оригинальный набор заголовков
“
Resent-
” переименовывается в
“
X-Resent-
”? когда добавляется новый набор. Это удаляет любую возможную двусмысленность.
“
-ti
” - Эта опция в точности эквивалентна
“
-t
” и
“
-i
”. Она предоставлена для совместимости с sendmail.
“
-tls-on-connect
” - Эта опция доступна, когда exim скомпилен с поддержкой TLS. Она вынуждает все входящие SMTP подключения вести себя, как будто входящий порт перечислен в опции
“
tls_on_connect_ports
”. Смотрите секцию 13.14 и 38 для дальнейших деталей.
“
-U
” - Sendmail использует эту опцию для
“начальной подачи сообщения
” (
“initial message submission
”), и его документация заявляет, что в будущих релизах, он может жаловаться на синтаксически неправильные сообщения, вместо исправления их (я, так думаю, что исправления - тут использовалось слово fixing - прим. lissyara), когда этот флаг не установлен. Exim игнорирует эту опцию.
“
-v
” - Эта опция заставляет exim писать информацию в стандартный поток ошибок, описывая что он делает. В частности, он показывает строки логов для приёма и доставки сообщений, и если произведено SMTP-подключение, показывается диалог SMTP. Некоторые показанные строки логов могут быть не записаны в лог, если установка
“
log_selector
” отменяет их. Любые релевантные селекторы показываются с каждой строкой логов. Если не показыватся ни одна, логгинг безусловен.
“
-x
” - AIX использует
“
-x
” в закрытых целях (
“почта от локальной почтовой программы имеет расширенные символы National Language Support, в теле почтового сообщения
”). Это устанавливается опцией
“
-x
” при вызове MTA программой
“
mail
”. Exim игнорирует эту опцию.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
6. Конфигурационный файл exim во время выполнения
Во время выполнения, exim использует один конфигурационный файл (
“run time configuration file
”), читаемый каждый раз при выполнении двоичного файла exim`a. Обратите внимание, что в нормальных условиях, это происходит часто, поскольку exim спроектирован для работы распределённым способом, без центрального контроля.
Если при чтении конфигурационного файла обнаруживается синтаксическая ошибка, exim записывает сообщение на стандартный поток ошибок, и выходит с ненулевым кодом возврата. Также записывается сообщение в лог паники. Примечание: В это время могут быть детектированы лишь простые синтаксические ошибки. Значения любых раскрываемых опций не проверяются, пока не произойдёт раскрытие, даже когда раскрытие не изменяет строку.
Имя файла рабочей конфигурации (
“run time configuration file
”) вкомпилено в бинарник по соображениям безопасности, и указывается компиляционной опцией
“CONFIGURE_FILE
”. В большинстве конфигураций, она задаёт единственный файл. Однако, разрешается задать список имён файлов, разделённых двоеточиями, в этом случае exim использует первый существующий файл из списка.
Файл рабочей конфигурации должен принадлежать пользователю root, или пользователю, заданному во время компиляции опцией
“CONFIGURE_OWNER
” (если установлено). Конфигурационный файл не должен быть читаемым для всех или для группы, исключая группу указанную при компиляции в опции
“EXIM_GROUP
” или в опции
“CONFIGURE_GROUP
”.
Предупреждение: В обычной конфигурации, где бинарный файл exim`a - setuid root`a, любой кто имеет право редактировать файл рабочей конфигурации, обладает простым способом запускать команды от root`a. Если вы делаете ваших почтовых администраторов членами группы exim, но не доверяете им права root, убедитесь, что рабочая конфигурация не доступна на запись группе.
Дефолтовый конфигурационный файл, который будет корректно работать в простых ситуациях, предоставлен в файле
“
src/configure.default
”. Eсли опция
“CONFIGURE_FILE
” задаёт лишь одно имя файла, инсталляционный процесс копирует дефолтовый конфигурационный файл в новый файл, если он не существовал (т.е. существующий файл не будет перезаписан - прим. lissyara). Если
“CONFIGURE_FILE
” - список, он не инсталлируется автоматически. Раздел 7 - обсуждение
“сквозного контроля
” заданной по дефолту конфигурации.
6.1 Использование иного конфигурационного файла
Одноразовая альтернативная конфигурация может быть задана использованием опции
“
-C
” командной строки, которая может задать единственный файл, или список файлов. Однако, когда используется опция
“
-C
”, exim отменяет свои root`овые привилегии, за исключением запуска его root`ом или пользователем exim`a (или, если параметр для
“
-C
” идентичен со встроенным значением из
“CONFIGURE_FILE
”). Опция
“
-C
”, главным образом, полезна для проверки синтаксиса конфигурационного файла до его инсталляции. Проверки владельца и группы, для конфигурационного файла заданного опцией
“
-C
”, не проводятся.
Привелигированное использование опции
“
-C
” пользователем exim`a может быть заблокировано установкой
“ALT_CONFIG_ROOT_ONLY
” в
“
Local/Makefile
”, при сборке exim`a. Однако, если вы это сделаете, вы также заблокируете возможность тестирования конфигурационного файла с использованием опции
“
-C
”, на приём сообщений и доставку, даже если exim будет вызван от пользователя root. Приём работает, но к тому времени exim работает от своего пользователя, таким образом когда он перезапускает себя для возвращения root`овых привилегий, для доставки, использование опции
“
-C
” заставляет его потерять права доступа. Однако root может тестировать приём и доставку, используя две разные команды (одна для помещения сообщения в очередь -
“
-odq
”, и другая для доставки -
“
-M
”).
Если
“ALT_CONFIG_PREFIX
” задан в
“
Local/Makefile
”, он определяет строку префикса, с которой должен начинаться любой файл в опции командной строки
“
-C
”. Кроме того, имя файла не должно содержать последовательность
“/../
”. Нет дефолтовой настройки для
“ALT_CONFIG_PREFIX
”; когда он незадан, любое имя файла может использоваться с опцией
“
-C
”.
Одноразовые изменения конфигурации могут быть заданы опцией командной строки
“
-D
”, определяющей и отменяющей значения для макросов используемых в конфигурационном файле. Однако, как и
“
-C
”, использование этой опции непривелигированными пользователями вынуждает exim отменить свои root`овые права. Если в
“
Local/Makefile
” задана опция
“
DISABLE_D_OPTION
”, использование опции
“
-D
” полностью отключено, и попытка её использования вызывает немедленный выход с ошибкой.
Некотрые серверы могут использовать один и тот же бинарник exim`a на различных машинах с совместно используемой файловой системой, но используя разные конфигурационные файлы на кадой машине. Если в
“
Local/Makefile
” задана опция
“
CONFIGURE_FILE_USE_NODE
”, exim вначале ищет конфигурационный файл с именем конфигурационного файла, сопровождаемого точкой и именем узла машины, полученным из функции
“
uname()
”. Если файл не существует, используется стандартное имя. Эта обработка происходит для каждого имени файла из списка заданного
“CONFIGURE_FILE
” или
“
-C
”.
В некотрых тайных(?) ситуациях различные версии exim`a могут быть запущены под разными эффективными uid и определена опция
“CONFIGURE_FILE_USE_EUID
” чтобы помочь с этому. Смотрите комментарии в
“
src/EDITME
” для деталей.
6.2 Формат конфигурационного файла
Файл конфигурации exim`a разделён на множество частей. Общие параметры настройки должны всегда быть в начале файла. Другие части являются опциональными и могут фигурировать в любом порядке. Каждая часть, кроме первой, вводится словом начинающимся с
“begin
”, сопровождаемым именем части. Опциональные части:
“
ACL
”: Списки контроля доступа для контроля входящей SMTP почты.
“
authenticators
”: Конфигурационые настройки для драйверов аутентифкации. Они связаны с командой SMTP AUTH (смотрите раздел 33).
“
routers
”: Конфигурационные настройки для драйверов роутеров. Маршрутизаторы обрабатывают адреса и определяют как сообщение необходимо доставлять.
“
transports
”: Конфигурационные настройки для драйверов транспортов. Транспорты задают механизмы для копирования сообщения в места назначения.
“
retry
”: Правила повторов, для использования когда сообщение не может быть доставлено немедленно.
“
rewrite
”: Правила глобальной перезаписи адресов, для использования когда сообщение приходит и когда новые адреса сгенерированы во время доставки.
“
local_scan
”: Частная опция для функции
“
local_scan()
”. Если вы хотите использовать эту возможность, вы должны задать
LOCAL_SCAN_HAS_OPTIONS=yes
|
в
“
Local/Makefile
” до сборки exim. Полные данные о средстве
“
local_scan()
” даны в разделе 41.
Начальные и замыкающие пробелы в строках конфигурации всегда игнорируются.
Пустые строки в файле, и строки начинающиеся с символа
“#
” (игнорируя начальное пустое пространство) обрабатываются как комментарии и игнорируются. Примечание: Символ
“#
” кроме как в начале строки не обрабатывается специальным образом, и не является комментарием.
Любая строка не являющаяся комментарием может быть продолжена, если её завершить символом обратного слэша (
“\
”). Обратите внимание, что общее правило, для пустого пространства, означает, что появление пробелов после обратного слэша и начальных пробелов в начале строк продолжения игнорируется. Строки комментариев, начинающиеся с
“#
” (но не пустые строки), могут появиться в середине последовательности строк продолжения.
Удобный способ создания конфигурационного файла заключается в том, чтобы начать с дефолтового, представленного в
“
src/configure.default
”, и добавлять, удалять или изменять настройки как требуется.
ACL`ы, правила повторов, и правила перезаписи имеют их собственный синтаксис, который описан в разделах 39, 32 и 31 соответственно. Другие части конфигурационного файла имеют некоторые общие синтаксические пункты, и они описаны ниже, от раздела 6.10 и далее. До этого описаны средства включения, макрокоманд и условий средств.
6.3 Включения файлов в конфигурационый файл
Вы можете включать другие файлы внутри файла рабочей конфигурации exim`a, используя этот синтаксис:
.include <file name>
.include_if_exists <file name>
|
в отдельных строках. Двойные кавычки вокруг имени файла - опциональны. Если вы используете первую форму, если файл не существуе, происходит ошибка конфигурации; вторая форма, ничего не делает, в случае несуществующих файлов. Во всех случаях, требуются абсолютные имена.
Включенный файл может быть на любой глубине вложенности, но помните, что exim часто читает конфигурационый файл, поэтому хорошей идеей будет хранить их на минимальной глубине. Если вы меняете содержимое инклюженного файла, вы должны дать даемону сигнал HUP, поскольку заинклюженный файл в момент чтения конфигурации в режиме доступа - только на чтение.
Обработка включений происходит рано, на физическом уровне строки, таким образом, как и строки комментариев, включения могут использоваться в середине параметра настройки, например:
hosts_lookup = a.b.c \
.include /some/file
|
Процесс включения присходит после обработки макрокоманд (смотрите ниже). Этот эффект обрабатывает включенные строки так, как будто они находятся в месте, где произошло включение.
6.4 Макросы в конфигурационном файле
Если строка, в основной части конфигурации (т.е. до первой строки
“begin
”), начинается с символа верхнего регистра, она берётся как макроопределение, и должна иметь форму:
<name> = <rest of line><name> = <rest of line>
|
Имя должно состоять из букв, цифр и символов подчёркивания, и нет необходимости, чтобы все они были в верхнем регистре, хотя это рекомендуется. Оставшаяся часть строки, включая любое продолжение, является текстом замены, и из неё удаляется начальное и завершающее пустое пространство. Кавычки не удаляются. Текст замены не может завершаться символом обратного слэша, но это несерьёзное ограничение.
Макрос, также может быть задан между роутером и транспортом, аутентификатором, или определением ACL. Однако, они не могут быть определены внутри определённых драйверов или ACL, или в
“
local_scan
”, или секции повторов конфигурации.
6.5 Макроподстановка
Как только макрос определён, все последующие строки файла (и любых заинклюженных файлов) сканируются на предмет имени макроса; если есть несколько макросов, строки сканируются по очереди их опредления, для каждого макроса. Текст замены не сканируется повторно, для текущей макрокоманды, хотя он сканируется для впоследствии заданных макросов. Поэтому, имена макрокоманд, не могут содержать, как подстроку, имя ранее заданного макроса. Например, вы могли бы задать
ABCD_XYZ = <something>
ABCD = <something else>
|
но помещение объявлений в обратном порядке, вызвало бы конфигурационную ошибку. Раскрытие макросов применяется к индивидуальным физическим строкам файла, до проверки продолжения строки или включений (смотрите выше). Если строка состоит лишь из имени макроса, и расткрытие макроса пустое, строка игнорируется. Макрос, в начале строки, может превратить строку в строку комментария, или в строку
“.include
”.
6.6 Переопределение макроса
После определения, значение макроса может быть переопределно позднее, в кофигурации (или в заинклюженом файле). Переопределение задаётся использованием
“==
” вместо
“=
”. Например:
MAC = initial value
...
MAC == updated value
|
Переопределение не меняет порядок в котором макрос применяется к последующим строкам конфигурации. Порядок остаётся тем же самым, в котором макросы были изначально заданы. Всё, что изменяется, - значение макроса. Переопределение позволяет накапливать значения. Например:
MAC = initial value
...
MAC == MAC and something added
|
Это может быть полезным в ситуации, когда конфигурационный файл собирается из множества других файлов.
6.7 Отмена значения макроса
Набор значений для макроса, в конфигурационном файле, может быть отменён опцией
“
-D
” командной строки, но при её использовании, exim снимает свои root`овые права, если он вызван не root`ом или пользователем exim`a. Задание опции
“
-D
”, в командной строке, заставляет игнорироваться все определения и переопределения в пределах файла.
6.8 Пример использования макроса
Как пример макроса, рассмотрим конфигурацию, где альясы ищутся в ДБ MySQL. Это помогает оставить файл менее беспорядочным, если длинные строки, например SQL-запросы, определны отдельно, как макрос, например:
ALIAS_QUERY = select mailbox from user where \
login=${quote_mysql:$local_part};
|
Тогда это может использоваться в роутере
“
redirect
”, устанавливаемом примерно так:
data = ${lookup mysql{ALIAS_QUERY}}
|
В более ранних версиях exim, макрос, иногда, использовался для списков доменов, хостов, или адресов. В exim v4 они лучше обрабатываются именованными списками - смотрите раздел 10.5.
6.9 Условные пропуски в конфигурационном файле
Вы можете использовать директивы
“.ifdef
”,
“.ifndef
”,
“.elifdef
”,
“.elifndef
”,
“.else
” и
“.endif
” для динамического включения или исключения частей конфигурационного файла. Обработка происходит каждый раз, когда файл читается (т.е. когда запускается бинарник exim).
Реализация очень проста. Примеры четырёх первых директив должны сопровождаться текстом, включающим имена одного и более макросов. Условие проверяется, действительно ли происходила подстановка макроса в строке. Таким образом:
.ifdef AAA
message_size_limit = 50M
.else
message_size_limit = 100M
.endif
|
устанавливает ограничение размера сообщения в 50mb, если задан макрос
“AAA
”, и 100mb в ином случае. Если задано более одного имени макроса в строке, условие истинно, если задано любое из них. Таким образом, это условие
“or
” (
“или
”). Чтобы получить условие
“and
”, вам необходимо использовать вложенное
“.ifdefs
”.
Хотя вы можете использовать макрораскрытие для создания одной из этих директив, это не очень полезно, поскольку условие
“в этой строке была макроподстановка
” (
“there was a macro substitution in this line
”) будет всегда истинным.
Текст следующий за
“.else
” и
“.endif
” игнорируется, и может использоваться как комментарий, чтобы сделать пояснения к сложным вложениям.
6.10 Общий синтаксис опции
Для основного набора опций, опций драйвера и опции
“
local_scan()
”, каждая настройка находится на отдельной строке, и начинается с имени, состоящего из символов в нижнем регистре, и символов подчёркивания. Многие опции требуют значение с данными, и в этом случае, имя должно сопровождаться символом равно (
“=
”), с опциональными пробелами, и затем значение. Например:
qualify_domain = mydomain.example.com
|
Некоторые параметры настройки могут содержать уязвимые данные, например, пароль для доступа к базам данных. Для недопущения прочтения этих значений неадминистративными пользователями, используя опцию командной строки
“
-bP
”, вы можете предварять их словом
“hide
” (
“скрыть
”). Например:
hide mysql_servers = localhost/users/admin/secret-password
|
Для неадминистративных пользователей, такие опции отображаются как в примере:
mysql_servers = <value not displayable>
|
Если
“hide
” используется в опции драйвера, оно скрывает значение этой опции во всех проявлениях этого драйвера.
Следующие разделы описывают синтаксис используемый для различных типов данных, находящихся в параметрах настроек.
6.11 Булевы опции
Опции, тип которых даётся как булева переменная (логическая переменная - прим. lissyara) - переключатели on/off. Возможны два способа определить такие опции: с и без значением данных. Если имя опции указано само по себе, без данных, - это значит
“on
”; если ему предшествует
“no_
” или
“not_
” - это значит
“off
”. Однако, булевы опции могут быть сопровождены символом равно
“=
”, и одним из слов
“true
”,
“false
”,
“yes
”, или
“no
”, как альтернативный синтаксис. Например, следующие два параметра настройки, будут иметь одинаковый эффект:
queue_only
queue_only = true
|
Следующие две строки, также, имеют одинаковый (обратный) эффект:
no_queue_only
queue_only = false
|
Вы можете использовать тот синтаксис, который предпочитаете.
6.12 Целочисленные значения
Если целочисленные элемент данных начинается с символов
“0x
”, оставшаяся его часть интепретируется как шестнадцатеричное число. Иначе, он обрабатывается как восьмеричный, если начинается с цифры
“0
”, и десятичное - в остальных случаях. Если целочисленное значение сопровождается символом
“K
”, оно умножается на 1024; если оно сопровождается символом
“M
”, оно умножается на 1024x1024.
Когда выводятся значения целочисленных опций, значения, явялющиеся точным множителем 1024 или 1024x1024, иногда, но не всегда, печатаются с использованием символов
“K
” и
“M
”. Стиль печати независим от использовавшегося, фактического, входного формата.
6.13 Целочисленные восьмеричные значения
Значение опции, указанной как восьмеричное целое число, всегда интерпретируется в восьмеричном виде, незавсисмо, начинается оно или нет, с цифры ноль. Такие опции всегда выводятся в восьмеричном виде.
6.14 Числовые значения с фиксированной точкой
Число с фиксированной точкой состоит из десятичного целого, опционально сопровождаемого десятичной точкой и до трёх дальнейших цифр.
6.15 Значения временных интервалов
Интервал времени указывается как последовательность чисел, каждое сопровождаемое буквой, без пробелов:
буква
|
значение
|
s
|
секунды
|
м
|
минуты
|
h
|
часы
|
d
|
дни
|
w
|
недели
|
|
Например,
“3h50m
” задаёт 3 часа и 50 минут. Значения временных интервалов выводятся в таком же формате. Exim не ограничивает значения; он допускает, например, указать
“90m
” вместо
“1h30m
”.
6.16 Строковые значения
Если строковые элементы данных не начинаются с символа двойной кавычки, он берётся как состоящий из остатка строки, плюс любые строки продолжения, начинающиеся с первого символа после любых начальных пробелов, с удалением пробелов в конце, и без интерпретации символов в строке. Поскольку exim удаляет строки комментариев (т.е. начинающиеся с
“#
”) на ранней стадии, они могут появляться в середине многостроковых строк. Поэтому следующие настройки эквивалентны:
trusted_users = uucp:mail
trusted_users = uucp:\
# This comment line is ignored
mail
|
Если строка начинается с символа двойной кавычки, она должна завершаться заключительной двойной кавычкой, и любые символы обратного слэша, кроме как используемые для продолжения строки, интерпретируются как специальные символы (escape-последовательность), следующим образом:
последовательность
|
значение
|
\\
|
одиночный обратный слэш
|
\n
|
символ новой строки
|
\r
|
символ возврата каретки
|
\t
|
символ табуляции (TAB)
|
\<octal digits>
|
до трёх восьмеричных цифр определяющих один символ
|
\x<hex digits>
|
до двух шестнадцатеричных цифр определяющих один символ
|
|
Если обратные слэш сопровождается какими-то другими символами, включая двойные кавычки, этот символ заменяет пару (пару обратный слэш и символ - прим. lissyara).
Квотирование (помещение в двойные кавычки - прим. lissyara) необходимо лишь если вы хотите использовать escape-последовательности для вставки специальных символов, или необходимо определить значение с начальными и конечными пробелами. Эти случаи редки, таким образом использование двойных кавычек почти не необходимо в текущих версиях exim`a. В версиях exim до 3.14, двойные кавычки требовались для продолжения строки, таким образом, вы можете натолкнуться на старые конфигурационные файлы, и примеры, в которых применяется излишнее использование двойных кавычек.
6.17 Раскрытие строк
Некоторые строки в конфигурационном файле подвергаются
“
раскрытию строки
” (
“
string expansion
”), при помощи которого различные части строки могут быть заменены, по обстановке (смотрите раздел 11). Входной синтаксис для таких строк лишь описан; в частности, обработка обратных слэшей внутри квотированных (находящихся внутри двойных кавычек - прим. lissyara) строк производится как часть входного процесса, до того как имеет место раскрытие. Однако, обратный слэш - также символ экранировки для раскрытия, таким образом, любые требуемые обратные слэши должны быть удвоены, если они в пределах конфигурационной строки в кавычках.
6.18 Имена пользователей и групп
Имена пользователей и групп задаются как строки, с использованием синтаксиса описанного выше, но строки интерпретируются специальным образом. Имя пользователя или группы должно состоять полностью из цифр, или именем, которое может быть найденно функциями
“
getpwnam()
” или
“
getgrnam()
” соответственно.
6.19 Построение списков
Данные для некоторых конфигурационных опций - список элементов, с двоеточием в качестве дефолтового разделителя. Многие из этих опций опказываются типом
“список строк
” (
“string list
”) в описаниях, позже, в этом документе.Другие перечислены как
“domain list
”,
“host list
”,
“address list
”, или
“local part list
”. Синтаксически, они все одинаковы; однако, все, кроме
“string list
”, являются объектами для интепретации, как описанов разделе 10.
Во всех случаях, весь список обрабатывается как единая длинная строка, как того требует синтакис. Пример - установка опции
“
trusted_users
”, выше, в секции 6.16. Если реально необходимо использовать двоеточие как элемент в списке, оно должно быть введено как два двоеточия. Начальные и конечные пробелы, в каждом элементе списка, игнорируются. Это позволяет включать элементы начинающиеся с двоеточия, в частности, определённые формы адресов IPv6. Например, список:
local_interfaces =
127
.
0
.
0
.
1
: ::::
1
|
содержит два IP адреса, адрес IPv4
“127.0.0.1
” и адрес IPv6
“::1
”.
Примечание: Насмотря на то, что начальные и конечные пробелы игнорируются в списке индивидуальных элементов, они не игнорируются при парсинге списка. Пробел после первого двоеточия, в примере выше, необходим. Если бы его там не было, то список интепретировался бы как два элемента
“127.0.0.1::
” и
“1
”.
Удвоение двоеточий в адресах IPv6 - неприятная рутинная операция, таким образом был предоставлен механизм позволяющий изменить разделитель списка. Если список начинается с левой угловой скобки, сопровождаемой каким-либо символом пунктуации, этот символ используется, вместо двоеточия, как разделитель элементов списка. Для примера, список выше, может быть переписан с сипользованием точки с запятой в качестве разделителя:
local_interfaces = <;
127
.
0
.
0
.
1
; ::
1
|
Это средство применяется ко всем спискам, за исключением списка в
“
log_file_path
”. Рекомендуется, использовать иные символы, кроме двоеточия, было ограничено обстоятельствами, где они реально необходимы.
6.20 Пустые элементы в списках
Пустые элементы в конце списков всегда игнорируются. Другими словами, конечный симавол разделителя игнорируется. Таким образом, список в
содержит лишь один элемент. Если вы хотите включить пустую строку в качестве одного из элементов списка, она не должна быть последним элементом списка. Например, этот список содержит три элемента, второй из которых пустой:
senders = user1@domain : : user2@domain
|
Примечание: Должно быть пустое пространство, между этими двумя двоеточиями, иначе они будут интерпретированы как один символ двоеточия (и тогда список содержал бы лишь один элемент). Если вы хотите задать список, содержащий лишь один пустой элемент, вы можете сделать это, как в этом примере:
В этом случае, первый элемент пуст, и второй игнорируется, поскольку он в конце списка.
6.21 Формат конфигурации драйвера
Есть отдельные части в конфигурации, для определения роутеров, транспортов и аутентификаторов. В каждой части, вы определяете множество примеров драйверов, каждый с его собственным набором опций. Каждый пример драйвера задаётся последовательностью строк, такого типа:
<instance name>:
<option>
...
<option>
|
В следующем примере, имя образца -
“
localuser
”, и он сопровождается тремя опциями:
localuser:
driver = accept
check_local_user
transport = local_delivery
|
Для каждого образца драйвера, вы определяете, какой модуль кода exim он использует - путём установки опции
“
driver
”, и, опционально, некотрые параметры крнфигурации. Например, в случае транспортов, если вы хотите чтобы транспорт доставля по SMTP, вы бы использовали драйвер
“
smtp
”; если вы хотите доставлять в локальный файл, вы бы использовали драйвер
“
appendfile
”. Каждый из драйверов подробно описан в его собственной главе, позже, в этом руководстве.
Вы можете иметь несколько роутеров, транспортов или аутентификаторов которые основаны на одном и том же основном драйвере (каждый должен иметь своё имя).
Порядок, в котором определены роутеры, важен, потому что адреса передаются на индивидуальные маршрутизаторы по одному, по порядку. Порядок в котором заданы транспорты, не имеет значения. Порядок в котором определены аутентификаторы, используется только когда exim, как клиент, ищет их, чтобы найти тот, который соответствует предлагаемому сервером механизму аутентификации.
В пределах определения образца драйвера, есть два вида опций:
“
универсальный
” (
“
generic
”) и
“
частный
” (
“
private
”). Общие опции - те, которые применяются ко всем драйверам, одного типа (т.е. все роутеры, все транспорты, или все аутентификаторы). Опция
“
driver
” - общая опция, которая должна появляться в каждом определении. Частные опции являются специальными для каждого драйвера, и ни одна не должна появляться, поскольку все они имеют значения по умолчанию.
Опции могут появляться в любом порядке, за исключением, что опция
“
driver
” должна предшествовать частным опциям, поскольку они завсимы от неё. Поэтому, рекомендуется, чтобы опция
“
driver
” всегда была первой.
Имена экземпляров драйверов, которые используются для ссылок в логах, и других местах, могут быть любой последовательностью букв, цифр, и подчёркиваний (начинающихся с буквы), и должны быть уникальными среди драйверов того же типа. Роутер и транспорт (для примера), могут иметь одинаковое имя, но никакие два маршрутизатора не могут быть с одим именем. Имя экземпляра драйвера не должно быть перепутано с именем базового модуля драйвера. Например, конфигурационные строки:
remote_smtp:
driver = smtp
|
создают экземпляр драйвера транспорта
“
smtp
”, имя которого
“
remote_smtp
”. Тот же самый код драфвера может использоваться более одного раза, с различными именами экземпляров и различными параметрами настроек, в каждом случае. Второй экземпляр транспорта
“
smtp
”, с другиими опциями, может быть задан таким образом:
special_smtp:
driver = smtp
port =
1234
command_timeout = 10s
|
Имена
“
remote_smtp
” и
“
special_smtp
” использовались бы для ссылки на эти экземпляры транспорта из маршрутизаторов, и эти имена фигурировали бы в строках логов.
Строки комментаривев могут присутствовать в середине спецификации драйвера. Полный список опций настройки для любого частного драйвера, включая все дефолтовые значения, может быть создан, используя опцию командной строки
“
-bP
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
7. Дефолтовый конфигурационный файл.
Дефолтовый конфигурационный файл, поставляемый с exim`ом как
“src/configure.default
”, достаточен для хоста, не имеющему особых требований к почтовой системе. В качестве вводной главы, в конфигурировании exim`а, этот раздел представляет собой
“путь через значения по-умолчанию
”, давая краткие пояснения параметров настройки. Детальные описания опций, даются в последующих главах. Дефолтовый конфигурационный файл содержит много комментариев о том, как изменить умолчальные значения. Однако, необходимо отметить, что имеется множество опций, которые вообще не упомянуты в дефолтовой конфигурации.
7.1 Главные конфигурационные настройки
Главные (глобальные) конфигурационные опции должны быть в начале файла. Первое, что необходимо установить, после вводных комментариев, это строка:
Это - закомментрованная установка опции
“primary_hostname
”. Exim должен знать официальное, полное имя вашего хоста, и тут можно его задать. Однако, в большинстве случаев, вам не нужно устанавливать эту опцию. Когда она не задана, exim использует системную функцию
“
uname()
”, для получения имени хоста.
Первые три раскомментированные линии таковы:
domainlist local_domains = @
domainlist relay_to_domains =
hostlist relay_from_hosts =
127
.
0
.
0
.
1
|
Фактически, они не параметры настройки. Это определения двух именованых списков доменов, и одногоименованого списка хостов. Exim позволяет давать имена спискам доменов, хостов и e-mail адресов для облегчения управления конфигурационным файлом (смотрите секцию 10.5).
Первая строка задаёт список доменов, называемый
“
local_domains
”; он используется позже, в конфигурации, для определения доменов которые нужно доставлять на локальный хост.
Tут, в этом списке, только одно значение, строка
“@
”. Это специальная форма, вхождение которой означает имя локального хоста. Таким образом, если локалхост называется
“
a.host.example
”, то почта к любому пользователю типа
“
any.user@a.host.example
” будет доставляться локально. Поскольку на имя локалхоста ссылаются косвенно, то можно использовать одинаковый конфиг на разных хостах.
Вторая строка задаёт список доменов, называемый
“
relay_to_domains
”, но список пуст. Позже, в конфигурации, будет часть контролирующая релеинг почты через локальный хост; он позволяет релеить любые домены из этого списка. По дефолту, здесь, не разрешён релей на основе имён почтовых доменов.
Третья строка задаёт список хостов, называемый
“
relay_from_hosts
”. Этот список используется позже, в конфигурации, для разрешения релея от любых хостов или IP-адресов, которые совпадают со списком. По-умолчанию, в нём содержится только IP-адрес интерфейса обратной петли, что означает, что процессы на локальном хосте могут пересылать почту к другим хостам через exim, соединяясь с ним по TCP/IP на интерфейсе обратной петли.
Для того, чтобы небыло непонимания: В этом пункте конфигурации мы не устанавливаем никаких значений директив. Мы просто задаём некоторые домены и хосты, использующиеся в директивах заданных позже.
Следующие две строки - настоящие опции настройки:
acl_smtp_rcpt = acl_check_rcpt
acl_smtp_data = acl_check_data
|
Эти опции задают
“
Access Control Lists
” (списки контроля доступа - ACLs), которые используются в течение входящего SMTP-подключения для каждого получателя сообщения (на каждую команду RCPT), и после того, как сообщение было получено, соотвественно.Названия списков -
“
acl_check_rcpt
” и
“
acl_check_data
”, и мы доберёмся до их определения ниже, в конфигурационной секции ACL. RCPT ACL контролирует, какие получатели разрешены для входящих сообщений - если конфигурация не содержит ACL для проверки получателей, то никакая почта по SMTP не принимается. DATA ACL рарешает проверку содержимого сообщения.
Следующие две закомментированные строки:
# av_scanner = clamd:/tmp/clamd
# spamd_address = 127.0.0.1 783
|
Они - пример настроек, которые могут использоваться когда exim скомпилен с расширением контентного сканирования (content-scanning extension). Первая задаёт интерфейс к сканеру вирусов, и вторая заадёт интерфейс к SpamAssassin. Дальнейшие детали даются в разделе 40.
Далее ещё две закомментированных строки:
# qualify_domain =
# qualify_recipient =
|
Первая из них задаёт домен, который exim использует, при создании полного адреса электронной почты, из имени логина локального пользователя. Часто это необходимо при получении exim`ом почты от локального процесса. Если вы не задали
“qualify_domain
”, то используется значение
“primary_hostname
”. Если вы задали обе эти опции, то можно иметь разные домены для адресов получателей и отправителей. Если же используете только первую, то её значение используется для обоих директив.
Следующая строка может быть раскомментирована, если вы хотите чтобы exim понимал адреса формы
“
user@[10.11.12.13]
”, тоесть с
“буквальным доменом
” (
“domain literal
” - IP-адрес в квадратных скобках) вместо именованного домена.
RFC всё ещё требуют эту форму, но много людей считают что в современном интернете посылка почты определённым хостам, указывая их IP-адрес имеет мало смысла. Этот старый формат использовался людьми рассылающими спам. Однако, некоторые полагают, что есть обстоятельства (например письма постмастеру), когда этот формат полезен.
Следующая строка конфигурации, своего рода защита:
Это определяет, что никакая доставка не должна осуществляться от имени пользователя
“root
”. Нормальное соглашение заключалось в том, что
“root
” - псевдоним системного администратора. Зта опция - охранная. Список пользователей, определённых как
“never_users
” - неполный, при компиляции в
“
Local/Makefile
” есть опция
“FIXED_NEVER_USERS
”, задающая список, который не может быть отменён. Содержимое
“never_users
” добаляется к списку. По-умолчанию,
“FIXED_NEVER_USERS
” содержит пользователя
“root
”.
Когда удалённый хост коннектится к exim`y, чтобы послать почту, единственная информация, которую имеет exim, о идентификации хоста - это его IP-адрес. Следующая конфигурационная строка,
задаёт, что exim должен проводить обратный поиск в DNS для всех входящих соединений, чтобы получить имя хоста. Это улучшает качество логов, но если вы чувствуете, что это обходиться слишком дорого, то вы можете удалить этот пункт вообще, или ограничить поиск хостами в соседних сетях. Отметтьте, что не всегда можно найти имя хоста по его IP-адресу, поскольку не все обратные DNS-зоны обслуживаются, и некоторые DNS-сервера могут быть недоступны.
Следующие две строки занимаются вызовом
“
ident
”, как определнов RFC1413? следосательно их имена:
rfc1413_hosts = *
rfc1413_query_timeout = 5s
|
Эти настройки затавляют exim делать вызовы
“
ident
” для всех входящих SMTP подключений. Вы можете ограничить список хостов, на которые делается этот вызов, или изменить таймаут, если он используется. Можно поставить таймаут в ноль, тогда все вызовы
“
ident
” будут заблокированы. Хотя они обходятся дёшево, и могут дать полезную информацию для трассировки проблем сообщений, некоторые хосты и фаерволлы имеют проблемы с запросами
“
ident
”. Это может привести к таймауту вместо немедленного сброса подключения, в случае отказа, приводя к задержке на старте входящего SMTP подключения.
Когда exim получает сообщения по SMTP, то ожидается, что все хосты будут иметь полное доменное имя, как требуется по определению SNMP. Однако если на ваш сервер шлют сообщения простые пользователи, то они могут иметь неподходящие адреса. Две закомментированые опции:
# sender_unqualified_hosts =
# recipient_unqualified_hosts =
|
указывают как вы можете задать хосты, которым разрешается посылать неполные адреса отправителей и получателей (имеются ввиду адреса без домена - тока имя пользователя).
Опция
“percent_hack_domains
” также закомментирована:
Она обеспечивает список доменов, для которых должно работать
“percent hack
”. Это - почти устаревшая опция явной почтовой маршрутизации. Если вы ничего не знаете об этом - то также можете проигнорировать эту опцию. (Прим. переводчика: а вообще имеются ввиду адреса, типа user%domain1.su@domain2.su - когда письмо приходит на сервер domain2.su, а тот уже пересылает его на domain1.su. Но лучше это не использовать.)
Два последних параметра настройки дефолтовой конфигурации касаются сообщений,
“замороженных
” в очереди exim`a. Когда сообщение заморожено, exim не продолжает попытки доставить его. Замораживание происходит когда сообщение об отлупе сталкивается с постоянным отказом, поскольку отправитель оригинального сообщения, вызвавшего рикошет, недопустим, и таким образом отлуп нельзя доставить. Это - наиболее частая причина, но есть и другие причины заморозки, и замороженные сообщения - не всегда рикошеты.
ignore_bounce_errors_after = 2d
timeout_frozen_after = 7d
|
Первая из этих опций определяет, что рикошеты будут выброшены из очереди через два дня. Вторая задаёт что любое замороженное сообщение (рикошет или другое) будет выброшено из очереди через неделю. При таких настройках, гарантируется, что попытки доставки рикошата никогда не будут длиться неделю (потому как через два дня их выкинут :)))).
7.2 Конфигурация ACL
В дефолтовой конфигурации, секция ACL следует за главной конфигурацией. Она начинается со строки
и она содержит определения двух ACL, называемых
“
acl_check_rcpt
” и
“
acl_check_data
” на которые выше ссылались параметры настройки
“acl_smtp_rcpt
” и
“acl_smtp_data
”.
Первая ACL, используееся для всех команд RCPT для входящих SMTP сообщений. Каждая команда RCPT определяет одного получателя сообщения. Утверждения ACL рассматриваются до тех пор, пока адрес либо принимается либо отклоняется. Тогда команда RCPT либо принята, либо отклонена, согласно результату обработки ACL.
Эта строка, состоящая из названия завершённого двоеточием, отмечает начало ACL и именует её.
Это утверждение ACL принимает получателя, если хост соответствет списку. Но что означает этот странный список? Он, фактически, не содержит никаких имён хостов, или адресов IP. Присутствие двоеточия, помещает в пустой элемент в список; exim сопоставляет его только с входящими сообщениями, которые идут не с удалённого хоста (только с локалхоста), поскольку в этом случае, имя удалённого хоста пустой. Двоеточие важно. Без него список пуст, и никогда ничему не сответствует.
То, что делает это утверждение, - разрешает безоговорочный приём всех получателей в сообщениях переданных по SMTP от локальных процессов, с использованием стандартного ввода и вывода (т.е. без использования TCP/IP). Множество MUA работает в такой манере.
deny message = Restricted characters in address
domains = +local_domains
local_parts = ^[.] : ^.*[@%!/|]
deny message = Restricted characters in address
domains = !+local_domains
local_parts = ^[./|] : ^.*[@%!] : ^.*/\\.\\./
|
Это утверждение занимается тем, чтобы локальная часть адреса не содержали некоторые символы -
“@
”,
“%
”,
“!
”,
“/
”,
“|
”, или точки в необычных местах. Хотя эти символы могут абсолютно законно использоваться в локальной части адреса (в случае
“@
” и начальной точки, только если корректно заэкранировано), обычно они не встречаются в почтовых адресах.
Первые три имеют прошлые ассоциации с явным роутингом адресов (символ процента используется до сих пор - смотрите опцию
“percent_hack_domains
”). Адреса содержащие эти символы регулярно пробуют спамеры, в попытках обойти ограничения релея почты, и программами проверяющими хост на открытый релей. Если вы в них не нуждаетесь, то самое безопасное - отклонить их на ранней стадии. Эта конфигурация отклоняет эти символы для всех удалённых хостов. Это преднамеренная политика, для достижения, насколько возможно, максимальной безопасности.
Первое правило более строгое, и оно применяется к сообщениям, которые адресованы к одному из локальных доменов, которые крутятся на этом хосте. Это осуществляется первым условием, которое ограничивает его доменами перечисленными в списке
“
local_domains
”. Символ
“+
” используется для указания ссылки на именованный список. В данной конфигурации, тут только один домен в
“
local_domains
”, но вообще, может быть несколько.
Второе условие в первом утверждение использует два регулярных выражения, для блокирования локальных частей начинающихся с точки, или содержащих
“@
”,
“%
”,
“!
”,
“/
”, или
“|
”. Если у вас есть учётки использующие эти символы, то надо изменить это правило.
Пустые компоненты (две точки подряд) недопустимы по RFC2822, но exim разрешает их, поскольку с ними столкнулись практически. (Обычно локальная часть выглядит так:
“first-initial.second-initial.family-name
”, но иногда бывает, что второго иницала нет, как у автора exim) Однако, локальная часть начинающаяся с точки, или содержащая
“/../
” может вызывать проблемы, если она используется как часть имени (например в списке рассылки). Также это истинно для локальных частей содержащих слэши. Символ трубы
“|
” также может принести неприятности, если локальная часть легкомысленно включена в командную строку шелла.
Второе правило, применяемое ко всем прочим доменам менее строго. Это позволяет локальным пользователям посылать сообщения к другим серверам, использующим слэши и трубы в локальной части адреса. Оно блокирует локальные части начинающиеся с точки, слэша, или трубы, но разрешает эти символы внутри локальной части. Однако, последовательность
“/../
” - запрешена. Использование
“@
”,
“%
”, и
“!
” заблокировано. Мотивация - запретить пользователям (или пользовательским вирусам) от определённые виды атак на удалённые сервера.
accept local_parts = postmaster
domains = +local_domains
|
Это утверждение, имеющее два условия, разрешает входящий адрес если локальная часть
“
postmaster
” и домен - один из перечисленных в списке
“
local_domains
”. Символ
“+
” используется для указания ссылки на именованный список. В данной конфигурации, тут только один домен в
“
local_domains
”, но вообще, может быть несколько.
Присутствие этого условия означает, что почта предназначенная постмастеру не блокируется последующими проверками. Это может быть полезным, при разборе проблем в последующих проверках, где неверно запрещается доступ.
Это утверждение требует, чтобы адрес отправителя был проверен до того, как будут последующие проверки ACL. Если проверка неудачна, то отказывается в доставке входящему адресу получателя. Проверка состоит из попытки маршрутизировать адрес, с целью выяснить, можно ли по нему доставить сообщение о рикошете. В случае удалённых адресов, проверяется только домен, но для более точной проверки может использоваться
“
callouts
”. Смотрите раздел 39.31 для получения дополнительной информации о проверке адреса.
accept hosts = +relay_from_hosts
control = submission
|
Это утверждение принимает адрес, если сообщение приходит с одного из хостов которым разрешён релей через этот хост. Проверка получателя тут опущена, поскольку во многих случаях клиенты - тупые MUA котрые не в состоянии справиться ответами об ошибке SMTP. По этой же причине, вторая строка задаёт
“режим подчинения
” (
“submission mode
”) для принятых сообщений. Это детально описано в разделе 43.1; это заставляет exim`a исправлять сообщения которые недоделаны (неполные или несовершенные), например, потому что у них отсутствует строка заголовка
“
Date:
”. Если вы передаёте их наружу, с MTA, вы, вероятно, должны тут добавить проверку получателя, и отключить режим подчинения.
accept authenticated = *
control = submission
|
Это утверждение принимает адрес, если клиентский хост подтвердил свою подлинность. Снова задан режим подчинения, поскольку сообщения, вероятнее всего, будут прибывать с MUA. В умолчальном конфиге не заданы аутентификаторы, что означает, что никакой клиент не сможет подтвердить свою подлинность. Вам необходимо добавить определения аутентификаторов если вы хотите использовать это утверждение ACL.
# deny message = rejected because $sender_host_address \
# is in a black list at $dnslist_domain\n\
# $dnslist_text
# dnslists = black.list.example
#
# warn message = X-Warning: $sender_host_address is \
# in a black list at $dnslist_domain
# log_message = found in $dnslist_domain
# dnslists = black.list.example
|
Эти закомментированные строки - пример того как вы можете сконфигурировать exim для проверки отправляющего хоста в блэк-листах DNS. Первое утверждение отклоняет сообщения с хостов находящихся в чёрных списках, тогда как второе только добавляет строку заголовка с предупреждением.
accept domains = +local_domains
endpass
verify = recipient
|
Это утверждение принимает входящий адрес, если домен - один из локальных доменов, но тока если подтверждён адрес. Проверка локальных адресов, обычно, заключается в проверке локальной и доменной частей. Строка
“endpass
” нуждается в некотором пояснении: если условие выше
“endpass
” неудачно, т.е. в данном случае, получатель не в локальном домене, управление передаётся следующей ACL. Однако, если условие ниже
“endpass
” неудачно, т.е. если получательполучатель в локальном домене не может быть подверждён, то доступ запрещается и получатель отклоняется.
accept domains = +relay_to_domains
endpass
verify = recipient
|
Это утверждение принимает входящий адрес, если домен - один из доменов для которых этот хост является релеем, но снова, тока если адрес может быть проверен.
deny message = relay not permitted
|
Заключительное утверждение, запрещает доступ, выдавая специфическое сообщение об ошибке. Достижение конца ACL также запрещает доступ, но с общим сообщением
“administrative prohibition
”.
Эта строка отмечает начало второго ACL, и именует его. Большая часть содержимого этого ACL закомментирована:
# deny malware = *
# message = This message contains a virus \
# ($malware_name).
|
Эти строки - пример того, как сделать чтобы сообщения были просканированы на вирусы, когда exim скомпилен с поддержкой контентного сканирования, и установлен подходящий сканнер вирусов. Если в сообщении найден вирус, то оно отклоняется с заданным сообщением об ошибке.
# warn spam = nobody
# message = X-Spam_score: $spam_score\n\
# X-Spam_score_int: $spam_score_int\n\
# X-Spam_bar: $spam_bar\n\
# X-Spam_report: $spam_report
|
Эти строки - пример того, как сделать, чтобы сообщения были просканированы SpamAssassin, когда exim скомпилен с поддержкой контентного сканирования, и установлен SpamAssassin. Проверка SpamAssassin`ом выполняется от пользователя nobody, и результаты добавляются к сообщению как ряд дополнительных заголовков. В этом случае, сообщение не отклоняется, вне завсимости от того сколько очков ему поставлено.
Это заключительная строка в DATA ACL, сообщение принимается безоговрочно.
7.3 Конфигурация роутера (маршрутизатора)
Конфигурация роутеров в дефолтовом конфиге, начинается со следующей линии:
Роутеры - это модули в exim`e, принимающие решение о том, куда слать сообщение. Адрес передаётся каждому маршрутизатору, по очереди, и он его либо принимает, либо нет. Это значит, что порядок в котором заданы роутеры - важен. Каждый роутер, позднее, полностью описан в его разделе, в этом руководстве. Тут даны только краткие обзоры.
# domain_literal:
# driver = ipliteral
# domains = !+local_domains
# transport = remote_smtp
|
Этот маршрутизатор закомментирован, поскольку большинство серверов не поддерживает буквальные адреса (вида
“user@[10.9.8.7]
”). Если вы раскомментируете этот роутер, также необходимо будет раскомментить опцию
“allow_domain_literals
” в основоной части конфигурации.
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
ignore_target_hosts =
0
.
0
.
0
.
0
:
127
.
0
.
0
.
0
/
8
no_more
|
Первый незакомментированный роутер обрабатывает адреса, не относящиеся к локальным доменом. Это задано строкой
domains = ! +local_domains
|
Опция
“domains
” - список доменов к которым применяется этот роутер, но восклицательный знак является признаком отрицания (несоответствия), таким образом роутер используется только для доменов, которые не находятся в списке
“
local_domains
” (который был определён в начале конфигурации). Символ
“+
” используется для указания ссылки на именованный список. Адреса в других доменах передаются следующим роутерам.
Имя драйвера маршрутизатора -
“dnslookup
”, оно задано в опции
“driver
”. Вас не должно смущать то, что имя маршрутизатора такое же как и имя драйвера. Название примера может быть произвольным, но имя заданное в опции
“driver
” - должен быть один из модулей драйверов из исполняемого файла exim`a.
Роутер
“dnslookup
” маршрутизирует адреса, ища их домены в DNS, для получения списка хостов к которым к которым должен маршрутизироваться адрес. Если роутер успешен, адрес ставиться в очередь транспорта
“remote_smtp
”, как задано в опции
“transport
”. Если роутер не надодит домен в DNS, то никакие дальнейшие роутеры не рассматриваются из-за опции
“no_more
”, таким образом адрес неудачен, и недоставляется (возвращается сообщение о ошибке).
Опция
“ignore_target_hosts
” задаёт список IP-АДРЕСОВ, которые должны полностью игнорироваться. Эта опция присутствует по причине, что было много случаев, когда MX-запись в DNS указывает на имя хоста с адресом 0.0.0.0 или из 127-й подсети (обычно, 127.0.0.1). Полное игнорирование этих адресов лишает возможности exim маршрутизировать почту к ним, таким образом доставка срывается. Иначе, exim писал бы в логи о проблеме маршрутизации, и продолжал пытаться доставить сообщение, с определённым таймаутом.
system_aliases:
driver = redirect
allow_fail
allow_defer
data = ${lookup{
$local_part}lsearch{/etc/aliases}}
# user = exim
file_transport = address_file
pipe_transport = address_pipe
|
Управление передаётся этому и последующим роутерам, только если адрес в локальном домене. Этот роутер проверяет, заданa ли локальная часть как альяс в
“
/etc/aliases
”, и если это так, переадресовывает адрес согласно данным найденным в этом файле. Если для локальной части не найдено никаких данных, то значение опции
“data
” пустое, и адрес передаётся следующему роутеру.
“
/etc/aliases
” - обычно это файл системных альясов. Именно по этому на него, по-умолчанию, ссылается конфигурационный файл. Однако, это можно поменять, изменив опцию
“SYSTEM_ALIASES_FILE
” в
“
Local/Makefile
” до сборки exim`a.
userforward:
driver = redirect
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
file = $home/.forward
# allow_filter
no_verify
no_expn
check_ancestor
file_transport = address_file
pipe_transport = address_pipe
reply_transport = address_reply
|
Этот маршрутизатор - самый сложный в дефолтовой конфигурации. Это другой перенаправляющий роутер, но он ищет данные перенаправления установленные отдельными пользователями. Установка
“check_local_user
” задаёт проверку локальной части, что она логин локального пользователя. Если это не так - роутер пропускается. За опцией
“check_local_user
” следуют две закомментированные опции, а именно:
# local_part_suffix = +* : -*
# local_part_suffix_optional
|
указывают, как можно задать распознание локальной части суффиксов. Если раскомментировать первое, то суффикс начинающийся с плюса или минуса, за которым идёт какая-то последовательность символов, удаляется из локальной части и помещается в переменную
“
$local_part_suffix
”. Вторая опция суффикса определяет, что присутсвие суффикса в локальной части является опциональны. Когда суффикс есть, проверка локального логина пользователя использует локальную часть без суффикса.
Когда найден локальный аккаунт пользователя, то просматривается файл
“
.forward
” в домашней директории пользователя. Если он не существует, или пуст, то роутер пропускается. Иначе, содержимое
“
.forward
” интерпретируется как данные перенаправления (для дополнительных деталей, обратитесь к главе 22).
Традиционный файл
“
.forward
” содержит лишь список адресов, каналов (труб), или файлов. Exim поддерживает всё это по-умолчанию. Однако, если установлена опция
“allow_filter
” (по дефолту, она закомментирована), содержимое файла интерпретируется инструкции exim`a или sieve, если файл начинается с
“#Exim filter
” или
“#Sieve filter
”, соответственно. Фильтры пользователей обсуждаются в отдельном документе
“
Exim's interfaces to mail filtering
”.
Опции
“no_verify
” и
“no_expn
” означают что этот роутер пропущен, когда проверяется адрес, или когда он выполняется вследствие команды SMTP EXPN. Есть две причины, чтобы это сделать:
1. В действительности, не очень важно, есть у пользователя файл
“
.forward
” или нет, при проверке адреса на существование; это делается сознательно, чтобы не тратить ресурсы на бесполезную работу.
2. Ещё более важно, когда exim проверяет адрес или обрабатывает команду EXPN во время SMTP сессии он работает от имени своего пользователя, а не от root. Группа - тоже его группа, и никаких дополнительных групп не установлено. Поэтому, вполне возможно, что exim не сможет прочитать пользовательский файл
“
.forward
” в этот момент.
Установка
“check_ancestor
” препятствует роутеру генерить новый адрес, являющийся таким же как и предыдущий, который переадресуется. (Это связано с относительно плохим взаимодействием между альясингом и форвардингом - смотрите раздел 22.5)
Три финальных параметра настройки задают транспорты, которые должны использоваться когда форвардинг совершает прямую доставку в файл, или в трубу, или делает авто-ответ, соответственно. Например, если файл
“
.forward
” содержит
a.nother@elsewhere.example, /home/spqr/archive
|
доставка в
“
/home/spqr/archive
” будет осуществлена запуском транспорта
“address_file
”.
localuser:
driver = accept
check_local_user
# local_part_suffix = +* : -*
# local_part_suffix_optional
transport = local_delivery
|
Последний роутер устанавливает доставку в локальные почтовые ящики, при условии, что локальная часть адреса является логином пользователя, принимая адрес и задавая его транспорту
“local_delivery
”. Иначе, т.к. достигнут конец роутеров, адрес возвращается отправителю. Закомментированные настройки суффиксов выполняют ту же самую роль, что и в роутере
“userforward
”.
7.4 Транспортная конфигурация
Транспорты задают механизмы для фактической доставки сообщений. Они работают только когда на них ссылаются роутеры, таким образом порядок в котором они заданы - неважен. Раздел транспортов начинается с
Определены один удалённый и четыре локальных транспорта.
remote_smtp:
driver = smtp
|
Этот транспорт используется для доставки сообщений через SMTP-соединение. Все его опции - умолчальные. Список удалённых хостов даётся маршрутизатором.
local_delivery:
driver = appendfile
file = /var/mail/$local_part
delivery_date_add
envelope_to_add
return_path_add
# group = mail
# mode = 0660
|
Транспорт
“appendfile
” используется для локальной доставки в пользовательские почтовые ящики, в традиционном формате BSD mailbox. По дефолту, он запускается под uid и gid локального пользователя, что требует установки
“липкого
” (
“sticky
”) бита на директории
“
/var/mail
”. Некоторые системы используют иной подход к запуску доставки почты, под специфической группой, вместо использования
“липкого
” бита. Закомментированные опции показывают, как это может быть сделано.
При доставке, exim добавляет к сообщению три заголовка:
“
Delivery-date:
”,
“
Envelope-to:
” и
“
Return-path:
”. Это регулируется тремя опциями, с подобными названиями.
address_pipe:
driver = pipe
return_output
|
Этот транспорт используется для обработки доставки в каналы, генерируемых редиректом (альясингом, или пользовательским файлом
“
.forward
”). Опция
“return_output
” определяет, что любой вывод сгенерированный каналом, должен быть возвращён отправителю.
address_file:
driver = appendfile
delivery_date_add
envelope_to_add
return_path_add
|
Этот ранспорт используется для обработки доставки в файлы, проиведённым редиректом. Имя файла не задаётся в
“appendfile
”, поскольку оно приходит от маршрутизатора
“redirect
”.
address_reply:
driver = autoreply
|
Этот транспорт используется для обработки автоматических ответов, сгенерённых пользовательскими фильтрами.
7.5 Дефолтовые правила повторов
Секция повторов конфигурационного файла, содержит правила затрагивающие поведение exim`a при повторах доставки сообщений, которые не удалось доставить с первого раза. Она начинается со строки
В дефолтовой конфигурации, есть только одно правило, применяемое ко всем ошибкам:
* * F,2h,15m; G,16h,1h,
1
.
5
; F,4d,6h
|
Это заставляет exim пытаться доставить любой временно неудачный адрес в течение двух часов каждые 15 минут, затем интервал начинается с часа и увеличивается с фактором полтора пока не пройдёт 16 часов, затем каждые 6 часов, до срока в 4 дня. Если адрес не удаётся доставить после 4-х дней временного отказа, то происходит срыв адреса (письмо возвращается отправителю).
7.6 Конфигурация перезаписи
Раздел конфигурации перезаписи, начинаемый с
содержит правила для перезаписи адресов в прибывших сообщениях. В дефолтовом конфиге нет правил перезаписи.
7.7 Конфигурация аутентификаторов
Секция аутентификаторов файла конфигурации, начинаемая с
задаёт механизмы для использования в команде SMTP AUTH. В дефолтовом конфиге нет правил аутентификации.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
8. Регулярные выражения
Exim поддерживает использование регулярных выражений во многих своих опциях. Используется библиотека регулярных выражений PCRE; это обеспечивает совместимость регулярных выражений с perl5. Синтаксис и семантика регулярных выражений обсуждаются во многих книгах по perl, и также в Jeffrey Friedl's Mastering Regular Expressions, изданной O'Reilly (смотрите http://www.oreilly.com/catalog/regex2/).
Документация о синтаксисе и семантике регулярных выражений включена в текстовом формате в файле
“
doc/pcrepattern.txt
” дистрибутива exim, а также в HTML тарболле (архив tar`a - прим. lissyara) документации exim. Там подробно описываются особенности поддержки регулярных выражений PCRE, таким образом нет необходимости включать дальнейшее описание тут. Функции PCRE вызываются из exim`a использованием дефолтовых опций настройки (т.е. без установленной опции PCRE), за исключением того, что опция
“PCRE_CASELESS
” установлена, когда используется соответствие без учёта регистра.
В большинстве случаев, когда регулярные выражения требуются в конфигурации exim`a, они должны начинаться с крышки (
“^
”), для того чтобы отличить их от простого текста, или заканчиваться
“безразличным символом
”. В этом примере конфигурационных настроек, второй элемент в списке разделённом двоеточиями, - регулярное выражение.
domains = a.b.c : ^\\d{3} : *.y.z : ...
|
Удвоение обратного слэша требуется, поскольку раскрытие строки предшествует интерпретации - смотрите раздел 11.1 для подробного рассмотрения этой темы, и способов не удваивать обратные слэши. Регулярное выражение, использующееся в этом примере, в конечном счёте содержит только один обратный слэш. Крышка включена в него, и её нормальный эффект -
“постановка на якорь
” выражения в начале строки.
Однако, есть два случая, когда где крышка не требуется для распознания регулярного выражения: это условие
“match
” в строке раскрытия и условие
“matches
” в файле фильтра exim. В этих случаях, уместная строка всегда обрабатывается как регулярное выражение; если выражение не начинается с крышки, то оно не поствлено на якорь и может соответствовать в любом месте строки объекта.
Во всех случаях, если вы хотите, чтобы регулярное выражение совпадало с концом строки, вы можете использовать метасимвол
“$
” для указания этого. Например:
domains = ^\\d{3}\\.example
|
совпадает с доменом
“
123.example
”, но также соответствует
“
123.example.com
”. Вам нужно использовать:
domains = ^\\d{3}\\.example\$
|
если вы хотите чтобы
“
example
” был доменом высшего уровня. Обратный слэш перед
“$
” необходим, поскольку раскрытие строки также интерпретирует символ доллара.
8.1 Тестирование регулярных выражений
Программа называемая
“
pcretest
” является частью дистрибутива PCRE и собирается с PCRE в процессе сборки exim. После сборки exim`a бинарник может быть найден в директории где собирался exim (если она не проинсталлилась где-то автоматически). Существует документация для различных опций в
“
doc/pcretest.txt
”, но для одиночного теста она не требуется. Это - вывод образца запуска
“
pcretest
”:
re> /^([@]+)@.+\.(ac|edu)\.(?!kr)[a-z]{2}$/
data> x@y.ac.uk
0
: x@y.ac.uk
1
: x
2
: ac
data> x@y.ac.kr
No match
data> x@y.edu.com
No match
data> x@y.edu.co
0
: x@y.edu.co
1
: x
2
: edu
|
Ввод пользователя показан жирным шрифтом. После подсказки
“re>
”, ожидается регулярное выражение внутри разделителей. Если оно компилится без ошибок, даётся подсказка
“data>
” напротив строки соответствующей выражению. Пустая линия приводит к чтению нового регулярного выражения. Если было успешной совпадение, показываются зафиксированные значения подстроки (то есть, что было бы в переменных 0 $, 1 $, 2 $, и т. д.). Вышеупомянутый пример проверяет на адрес электронной почты, домен которого заканчивается или
“ac
” или
“edu
”, сопровождаемым двухсимвольным вышестоящим доменом, который не
“kr
”. Локальная часть находится в $1 и
“ac
” или
“edu
” в $2.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
9. Поиски в файлах и базах данных
Exim может быть сконфигурирован для поиска данных в файлах или базах данных, когда он обрабатывает сообщение. Могут использоваться два различных синтаксиса:
1. Строка, которая будет раскрыта, может содержать явный запрос поиска. По этой причине, часть строки будет заменена данными, найденными поиском. Поиски этого типа - условия в элементах раскрытия. Различные результаты могут быть заданы для случаев успешного и неудачного поисков. Смотрите раздел 11, где в деталях описано раскрытие строк.
2. Списки доменов, хостов, и адресов e-mail могут содержать запрос поиска, как способ избежать слишком длинного линейного списка. В этом случае, данные возвращённые запросом, обычно (но не всегда) отбрасываются (короче, не нужны они - прим. lissyara); реально засчитывается - успешен ли поиск, или нет. Эта разновидность списков описана в разделе 10.
Раскрытие строк, списков, и поисков взаимодействуют друг с другом, в каждом случае, нет порядка, в котором описан любой из них и нет ссылок к другим. Каждая из этих трёх частей даст намного больше, если вы прочтёте вначале две другие. Если вы читаете это первым, то знайте, что поймёте больше, после прочтения глав 10 и 11.
9.1 Примеры различных синтаксисов поиска
Очень легко перепутать два разных способа поиска, тем более, что списки, которые могут содержать вторую разновидность, всегда раскрываются, прежде чем быть обработанными как списки. Поэтому, они также могут содержать поиски первого вида. Будте точны в различии между следующими двумя примерами:
domains = ${lookup{
$sender_host_address}lsearch{/some/file}}
domains = lsearch;/some/file
|
Первый использует раскрытие строки, результат которого должен быть списком доменов. Строки, для успешного или безуспешного поиска не заданы; значение по-умолчанию, в этом случае, найденные данные и пустая строка, соответственно. Раскрытие помещается прежде чем строка обрабатывается как список, и файл, по которому ведётся поиск, может содержать строки как эти:
192
.
168
.
3
.
4
: domain1:domain2:...
192
.
168
.
1
.
9
: domain3:domain4:...
|
Когда поиск успешен, результат раскрытия - список доменов (и, возможно, другие типы элементов, разрешённые в списке доменов).
Во втором примере, ищется один элемент в списке доменов. Это вынуждает exim к использованию поиска, для того чтобы узнать, может ли обрабатываемый домен быть найден в файле. Файл может содержать строки как эти:
Любые данные, сопровождаемые ключами, не уместны при проверке что домен совпадает с элементом списка.
Их можно спутать, при использовании обоих видов поиска сразу. Рассмотрите файл, содержащий, например, такие строки:
192
.
168
.
5
.
6
: lsearch;/another/file
|
Если значение
“
$sender_host_address
” - 192.168.5.6, раскрытие первой установки
“
domains
” генерит вторую установку, которая вызывает второй поиск.
Оставшаяся часть этой главы описывает различные доступные типы поиска. Любой из них может использоваться в любой части конфигурации, где разрешены поиски.
9.2 Типы поиска
Реализованы два различных типа поиска:
“
Одноключевой
” (
“
single-key
”) тип поиска, требует задания файла, в котором будет происходить поиск, и одного ключа для поиска. Ключ должен быть непустой строкой, чтобы поиск был успешен. Тип поиска определяет, как найден файл.
Поиск в
“
стиле запроса
” (
“
query-style
”) - принимает обобщённый запрос базы данных. Exim не предполагает никакого специфического ключевого значения для поисков в стиле запроса. Вы можете использовать любые переменные exim`a для необходимого вам запроса к БД.
Код для каждого типа поиска находится в отдельном файле исходных текстов, и включается в бинарник exim`a лишь если при компиляции установлена соответствующая опция. Дефолтовые настройки в
“
src/EDITME
” таковы:
LOOKUP_DBM=yes
LOOKUP_LSEARCH=yes
|
и означают, что лишь линейный поиск и поиск в DBM включены по дефолту. Для некоторых типов поисков (например, БД SQL), вам необходимо инсталлировать библиотеки и файлы заголовков, до сборки exim`a.
9.3 Одноключевые типы поиска
Реализованы следующие одноключевые типы поиска:
“
cdb
”: По данному файлу производится поиск как по файлу Статической БД (Constant DataBase), используя ключевую строку без завершающего двоичного нуля. Формат
“cdb
” спроектирован для индексных файлов, которые часто читаются, и никогда не обновляются, исключая полное пересоздание. Такде он является наиболее подходящим для больших файлов, содержащих альясы, или другие индексированные данные, на которые ссылается MTA. Информация о
“cdb
” может быть найдена в нескольких местах:
http://www.pobox.com/~djb/cdb.html
ftp://ftp.corpit.ru/pub/tinycdb/
http://packages.debian.org/stable/utils/freecdb.html
Дистрибутив
“cdb
” не нужен для сборки exim`a с поддержкой
“cdb
”, поскольку код для чтения
“cdb
”-файлов непосредственно включён в exim. Однако, с exim`ом не предоставляется никаких средств для сборки или тестирования
“cdb
”-файлов, таким образом вам необходимо получить дистрибутив
“cdb
” для этого.
“
dbm
”: Вызовы к библиотечным функциям
“dbm
” используются для извлечения данных из файлов DBM, путём поиска записей с данным ключом. Завершающий бинарный ноль включён в ключ, который передаётся библиотеке DBM. Смотрите раздел 4.3, для обсуждения библиотек DBM.
Для всех версий Berkeley DB, exim использует стиль DB_HASH базы данных, когда собирает DBM-файлы используя утилиту
“
exim_dbmbuild
”. Однако, когда используется Berkeley DB версий 3 и 4, он открывает для чтения, существующие базы данных, с опцией DB_UNKNOWN. Это позволяет ему обработать любой из типов БД поддерживаемых библиотекой, и может быть полезным для доступа к DBM-файлам созданным другими приложениями. (Для более ранних версий DB, всегда используется DB_HASH.)
“
dbmnz
”: Это тоже самое, что и
“
dbm
”, за исключением, что, завершающий бинарный ноль не включен в ключ передаваемый библиотеке DBM. Вам может понадобиться использовать это, если вы хотите искать данные в файлах, которые созданы или расшарены с каким-либо иным приложением, которое не использует завершающий ноль. Например, вы должны использовать
“
dbmnz
” а не
“
dbm
”, если вам необходимо аутентифицировать входящие SMTP-подключения, используя пароли из файла
“
/etc/userdbshadow.dat
” Сourier`a. Утилита exim`a для создания файлов DBM (
“
exim_dbmbuild
”) по дефолту включает нули, но у неё есть опция для их исключения (смотрите раздел 49.9).
“
dsearch
”: Данный файл должен быть директорией; ищется файл, имя которого равно ключу. Ключ не должен содержать символов слэша. Результат успешного поиска - имя файла. Пример, как этот поиск может использоваться для поддержки виртуальных доменов, дан в разделе 46.7.
“
iplsearch
”: Данный файл - текстовый файл, содержащий ключи и данные. Ключ завершается двоеточием, или пробелом, или концом строки. Ключи, в файле, должны быть IP-адресами, или IP-адресами с CIDR масками. Ключи включающие в себя адреса IPv6, должны быть заключены в кавычки, для предотвращения интерпретации первого внутреннего двоеточия как завершение ключа. Например:
1
.
2
.
3
.
4
: data for
1
.
2
.
3
.
4
192
.
168
.
0
.
0
/
16
data for
192
.
168
.
0
.
0
/
16
"abcd::cdab": data for abcd::cdab
"abcd:abcd::/
32
" data for abcd:abcd::/
32
|
Ключ для
“
iplsearch
” поиска должен быть IP-адресом (без маски). Поиск по файлу линейный, с использованием масок CIDR, где они заданы, до нахождения соответствия ключу. Используется первый совпадающий ключ; дальнейших попыток найти
“лучшее
” совпадение, не предпринимается. Кроме совпадения ключей, обработка
“
iplsearch
” - такая же как у
“
lsearch
”.
Предупреждение 1: В отличие от большинства других одноключевых поисков, файл данных для
“
iplsearch
” не может быть превращён в DBM или cdb-файл, поскольку эти типы поиска поддерживают только буквальные ключи.
Предупреждение 2: В списке хостов,вы всегда должны использовать
“
net-iplsearch
”, таким образом, чтобы неявный ключ был IP-адресом, а не именем (смотрите раздел 10.12).
“
lsearch
”: Данный файл - текстовый файл, по которому линейно ищется строка, начинающаяся с искомого ключа, законченную двоеточием, или пробелом, или концом строки. Используется первое найденное совпадение. пустое место между ключом и двоеточием разрешается. Остаток строки, после удаления начального и конечного пустого пространства является данными. Они могут быть продолжены на последующие строки путём начала их с любого количества пустого пространства, но только один символ пробела включается в данные при таком соединении. Если данные начинаются с двоеточия, ключ должен быть завершён двоеточием, например:
Пустые строки, и строки начинающиеся с
“#
” игнорируются, даже если они встречаются в середине строки. Это - традиционный текстовый формат файла альясов. Обратите внимание, что ключи в файле
“
lsearch
” - литеральные строки. Тут нету подстановки (
“wildcarding
”) какого бы то ни было вида.
В большинстве
“
lsearch
” файлов, ключи не могут содержать двоеточия, или символы
“#
”, или пустые пробелы. Однако, если вам необходима эта возможность, она доступна. Если ключ начинается с символа двойной кавычки, она завершается только соответствующей кавычкой (или концом строки), и, к её содержимому, применяются обычные правила экранирования (смотрите раздел 6.16). Опционально, двоеточие разрешено после ключа в кавычках (также как и для ключей без кавычек). Специальная обработка кавычек для части данных строки
“
lsearch
” отсуствует.
“
nis
”: Данный файл - имя карты NIS, и поиск NIS производится с данным ключом, без завершающего двоичного нуля. Есть вариант, называемый
“
nis0
”, который включает двоичный нуль в ключ. По сведениям, это необходимо для файла альясов в стиле SUN. Exim не понимает NIS-альясы; должны использоваться полные имена карт.
“
wildlsearch
” или
“
nwildlsearch
”: Поиск по файлу линейный, как
“
lsearch
”, но вместо того, чтобы интепретировать как литеральную строку, каждый ключ в файле может быть подстановочным. Различие между этими двумя типами поиска в том, что для
“
wildlsearch каждый ключ в файле раскрывается до начала использования, тогда как для
“
nwildlsearch нет раскрытия на месте.
Как и
“
lsearch, тестирование производится без учёта регистра. Признаются следующие формы подстановочных знаков:
1. Строка может начинаться со звёздочки, для обозначения
“кончается на
”. Например:
*.a.b.c data for anything.a.b.c
*fish data for anythingfish
|
2. Строка может начинаться с крышки (
“^
”), для обозначения регулярного выражения. Например, для
“
wildlsearch
”:
^\N\d+\.a\.b\N data for <digits>.a.
|
Примечание - использование
“\N
” отключает раскрытие содержимого регулярного выражения. Если вы используете
“
nwildlsearch
” там, где ключи не раскрываются, это эквиалентрно:
^\d+\.a\.b data for <digits>.a.b
|
Если регулярное выражение содержит пустое место, или символы двоеточия, вы должны поместить его в кавычки (смотрите
“
lsearch
”, выше), или представить эти символы другим образом. Например,
“\s
” может быть использовано для обозначения пробела и
“\x3A
” - для двоеточия. Это может оказаться легче, чем использовать кавычки, поскольку при использовании кавычек, вы должны экранировать все обратные слэши внутри кавычек.
Примечание: Невозможно зафиксировать подстроки в совпадении регулярного выражения, для дальнейшего использования, поскольку результаты всех поисков кэшируются. Если поиск повторяется, результат берётся из кэша, и нет фактического сопоставления с образцом. Значения всех цифровых переменных сбрасываются после совпадения
“(n)wildlsearch
”.
3. Хотя я не вижу много применений, общая функция соответствия, используемая для реализации
“(n)wildlsearch
”, означает, что строка может начинаться с имени поиска, завершаемого двоеточием, и сопровождаться данными поиска. Например:
cdb;/some/file data for keys that match the file
|
Данные, полученные из вложенного поиска, отвергаются.
Ключи, которые не соответствуют ни одному из этих паттернов, интепретируются буквально. Правила продолжения для данных - точно ткие же как для
“
lsearch
”, и ключи могут сопровождаться опциональными двоеточиями.
Предупреждение: В отличие от большинства других одноключевых поисков, файл данных для
“(n)wildlsearch
” не может быть превращён в DBM или cdb-файл, поскольку эти типы поиска поддреживают только буквальной соответствие.
9.4 Типы поиска в стиле запроса
Поддерживаемые типы поиска в стиле запроса перечислены ниже. Дальнейшие детали, о многих из них, даны в дальнейших разделах.
“
dnsdb
”: Этот производит поиск одной или более записей, чьи доменные имена даны в предоставленном запросе. Результирующие данные - содержимое записей. Смотрите раздел 9.10.
“
ibase
”: Этот производит поиск по БД Interbase.
“
ldap
”: Этот производит поиск по LDAP, используя запрос в форме URL, и возвращает атрибуты единственного элемента. Есть вариант, вызывающий
“
ldapm
”, который разрешает возврат значений от нескольких элементов. Третиф вариант, называемый
“
ldapdn
”, возвращает Distinguished Name (отличительное имя) одного элемента, вместо любых значений атрибутов. Смотрите раздел 9.13.
“
mysql
”: Формат запроса - SQL-выражение, передаваемое БД MySQL. Смотрите раздел 9.20.
“
nisplus
”: Этот производит поиск в NIS+, используя запрос, который может задать имя поля для возврата. Смотрите раздел 9.19.
“
oracle
”: Формат запроса - SQL-выражение, передаваемое БД Oracle. Смотрите раздел 9.20.
“
passwd
”: Поиск в стеле запросов, с запросами, которые содержат лишь имя пользователя. Поиск вызывает
“
getpwnam()
”, для запроса данных системного пароля, и при успехе, строка результата - то же самое, что вы бы получили из поиска
“
lsearch
” в традиционном файле паролей
“
/etc/passwd file
”, со значением
“*
” в качестве заначения пароля. Например:
*:
42
:
42
:King Rat:/home/kr:/bin/bash
|
“
pgsql
”: Формат запроса - SQL-выражение, передаваемое БД PostgreSQL. Смотрите раздел 9.20.
“
sqlite
”: Формат запроса - имя файла, сопровождаемое SQL-выражением, передаваемым БД SQLite. Смотрите раздел 9.24.
“
testdb
”: Это тип поиска, используемый для тестирования exim. Он врятли будет полезен в обчной ситуации.
“
whoson
”:
“
Whoson
” (http://whoson.sourceforge.net) - предложенный протокол Интернета, который разрешает программам серверов Интернета проверять, какой из двух специфических (динамически выделенных) IP-адресов, в данный момент выделен извеcтному (доверенному) пользователю, и опционально, получить идентификацию упомянутого пользователя. В exim, это может использоваться для реализации проверки условия ACL
“POP перед SMTP
”, например:
require condition = \
${lookup whoson {$sender_host_address}{yes}{no}}
|
Запрос состоит из единственного IP-адреса. Возвращённое значение - имя аутентифицированного пользователя, который сохранён в переменной
“
$value
”. Однако, в этом примере, данные
“
$value
” не используются; результат поиска - одна из фиксированных строк -
“yes
” or
“no
”.
9.5 Временные ошибки в поисках
Функции поиска мошут вернуть коды временных ошибок, если поиск не может быть завершён. Например, БД SQL или LDAP могут быть недоступны. Поэтому не желательно использовать поиск, которыё мог бы сделать такое для критичных опций, например, списка локальных доменов.
Когда поиск не может быть завершён в роутере или транспорте, доставка сообщения (к релевантному адресу) задерживается, как и для других временных ошибок. При других обстоятельствах, exim может предположить, что поиск был неудачен, или может вообще всё бросить.
9.6 Дефолтовые значения в одноключевых поисках
В этом контексте,
“дефолтовые значения
” - это значения заданные администратором, которое должно использоваться, если поиск неудачен.
Если
“*
” добавляется к одноключевому типу поиска (например
“
lsearch*
”) и начальный поиск неудачен, ключ
“*
” ищется в файле, для нахождения значения по-умолчанию. Также, смотрите раздел о частичном соответствии, ниже.
Альтернативно, если
“*
” добавляется к одноключевому типу поиска (например
“
dbm*@
”), тогда, если начальный поиск неудачен и ключ содержит символ
“@
”? второй поиск производится заменив все на
“*
”, до последней
“@
”. Это позволяет предоставить значения по умолчанию на домен, в файлах альясов, включающих домены в ключи. Если воторой поиск неудачен (или его нет, потому что в ключе нет
“@
”), ищется
“*
”. Например, роутер
“
redirect
” мог бы содержать:
data = ${lookup{
$local_part@$domain}lsearch*@{/etc/mix-aliases}}
|
Предположим, обрабатываемый адрес -
“
jane@eyre.example
”. Exim ищет эти ключи в таком порядке:
jane@eyre.example
*@eyre.example
*
|
Данные берутся из любого ключа найденного первым. Примечание: В файле
“
lsearch
”, это не означает первый из этих ключей в файле. Полное сканирование производится для каждого ключа, и лишь если он не найден, exim пробует следующий ключ.
9.7 Частичное совпадение в одноключевых поисках
Нормальная операция одноключевого поиска - поиск в файле, точного соответствия заданному ключу. Однако, во множестве ситуаций в которых ищутся домены, было бы полезным частичное соответствие. В этом случае, информация в файле, которая начинается с
“*.
”, совпадает с любым доменом заканчивающимся компоненами, следующими за точкой. Например, если ключ в DBM-файле такой
тогда, когда частичное соответсвие включено, это совпадает (в том числе)
“
2001.dates.fict.example
” и
“
1984.dates.fict.example
”. Также совпадает с
“
dates.fict.example
”, если эта строка не появляется как отдельный ключ в файле.
Примечание: Частичное соответствие не доступно для поисков в стиле запроса. Также оно недоступно для поиска любых элементов в списках адресов (смотрите раздел 10.18).
Частичное соответствие реализовано путём отдельных поисков с использованием ключей сконструированных путём модификации оригинального ключа. Это означает, что он может использоваться с любым типом одноключевого поиска, при условии, что частично совпадающие ключи, начинающиеся со специального преффикса (по умолчанию -
“*.
”), включены в файл данных. Ключи в файле, которые не начинаются с преффикса, совпадают только с немодифицированными ключами, когда используется частичное соответствие.
Частичное соответствие вызывают путём добавления строки
“partial-
” к началу имени одноключевого типа поиска, например,
“
partial-dbm
”. Когда это происходит, вначале ищется немодифицированный объект ключа; если поиск неудачен,
“*.
” добавляется вначале ключа, и снова производится поиск. Если он неудачен, будущие поиски пробуют удалять разделённые точками компоненты, он начала ключа, один за одним, и добавляя
“*.
” к началу того, что осталось.
Требуемое минимальное число не-* компонентов - два. Это может быть скорректировано включением числа до дефиса, в типе поиска. Например,
“
partial3-lsearch
” задаёт минимум три не-* компонента в измененённых ключах. Отстутствие числа эквивалентно
“partial2-
”. Если ключ
“
2250.dates.fict.example
”, тогда следующие ключи ищутся, когда минимальное число не-* компонентов - два:
2250
.dates.fict.example
*.
2250
.dates.fict.example
*.dates.fict.example
*.fict.example
|
Как только один ключ, в последовательности, успешно найден, поиск завершён.
Использование
“*.
”, как дефолтового преффикса, может быть изменено. Мотивацией для этой возможности является разрешение exim`y работать с форматами файлов используемыми другими MTA. Иной префикс может быть предоставлен в круглых скобках, вместо дефиса, после
“partial
”. Например:
domains = partial(.)lsearch;/some/file
|
В этом примере, если домен -
“
a.b.c
”, последовательность поисков -
“a.b.c
”,
“.a.b.c
” и
“.b.c
” (при неизменённом дефолтовом минимуме в 2 компонента). Префикс может состоять из любых символов пунктуации, кроме закрывающей круглой скобки. Он может быть пустым, например:
domains = partial1()cdb;/some/file
|
Для этого примера, если домен
“
a.b.c
”, последовательность поиска будет
“a.b.c
”,
“b.c
” и
“c
”.
Если задан
“partial0
”, что случается в конце (когда поиск, с лишь одним неподстановочным компонентом, неудачен и оригинальный ключ укорачиватся вправо на нулевую строку) зависимостей от префикса:
Если префикс имеет нулевую длинну, весь поиск неудачен.
Если длинна префикса равна 1, поиск производится лишь для префикса. Например, заключительный поиск для
“partial0(.)
” является единственным для
“.
”.
Иначе, если префикс заканчиватся точкой, точка удаляется, и ищется оставшаяся часть. Поэтому, с дефолтовым префиксом, финальный поиск для
“*
” самостоятелен.
Иначе, ищется полный префикс.
Если тип поиска заканчивается на
“*
” или
“*@
” (смотрите выше, раздел 9.6), поиск окончательного дефолтового значения, подразумевающего эти последовательности, происходит после неудачи всех поисков. Однако, тут можно использовать поиск типа
“partial0(.)lsearch*
”.
Использование
“*
”, в частично соответствующем поиске, отличается от её использовния как подстановочного символа в списках доменов и тому подобном. Частичное соответствие работает только в виде компонентов разделённых точкой; ключ, например
“*fict.example
” бесполезен в БД, поскольку звёздочка в частично совпадающем ключе всегда сопровождается точкой.
9.8 Кэширование поиска
Exim кэширует все результаты поисков, для избежания бесполезных повторений поисков. Однако, поскольку (кроме даемона) exim работает как коллекция независимых, короткоживущих процессов, это кэширование применяется только в пределах одного процесса exim`a. Средства для межпроцессного кэширования отсутсвуют.
Для одноключевого поиска, exim оставляет релевантные файлы открытыми в случае, если есть другой поиск, нуждающийся в них. В некоторых типах конфигураций, это может привести к большому числу открытых файлов, сохраняемых открытыми, оставляемых открытыми для сообщений со многими получателями. Для избежания попадений под системные ограничения на число открытых файлов, exim закрывает последний использованный файл, когда необходимо открыть больше файлов чем позволяют его внутренние ограничения, которое можно изменить через опцию
“
lookup_open_max
”.
Файлы одноключевого поиска закрываются и сбрасывается кэш поиска в стратегических точках доставки - например, после завершения всех роутингов.
9.9 Квотирование (помещение в двойные кавычки) данных поиска
Когда данные из входящего сообщения включаются в поиск типа запросов, возможно появление специальных символов в данных, нарушающих синтаксис запроса. Например, запрос NIS+ содержащий
будет прерван, если локальная часть будет содержать правую квадратную скобку. Для данных NIS+, данные должны быть помещены в двойные кавычки, как в примере:
но это оставляет проблемы с кавычками в данных. Правила для NIS+ состоит в том, что двойные кавычки должны быть удвоены. Другие типы поиска имеют иные правила, и для решения этих требований существет оператор раскрытия такой формы:
${quote_<lookup-type>:<string>}
|
Например, самый безопасный способ написания NIS+ запроса:
[name="${quote_nisplus:$local_part}"]
|
Смотрите раздел 11 для полного обзора раскрытия строк. Оператор кавычек может спользоваться для всех типов поисков, но он не имеет эффекта в одноключевых поисках, т.к. кавычки в них никогда не бывают необходимы.
9.10 Дополнительные сведения о dnsdb
Тип поиска
“
dnsdb
” использует DNS как базу данных. Простой запрос содержит тип записи и имя домен, разделённые знаком равно (
“=
”). Например, строка раскрытия может содержать:
${lookup dnsdb{mx=a.b.example}{$value}fail}
|
Если поиск успешен, результат помещается в
“
$value
”, которая, в этом случае, используется как результат. Если поиск успешен, ключевое слово
“fail
” вызывает принудительную ошибку раскрытия (
“
forced expansion failure
”) - смотрите раздел 11.4 для понимания, что это означает.
Поддерживаемые типы DNS-записей - A, CNAME, MX, NS, PTR, SRV, and TXT, и когда exim скомпилен с поддержкой IPv6 - AAAA (и A6, если это тоже сконфигурено). Если тип не задан, предполагается TXT. Когда тип PTR, данные могут быть нормально записанным IP-адресом; инверсия и добавление
“
in-addr.arpa
” или
“
ip6.arpa
” происходят автоматически. Например:
${lookup dnsdb{ptr=
192
.
168
.
4
.5}{$value}fail}
|
Если данные для PTR-записи не являются синтаксически допустимым IP-адресом, он не изменяется и ничего не добавляется.
Для поиска MX, для каждой записи возвращаются оба привелигированных значения, и имя хоста, разделённые пробелом. Для поиска SRV, приоритет, вес, порт и имя хоста возвращаются для каждой записи, разделённые пробелами.
Для любых типов записей, если найдено много записей (или, для поиска A6, если одна запись ведёт ко многим адресам), данные возвращаются как объединение, с символом новой строки, как дефолтовым разделителем. Порядок, разумеется, определяется DNS-резольвером. Вы можете задать иной разделитель символов, между несколькими записями, путём помещения в начале запроса правой угловой скобки, сопровождаемой (без пробелов) новым раделителем. Например:
${lookup dnsdb{>: a=host1.example}}
|
Разрешается задать пробел, как символ разделителя. дальнейшее пустое пространство игнорируется.
9.11 Псевдо-
“dnsdb
” типы записей
По-умолчанию, и предпочтительное значение, и имя хоста, возвращаются для каждой MX-записи, разделённые пробелами. Если вам нужны только имена хостов, вы можете использовать псевдо-тип MXH:
${lookup dnsdb{mxh=a.b.example}}
|
В этом случае, предпочтительное значение опущено, и возвращаются только имена хостов.
Другой псевдотип - ZNS (расшифровывается
“zone NS
”). Он выполянет поиск NS-записи для данного домена, но если она не наёдена, он удаляет первый компонент имени домена, и пробует снова. Этот процесс продолжанется пока не найдена NS-запись, или не останется компонентов имени (или произойдёт ошибка DNS). Другими словами, он может вернуть сервер имён домена верхнего уровня, но никогда не вернёт корневой сервер имён. Если нет NS-записей домена верхнего уровня, поиск неудачен. Рассмотрите эти примеры:
${lookup dnsdb{zns=xxx.quercite.com}}
${lookup dnsdb{zns=xxx.edu}}
|
Предполагается, что в каждом случае тут нет NS-записей для полного доменного имени, в первом случае сервером имён возвращается значение для
“
quercite.com
”, и во втором случае сервером имён возвращается значение для
“
edu
”.
Вы должны быть внимательны при использовании этого типа поиска, поскольку, если домен верхнего уровня не существует, поиск всегда вернёт какое-то имя домена. Это могло бы использоваться для того, чтобы видеть, находится ли сервер имён данного домена в чёрном списке. Вероятно, вы можете предполагать, что сервреа имён для доменов верхнего уровня, таких как
“
su
” или
“
co.uk
” не собиираются находиться в таких списках.
Третий псевдо-тип - CSA (Client SMTP Authorization). Он ищет SRV-записи для правил CSA, которые описаны в разделе 39.37. Хотя
“
dnsdb
” непосредственно поддерживает поиски SRV, этого недостаточно, из-за дополнительного режима поиска родительских доменов CSA. Результат успешного поиска, например:
${lookup dnsdb {csa=$sender_helo_name}}
|
имеет два разделённых пробелами поля: код авторизации и имя целевого хоста. Авторизационный код может быть
“Y
” для yes,
“N
” для no,
“X
” для явно требуемой, но отсутствующей авторизации, или
“?
” для неизвестного.
9.12 Множественные поиски
“dnsdb
”
В предыдущих разделах описаны поиски для одиночного домена. Однако, вы можете задать список доменов или адресов в отдельном
“
dnsdb
” поиске. Список задаётся в нормальном виде exim`a, с двоеточием в качестве дефолтового разделителя, но с возможностью изменить его. Например:
${lookup dnsdb{one.domain.com:two.domain.com}}
${lookup dnsdb{a=one.host.com:two.host.com}}
${lookup dnsdb{ptr = <;
1
.
2
.
3
.
4
;
4
.
5
.
6
.8}}
|
Для сохранения обратной совместимости, есть один специальный случай: если тип поиска PTR и не указано изменение разделителя, exim смотрит, не является ли остаток строки одним IPv6 адресом. В этом случае, он не обрабатывает её как список.
Данные каждого поиска объединены, с символом новой строки в качестве дефолтового разделителя, таким образом обрабатываются множественные DNS-записи для одного элемента. Может быть задан иной разделитель, как указано выше.
Поиск
“
dnsdb
” неудачен, лишь если неудачны все все DNS-поиски. Если для любого из них происходит временная ошибка DNS, то поведением управляет опциональное ключевой слово, с последующей запятой, могущей появиться перед типом записи. Возможные ключевые слова -
“defer_strict
”,
“defer_never
”, и
“defer_lax
”. С
“strict
” поведением, любая временная ошибка DNS вызывает задержку всего поиска. С
“never
” поведением, временные ошибки DNS игнорируются, и поведение такое, будто поиск в DNS не привёл ни к чему. С
“lax
” поведением, предпринимаются все запросы, но временые ошибки DNS вызывают задержку лишь в случае, если если остальные поиски были безуспешны. Дафолт -
“lax
”, таким образом, следующие поиски эквивалентны:
${lookup dnsdb{defer_lax,a=one.host.com:two.host.com}}
${lookup dnsdb{a=one.host.com:two.host.com}}
|
Следовательно, в дефолтовом случае, поиск успешен до тех пор, пока хоть один поиск в DNS привёл к каким-то данным.
9.13 Дополнительные сведения о LDAP
Оригинальная реализация LDAP была сделана в University of Michigan; она стала
“Open LDAP
”, и сейчас существует два различных релиза. Другая реализация происходит из Netscape, Solaris 7 и последующие релизы содержат встроенную поддержку LDAP. К сожалению, хотя все они совместимы на уровне функционирования запросов, обработка их ошибок различна. По этой причине необходимо установить переменную, во время компиляции exim`a с LDAP, для указания, какая библиотека LDAP используется. Одна из следующих строк должна быть в вашем
“
Local/Makefile
”:
LDAP_LIB_TYPE=UMICHIGAN
LDAP_LIB_TYPE=OPENLDAP1
LDAP_LIB_TYPE=OPENLDAP2
LDAP_LIB_TYPE=NETSCAPE
LDAP_LIB_TYPE=SOLARIS
|
Если
“LDAP_LIB_TYPE
” не задана, exim предполагает
“OPENLDAP1
”, имеющий такой же интерфейс, как и версия University of Michigan.
Есть три типа поиска LDAP в exim. Они ведут себя по-разному, когда обрабатывают результаты запроса:
“
ldap
” - требует, чтобы результат содержал только один элемент; если их больше - он выдаёт ошибку.
“
ldapdn
” - также требует, чтобы результат содержал только один элемент, но запросом должно быть возвращено Distinguished Name, а не любые аттрибуты со значением.
“
ldapm
” - разрешает результату содержать более одного элемента; все их аттрибуты возвращаются запросом.
Для
“
ldap
” и
“
ldapm
”, если запрос находит лишь входы без аттрибутов, exim ведёт себя, как будто вхождения не найдены, и поиск неудачен. Формат данных, возвращаемых успешным поиском описаны в следующей секции. Сначала мы объясняем, как кодируются LDAP-запросы.
9.14 Формат запросов LDAP
Запрос к LDAP имеет форму URL, как определено в RFC2255. Например, в конфигурации роутера
“
redirect
”, могла бы быть такая установка:
data = ${lookup ldap \
{ldap:///cn=$local_part,o=University%20of%20Cambridge,\
c=UK?mailbox?base?}}
|
URL может начинаться с
“ldap
” или
“ldaps
”, если ваша библиотека LDAP поддерживает безопасные (шифрованные) LDAP-соединения. Второй из них гарантирует, что используются шифрованные подключения TLS.
9.15 Квотирование (использование двойных кавычек и спецсимволов) в LDAP
В запросах LDAP требуются два уровня квотирования, первый - непосредвственно для LDAP, и второй, поскольку запрос LDAP представлен как URL. Кроме того, внутри LDAP-запроса, требуются два различных вида квотирования. Поэтому есть два различных, LDAP-специфичных, оператора квотирования.
Оператор
“
quote_ldap
” спроектирован для использования на строках, являющихся частью спецификации фильтра. Концептуально, он, вначале, производит следующие преобразования строки:
* => \2A
( => \28
) => \29
\ => \5C
|
в соответствии с RFC2254. Результирующая строка квотируется согласно правилам для URL, т.е. все не алфавитно-цифровые символы, кроме:
конвертируются в их шастнадцатеричные значения, с предшествующим им символом процента. Например:
${quote_ldap: a(bc)*, a<yz>; }
|
превращается в
%20a%5C28bc%5C29%5C2A%2C%20a%3Cyz%3E%3B%20
|
Удалив квотирование URL, это (с начальным и конечным пустым пространством):
Оператор
“
quote_ldap_dn
” спроектирован для использования на строках, являющихся частью базовых спецификаций DN, в запросех. Концептуально, вначале он конвертирует строку, вставляя обратный слэш перед любым из следующих символов:
Он также вставляет обратный слэш перед любыми пробелами или символом
“#
”, и перед конечными пробелами. (Правила находятся в RFC2253.) Тогда результирующая строка квотирована согласно правилам для URL. Например:
${quote_ldap_dn: a(bc)*, a<yz>; }
|
будет
%5C%20a(bc)*%5C%2C%20a%5C%3Cyz%5C%3E%5C%3B%5C%20
|
Удалив квотирование URL, получится (с конечными пробелами)
Есть некоторые дальнейшие комментарии о квотировании в секции о аутентификации LDAP, ниже.
9.16 Соединения LDAP
Подключение к серверу LDAP может быть через TCP/IP, или, когда используется OpenLDAP, через сокет UNIX. Пример, данный выше, не определяет сервер LDAP. Сервер, который доступен по TCP/IP, может быть задан в запросе, запуская его так:
ldap://<hostname>:<port>/...
|
Если порт (и предыдущее двоеточие) опущены, используется стандартный порт LDAP (389). Если в запросе не указан сервер, список дефолтовых серверов берётся из конфигурационной опции
“
ldap_default_servers
”. Он предоставляет список серверов, разделённых двоеточиями, пробуемых по очереди, пока запрос не будет успешно обработан, или не произойдёт серьёзная ошибка. Успешная обработка или вернёт запрошенные данные, или укажет, что они не существуют. Серьёзные ошибки - синтаксические, или много значений, когда ожидается только одно. Ошибки, приводящие к пробе следующего сервера - сбои подключения, привязки, и таймауты.
Для каждого имени сервера, в списке, можно задать номер порта. Стандартный способ задания хоста и порта - использование двоеточия, как разделителя (RFC1738). Поскольку
“
ldap_default_servers
” - список значений разделённых двоеточиями, такие двоеточия должны быть удвоены. Например:
ldap_default_servers = ldap1.example.com::
145
:ldap2.example.com
|
Если
“
ldap_default_servers
” незадана, библиотеке LDAP передаётся URL безбез имени сервера, и используется дефолтовое значение библиотеки (обычно - локальный компьютер).
Если вы используете библиотеку OpenLDAP, вы можете соединится с LDAP-сервером используя сокет UNIX, вместо подключения через TCP/IP. Это задаётся использованием
“ldapi
” вместо
“ldap
” в LDAP-запросах. Нижеследующее (имеется ввиду - про
“ldapi
” - прим. lissyara), применяется только в OpenLDAP. Если exim скомпилен с поддержкой различных LDAP-библиотек, эта возможность недоступна.
Для этого типа соединения, вместо имени хоста, требуется имя-путь сокета, и номер порта неуместен. Имя-путь может быть указано как элемент в
“
ldap_default_servers
”, или встроено в запрос. В первом случае, вы будете иметь настройки типа таких:
ldap_default_servers = /tmp/ldap.sock : backup.ldap.your.domain
|
Когда путь с именем указываются в запросе, вы должны заменить прямые слэши последовательностью
“%2F
” для соблюдения синтаксиса LDAP URL. Например:
${lookup ldap {ldapi://%2Ftmp%2Fldap.sock/o=...
|
Когда exim производит поиск LDAP, и находит, что
“имя хоста
” (
“hostname
”) - реальный путь к сокету, он использует код сокета UNIX, даже если запрос задаёт использование
“ldap
” или
“ldaps
”. В частности, для соединения с сокетом не используется шифрование. Это поведение означает, что вы можете использовать настройки, например,
“
ldap_default_servers
”, в примере выше, с традиционными
“ldap
” или
“ldaps
”, и эо будет работать. Вначале, exim пробует соединиться через через сокет UNIX; если это не удаётся, он пробует подключиться по TCP/IP к резервному хосту.
Если в запросе задаётся явный тип
“ldapi
”, при указанном имени хоста, диагностируется ошибка. Однако, если есть другие элементы в
“
ldap_default_servers
”, пробуются они. Другими словами:
Использование пути к сокету с
“ldap
” или
“ldaps
” вызывает использование интерфейса сокета UNIX.
Использование
“ldapi
” с именем хоста вызывает ошибку.
Использование
“ldapi
” без хоста или пути в запросе, и без установки
“
ldap_default_servers
”, делает то, что библиотека делает по умолчанию.
9.17 Аутентификация LDAP и управляющая информация
Синтаксис LDAP URL не предоставляет пути передачи аутентификационной и иной управляющей информации на сервер. Чтобы сделать это возможным, URL в запросе LDAP может предшествоваться любым числом установок
“
<name>=<value>
”, разделённых пробелами. Если значение содержит пробелы, они должны быть помещены в двойные кавычки, и, когда используются двойные кавычки, надо использовать обратный слэш, как обычно. Распознаются следующие имена:
имя
|
значение
|
DEREFERENCE
|
установить параметр разименования
|
NETTIME
|
установить таймаут сетевой операции
|
USER
|
установить DN для аутентификации связи LDAP
|
PASS
|
установить пароль для аутентификации связи LDAP
|
SIZE
|
установить ограничение числа возвращаемых входов
|
TIME
|
установить таймаут запроса
|
|
Значение параметра
“DEREFERENCE
” должно быть одним из слов
“never
”,
“searching
”,
“finding
”, или
“always
”.
Имя
“CONNECT
” - устаревшее имя
“NETTIME
”, сохраненноё для обратной совместимости. Этот таймаут (заданный как число секунд) устанавливатся с клиентской стороны, для операций, который могут быть выполнены по сети. Специально, это применяется к сетевым соединениям и вызовам функции
“
ldap_result()
”. Если значение больше чем ноль, используется LDAP_OPT_NETWORK_TIMEOUT, если задано в заголовках LDAP (OpenLDAP), или, если в заголовках LDAP (Netscape SDK 4.1) задано LDAP_X_OPT_CONNECT_TIMEOUT. Нулевое значение вызывает явную установку
“no timeout
” для Netscape SDK; для OpenLDAP никакого действия не происходит.
Параметр TIME (также число секунд) передаётся на сервер для установки серверных ограничений на время потраченное на поиск.
Вот пример запроса LDAP в поиске exim`a, использующем некотрые из этих значений. Это - одна строка, перенесённая, чтобы поместиться на странице:
${lookup ldap
{user="cn=manager,o=University of Cambridge,c=UK" pass=secret
ldap:///o=University%20of%20Cambridge,c=UK?sn?sub?(cn=foo)}
{$value}fail}
|
Кодирование пробелов, как
“%20
” - из URL, его нелььзя делать для каких-либо вспомогательных данных. Конфигурационные настройки exim`a, включающие поиски содержащие информацию о пароле, необходимо предварять
“hide
”, чтобы предотвратить возможность увидеть эти значения не-административными пользователями, при использовании опции
“
-bP
”.
Вспомогательные данные могут быть даны в любом порядке. По умолчанию - таймаут отсутсвует (используется системный таймаут), нет пользователя или пароля, нет ограничений на число возвращённых значений, и нет ограничений по времени запроса.
Когда DN квотирован в USER= setting для LDAP аутентификации, exim удаляет любое URL-квотирование, которое может быть до LDAP. Очевидно, некоторые библиотеки делают это для себя, но некоторые нет. Удаление URL-квотирование даёт два преимущества:
Это позволяет использовать тоже самое раскрытие
“
quote_ldap_dn
” для USER= DNs, что и для DNs внутри фактических запросов.
Это разрешает пробелы внутри USER= DNs.
Например, настройка типа
USER=cn=${quote_ldap_dn:$1}
|
должна работать, даже если
“
$1
” содержит пробелы.
Раскрытые данные для PASS= value должны быть квотированы с использованием оператора раскрытия
“
quote
”, а не оператора квотирования LDAP. Единственная причина, по которой это поле нуждается в квотировании, состоит в том, чтобы гарантировать его соответствие синтаксису exim`a, который не разрешает пробелы вне кавычек. Например:
Аутентификационный механизм LDAP может использоваться для прокерки паролей, как часть SMTP-аутентификации. Смотрите условие ракрытия строки
“
ldapauth
” в разделе 11.
9.18 Формат данных возвращённых LDAP
Типы поиска
“
ldapdn
” возвращают Distinguished Name (отличительное имя) из единственного элемента, как последовательность значений, например:
cn=manager, o=University of Cambridge, c=UK
|
Тип поиска
“
ldap
” генерит ошибку, если более одного элемента соответствует фильтру поиска, тогда как
“
ldapm
” разрешает этот случай, и вставляет новую строку в результат, до данных от различных входов. Это возможно для многочисленных значений возвращённых для обоих
“
ldap
” и
“
ldapm
”, но в первом случае вы знаете, что независимо от возвращённого значения, исходили из одиночного вхождения в директории.
В общем случае, где вы задаёте один аттрибут в вашем LDAP-запросе, результат не квотируется, и не содержит имя атрибута. Если атрибут имеет множественные значения, они разделются запятыми.
Если вы определяете множественные тарибуты, результат содержит разделённые пробелами, квотированные строки, каждая с предшествующим именем атрибута и символом равно. В пределах кавычек, символ двойной кавычки, обратного слэша и новой строки экранируется обратным слэшем, и запятые используются для разделения многочисленных значений атрибута. В части для экранирования, строка внутри кавычекпринимает такую же форму как вывод, когда запрашивается единственный атрибут. Если никакие атрибуты не заданы, это тоже самое, что и задание всех атрибутов.
Это - некотрые примеры формата вывода. Превая строка каждой пары - запрос LDAP, и вторая - возвращённые данные. Атрибут называемый
“
attr1
” имеет два занчения, тогда как
“
attr2
” - лишь одно:
ldap:///o=base?attr1?sub?(uid=fred)
value1.
1
, value1.
2
ldap:///o=base?attr2?sub?(uid=fred)
value two
ldap:///o=base?attr1,attr2?sub?(uid=fred)
attr1="value1.
1
, value1.
2
" attr2="value two"
ldap:///o=base??sub?(uid=fred)
objectClass="top" attr1="value1.
1
, value1.
2
" attr2="value two"
|
Оператор
“
extract
” в раскытиях строки может быть использован для выбора индивидуальных полей из данных, состоящих из пар
“
key=value
”. Вы модете использовать опцию exim`a
“
-be
”, для хапуска теста раскрытия и таким образом проверить результаты поиска в LDAP.
9.19 Дополнительные сведения о NIS+
Запросы NIS+ состоят из
“
индексного имени
” (
“
indexed name
”) NIS+, сопровождаемого опциональным двоеточием и именем поля. Если это дано, разультат успешного запроса - содержимое именованного поля; иначе - результат состоит из объединённых пар
“
field-name=field-value
”, разделённых пробелами. пустые значения и значения содержащие пробелы помещаются в двойные кавычки. Например, запрос
[name=mg1456],passwd.org_dir
|
мог бы вернуть строку
name=mg1456 passwd="" uid=
999
gid=
999
gcos="Martin Guerre"
home=/home/mg1456 shell=/bin/bash shadow=""
|
(разбито на две строки чтобы пометиться на странице), тогда как
[name=mg1456],passwd.org_dir:gcos
|
вернул бы лишь
без кавычек. Поиск NIS+ неудачен если NIS+ возвращает больше одного элемента таблицы для данного индексного ключа. Эффект оператора раскрытия
“
quote_nisplus
” удваивает любые символы кавычек внутри текста.
9.20 Поиски SQL
Exim может поддерживать поиски в Interbase, MySQL, Oracle, PostgreSQL, и SQLite базах данных. Запросы для этих БД содержат SQL-выражения, таким образом, пример мог бы быть таким
${lookup mysql{select mailbox from users where id='userx'}\
{$value}fail}
|
Если результат запроса содержит более одного поля, данные возвращаются для каждого поля, предшествуеиые его именем, таким образом, результат
${lookup pgsql{select home,name from users where id='userx'}\
{$value}}
|
мог бы быть
home=/home/userx name="Mister X"
|
Пустые значения, и значения содержащие пробелы помещаются в двойные кавычки, внутренние кавычки экранируются обратным слэшем. Если результат запроса содержит лишь одно поле, значение возвращется дословно, без имени поля, например:
Если результат запроса приводит более чем к одной строке, они все объединяются, с новой строкой между данными для каждой строки.
9.21 Дополнительные сведения о MySQL, PostgreSQL, Oracle, и Interbase
Если используются какие-либо поиски в MySQL, PostgreSQL, Oracle, или Interbase, должна быть установлена опция
“
mysql_servers
”,
“
pgsql_servers
”,
“
oracle_servers
” или
“
ibase_servers
” (соответственно) в виде списка информации о сервере, разделённого двоеточиями. Каждый элемент в списке - разделённый слэшами список четырёх пунктов: имя хоста, имя БД, имя пользователя и пароль. В случае Oracle, поле имени хоста используется для
“имени сервиса
” (
“service name
”), поле имени базы данных не используется, и должно быть пустым. Например:
hide oracle_servers = oracle.plc.example//userx/abcdwxyz
|
Поскольку данные пароля секретны, вы всегда должны предшествовать настройку словом
“hide
”, для предотвращения просмотра установки неадминистративными пользователями при использовании опции
“
-bP
”. Вот пример, где перечислены два сервера MySQL:
hide mysql_servers = localhost/users/root/secret:\
otherhost/users/root/othersecret
|
Для MySQL и PostgreSQL, хост может быть задан как
“
<name>:<port>
”, но т.к. это список значений разделённых двоеточиями, то оно должно быть удвоено. Для каждого запроса, эти параметры групп проверяются, в порядке успешности соединенией и запросов.
Операторы раскрытия
“
quote_mysql
”,
“
quote_pgsql
” и
“
quote_oracle
” конвертируют новую строку, таб, возврат каретки и обратный слэш в
“\n
”,
“\t
”,
“\r
” и
“\b
” соответственно, и символы одиночной кавычки, двойной кавычки и обратного слэша экранируются обратным слэшем. Оператор раскрытия
“
quote_pgsql
”, кроме того, экранирует символы процента и подчёркивания. Это нельзя делать для MySQL, поскольку эти символы экранирования не распознаются в контексте, где они они не экранируют специальные символы.
9.22 Специальные возможности MySQL
Для MySQL, пустое имя хоста, или использование
“localhost
” в
“
mysql_servers
” вызывает соединение с сервером на локальном хосте через сокет UNIX. Альтернативный сокет может быть указан в круглых скобках. полный синтаксис каждого элемента в
“
mysql_servers
” таков:
<hostname>::<port>(<socket name>)/<database>/<user>/<password>
|
Любая из трёх частей первого поля может быть опущена. Для нормального использования на локальном хосте можно отсавить пробел, или установить лишь
“localhost
”.
Нет необходимости в указании БД, - если она тут отсутсвует, то должна быть дана в запросах.
Если запрос MySQL не возвращает никаких данных (команды insert, update, или delete), результат поиска - число затронутых строк.
Внимание: Это может ввести в заблуждение. Если обновление ничего, фактически, не меняет (например, устанаваливая поле на то же самое значение), результат - ноль, поскольку нет затронутых строк.
9.23 Специальные возможности PostgreSQL
Поиски в PostgreSQL также могут использовать сокет UNIX для соединения с БД. Обычно, это быстрей, и стоит меньше процессорного времени, чем подключение по TCP/IP. Однако он может использоваться лишь в случае, если сервер БД работает на той же самой машине, что и почтовый сервер. Конфигурационная строка для PostgreSQL, через сокет UNIX, выглядит так:
hide pgsql_servers = (/tmp/.s.PGSQL.
5432
)/db/user/password : ...
|
Другими словами, вместо имени хоста даётся путь к сокету. путь заключён в круглые скобки так, чтобы его прямые слэши не были визуально перепутаны с разделителями других параметров сервера.
Если запрос PostgreSQL не возвращает никаких данных (команды insert, update, или delete), результат поиска - число затронутых строк.
9.24 Дополнительные сведения о SQLite
SQLite отличается от других поисков SQL, поскольку требуется имя файла, в дополнение к SQL-запросу. БД SQLite - один файл, и нет демона, как в других БД. Интерфейс exim`a требует чтобы имя файла, как абсолютный путь, было задано в начале запроса. Оно отделяется от запроса пустым пространством. Это означает что путь и имя файла не могут содержать пустые символы. Вот пример раскрытия поиска:
${lookup sqlite {/some/thing/sqlitedb \
select name from aliases where id='userx';}}
|
В списке, похожий синтаксис. Например:
domainlist relay_domains = sqlite;/some/thing/sqlitedb \
select * from relays where ip='$sender_host_address';
|
Единственный символ, затрагиваемый оператором
“
quote_sqlite
” - символ одиночной кавычки, которую он удваивает.
Библиотека SQLite обрабатывает множественные одновременные доступы к БД внутренне. Множественные чтения разрешены, но лишь один процесс может производить обновление. Попытки обращения к БД, во время обновления, отклоняются после таймаута ожидания, в течение которого библиотека SQLite ждёт освобождения блокировки. В exim, дефолтовый таймаут установлен в 5 секунд, но это может быть изменено с помощью опции
“
sqlite_lock_timeout
”.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
10. Списки доменов, узлов, адресов и локальных частей [почтового] адреса
Многие конфигурационные опции Exim содержат списки доменов, узлов, email адресов, или локальных частей [почтового] адреса. Например, опция
“hold_domains
” содержит список доменов, для которых доставка на данный момент временно приостановлена. Эти списки также используются как данные в списках управления доступом (см. главу 39), и как параметры к условиям раскрытия, типа
“match_domain
”.
Каждый элемент в одном из этих списков - шаблон, проверяемый на соответствие домену, узлу, email адресу, или локальной части [почтового] адреса, соответственно. В секциях ниже описаны различные типы шаблонов для каждого случая, но сначала мы затронем некоторые общие средства, которые применяются для всех четырех типов списков.
10.1 Раскрытие списков
Каждый список раскрывается как одиночная строка перед использованием. Результатом раскрытия должен быть список, возможно, содержащий пустые элементы, разделённый на отдельные элементы для совпадения. По-умолчанию, символ-разделитель - двоеточие, но в случае необходимости он может быть изменён. Смотрите разделы 6.19 и 6.20 для деталей о синтаксисе списка; по второму линку обсуждается способ определения пустых элементов списка.
При неудачном раскрытии строки, Exim ведет себя так будто бы тестируемый элемент (домен, узел, адрес, или локальная часть [почтового] адреса) не в списке. Другие отказы раскрытия приводят к временным ошибкам.
Если элемент списка - регулярное выражение, знак обратного слеша, знак доллара и возможно другой спецсимвол в выражении, он должен быть защищен от неправильной интерпретации функцией раскрытия. Самый простой способ это сделать - использовать особенность раскрытия
“\N
”, чтобы обозначить что содержимое регулярного выражения не должно раскрываться. Например, в списке управления доступом вы можете указать:
deny senders = \N^\d{8}\w@.*\.baddomain\.example$\N : \
${lookup{
$domain}lsearch{/badsenders/bydomain}}
|
Первый элемент - это регулярное выражение защищенное от раскрытия указанием
“\N
”, а второй использует раскрытие для получения списка нежелательных отправителей на основе домена получателя.
10.2 Отрицаемые элементы в списках
Элемент в списке может положительным или отрицательным. Отрицательные элементы идентифицируются предшествующим знаком восклицания, за которым может следовать пробел. Список определяет набор элементов (доменов, etc). Когда Exim обрабатывает один из этих списков, он пытается найти домен, узел, адрес или локалую часть [почтового] адреса в наборе, определенном списком. Это работает так:
Список сканируется слева направо. Если совпадает положительный элемент, проверяется, установлена ли тема; если совпадает отрицательный - тема не устанавливается. Если достигнут конец списка и небыло совпадения темы ни с одним шаблоном, она устанавливается в последний элемент списка, если последний элемент был отрицательным, и не устанавливается если он был положительным.
domainlist relay_domains = !a.b.c : *.b.c
|
соответствует любому домену оканчивающемуся
“.b.c
” за исключением
“a.b.c
”. Домены не соответствующие ни
“a.b.c
” ни
“*.b.c
” не соответствуют, т.к. последний элемент списка позитивный. Тем не менее если бы было установлено
domainlist relay_domains = !a.b.c
|
тогда бы совпадали все домены кроме
“a.b.c
” т.к. последний элемент списка позитивный. Другими словами список, оканчивающийся отрицательным элементом интерпретируется так, как если бы он имел дополнительный элемент
“:*
” в конце.
Другой способ подумать о положительных и отрицательных элементах списков - это читать соединитель как
“или
” после положительных элементов, и как
“и
” - после отрицательных.
10.3 Имена файлов в списках
Если элемент списка доменов, хостов, адресов или локальных частей [почтового] адреса является абсолютным именем файла (начинается со знака слеша), каждая строка файла читается и обрабатывается так, как если бы это был независимый элемент списка, за исключением того, что не допускаются дальнейшие имена файлов, раскрытие данных из файла не происходит. Пустые строки файла игнорируются, файл также может содержать строки комментариев:
Для списков доменов и хостов если где-либо в строке файла встречается символ
“#
” он и все следующие символы игнорируются.
Т.к. локальные части [почтового] адреса могут содержать знаки
“#
” комментарий в списке адресов или локальных частей [почтового] адреса распознается только если
“#
” стоит после пробела либо в начале строки. Например:
not
#comment@x.y.z # but this is a comment
|
Указывая имя файла в списке имеет такой эффект как вставка каждой строки файла в качестве элемента в список (пустые строки и комментарии исключаются). Тем не менее есть одно важное отличие: файл читается при каждой обработке списка, таким образом если его содержимое периодически меняется, изменяется и поведение Exim.
Если имени файла предшествует восклицательный знак значение любых совпадений с файлом инвертируется. Например, если
hold_domains = !/etc/nohold-domains
|
и файл содержит строки
тогда
“a.b.c
” будет находится в списке доменов определенных в
“hold_domains
”, в то время как любой домен совпадающий с
“*.b.c
” - нет.
10.4 Файл
“lsearch
” не нелинейный список
Как будет описанов следующих секциях, поиски могут использоваться в списках, для обеспечения индексированных методов проверки списка членов. Было некоторое количество путанницы о способе работы
“lsearch
” со списками. Поскольку файл
“lsearch
” содержит простой текст и сканируется последовательно, то некоторые думают, что в него можно ставить групповые символы и другие переменные шаблоны. Это не так. Ключи в файле
“lsearch
”, всегда фиксированные строки, также как и для любого другого одноключевого поиска.
Если вы хотите использовать файл содержащий подстановочные паттерны являющиеся частью списка, просто дайте самостоятельное имя файла, без типа поиска, как описано в предыдущей секции.
10.5 Именованные списки
Списоку доменов, хостов, e-mail адресов или локальных частей адреса можно дать название, которое используется для обращения к списку в другом месте конфигурации. Это особенно удобно, если один и тот же список нужно использовать в нескольких различных местах. Например, часто задают спосок доменов называемый
“
local_domains
” для всех локальных доменов, обрабатываемых на этой машине, с использованием конфигурационной строки типа:
domainlist local_domains = localhost:my.dom.example
|
На именованный список можно ссылаться, давая его имя с предшествующим ему знаком
“+
”, например, роутер предназначенный для обработки локальных доменов, был бы сконфигурен со строкой:
Первый роутер в конфигурации, обычно, тот, который обрабатывает все домены, кроме локальных, используя конфигурацию с инвертированным элементом, как этот:
dnslookup:
driver = dnslookup
domains = ! +local_domains
transport = remote_smtp
no_more
|
Четыре вида именованных списков создаются конфигурационными строками, начинающимися со слов
“domainlist
”,
“hostlist
”,
“addresslist
” или
“localpartlist
” соответственно. Задаваемые вами списки помещайте после них. Например:
hostlist relay_hosts =
192
.
168
.
23
.
0
/
24
: my.friend.example
addresslist bad_senders = cdb;/etc/badsenders
|
Именованный список может обращаться к другим именованным спискам:
domainlist dom1 = first.example : second.example
domainlist dom2 = +dom1 : third.example
domainlist dom3 = fourth.example : +dom2 : fifth.example
|
Внимание: Если последний элемент, в списке на который ссылаются, отрицательный (инвертированный), то может быть вовсе не тот эфект, который вы ожидали, поскольку отрицание не передаётся на следующий (болеек высокий) уровень. Например, рассмотрите:
domainlist dom1 = !a.b
domainlist dom2 = +dom1 : *.b
|
Второй список задан:
“или в списке dom1 или *.b
”. Первый список задаёт только
“не a.b
”, таким образом домен
“x.y
” совпадает с ним. Это означает, что он также соответствует и второму списку. Эффект не такой же как:
domainlist dom2 = !a.b : *.b
|
что не соответствует
“x.y
”. Вообще, по возможности, лучше избегать отрицания в списках.
Именованные списки могут быть выгодны в плане производительности. Когда exim роутит адрес или проверяет входящее сообщение, он кэширует результаты теста именованного списка. Так, если у вас есть такой пункт:
в нескольких маршрутизаторах или нескольких ACL, то фактически, тестируется только в первом. Однако, кэширование работает, лишь если в пределах списка, или любых подсписков, нет раскрытий. Другими словами, кэширование происходит только для списков, про которые известно, что они будут одинаковыми при каждом обращении.
По умолчанию, могут быть до 16 именованных списков каждого типа. Этот предел может быть увеличен изменением компиляционной переменной. Использование списков хостов и доменов рекомендуется для концепции типа локальных доменов, релейных доменов и релейных хостов. В дефолтовом конфиге так и установлено.
10.6 Сравнение именованных списков с макросами
На первый взгляд, как могло бы показаться, в файле конфигурации, именованные списки неотличимы от макросов. Однако, макрос - лишь текстовая замена. Если вы напишете
ALIST = host1 : host2
auth_advertise_hosts = !ALIST
|
то оно, вероятно, не будет делать то, что вы хотите, потому что это, то же самое что и
auth_advertise_hosts = !host1 : host2
|
Заметтьте, что второе имя хоста не инвертировано. Однако, если вы используете список хостов, и напишете
hostlist alist = host1 : host2
auth_advertise_hosts = ! +alist
|
то отрицание применяется ко всему списку, и в итоге это эквивалентно
auth_advertise_hosts = !host1 : !host2
|
10.7 Кэширование именованных списков
При обработке сообщения exim кэширует результат проверки именованного списка, если есть уверенность, что список статический. Практически, это означает, что кэширование работает только если список не содержит символов
“$
”, что гарантирует, что список не будет изменяться при раскрытии. Однако, иногда, вы можете иметь раскрываемый список, про который вы знаете, что это в пределах одного сообщения это будет тот же самый список при кажой проверке. Например:
domainlist special_domains = \
${lookup{
$sender_host_address}cdb{/some/file}}
|
Это обеспечивает список доменов, который зависит лишь от IP-адреса хоста отправителя. Если этот список доменов используется неоднократно (например в нескольких строках ACL, или в нескольких роутерах), по дефолту, результат не кэшируется, поскольку exim не знает, что каждую проверку это будет один и тот же список.
Добавив
“_cache
” к
“domainlist
” вы можете сказать exim`y что результат можно кэшировать. Например:
domainlist_cache special_domains = ${lookup{...
|
Если вы сделаете это, то вы должны быть абсолютно уверенны, что кэшированный результат будет верен во всех случаях. Если вы сомневаетесь, не делайте этого.
10.8 Списки доменов
Списки доменов содержат паттерны, не совпадающие с почтовыми доменами. Следующие типы элементов могут использоваться в списках доменов:
Если паттерн состоит из из единственного символа
“@
”, он совпадает с именем локального хоста, установленному опцией
“primary_hostname
” (или по-умолчанию). Это позволяет использовать один и тот же конфигурационный файл на нескольких разных хостах, различающихся лишь названием.
Если паттерн содержит строку
“@[]
” - он совпадает с любым локальным IP-адресом (висящим на интерфейсах), находящемуся в квадратных скобках, как в адресе e-mail, в доменных литералах (это когда вместо имени хоста используется его IP-адрес). В сегоднящнем интернете, использование доменных литералов спорно...
Если паттерн состоит из строки
“@mx_any
”, то это совпадает с любым доменом, чья MX-запись указывает на локальных хост, или на люой хост который перечислен в
“hosts_treat_as_local
”. Элементы
“@mx_primary
” и
“@mx_secondary
” являются подобными, за тем исключением, что первый соответствует лишь в случае если первичных MX указывает на локальную машину, а второйлишь когда нет парвичной записи MX указывающей на локалхост, но на него указывает вторичная MX-запись.
“Первичная
” MX запись, означает, что у неёё самое маленькое значение, и их может быть более одной.
Поиск MX, соответствующей образцу, выполняется с опциями резольвера для отключения раскрытия имён. Таким образом, например, однокомпонентный домен не будет раскрыт резольвером, добавлением дефолтового домена. Смотрите опции
“qualify_single
” и
“search_parents
” роутера
“dnslookup
” для подробной информации о раскрытии домена.
Иногда можно игнорировать определённые IP-адреса, при использовании одного из этих паттернов. Вы можете задать их сразу за образцом, при помощи
“/ignore=<ip list>
”, где
“<ip list>
” - список IP-адресов. ПРи обработке паттерна, эти адреса игнорируются (сравните с опцией
“ignore_target_hosts
” в роутере). Например:
domains = @mx_any/ignore=
127
.
0
.
0
.
1
|
Этот пример совпадает с любым доменом имеющим MX-запись указывающую на один из IP-адресов локальной машины, за исключением 127.0.0.1.
Список IP-адресов обрабатывается тем же самым кодом, который обрабатывает список хостов, таким образом тут можно писать сети в виде CIDR, и также тут могут находится негативные элементы.
Поскольку список IP-адресов является подсписком внутри списка доменов, вы должны быть осторожны, при использовании разделителей если тут больше одного адреса. Как и в любом другом списке, дефолтовый разделитель может быть заменён. Таким образом, можно сделать так:
domains = @mx_any/ignore=<;
127
.
0
.
0
.
1
;
0
.
0
.
0
.
0
: \
an.other.domain : ...
|
чтобы подсписок использовал в качесте разделителя точку с запятой (
“;
”). При использовании адресов IPv6, полезно поменять разделитель и для главного списка:
domains = <? @mx_any/ignore=<;
127
.
0
.
0
.
1
;::
1
? \
an.other.domain ? ...
|
Если паттерн начинается со звёздочки (
“*
”), оставшиеся символы паттерна сравниваются с последними символами домена. Использование звёздочки в списках доменов отличается от её использования в частично соответствующих поисках. В списке доменов, символ следующий за звёздочкой не должен быть точкой, тогда как частичное соответствие работает лишь в разделённых точкой компонентах. Например, элемент списка доменов типа
“*key.ex
” совпадает с
“
donkey.ex
” также как и с
“
cipher.key.ex
”
Если паттерн начинается с символа крышки (
“^
”), то он обрабатывается как регулярное выражение, и совпадает с доменом с использованием соответствующей функции регулярного выражения. Крышка обрабатывается как часть регулярного выражения. Справочная информация описывающая синтаксис регулярных выражений дается в главе 8.
Предупреждение: Поскольку список доменов раскрыватся до обработки, необходимо предварить обратным слешем символы обратного слэша и доллара
“$
”, или использовать специальную последовательность
“\N
” (смотрите раздел 11) для определения того, что не надо раскрывать (если вы действительно не хотите строить регулярное выражение при помощи раскрытия, разумеется).
Если паттерн начинается с имени одноключевого поиска, сопровождающегося точкой с запятой (например,
“dbm;
” или
“lsearch;
”), то остаток паттерна должен быть именем файла в подходящем для поиска формате. Например, для
“cdb;
” это должен быть абсолютный путь:
domains = cdb;/etc/mail/local_domains.cdb
|
Соответсвующий тип поиска производится по файлу, с использованием доменного имени как ключа. В большинстве случаев, данные которые ищутся не нужны, exim`а интересует лишь есть или нет ключ в файле. Однако, при использовании поиска для опции
“domains
” в роутере или
“domains
” кондишене ACL, данные сохраняются в переменной
“
$domain_data
” и могут быть использованы в других опциях роутера или в утверждениях, в той же самой ACL.
Любое имя типа одноключевого поиска может предваряться частью
“<n>-
”, где
“<n>
” опционально, например:
domains = partial-dbm;/partial/domains
|
Это вызывает частично-соответсвующую логику; описание как это работает, дано в секции 9.7.
Любой из одноключевых поисков может сопровождаться звёздочкой. Это вызывает поиск дефолтового значения для ключа содержащего единственную звёздочку, если первоначальный поиск неудачен. Это бесполезная особенность при использовании списка доменов для выбора специфического домена (поскольку совпадает любой домен), но но это может иметь значение если результат поиска используется через переменную раскрытия
“
$domain_data
”.
Если паттерн начинается с имени поиска в стиле запросов, сопровождаемого точкой с запятой (например,
“nisplus;
” или
“ldap;
”), оставшаяся часть паттерна должна быть соответсвующим запросом для поиска, как описано в разделе 9. Например:
hold_domains = mysql;select domain from holdlist \
where domain = '$domain';
|
В большинстве случаев, данные поиска не используются (так, для SQL-запроса, к примеру, не имеет значения выбираемое поле). Exim интересуется лишь тем, успешен запрос или нет. Однако, при использовании поиска в опции
“domains
” в роутере, данные содраняются в переменной
“
$domain_data
” и могут быть использованы в других опциях.
Если ни один из вышеупомянутых случаев не применяется, производится регистронезависмое текстовое сравнение между паттерном и доменом.
Вот пример, использующий несколько различных видов паттернов:
domainlist funny_domains = \
@ : \
lib.unseen.edu : \
*.foundation.fict.example : \
\N^[
1
-
2
]\d{3}\.fict\.example$\N : \
partial-dbm;/opt/data/penguin/book : \
nis;domains.byname : \
nisplus;[name=$domain,status=local],domains.org_dir
|
Тут очевидна обработка в различных режимах соответствия. Использование звёздочки быстрей чем регулярного выражения (имеется ввиду по трудоёмкости, т.е. процессорным ресурсам)и внесение в список нескольких имён, очевидно тоже. Использование поиска по БД или файлу - дорого (опять-таки - по процессорому времени), но это может оказаться единственным вариантом, если используются сотни имён. Поскольку паттерны проверяются по порядку, имеет смысл поместить самые вероятные (совпадающие чаще всего) выше.
10.9 Списки хостов
Списки хостов используются для контроля, что можно делать удалённым хостам. Например, некоторым хостам можно разрешить релей через локальную машину, и некоторым может быть разрешено использовать команду SMTP ETRN. Хосты могут быть идентифицированы двумя различными путями, по имени или по IP-адресу. В списке хостов некторые типы паттернов совпадают с именем хоста, и некоторые совпадают с IP-адресом. Вы должны быть особенно осторожны при использовании одноключевых поисков, и гарантировать что используется правильный ключ.
10.10 Специальные паттерны списка хостов
Если элемент списока хостов - пустая строка, то она совпадает только когда не используется удалённый хост. Так происходит при получении сообщения от локального процесса используя SMTP на стандартном вводе, т.е. когда не используется соединение TCP/IP.
Специальный паттерн
“*
” в списке хостов совпадает с любым хостом, или ни с каким хостом (наверное, имеется ввиду то самое подключение без TCP/IP, от локальных процессов). Фактически, ни имя ни Ip-адрес не просматриваются.
10.11 Паттерны списка хостов, совпадающие с IP-адресом
Если хост IPv4 соединяется с хостом IPv6 и запрос принимается на сокет IPv6, входящий адресна хосте IPv6 фигурирует как
“::ffff:<v4address>
”. Когда такой адрес проверяется в списке хостов, он сначала преобразуется в традиционный адрес IPv4. (Не все операционные системы принимают вызовы IPv4 на сокеты IPv6, поскольку были проблемы с безопасностью.)
Следующие типы паттернов в списках хостов проверяют удалённый хост, просматривая его IP-адрес:
Если паттерн - просто имя домена (не регулярное выражение, не начинается с
“*
”, не является разновидностью поиска), exim вызывает функцию операционной системы для нахождения ассоциации с IP-адресом (или адресами). По возможности, он использует функцию
“
getipnodebyname()
”, если же она недоступна, то
“
gethostbyname()
”. Обычно, она вызывает поиск в DNS. Результат сравнивается с IP-адресом хоста.
Если происходит временная проблема (типа таймаута DNS) при поиске имени хоста, происходит временная ошибка. Например, если список начинается с использования условия ACL, то ACL даёт
“задерживающий
” (
“defer
”) ответобычно приводящий к временной ошибке SMTP. Что происходит при невозможности найти адрес для имени хоста, описано ниже, в разделе 10.14.
Если паттерн -
“@
”, он заменяется первичным именем хоста, и используется как имя домена, как описано.
Если паттерн - IP-адрес, он сравнивается с IP-адресом хоста. Адреса IPv4 даются в нормальной нотации
“пунктирной четвёрки
”. Адреса IPv6 можно использовать в формате с двоеточием в качестве разделителя, но двоеточия должны быть удвоены, чтобы они не были приняты за разделитель, при использовании дефолтовго разделителя. Адреса IPv6 распознаются даже когда exim собран без поддержки IPv6. Это означает, что если они фигурируют в списке хостов только для IPv4, exim не станет из обрабатывать как имена хостов. Они - лишь адреса, которые никогда не совпадают с хостом клиента.
Если паттерн -
“@[]
”, он совпадает с IP-адресом любого интерфейса локального хоста. Например, если локалхост - хост IPv4 с одним адресом интерфейса 10.45.23.56, эти две ACL будут иметь одинаковый эффект:
accept hosts =
127
.
0
.
0
.
1
:
10
.
45
.
23
.
56
accept hosts = @[]
|
Если паттерн - IP-адрес со слешем и маской сети (например 10.11.42.0/24), он совпадает с IP-адресом хоста при такой маске. Это позволяет включать целую сеть хостов одним пунктом. Маска используется в CIDR-нотации; это задаёт число битов адреса, которые должны совпадать, начиная с конца адреса.
Отметтьте: Маска - это не число адресов, при этом это не самое большое число диапазона адресов. Это число битов в сетевой части адреса. Вышеупомянутый пример определяет 24-х битовую сетевую маску, таким образом она совпадает с 256 адресами в сети 10.11.42.0. Элемент типа
192
.
168
.
23
.
236
/
31
|
совпадает лишь с двумя адресами, 192.168.23.236 и 192.168.23.237. Маска со значением 32 для адреса IPv6 - тоже самое что её отсутствие; такому элементу соответствует единственный адрес.
Вот другой пример, показывающий сети IPv4 и IPv6:
recipient_unqualified_hosts =
192
.
168
.
0
.
0
/
16
: \
3ffe::ffff::836f::::/
48
|
Удвоение разделителей списка применяется лишь в случае когда эти элементы использубтся внутри строки списка хостов. Это не требуется при задании их внутри файла. Например:
recipient_unqualified_hosts = /opt/exim/unqualnets
|
может использовать файл содержащий
172
.
16
.
0
.
0
/
12
3ffe:ffff:836f::/
48
|
и будет иметь точно такой же эффект как и предыдущий пример. При использовании адресов IPv6 внутри строки, обычно более удобно использовать изменение символа разделителя. Такой список содержит теже самые две сети:
recipient_unqualified_hosts = <;
172
.
16
.
0
.
0
/
12
; \
3ffe:ffff:836f::/
48
|
Разделитель изменён на точку запятой использованием
“<;
” в начале списка.
10.12 Паттерны списка хостов для одноключевого поиска по имени хоста
Когда хост идентифицируется по одноключевому поиску его полного IP-адреса, паттерн принимает такой вид:
net-<single-key-search-type>;<search-data>
|
Например:
hosts_lookup = net-cdb;/hosts-by-ip.db
|
Текстовая форма Ip-адреса хоста используется как ключ поиска. Адреса IPv6 конвертируются к несокращённой форме, с использованием строчных букв, с точками в качестве разделителей, поскольку двоеточие - ограничитель ключа в файлах
“lsearch
”. [Двоеточия могут использоваться в внутри ключа в файлах
“lsearch
”, если пометить ключ в кавычки, но это было добавлено позже.] Данные возвращённые поиском не используются.
Одноключевые поиски также могут выполняться с использованием IP-адресов с маской, используя паттерн такой формы:
net<number>-<single-key-search-type>;<search-data>
|
Например:
Ip-адрес хоста замаскирован используя
“
<number>
” в качестве длинны маски. Текстовая строка создаётся из скрытого маской значения, сопровождаемого маской, и это иcпользуется как ключ поиска. Например, если у хоста IP-адрес 192.168.34.6, то ключ для вышеупомянутого примера -
“192.168.34.0/24
”. Адреса IPv6 конвертируются в текстовый вид, с использованием строчных букв, и точек, вместо двоеточия, в качестве разделителей, поскольку двоеточие - признак конца ключа в файлах
“lsearch
”. Всегда используются полные адреса IPv6, а не аббревиатуры.
Внимание: Специфические
“net32-
”(для адреса IPv4) или
“net128-
”(для адреса IPv6), не тоже самое что и специфическое
“net-
” без номера. В предыдущем случае ключевые строки включают значение маски, тогда как в последнем IP-адрес используется самостоятельно.
10.13 Паттерны списка хостов совпадающие по имени хоста
Существует несколько типов паттернов, требующих, чтобы exim знал имя удалённого хоста. Они являются подстановочными паттернами или поиском по имени. (Если полное имя хоста даётся без какого-либо подстановочного знака, оно используется для поиска соответствующего IP-адреса, как описано выше, в секции 10.11.)
Если при столкновении exim`a с одним из этих паттернов, удалённое имя хоста неизвестно, оно будет найдено по IP-адресу. Хотя многие сервера интернета являются вполне добросовестными, и имеют обратные DNS-записи, есть много хостов у которых её нет (прим. lissyara: иногда очень проблематично добиться от провайдера обратной записи, обусловлено это, по моему, тем что там работают люди понятия не имеющие как её прописать). Следовательно, имя не всегда может быть найдено, и это может привети к нежелательным эффектам. Позаботтьтесь об этом при конфигурировании списков хостов с подстановочными паттернами.Рассмотрите варант, если имя не может быть найдено.
Из-за проблем с разрешением имён хостов по IP-адресам, соответствие имён хостов не такое же как совпадение IP-адресов.
По-умолчанию, для нахождения имени хоста, exim делает обратный DNS-поиск; если в DNS имя не найдено, пробуются системные функции
“
gethostbyaddr()
” или
“
getipnodebyaddr()
” - какая доступна. Порядок, в котором производится поиск, может быть изменён установками опции
“host_lookup_order
”.
Есть несколько опций управляющих поведением в случае, если имя хоста не найдено. Они описаны ниже, в разделе 10.14.
В результате альясинга, хосты могут иметь более одного имени. При обработке любого из следующих типов паттернов, все имена хостов проверяются:
Если паттерн начинается с
“*
”, остаток элемента должен соответствовать концу имени хоста. Например,
“*.b.c
” совпадает со всеми хостами, имена которых заканчивается на
“
.b.c
”. Эта специальная простая форма используется, поскольку она очень часто необходима. Другие виды подстановок требуют использования регулярных выражений.
Если элемент начинается с
“^
”, то это берётся как регулярное выражение которое не совпадает с именем хоста. Например:
является регулярным выражением, совпадающим с двумя хостами
“
a.c.d
” или
“
b.c.d
”.Когда регулярное выражение используется в списке хостов, вы должны позаботится о том, чтобы обратный слэш (
“\
”) и символ доллара (
“$
”) не были неверно восприняты как часть раскрытия строки. Самый простой способ избежать этого - использовать
“\N
” для того чтобы отметить нужную часть строки как нераскрываемую.
sender_unqualified_hosts = \N^(a|b)\.c\.d$\N : ....
|
Предупреждение: Если вы хотите соответствия полному имени хоста, то вы должны включить символ
“$
” - закрывающий метасимвол в регулярном выражении, как в вышеупомянутом примере. Без этого, будет подходить всё, с совпадаюшим имененм хоста.
10.14 Поведение, когда IP-адрес не может быть найден
Когда обрабатывается список хостов, exim`y может понадобиться найти IP-адрес по имени (смотрите секцию 10.11), или имя хоста по IP-адресу (смотрите секцию 10.13). В любом случае, при невозможности найти информацию поведение одинаковое.
По-умолчанию, exim ведёт себя так, будто хост не совпадает со списком. Это не всегда совпадает с тем, что вам нужно. Для изменения поведения exim`a есть специальные элементы -
“+include_unknown
” или
“+ignore_unknown
” которые могут появляться в списке (на верхнем уровне, они не признаются в списках файлов).
Если любой элемент, который следует
“+include_unknown
” требует информации, которая не может быть найдена, exim ведет себя так, будто хост соответствует списку. Например,
host_reject_connection = +include_unknown:*.enemy.ex
|
отклоняет подключения от любых хостов, чьи имена совпадают с
“*.enemy.ex
”, и от тех хостов, чьи имена не могут быть найдены.
Если любой элемент, который следует
“+ignore_unknown
” требует информации, которая не может быть найдена, exim игнорирует этот пункт и переходит к оставшейся части списка. Например:
accept hosts = +ignore_unknown : friend.example : \
192
.
168
.
4
.
5
|
принимает (почту, видимо :))) от любого хоста, имя которого
“
friend.example
”, и от
“192.168.4.5
”, независимо найдено или нет его имя. Без
“+ignore_unknown
”, если имя
“192.168.4.5
” не найжено, почта отклоняется.
Оба элемента,
“+include_unknown
” и
“+ignore_unknown
” могут появляться в одном списке. Эффект от каждого длиться до следующего или до конца списка.
Заметтьте: Эта секция применяется к постоянным ошибкам поиска. Она не применяется к временным ошибкам DNS. Они всегда вызывают задержку сообщения (кроме тех случаев, когда
“dns_again_means_nonexist
” преобразовывает их в постоянные ошибки).
10.15 Список шаблонов хостов для одноключевого поиска по имени хоста
Если паттерн имеет форму
<single-key-search-type>;<search-data>
|
например
то выполняется одноключевой поиск, с использованием имени хоста в качестве ключа. Если поиск успешен, хост совпадает с элементом. Данные, возвращённые поиском, не используются.
Напоминание: С этим видом паттерна вы должны иметь имена хостов как ключи в файле, а не IP-адреса. Если вам нужно сделать поиск основанный на Ip-адресах, то необходимо предварить тип поиска преффиксом
“net-
” (смотрите секцию 10.12). Однако, ничто не препятствует вам использовать два элемента в одном списке, один для поиска адреса, другой для поиска имени, с использованием обоими одного и тогоже файла.
10.16 Список шаблонов хостов для поиска в стиле запросов
Если паттерн имеет форму
<query-style-search-type>;<query>
|
то выполняются запросы, если они успешны, имя хоста совпадает с элементом. Данные, которые искались, не используются. Переменные
“
$sender_host_address
” и
“
$sender_host_name
” могут использоваться в запросе. Например:
hosts_lookup = pgsql;\
select ip from hostlist where ip='$sender_host_address'
|
Значение переменной
“
$sender_host_address
” для адреса IPv6 содержит двоеточия. Если вам необходимо, вы можете использовать элемент раскрытия
“sg
” для изменения этого. Если хотите использовать адреса с маской, то можете использовать оператор раскрытия
“mask
”.
Если запрос содержит ссылку на
“
$sender_host_name
”, exim автоматически ищет имя хоста, если это не было сделано раньше. (Смотрите секцию 10.13, для подробностей о поиске имён хостов.)
Историческое примечание: до релиза 4.30, exim всегда пытался найти имя хоста перез выполнением запроса, если типу поиска не предшествовало
“net-
”. Сейчас это не так. Для обратной совместимости,
“net-
” распознаётся при поиске в стиле запроса, но его присутствие или отсутствие не имеет никакого эффекта. (Разумеется, для одноключевых поисков,
“net-
” является важным. Смотрите секцию 10.12.)
10.17 Смешивание безразличных имён хостов и адресов в списках хостов
Если вы используете поиск имени или безразличного имени хоста и IP-адреса в одном списке хостов, то вы должны размещать IP-адреса вначале. Например, в ACL вы могли бы иметь:
accept hosts =
10
.
9
.
8
.
7
: *.friend.example
|
Причина этого, в том, что exim обрабатывает списки слева направо. Это позволяет проверить IP-адрес без запроса DNS, а при достижении элемента требующего разрешения имени в адрес происходит ошибка, если невозможно найти имя хоста для сравениея с паттерном. Если вышеупомянутый список был бы в обратном порядке, утверждение
“accept
” было бы неудачно для хоста имя которого найти невозможно, даже если его IP адрес 10.9.8.7.
Если же вам действительно необходимо проверять первыми имена, и продолжить проверять IP-адреса, то вы можете переписать эту ACL таким образом:
accept hosts = *.friend.example
accept hosts =
10
.
9
.
8
.
7
|
Если первый
“accept
” неудачен, exim продолжает проверять второе утверждение. Смотрите секцию 39, для получения подробной информации о ACL.
10.18 Списки адресов
Списки адресов содержат паттерны совпадающие с почтовыми адресами. Есть лишь один специальный случай: адрес отправителя для рикошета всегда пустой. Вы можете проверить это, задав пустой элемент в списке адресов. Например, вы могли бы установить опцию маршрутизатора, для обработки рикошетов:
Присутствие двоеточия означает пустой элемент. Если никаких данных нет (в смысле, не было бы даже двоеточия - прим. lissyara), то список пуст и не соответствует вообще ничему. Пустой отправитель также может быть обнаружен регулярным выражением, соответствующим пустой строке, и поиском в стиле запросов, успешному в случае если переменная
“
$sender_address
” пуста.
Непустые элементы списка адресов могут быть прямыми адресами электронной почты. Например:
senders = jbc@askone.example : hs@anacreon.example
|
Разрешается некоторое число безразличий (т.е. шаблонов). Если паттерн содержит символ
“@
”, но он не регулярное выражение, и не начинается с типа поиска заканчивающегося точкой с запятой (описано ниже), локальная часть адреса сравнивается с локальной частью паттерна, которая может начинатсья со звёздочки. Если локальная часть совпадает, проверяется точно таким же образом для шаблона спика доменов. Например, домен может быть безразличным, обращаясь к именованному списку, или быть поиском:
deny senders = *@*.spamming.site:\
*@+hostile_domains:\
bozo@partial-lsearch;/list/of/dodgy/sites:\
*@dbm;/bad/domains.db
|
Если локальная часть начинается с восклицательного знака, требуется чтобы это было определно как регулярное выражение, поскольку в противном случае восклицательный знак, как обычно в списках, будет воспринят как символ отрицания.
Если непустой паттерн не регулярное выражение, или поиск не содержит символ
“@
”, это сравнивается с доменной частью адреса. Так понимаются только два формата - литеральный домен (домен в виде IP-адреса) или шаблон домена начинающийся со звёздочки. В обоих случаях, эффект точно такой же, как будто
“*@
” предшествовала паттерну. Например:
deny senders = enemy.domain : *.enemy.domain
|
Следующие виды более сложных видов паттернов списков адресов могут совпадать с любым адресом, включая пустой адрес, являющийся характеристикой (видимо, признаком - прим. lissyara) отправителей рикошета:
Если (после раскрытия) паттерн начинается с
“^
”, регулярное выражение сравнивается с полным адресом, с паттерном в качестве регулярного выражения. Вы должны позаботится о том, чтобы символы обратного слэша (
“\
”) и доллара (
“$
”) не были неправильно восприняты как часть раскрытия строки.Самый простой способ избежать этого - использовать
“\N
” чтобы отметить эту часть строки как нераскрываемую. Например:
deny senders = \N^.*this.*@example\.com$\N : \
\N^\d{8}.+@spamhaus.example$\N : ...
|
Последовательность
“\N
” удаляется при раскрытии, таким образом элементы действительно начинаются с крышки (
“^
”), к тому времени как они интерпретируются как паттерн адреса.
Полные адреса могут искаться с использованием паттерна который с типа поиска завершаемого точкой с запятой, и сопровождаемого данными для поиска. Например:
deny senders = cdb;/etc/blocked.senders : \
mysql;select address from blocked where \
address='${quote_mysql:$sender_address}'
|
Могут использоваться и одноключевой стиль, и стиль запросов. Для одноключевого типа, exim использует полный адрес как ключ. Однако, пустые ключи не поддерживаются одноключевым поиском, таким образом, сравнение с пустым адресом всегда будет неудачно. Это ограничение не применяется к поиску в стиле запросов.
Частичное соответствие для одноключевых поисков (раздел 9.7) не может использоваться, и игнорируется, если задано, с записью в журнал событий (paniclog). Однако, вы можете сконфигурить дефолтовые параметры поиска, как описано в секции 9.6, но это полезно лишь для значений по-умолчанию типа
“*@
”. Например, с этим поиском:
accept senders = lsearch*@;/some/file
|
файл может содержать строки типа таких:
user1@domain1.example
*@domain2.example
|
и для адреса отправителя
“
nimrod@jaeger.example
” последовательность пробуемых ключей будет:
nimrod@jaeger.example
*@jaeger.example
*
|
Предупреждение 1: Не включайте строку
“*
” в ключевой файл, поскольку это означало бы что соответсвие любому адресу, делая эту проверку бесполезной.
Предупреждение 2: Не путайте эти два вида элементов:
deny recipients = dbm*@;/some/file
deny recipients = *@dbm;/some/file
|
Первый, по-дефолту, производит полный поиск адреса, как описано, поскольку он начинается с типа поиска. Второй сравнивается с локальной и доменной частью независимо, как описано ниже.
Следующие виды паттерны списков адресов могут совпадать лишь с непустыми адресами. Если адрес пуст, сравнение с любым из этих типов паттернов неудачно.
Если паттерн начинается с
“@@
” сопровождаемых элементом одноключевого поиска (например @@lsearch;/some/file), проверяемый адрес разбивается на локальную и доменную части. Домен ищется в файле. Если он там не найден, в этом пункте нет соответствий. Если он найден, найденные в файле данные обрабатываются как список паттернов локальных частей, разделённых двоеточиями, каждый из которых, по очереди, сравнивается с локальной частью.
Поиск может быть частичным, и/или одним относящимся к поиску с дефолтовым ключом
“*
” (смотрите раздел 9.6). Искомая локальная часть паттерна, может быть регулярным выражением, или начинаться с
“*
”, или даже к будущему поиску. Также, они могут быть независмо инвертированы. Например:
deny senders = @@dbm;/etc/reject-by-domain
|
данные из DBM файла, могли бы содержать строки:
baddomain.com: !postmaster : *
|
для отклонения всех отправителей, кроме
“postmaster
” из этого домена.
Если требуется, чтобы локальная часть, начиналась с восклицательного знака, это должно быть определено с использованием регулярного выражения. В файлах
“lsearch
”, отдельные записи могут быть разбиты на несколько строк, для выравнивания, но разделяющие двоеточия всё ещё могут включаться в перевод строки. Пустое место вокруг двоеточий игнорируется. Например:
aol.com: spammer1 : spammer2 : ^[
0
-
9
]+$ :
spammer3 : spammer4
|
Как и во всех списках exim`a, разделённых двоеточиями, двоеточие может быть включено в элемент, путём его (двоеточия) удвоения.
Если последний элемент списка начинается с правй угловой скобки (
“>
”), остаток элемента берётся как новый ключ поиска для получения списка продолжения локальных частей. Новый ключ может быть последовательностью символов. Таким образом омжно иметь такие вхождения в файле
aol.com: spammer1 : spammer
2
: >*
xyz.com: spammer3 : >*
*: ^\d{8}$
|
в файле который ищется с
“@@dbm*
”, для задания совпадения с 8-цифровой локальной частью для всех доменов, в дополнение к специфическим локальным частям перечисленным для каждого домена. Конечно, использование этой особенности стоит другого поиска каждый раз когда цепочка сопровождается (видимо, символом
“>
” - прим. lissyara), но целью было уменьшить нагрузку.
При использовании этого средства, возможно создание петель, и для того чтобы их выявить, цепочки не могут содержать более пятидесяти элементов.
Стиль
“@@<lookup>
” элемента может использоваться для поиска в стиле запросов, но в этом случае, средство цепочек недоступно. Поиск может вернуть только один список локальных частей.
Предупреждение: есть важное различие между элементами списка адресов в этих двух примерах:
senders = +my_list
senders = *@+my_list
|
В первом,
“my_list
” является именованым списком адресов, тогда как во втором примере - именованный список доменов.
10.19 Регистр букв в списках адресов
Домены в e-mail адресах всегда обрабатываются регистронезависимо, но для локальных частей, на некоторых системах, это может быть существенно (смотрите
“caseful_local_part
” для разъяснения того, как exim работает с этими адресами при роутинге). Однако, RFC 2505 (
“
Anti-Spam Recommendations for SMTP MTAs
” - антиспамовые рекомендации для SMTP MTA) предлагает чтобы соответствие адресов спискам заблокированных было сделано в регистронезависимой маненре. Так как большинство списков адресов в exim`e используется для этого вида управления, exim пытается сделать это (регистронезависимый поиск, видимо - прим. lissyara) по-умолчанию.
Доменная часть адреса всегда переводится в нижний регистр до сравнения её со списком адресов. Локальная часть, по дефолту, переводится в нижний регистр, и любые производимые сравнения строки делаются регистронезависимо. Это значит, что данные могут быть непосредственно в списках адресов, в файлах включаемых простые имена файлов, и в любых файлах в которых производится поиск с использованием механизма
“@@
”, могут быть в любом регистре. Однако, ключи в файлах, поиск в которых производится по типу отличному от
“lsearch
” (который выполняется регистронезависимо), должны быть в строчных буквах, поскольку в них поиск регистрозависим.
Для разрешения регистрозависимого совпадения в списках адресов, если элемент списка адресов является строкой
“+caseful
”, оригинальный регистр локальной части восстанавливается для любого проводимого сравнения, и сравнения строк становятся регистрозависимы. Это не затрагивает домен, остающийся в нижнем регистре. Однако, хотя независимые сравнения доменов остаются регистронезависимы, регулярные выражения производящие сравнение со всем адресом, становятся регистрозависимыми после того, как был обнаружен пункт
“+caseful
”.
10.20 Списки локальных частей
Чувствтительность к регистру в списках локальных частей обрабатывается таким же образом для списков адресов, как только что описано. Элемент
“+caseful
” может использоваться, по необходимости. В установке опции
“local_parts
” в роутере с установленным в
“false
” пунктом
“caseful_local_part
” адрес в строчных буквах и изначально сравнивается регистронезависмо. В этом случае,
“+caseful
” восстановит регистрозависимое сравнение в списках локальных частей, но не в других местах роутера. Если в роутере опция
“caseful_local_part
” установлена в
“true
”, сравнение в опции
“local_parts
” регистрозависимо с начала маршрутизатора.
Если список локальных частей расположен в файле (смотрите секцию 10.3), комментарии обрабатываются также как и списки адресов - они распознаются лишь в случае, если символу
“#
” предшествует пустой символ, или символ начала новой строки. Иначе, списки локальных частей сравниваются точно также как и списки доменов, за исключением специальных элементов относящихся к локальному хосту (
“@
”,
“@[]
”,
“@mx_any
”,
“@mx_primary
” и
“@mx_secondary
”) которые не распознаются. Обратитесь к секции 10.8 для получения дополнительных деталей о других доступных типах элементов.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
11. Раскрываемые строки
Mногие строки, конфигурации exim, раскрываются перед использованием. Одни раскрываются каждый раз, при использовании, другие же, раскрываются лишь один раз.
Раскрытие строки - дословное копирование её слева направо, исключая символы доллара (
“$
”) и обратного слэша. Символ
“$
” задаёт начало части строки, которая интерпретируется и заменяется, как описно ниже, в разделе 11.5. Обратный слэш используется как экранирующий символ, как описано в следующем разделе.
11.1 Дословный текст в раскрываемых строках
Неинтерпретируемый
“$
” может быть включен в раскрываемую строку, путём помещения перед ним обратного слэша.Обратные слэш может быть использован для экранировки любого специального символа, который может быть развёрнут, включая экранирование самого себя, обратного слша. Если используестя строка в кавычках, должны использоваться два обратных слэша, поскольку кавычки сами вызывают интерпретацию обратного слэша, при чтении строки (смотрите секцию 6.16).
Часть строки может быть определна как нераскрываемая, при помощи помещения её между двумя символами \N. Это необходимо для защиты регулярных выражений, которые часто содержат символы
“$
” и
“\
”. Например:
deny senders = \N^\d{8}[a-z]@some\.site\.example$\N
|
При достижении первого символа \N экспандер копирует последующие символы без интерпретации, пока не достигнет следующего символа \N или новой строки.
11.2 Последовательности с обратным слэшем, в расширенных строках.
Обратный слэш, с последующим за ним символом
“n
”,
“r
”, или
“t
” - это специальная последовательность, означающая новую строку, возврат каретки, и табуляцию, соответствено. если за обратным слешем следует три восьмеричных цифры, то это расшифровывается как восьмеричная запись единичного символа, а если за обратным слешем следует символ
“x
” и до двух шестнадатеричных цифр - то это тракутется как шестнадцатеричная запись символа.
Эти последовательности распознаются и внутри кавычек. Их интерпретация, как есть, полезна в строках без кавычек, и в других случаях поиска строк, которые могут быть раскрыты.
11.3 Тестирование раскрываемых строк.
Очень многие, раскрываемые, строки могут быть проверены, путём вызова exim с опцией
“
-be
”. В этом случае принимаются параметры команды, или строки со стандартного ввода, если аргументов нет, выполняет их через код раскрытия строк, и пишет результат на стандартный вывод. Переменные, основанные на конфигурации, установлены, но т.к. не обрабатывается никакое сообщение, переменные типа $local_part не имеют никакого значения. Однако, опцию
“
-be
” можно применять для проверки файлов и обращений к БД, а также для проверки раскрытия операторов раскрытия, типа
“
sg
”,
“
substr
” и
“
nhash
”.
Exim управляет root`овыми привилегиями, при вызове его с опцией
“
-be
”, и выполняется под uid и gid пользователя, вызвавшего его, для того чтобы пользователь использующий опцию
“
-be
” не смог получить доступ к файлам, которые ему не принадлежат.
11.4 Принудительный отказ от раскрытия строки.
Множество раскрытий, описанных в следующем разделе, имеют подстроки
“true
” и
“false
”, помещённые в в символах фигурных скобок. То, какая из двух строк используется, зависит от условия, которое тоже раскрывается. Если вместо
“false
” используется слово
“fail
” (не в фигурных скобках), раскрытие строки происходит неудачно, и может быть обнаружено кодом, который запрашивал раскрытие. Это называют
“принудительным отказом раскрытия
” и его последствия зависят от обстоятельств. В одних случаях это неотличимо от любой другой ошибки раскрытия, но в отдельных случаях может быть предпринять иное действие. Такие варианты упомянуты в документации раскрывемой опции.
11.5 Элементы раскрытия.
Следующие элементы распознаются в раскрываемых строках. Пустое пространство может использоваться между подпунктами, которые являются ключевыми словами, или подстроками снаружи фигурных скобок, для улучшения читабельности. Внимание: Внутри фигурных скобок, пустое пространство имеет значение.
$<имя переменной> или ${<имя переменной>}
Замена содержимым, переменной, например:
Вторая форма записи может быть использована для отделения, от имени переменной, последующих алфавитно-цифровых символов. Эта форма (с использованием фигурных скобок) доступна только для переменных; её нельзя применять для заголовков сообщений. Имена переменных приведены в секции 11.9. Если используется имя несуществующей переменной, то раскрытие терпит неудачу.
${<op>:<строка>}
Вначале раскрывается строка, а затем производится заданная <op> операция. Например:
Строка начинается с первого символа после двоеточия, которое может предворяться пустым пространством. Список операторов приведен в секции 11.6. Нотация оператора использует простое раскрытие элементов, которые могут иметь один аргумент, поскольку это уменьшает число фигурных скобок, и позволяет легче понимать итоговую строку.
${dlfunc{<file>}{<function>}{<arg>}{<arg>}...}
Это раскрытие динамически загружается, и затем вызывает локальную функцию, написанную на C. Такая функциональность доступна лишь в случае, если exim собран со следующим аргументом:
заданным в Local/Makefile. Однажды загруженный, exim запоминает динамически загруженный объект, так что не требуется перезагружать файлы объектов при работе того же процесса exim (но сам экзим, часто запускает свои новые копии, при работе).
У функции может быть от нуля до восьми аргументов. Собирая локальную функцию, вызываемую таким образом, необходимо включить local_scan.h. Переменные и функции exim`a, определённые в API также доступны для динамически загружаемых функций. Сама функция должна иметь следующий вид:
int dlfunction(uschar **yield, int argc, uschar *argv[])
|
Где
“uschar
” является
“typedef
” для
“unsigned char
” в local_scan.h. Функция должна возвратить одно из следующих значений:
OK: Успех. Строка, помещённая в переменную
“yield
” помещена в раскрытую строку и будет построена.
FAIL: Непринудительная неудача раскрытия, с сообщением об ошибках взятых из
“yield
”, если такое задано.
FAIL_FORCED: Принудительный отказ раскрытия, с сообзением об ошибках из
“yield
”, если такое задано.
ERROR: Тоже что и
“FAIL
”, за исключением, что пишутся ошибки в лог.
При использовании gcc для сборки такой функции, необходимо добавить ключ
“-shared
” к строке запуска gcc. Также в при сборке exim`a необходимо добавить
“-export-dynamic
” в EXTRALIBS.
${extract{<key>}{<string1>}{<string2>}{<string3>}}
Вначале раздельно раскрываваются
“key
” и
“<string1>
”. Начальные и замыкающие пустые символы (пробелы, табы) удаляются из
“key
” (но не из строк). Ключ (
“key
”) не должен состоять полностью из цифр. Раскрытая строка
“<string1>
” должна иметь форму:
<key1> = <value1> <key2> = <value2> ...
|
где знак равенства и пробел (но не оба одновременно) опциональны. Если любое из значений содержит пустые символы, они должны быть помещены в двойные кавычки, чтобы быть обработанными, как описано в разделе 6.16. Раскрытие
“<string1>
” - поиск значения соответствующего ключу. Поиск нечувсвителен к регистру. Если ключ найден,
“<string2>
” раскрывается, и заменяет элемент, иначе используется
“<string3>
”. В процессе раскрытия
“<string2>
” переменная $value содержит значение, которое было извлечено. Впоследствии, оно восстанавливается до предыдущего значение, которое, возможно, было.
Если
“{<string3>}
” отсутствует, элемент заменяется пустой строкой, если ключ не найден. Если
“{<string2>}
” также отсутствует, то используется значение, которое было извлечено. Таким образом, например, эти два раскрытия идентичны и уступают (видимо, соответствуют)
“2001
”:
${extract{gid}{uid=
1984
gid=2001}}
${extract{gid}{uid=
1984
gid=2001}{$value}}
|
Вместо
“{<string3>}
” может быть слово
“fail
” (не в фигурных скобках), например:
${extract{Z}{A=... B=...}{$value} fail }
|
Это вызывает
“принудительный отказ раскрытия
” (смотрите секцию 11.4);
“{<string2>}
” должна присутствовать, чтобы
“fail
” был распознан.
${extract{<number>}{<separators>}{<string1>}{<string2>}{<string3>}}
Аргумент
“number
” (число, в смысле цифра) должен полностью состоять из десятичных цифр, кроме начальных и конечных пустых символов, которые игнорируются. Это то, что отличает эту форму
“extract
” от предыдущего вида. Она ведёт себя точно также, за тем исключением, что вместо того, чтобы извлечь названное поле, оно извлекает из
“<string1>
” поле, номер которого даётся как первый аргумент. Вы можете использовать
“
$value
” в
“<string2>
” или
“fail
” вместо
“<string3>
” как и прежде.
Поля в строке разделены любым из символов в строке разделителя. Они мугут включать пустые символы и табы. Первое поле имеет номер один. Если номер отрицательный, то поля считаются с конца строки, считая что самое правое имеет номер
“-1
”. Если задано номер
“0
”, то возвращается вся строка, целиком. Если модуль числа (видимо, всё-таки, не модуль числа, а само число) больше чем число полей в строке, то результат - раскрытие строки
“<string3>
” или пучтая строка, если
“<string1>
” отсутствует. Например:
${extract{2}{:}{x:
42
:
99
:& Mailer::/bin/bash}}
|
вернёт
“42
” и
${extract{-4}{:}{x:
42
:
99
:& Mailer::/bin/bash}}
|
вернёт
“99
”. Два последовательных разделителя означают, что область между ними пуста (например пятая область, в предыдущем примере).
${hash{<string1>}{<string2>}{<string3>}}
Это - текстовая функция хэширования, и она была первой, осуществлённой в ранних версиях exim. В нынешних релизах добавлены другие функции работы с хэшами (числовой, MD5, и SHA-1), описанные ниже.
Первые две строки, после раскрытия, должны быть числами. Зовите их
“<m>
” и
“<n>
”. Если вы используете фиксированные значения для этих чисел, т.е.
“<string1>
” и
“<string2>
” не изменяются при раскрытии, вы можете использовать более простой синтаксис оператора, без использования некоторых фигурных скобок:
${hash_<n>_<m>:<string>}
Второе число является опциональным (в обоих нотациях). Если
“<n>
” больше или равно длинне строки, раскрытие строки вернёт саму строку. Иначе, будет вычислена новая строка с длинной
“<n>
”, с помощью применения функции хэширования к строке. Новая строка состоит из
“<m>
” символов взятых от начала строки.
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQWRSTUVWXYZ0123456789
|
Если
“<m>
” не задана, то используется значение
“26
”, с целью, чтобы были тока строчные буквы. Например:
$hash{3}{monty}} результат jmg
$hash{5}{monty}} результат monty
$hash{4}{62}{monty python}} результат fbWx
|
$header_<header name>: или $h_<header name>:
Смотрите $rheader ниже.
$bheader_<header name>: или $bh_<header name>:
Cмoтpитe $rheader ниже.
$rheader_<header name>: или $rh_<header name>:
Замена заголовка содержанием названной строки. Например:
Символ новой строки, который завершает строку заголовка не включен в раскрытие, но внутренние символы новой строки (разделяющие заголовок на на несколько строк) могут присутствовать.
Различие между
“rheader
”,
“bheader
”, и
“header
” в способе интерпретации данных в строке заголовка.
“rheader
” - выдаёт оригинальное содержимое (
“raw
”) заголовка, вообще без обработки, без удаления начального и конечного пустого пространства.
“bheader
” - удаляет пустые символы в начале и конце строки, затем декодирует base64 или экранированные кавычками MIME
“слова
” в пределах заголовка, но не производит трансляции символов. Если расшифровка MIME
“слов
” неудачна, возвращается
“raw
” строка. Если в результате расшифровки появляется символ двоичного нуля, он заменяется вопросительным знаком, это то, что делает exim с бинарными нулями, переданными в строке заголовка.
“header
” - пробует транслировать строку как
“bheader
”, к стандартному набору символов. Это - попытка воспроизвести ту же строку, которая была бы отображена MUA пользователю. Если трансляция неудачна, возвращается строка
“bheader
”. Попытки трансляции предпринимаются только на OC которые поддерживают функцию iconv(). Это указано при компиляции макросом
“HAVE_ICONV
”в системном Makefile или Local/Makefile.
В файле фильтра, целевой набор символов для заголовка может быть определен командой следующей формы:
headers charset "UTF-
8
"
|
Эта команда затрагивает все ссылки на расширения
“$h_
” (или
“$header_
”) в командах фильтра. В отсутствии этой команды, итоговый набор символов устанавливается из опции
“headers_charset
” в текущей конфигурации. Дефолтовые значения этих опий - значение
“HEADERS_CHARSET
” Local/Makefile. Окончательное значение по-умолчанию - ISO-8859-1.
Имена заголовков следуют синтаксису RFC 2822, в котором говориться, что они могут содержать любые символы, кроме пробелов и двоеточий. Следовательно, фигурные скобки, не заканчивают имена заголовков, и не могут использоваться для помещения в начале и конце, как в переменных. Попытка сделать такое - ошибка синтаксиса.
Только заголовки, являющиеся общими для всех копий сообщения видны этому механизму. Тут фигурируют только оригинальные заголовки, переданные с сообщением, и некоторые, добавленые правилами
“warn
”, или системным фильтром. Заголовки, добавленные к особой копии сообщения, роутером или транспортом - недоступны.
Для входящих SMTP сообщений, никакие заголовки не видны в ACL, в правилах до DATA ACL, поскольку структура заголовка не установлена, пока сообщение не получено. Заголовки, добавленные правилами
“warn
”, например в RCPT ACL, сохраняются до тех пор пока, недоступны заголовки входящего сообщения, в какой точке они добавлены. Однако, когда выполняются DATA ACL, заголовки добавленные другими ACL - видны.
В именах заголовков не имеет значения, какие используются буквы - заглавные, или строчные. Если следующий символ - пробел, то завершающее доеточие может быть пропущено, но это не рекомендуется, поскольку вы можете забыть об этом, когда оно понадобиться. Когда имя заголовка завершается пробелом, оно включается в раскрываемую строку. Если сообщение не содержит данный заголовок, раскрытие заменяется пустой строкой. (Смотрите условие определения в секции 11.7 для проверки существования заголовка.)
Если есть более чем один заголовок с одинаковым именем, то все они объединяются для формирования строки замены, максимальной длинны 64k. Символ новой сроки вставляется между каждой строкой. Для раскрытия заголовка, для тех заголовков, которые содержат список адресов, также вставляется запятая, между строками.
${hmac{<hashname>}{<secret>}{<string>}}
Эта функция использует криптографическое хэширование (либо
“MD5
” либо
“SHA-1
”), для конвертации пароля и текста, в код идентификации сообщения, как определено в RFC2104. Это отличается от
“${sha1:secret_text...}
” или
“${sha1:secret_text...}
”, в этом шаге
“hmac
” добавляет в подпись криптографический хэш допустимый для аутентификации, что невозможно только с
“MD5
” or
“SHA-1
”. Имя хэша, в настоящее время, должно быть либо
“MD5
” либо
“SHA-1
”. Например:
${hmac{md5}{somesecret}{
$primary_hostname $tod_log}}
|
Для имени хоста
“mail.example.com
” и времени
“2002-10-17 11:30:59
”, это будет:
dd97e3ba5d1a61b5006108f8c8252953
|
Как пример, где это можно использовать, вы могли бы поместить в основной части конфигурации экзима:
SPAMSCAN_SECRET=cohgheeLei2thahw
|
В роутере или транспорте можно было бы иметь:
headers_add = \
X-Spam-Scanned: ${primary_hostname} ${message_exim_id} \
${hmac{md5}{SPAMSCAN_SECRET}\
{${primary_hostname},${message_exim_id},$h_message-id:}}
|
Тогда данное сообщение, вы могли бы проверить, где оно было проверено, по заголовкам
“X-Spam-Scanned:
”. Если вы знаете секретную строку, то можно проверить подлинность этой строки, повторно вычислив опознавательный код из имени хоста, message ID и заголовка
“Message-id:
”. Это может быть сделано с использованием опции экзима
“
-be
”, или другими средствами, например использованием функции hmac_md5_hex() в Perl.
${if <condition> {<string1>}{<string2>}}
Если
“<condition>
” - истинно, то раскрывается
“<string1>
” и заменяет весь элемент; иначе используется
“<string2>
”. Доступные кондишены описаны в секции 11.7. Например:
${if eq {$local_part}{postmaster} {yes}{no} }
|
Вторая строка может не присутствовать, если условие не соответствует, и условие не истинно, элемент ничем не заменяется. Аналогично, слово
“fail
” может быть вместо второй строки (без фигурных скобок). В этом случае происходит принудительный отказ раскрытия, если условие не истинно (смотрите секцию 11.4).
Если отсутствуют обе строки, результат - строка
“true
” если условие истинно, и пустая строка если условие ложно. Это облегчает написание своих ACL и условий для роутеров. Например, вместо:
condition = ${if >{$acl_m4}{3}{true}{false}}
|
вы можете использовать
condition = ${if >{$acl_m4}{3}}
|
${length{<string1>}{<string2>}}
Элемент
“length
” используется для извлечения начальной части строки. Обе строки раскрываются, и первая должна вернуть число
“<n>
”. Если вы используете жёстко заданное число, т.е. строка
“<string1>
” при раскрытиии не изменяется, вы можете использовать более простую нотацию оператора, без некоторых фигурных скобок:
Результатом будет или первые
“<n>
” символов, или вся строка
“<string2>
”, смотря что короче. Не путайте
“length
” со
“strlen
”, возвращающей длинну строки.
${lookup{<key>} <search type> {<file>} {<string1>} {<string2>}}
Это первый из двух различных типов поиска отдельных элементов, оба которых описаны в следующем пункте.
${lookup <search type> {<query>} {<string1>} {<string2>}}
Две формы поиска определяют поиск данных в БД и файлах, как обсуждается в главе 9. Первая форма использует одноключевой поиск, а вторая использует стиль запросов для поиска. Строки
“<key>
”,
“<file>
”, и
“<query>
” раскрываются перед использованием.
Если есть пустые символы в элементе поиска как часть команды фильтра, правила повтора или перезаписи, правила роутинга для
“manualroute
”, или любого другого мета, где пустое пространство существенно, то элемент поиска должен быть заключён в двойные кавычки. Использование поиска данных в файлах фильтров пользователей может быть заблокировано системным администратором.
Если поиск успешен,
“<string1>
” раскрывается и замещает весь элемент. В процессе его раскрытия переменная $value содержит данные, возвращённые поиском. Впоследствии оно возвращается к предыдущему своему значению (внешне оно пустое). Если поиск неудачен, раскрывается
“<string2>
” и замещает элемент. Если
“<string2>
” пропущена, то замена - пустая строка, в случае неудачного поиска. Если
“<string2>
” присутствует, то она может быть самостоятельным вложенным поиском, таким образом обеспечивая механизм поиска значения по-умолчанию, в случае неудачи основоного поиска.
Если вложенный поиск используется как часть
“<string1>
”, $value содержит данные для внешнего поиска, когда параметры второго поиска раскрыты, и также когда
“<string2>
” второго поиска раскрыта, второй поиск будет неудачен (нихрена толком не понял этой фразы). Вместо
“<string2>
” можно использовать
“fail
”, и в этом случае, если поиск неудачен, с раскрытием происходит
“принудительный отказ при раскрытии строки
” (смотрите секцию 11.4). Если пропущены обе строки -
“<string1>
” и
“<string2>
” то результат - искомое значение в случае успешного поиска, и ничего в случае неудачи.
Для одноключевого поиска
“неполной
” строке разрешается предшествовать типу поиска, чтобы сделать частичное соответствие и * или *@ могут быть вместе со строкой поиска, для поиска по-умолчанию, если ключ не совпадает (смотрите секции 9.6 и 9.7 для деталей).
Если используется частичный поиск, переменные
“
$1
” и
“
$2
” содержат части ключа в процессе раскрытия текста замены. Они возвращаются к их предыдущим значениям после окончания поиска.
Вот пример поиска альяса
“postmaster
”`a в обычном файле альясов:
${lookup {postmaster} lsearch {/etc/aliases} {$value}}
|
Этот пример использует NIS+ для поиска полного имени пользователя, соответствующего локальной части адреса, с принудительным отказом раскрытия, в случае неудачи.
${lookup nisplus {[name=$local_part],passwd.org_dir:gcos} \
{$value}fail}
|
${nhash{<string1>}{<string2>}{<string3>}}
Три строки раскрываются; первые две должны вернуть числа. Зовите их
“<n>
” и
“<m>
”. Если вы используете жёско заданные значения этих чисел, т.е. если
“<string1>
” и
“<string2>
” не изменяются при раскрытии, то вы можете использовать более простую форму этого оператора, без использования некоторых фигурных скобок:
${nhash_<n>_<m>:<string>}
|
Второе число является опциональным (в обоих нотациях). Если тут только одно число, результатом будет число из диапазона от нуля до <n>-1. Иначе строка, обработанная функцией хэшрования, вернёт два числа, разделённых слэшем, в диапазонах от нуля до <n>-1 и от нуля до <m>-1, соответственно. Например:
${nhash{8}{64}{supercalifragilisticexpialidocious}}
|
вернёт строку
“6/33
”.
${perl{<subroutine>}{<arg>}{<arg>}...}
Этот элемент доступен лишь в том случае, если exim собран с встроенным интерпретатором perl. Имя подпрограммы и параметры, вначале, раздельно раскрываются, а затем вызывается подпрограмма perl с этими параметрами. Никакие дополнительные параметры передаваться не должны; максимальное разрешённое число аргументов, включая имя подпрограммы - девять.
Значение возвращённое подпрограммой вставляется в раскрываемую строку, за тем исключением, если возвращённое значение
“undef
”. В этом случае, раскрытие неудачно, точно также как при
“fail
” в поиске. Возвращённое значение - скалярная величина. Независимо от того, что вы возвращаете, оно будет скалярной величиной. Например, если вы вернёте имя вектора perl, возвращённое значение будет размер вектора, а не содержимое.
Если подпрограмма выполняется с вызовом функции perl die(), раскрытие неудачно, с сообщенем об ошибках, которые были переданы функцией die(). Больше информации, о встроенном perl можно получить из части 12.
Роутер
“redirect
” имеет опцию вызывающую
“forbid_filter_perl
”, которая блокирует использование этого пункта в файлах фильтра.
${prvs{<address>}{<secret>}{<keynumber>}}
Первый параметр - полный e-mail адрес, и второй - секретная ключевая строка. В третьем аргументе задаётся номер ключа, и он является опциональным. При его отсутствии значение по-дефолту - ноль. Результат раскрытия - prsv-подписанный адрес e-mail, типичное его использование - с опцией
“return_path
” транспорта
“smtp
” как часть проверки схемы адреса возврата (BATV). За дополнительной информацией и примерами обратитесь к секции 39.38.
${prvscheck{<address>}{<secret>}{<string>}}
Этот пункт - дополнение пункта
“prvs
”. Он используется для проверки prsv-подписанных адресов. Если раскрытие первого параметра не приводит к синтаксически правильному prsv-подписанному адресу, то всё раскрывается в пустую строку. Когда первый параметр раскрывается в синтаксически правильный prsv-подписанный адрес, второй аргумент раскрывается с prvs-расшифрованным адресом и ключевым числом, в переменных $prvscheck_address и $prvscheck_keynum соответственно.
Эти две переменные могут использоваться в раскрытии второго аргумента, для отыскания секретного слова. Тогда действительность prsv-подписанного адреса проверяется по нему. Результат сохраняется в переменную $prvscheck_result, пустую при ошибке и
“1
” при соответствии.
Третий параметр является дополнительным, если он отсутствует, то дефолт - пустая строка. Теперь этот параметр раскрыт. Если результат - пустая строка, то результат раскрытия - расшифрованная версия адреса. Проверяется, была ли сигнатура верной. Иначе, результат раскрытия - раскрытие третьего аргумента.
Все три переменные могут использоваться в раскрытии третьего параметра. Однако, по завершении раскрытия остаётся только $prvscheck_result. За дополнительной информацией и примерами обратитесь к секции 39.38.
${readfile{<file name>}{<eol string>}}
Вначале, раздельно раскрываются
“имя файла
” и
“набор символов конца строки
”. Затем читается файл, и его содержимое заменяет весь пункт. Символы новой строки в файле, заменяются строкой
“<eol string>
”, если они есть. Иначе, символы перевода строк оставляют на месте. Раскрытие строки не применяется к содержимому файла. Если же вы хотите этого, то необходимо поместить элемент в оператор
“expand
”. Если файл не может быть прочитан, раскрытие строки неудачно.
Роутер
“redirect
” имеет опцию
“forbid_filter_readfile
” которая блокирует использование этого пункта в пределах файлов фильтра.
${readsocket{<name>}{<request>}{<timeout>}{<eol string>}{<fail string>}}
Этот пункт вставляет данные из UNIX или Internet-сокета в раскрываемую строку. Минимальный способ использования требует только два аргумента, как в этих примерах:
${readsocket{/socket/name}{request string}}
${readsocket{inet:some.host:1234}{request string}}
|
Для UNIX-сокета, первая подстрока должна быть путём к сокету. Для Internet-сокета, первая подстрока должна содержать подстроку
“inet:
” сопровождаемую именем хоста или IP адресом, через двоеточие порт, или имя сервиса, которое должно быть в
“/etc/services
”. Опционально, IP-адрес может заключаться в квадратные скобки. Адреса IPv6 лучше записывать именно так. Например:
${readsocket{inet:[::
1
]:1234}{request string}}
|
Можно задать только одно имя хоста, но если поиск по нему приведёт более чем к одному IP-адресу, будут сделаны попытки соединиться с каждым из них, по очереди, пока не получиться подключиться. Для обоих видов сокетов, exim осуществляет подключение, пишет строку запроса (если она не пустая), и читает из сокета пока не наступит конец файла. Применяется таймаут в 5 секунд. Дополнительные аргументы могут продлить это время. Во-первых, можно изменить таймаут:
${readsocket{/socket/name}{request-string}{3s}}
|
Четвёртый аргумент позволяет изменить символ перевода строки в читаемых данных, таким же образом как и в
“readfile
” (смотрите выше). Этот пример превращает их в пробелы:
${readsocket{inet:
127
.
0
.
0
.
1
:3294}{request-string}{3s}{ }}
|
Как и во всех раскрытиях, подстроки раскрываются до начала обработки. Ошибки в под-раскрытиях приводят к ошибке самого раскрытия. Кроме того, могут встречаться такие ошибки:
Ошибка создания дескриптора файла сокета.
Ошибка соединения с сокетом.
Ошибка записи строки запроса.
Таймаут чтения из сокета.
По дефолту, любая из этих ошибок приводит к ошибке раскрытия. Однако, если вы используете пятый аргумент, раскрытие происходит, если встречается любая из вышеупомянутых ошибок. Например:
${readsocket{/socket/name}{request-string}{3s}{\n}\
{socket failure}}
|
Вы можете проверить существование Unix-сокета, поместив раскрытие в ${if exists, но получается проверка кто отработает быстрей - открытие сокета, или проверка его существования. Таким образом, более корректно использовать пятый параметр, чтобы быть уверенным в том что будет корректно обработана ошибка раскрытия несуществующего Unix-сокета, или ошибка соединения с интернет-сокетом.
Роутер
“redirect
” имеет опцию
“forbid_filter_readsocket
” которая блокирует использование этого пункта в пределах файлов фильтра.
$rheader_<header name>: or $rh_<header name>:
Этот пункт вставляет необработанные (
“raw
”) строки заголовка. Это описано в пункте
“header
”, выше.
${run{<command> <args>}{<string1>}{<string2>}}
Вначале, отдельно, раскрываются команда и её параметры, затем команда запускается отдельным процессом, но под теми же gid и uid. Как и во всех других командах, выполняемых exim, по дефолту shell не используется. Если вы хотите его использовать, то нужно явно указать это в коде.
Если команда выполняется успешно (возвращённый код равен нулю), то
“<string1>
” раскрывается и замещает строку; в процессе этого раскрытия стандартный вывод команды находиться в переменной $value. Если команда неудачна, то раскрывается и используется
“<string2>
”. Ещё раз, стандартный вывод команды, в процессе раскрытия находиться в переменной $value. Если
“<string2>
” отсутствует, то результат пуст. Альтернативно,
“<string2>
” может быть словом
“fail
” (не в фигурных скобках), для принудительного отказа от раскрытия, если команда не была успешно выполнена. Если пусты обе строки, то результат содержит стандартный вывод, в случае успеха и ничего не содержит в случае неудачи.
Код возврата команды помещается в переменную $runrc, и впоследствии остаётся установленным, поэтому, в файле фильтра можно делать так:
if "${run{x y z}{}}$runrc" is
1
then ...
elif $runrc is
2
then ...
...
endif
|
Если выполнение команды неудачно (например, команда не существет), то код возврата равен 127 - тот же самый код, который шеллы используют для несуществующих команд.
Предупреждение: В роутере или транспорте вы не можете установить порядок раскрытия опций, за исключением тех предварительный условий, чей порядок задокументирован. Похтому нельзя быть уверенным в том что находиться в $runrc, запуская команду в одной опции и используя эту переменную в другой.
Роутер
“redirect
” имеет опцию
“forbid_filter_run
” которая блокирует использование этого пункта в пределах файлов фильтра.
${sg{<subject>}{<regex>}{<replacement>}}
Этот пункт работает как оператор замены в perl, с глобальной опцией
“/g
”. Однако, в отличие от perl, exim не изменяет строку, вместо этого он возвращает строку для вставки в общее раскрытие. Есть три парааметра: строка объекта, регулярное выражение, строка замены. Например:
{sg{abcdefabcdef}{abc}{xyz}}
|
результат -
“xyzdefxyzdef
”. Поскольку все три параметра раскрываются перед использованием, то если в регулярном выражении необходимы символы
“$
” или символы содержащие обратный слэш, то они должны быть экранированы. Например:
${sg{abcdef}{^(...)(...)\$}{\$2\$1}}
|
вернёт
“defabc
”, и
${sg{1=A
4
=D
3
=C}{\N(\d+)=\N}{K\$1=}}
|
вернёт
“K1=A K4=D K3=C
”. Отметтьте использование
“\N
” для защиты регулярного выражения от раскрытия.
${substr{<string1>}{<string2>}{<string3>}}
Три строки раскрываются, первые две должны вернуть числа. Зовите их
“<m>
” и
“<n>
”. Если вы используете фиксированные значения для этих чисел, т.е.
“<string1>
” и
“<string2>
” не изменяются при раскрытии, вы можете использовать более простой синтаксис оператора, без использования некоторых фигурных скобок:
${substr_<n>_<m>:<string>}
|
Второе число опционально (в обоих нотациях). Если, в более простом формате, оно отсутствует, то предваряющее подчёркивание также должно быть опущено.
Элемент
“substr
” может использоваться для извлечения более коростких подстрок из более длинной. Первое число
“<n>
”, является смещением точки начала, второе -
“<m>
” - требуемая длинна. Например:
${substr{3}{2}{
$local_part}}
|
Если стартовое смещение - больше длинны строки - то результатом будет пустая строка; если сумма старта плюс длинна смещения - результатом будет правая часть строки начинающаяся с точки старта.Первый символ строки имеет позицию ноль.
Элемент
“substr
” может иметь отрицательные значения смещения, чтобы рассчитать позицию с правой стороны строки. Последний символ имеет значение смещения -1, предпоследний -2 и так далее. Вот пример:
${substr{-5}{2}{1234567}}
|
результат -
“34
”. Если абсолютное значение отрицательного смещения больше, чем длинна строки, то подстрока начинается с начала строки и её длинна уменьшается на величину проскакивания. Например:
вернёт пустую строку, но
вернёт
“1
”.
Когда второй параметр
“substr
” опущен, то берётся остаток строки, при положительном смещении. Если же смещение отрицательно, то берутся все символы строки, предшествующие точке смещения. Например, смещение -1 и никакая (нулевая) длинна, в этих одинаковых примерах:
${substr_-
1
:abcde}
${substr{-1}{abcde}}
|
вернёт всю строку, кроме последнего символа, т.е.
“abcd
”.
${tr{<subject>}{<characters>}{<replacements>}}
Этот элемент - посимвольная замена строки объекта. Второй аргумент - список символов, которые будут заменены в строке объекта. Каждый совпадающий символ заменяется соответствующим символом из списка замены. Например:
вернёт
“1b3de1
”. Если во второй строке символов есть повторения, то используется последний из символов. Если третья строка короче чем вторая, последний символ копируется. Однако, если она пуста, то замена не производиться.
11.6 Операторы раскрытия.
Для раскрывающихся элементов, которые выполняют преобразования на одном аргументе строки, используется нотация
“оператора
”, поскольку это проще, и используется меньше фигурных скобок. Подстрока раскрывается до того, как над ней будет проведена операция. Следующие операции могут быть выполнены:
${address:<string>}
Строка интерпретируется как адрес, согласно RFC2822, и поскольку это может фигурировать в строках заголовков, то из неё извлекается эффективный адрес. Если строку не удаётся успешно разобрать, то результат пуст.
${base62:<digits>}
Строка должна полностью состоять из десятичных цифр. Число конвертируется к основанию 62 выводится как строка из шасти символов, включая ведущие нули. В некоторых окружениях, где exim использует основание 36 вместо 62 для идентификаторов сообщений (поскольку эти системы не учитывают регистр символов в имени файла), основание 36 используется этим оператором несмотря на его название. Отметтьте: Чтобы было абсолютно ясно: это не кодирование base64.
${base62d:<base-62 digits>}
Строка должна полностью состоять из цифр с основанием 62, или, в операционных системах где exim использует основание 36 вместо 62, из цифр с основанием 36. Число преобразуется в десятичные цифры, и выводится как строка.
${domain:<string>}
Строка интерпретируется как адрес, в соответствии с RFC2822, и из нёё извлекается домен. Если строка не может быть корректно разобрана, то результат пуст.
${escape:<string>}
Если строка содержит какие-то непечатные символы (ага, слова из трёх букв, например :)), то они будут преобразованы к их escape-последовательностям, начинающимся с символа обратного слэша (
“\
”). Символы, с установленным битом значимости (так называемые
“8-ми битные символы
”) считаются
“печатными
” и не контролируются опцией
“print_topbitchars
”.
${eval:<string>} и ${eval10:<string>}
Эти пункты поддерживают простейшие арифметические операции в раскрываемых строках. Строка (после раскрытия) должна быть обычным арифметическим выражением, но оно ограничено пятью основными операторами (плюс, минус, умножение, деление и остаток) и круглыми скобками. Все операции выполняются с использованием арифметики целых чисел. Плюс и минус имеют меньший приоритет чем умножение, деление и остаток. Операторы с одинаковым приортитетом оцениваются слева направо.
В
“eval
” числа могут быть десятичными, восьмеричными (начинаются с
“0
”) или шестнадцатеричными (начинаются с
“0x
”). В
“eval10
” все числа считаются десятичными, даже если они начинаются с нуля. Это может оказаться полезным при обработке чисел извлечённых из дат и времени, они часто содержат ведущие нули.
Число может сопровождаться
“K
” или
“M
” для умножения его на 1024 или 1024*1024, соответственно. Поддерживаются отрицательные числа. Результат вычисления - десятичное число (без
“K
” или
“M
”). Например:
${eval:
1
+1} результат
2
${eval:
1
+2*3} результат
7
${eval:(
1
+
2
)*3} результат
9
${eval:
2
+42%5} результат
4
|
Как более реалистичный пример, в ACL можно использовать так:
deny message = Too many bad recipients
condition = \
${if and { \
{>{$rcpt_count}{10}} \
{ \
< \
{$recipients_count} \
{${eval:$rcpt_count/2}} \
} \
}{yes}{no}}
|
Условие верно в случае, если было более 10 команд RCPT и меньше половины из них привели к правильному получателю.
${expand:<string>}
Оператор
“expand
” заставляет раскрывать строку по второму разу. Например:
${expand:${lookup{
$domain}dbm{/some/file}{$value}}}
|
вначале ищет строку в файле, в процессе раскрытия оператора
“expand
”, а затем снова раскрывает то, что было найдёно.
${from_utf8:<string>}
Мир медленно двигается в сторону Unicode, и хотя для электронной почты стандартов нет, она тоже двигается туда же. Многие другие приложения (включая некоторые БД) начинают сохранять данные в Unicode, используя кодировку UTF-8. Этот оператор конвертирует строку UTF-8 в строки ISO-8859-1. Коды символов UTF-8 более 255 преобразовываются в подчёркивания.Ввод должен быть корректной строкой UTF-8. Если это не так, то результатом будет неопределённая последовательность символов.
Точки кодов Unicode со значениями меньше 256 совместимы с ASCII и ISO-8859-1 (также известной как Latin-1). Для примера, символ 169 - символ копирайта (
“╘
”)в обоих случаях, хотя способ которым он закодирован - различен. В режиме UTF-8, более чем один байт необходим для символов кодом более 127, тогда как в ISO-8859-1 используется однобайтное кодирование (таким образом, оно ограничено 256 символами). Это позволяет сделать прямой перевод из UTF-8 в ISO-8859-1.
${hash_<n>_<m>:<string>}
Оператор
“hash
” - это более простой интерфейс к функции хэширования, которая может использоваться, когда два её параметра - фиксированные числа (в противоположность строкам, динамически строящимся при раскрытии). Эффект, тоже самое, что и:
${hash{<n>}{<m>}{<string>}}
|
Для дополнительных подробностей, смотрите описание главного оператора
“hash
” выше. Аббревиатура
“h
” может использоваться, когда
“hash
” используется как оператор.
${hex2b64:<hexstring>}
Этот оператор используется для преобразования шестнадцатеричной строки в кодировку base64. Это бывает полезно при обработке вывода функций хэширования md5 и sha-1.
${lc:<string>}
Это переводит буквы в нижний регистр. Например:
${length_<number>:<string>}
Оператор
“length
” - это более простой интерфейс к функции
“length
”, которая может использоваться, когда её параметр - фиксированное число (в противоположность строкам, динамически строящимся при раскрытии). Эффект, тоже самое, что и:
${length{<number>}{<string>}}
|
Для получения дополнительной информации, смотрите примечания к к основной функции
“length
”. Заметтьте,
“length
” не тоже самое что и
“strlen
”. Аббревиатура
“l
” может применяться при использовании
“length
” в качестве оператора.
${local_part:<string>}
Строка интерпретируется как адрес, в соответствии с RFC2822, и из неё извлекается локальная часть адреса. Если строка не может быть корректно разобрана, то результат пуст.
${mask:<IP address>/<bit count>}
Если формат строки не соответсвует адресу IP и маске через слэш (т.е. сервой адрес в CIDR-нотации), раскрытие будет неудачным. Иначе, этот оператор преобразует IP-адрес в двоичный вид, маску, от наименьших битов, и проеобразует результат обратно в текстовый вид, с прилагаемой маской. Например:
${mask:
10
.
111
.
131
.
206
/28}
|
вернёт строку
“10.111.131.192/28
”. Так как предполагается, что эта операция, главным образом, будет использоваться для поиска адресов в файлах, результат для IPv6 использует точчки для разделения компонентов адреса, вместо двоеточий, поскольку двоеточия используются для разделения ключевых строк в
“lsearch
” файлах. Например:
${mask:3ffe:ffff:836f:0a00:000a:
0800
:200a:c031/99}
|
вернёт строку
3ffe.ffff.836f.0a00.000a.
0800
.
2000
.
0000
/
99
|
Буквы, в адресах IPv6 всегда выводятся в строчном виде.
${md5:<string>}
Оператор
“md5
” вычисляет значение хэша MD5 строки, и возвращает его как шестнадцатеричное число с 32 цифрами, в котором все буквы в строчном виде.
${nhash_<n>_<m>:<string>}
Оператор
“nhash
”, это простой интерфейс к функции числового хэширования, которая может использоваться, когда оба параметра - фиксированные числа (в противоположность строкам, динамически строящимся при раскрытии). Эффект точно такой же как от:
${nhash{<n>}{<m>}{<string>}}
|
Для дополнительных подробностей, смотрите описание главного оператора
“nhash
” выше.
${quote:<string>}
Оператор
“quote
” помещает переданный ему параметр в двойные кавычки, если это пустая строка, или содержит что-либо кроме букв, цифр, символа подчёркивания, точек или дефисов. Любые вхождения двойных кавычек и обратного слэша, экранируются обратным слэшем. Символы новой строки и возврата каретки преобразуются в
“\n
” и
“\r
” соответственно. Например,
становиться
Это полезно в местах, где агрумент - замена из переменной или заголовок сообщения.
${quote_local_part:<string>}
Этот оператор похож на предыдущий,
“quote
”, за тем исключением, что в кавычки она заключается по правилам RFC2822 для локальных частей адреса. Например символ
“+
” не вызвал бы заключение в кавычки (но при использовании
“quote
” строка была бы помещена в кавычки). Если вы создаёте новый адрес e-mail из содержимого
“
$local_part
” (или других неизвестных данных), то вы всегда должны использовать этот оператор.
${quote_<lookup-type>:<string>}
Этот оператор применяет специфические правила экранирования, помещения в кавычки и замены к строке. Каждый тип запроса имеет свои правила, описанные в главе 9. Например:
вернёт
Для одноключевых поисков нет необходимости в кавычках, и этот оператор вернёт неизменную строку.
${rxquote:<string>}
Оператор
“rxquote
” прослэшивает все символы не являющиеся алфавитно-цифровыми. Это применяется, например, для замены значений переменных или заголовков внутри регулярных выражений.
${rfc2047:<string>}
Этот оператор шифрует текст согласно RFC2047. Это кодирование используется в строках заголовков, для кодирования символов не-ASCII. Предполагается, что входная строка находиться в кодировке, определённой опцией
“headers_charset
”, с дефолтом ISO-8859-1. Строки содержащие символы только в диапазоне 33-126, и не содержащие символов типа:
? = ( ) < > @ , ; : \ " . [ ] _
|
не модифицирутся. В противном случае, разультат - строка закодированная в соответствии с RFC2047, содержащая так много закодированных букв, сколько нужно для кодирования строки.
${sha1:<string>}
Оператор
“shal
” вычисляет хэш SHA-1 строки, и возвращает это значение как шестнадцатеричное число с 40 цифрами, в котором все буквы находятся в прописном регистре.
${stat:<string>}
Строка, после раскрытия, должна представлять собой путь к файлу. Для этого пути делается вызов функции stat(). Если она (stat()) вернёт ошибку, то происходит ошибка раскрытия. Если же она отрабатывает успешно, то данные от stat() заменяют элемент, в виде ряда пар
“<name>=<value>
” где все значения числовые, за исключением значения
“smode
”. Имена:
“mode
” (даёт режим в виде восьмеричного числа, с четырьмя цифрами),
“smode
” (даёт режим в символическом формате, как 10-ти символьную строку, как команда
“ls
”),
“inode
”,
“device
”,
“links
”,
“uid
”,
“gid
”,
“size
”,
“atime
”,
“mtime
”, и
“ctime
”. Вы можете извлечь отдельные поля с использованием оператора
“extract
”.
Использование функции
“stat
” в файлах фильтров пользователей может быть блокировано системным администратором. Предупреждение: размер файла может быть неправильным на 32-х разрядных системах, для файлов больше 2Gb размером.
${str2b64:<string>}
Этот оператор кодирует строку в кодировку base64.
${strlen:<string>}
Этот пункт - заменяется длинной строки, в десятичном виде. Ометтьте: не путайте
“strlen
” с
“length
”.
${substr_<start>_<length>:<string>}
Оператор
“substr
” - это простой интерфейс к функции
“substr
”, который может использоваться, когда оба параметра функции - фиксированные числа (в отличие от раскрываемых строк). Эффект очно такой же как:
${substr{<start>}{<length>}{<string>}}
|
За дополнительными деталями обратитесь к описанию функции
“substr
”. Аббревиатура
“s
” может использоваться, когда
“substr
” используется как оператор.
${time_eval:<string>}
Этот элемент преобразует временные интервалы exim, типа
“2d4h5m
” в число секунд.
${time_interval:<string>}
Параметр (после раскрытия подстроки) должен представлять собой последовательность десятичных цифр, которая представляет собой временной интервал в секундах. Число преобразуется к формату времени exim, например
“1w3d4h2m6s
”.
${uc:<string>}
Преобразует буквы в верхний регистр.
11.7 Условия раскрытия
Следующие условия доступны для проверки конструкции
“${if
”, при раскрытиии строк:
!<condition>
Восклицательный знак перед любым условием, приводит результат условия к противоположному.
<symbolic operator> {<string1>}{<string2>}
Есть несколько символических операторов для проведения операций стравнения:
Оператор
|
значение
|
“= ”
|
равно
|
“== ”
|
равно
|
“> ”
|
больше
|
“>= ”
|
больше или равно
|
“< ”
|
меньше
|
“<= ”
|
меньше или равно
|
|
Например:
${if >{$message_size}{10M} ...
|
Заметтьте, что можно проверять неравенство, оператором отрицания (
“!
”). Обе строки должны принимать форму десятичных чисел, опционально используемо
“K
” или
“M
” (в заглавном или строчном виде), что будет означать умножение на 1024 или 1024*1024 соответсвенно.
crypteq {<string1>}{<string2>}
Это сравнение включено в бинарный файл exim, если он собран с поддержкой механизмов аутентификации (смотрите часть 33). Иначе, необходимо определить
“SUPPORT_CRYPTEQ
” в
“Local/Makefile
” для включения
“crypteq
” в исполняемый файл exim.
Кондишен
“crypteq
” имеет два аргумента. Содержимого первого шифруется, и сравнивается со вторым, который уже зашифрован. Вторая строка может быть в форме хранения шифрованных строк в LDAP, которые начинаются с фигурных скобок, содержащих условие (алгоритм). Если вторая строка не начинается с
“{
”, то предполагается что алгоритм шифрования
“crypt()
” или
“crypt16()
” (смотрите ниже), т.к. такие строки не могут начинаться на
“{
”. Обычно это поле из файла паролей. Пример зашифрованной строки в формате LDAP:
{md5}CY9rzUYh03PK3k6DJie09g==
|
Если такая строка появляется непосредственно, в раскрытой строке, то фигурные скобки должны быть указаны, поскольку они - часть синтаксиса. Например:
${if crypteq {test}{\{md5\}CY9rzUYh03PK3k6DJie09g==}{yes}{no}}
|
Следующие типы шифрования (их имена не зависят от регистра) поддерживаются:
{md5} - вычисляет MD5 сумму первой строки, и и представляет её в виде набора
“печатных
” символов, для сравнения с остатком от второй строки. Если длинна сравниваемой строки 24 символа, то exim предполагает что она закодирована base64 (как в примере выше). Если длинна 32 символа, txim предполагает что это шестнадцатеричное кодирование MD5. Если же длинна не 24 и не 32 то сравнение оканчивается неудачей.
{sha1} - вычисляет SHA-1 сумму первой строки, представляет её в
“печатном
” виде, и сравнивает с отатком от второй строки. Если длинна сравнения 28 символов, то exim предполагает чтоэто закодированно base64. Если длинна 40 символов, то предполагается что это шастнадцатеричное кодирование суммы SHA-1. Если же длинна не 28 и не 40 то сравнение оканчивается неудачей.
{crypt} - вызывает функцию
“
crypt()
”, которая традиционно, использовала только первые восемь символов пароля. Однако, во многих современных ОС это уже не так, и используется весь пароль, несмотря на его длинну.
{crypt16} - вызывает функцию
“
crypt16()
” (также известную как
“
bigcrypt()
”), которая, изначально, была создана для использования первых 16-ти символов пароля. Опять-таки, в современных ОС может использоваться больше символов.
Exim имеет собственную версию
“
crypt16()
” (которая является просто двойным вызовом функции
“
crypt()
”). Для ОС которые имеют свою версию, установка
“HAVE_CRYPT16
” в
“Local/Makefile
” при сборке exim, заставляет его использовать версию из ОС, а не его собственную. Эта опция включена, по-умолчанию, в ОС-зависимом
“Makefile
”, для тех операционных систем, про которые известно, что они поддерживают
“
crypt16()
”.
Если вы не помещаете тип криптования в фигурные скобки, при
“crypteq
” сравнении, то значение по-умолчанию также
“{crypt}
” или
“{crypt16}
”, как определено установкой опции
“DEFAULT_CRYPT
” в
“Local/Makefile
”. Значение по-умолчанию дефолтового значения -
“{crypt}
”. Вне зависимости от значения по умолчанию, вы можете использовать любую функцию, явно указав её в фигурных скобках.
Заметтьте, что если пароль не более восьми символов длинной, то результат его шифрования функциями
“
crypt()
” и
“
crypt16()
” идентичен. Это означает что
“
crypt16()
” обратно совметим, до тех пор, пока, ему не скормят пароль длинней восьми символов.
def:<variable name>
Условие
“def
” может содержать имя одной из раскрываемых переменных, заданных в секции 11.9. Условие истинно, если переменная не содержит пустую строку. Например:
${if def:sender_ident {from $sender_ident}}
|
Заметтьте, что имя переменной даётся без начального символа
“$
”. Если переменная не существует, то раскрытие неудачно.
def:header_<header name>: или def:h_<header name>:
Это условие истинно, если сообщение обрабатывается, и указанный заголовок в нём существует. Например:
${if def:header_reply-to:{$h_reply-to:}{$h_from:}}
|
Заметтьте: Символ
“$
” появляется в условии до
“header_
” или
“h_
”, и имя заголовка должно оканчиваться заголовком, если за ним не идёт пустое место (пробелы и прочее).
eq {<string1>}{<string2>}
Вначале раскрываются подстроки. Условие истинно, если получившиеся подстроки идентичны, в том числе и в регистре букв.
eqi {<string1>}{<string2>}
Вначале раскрываются подстроки. Условие истинно, если получившиеся подстроки идентичны, сравнение проводиться без учёта регистра букв.
exists {<file name>}
Подстрока раскрывается, затем интерпретируется как абсолюный путь. Условие истинно, если существует указанный файл, или директория. Проверка существования осуществляется вызовом функции
“
stat()
”. Использование проверки
“exists
” в пользовательских фильтрах может быть отключено системным администратором.
first_delivery
Это условие, не имеющее никаких данных, является истинным в течение первой попытки доставки сообщения. Во время любых последующих попыток доставки оно будет ложным.
ge {<string1>}{<string2>}
Смотрите
“gei
”.
gei {<string1>}{<string2>}
Вначале раскрываются обе подстроки. Условие истинно, если первая строка лексически больше второй, или равна ей. Для
“ge
” сравнение производиться с учётом регистра, а для
“gei
” сравнение не зависит от регистра букв.
gt {<string1>}{<string2>}
Смотрите
“gti
”.
gti {<string1>}{<string2>}
Вначале раскрываются обе подстроки. Условие истинно, если первая строка лексически больше второй. Для
“gt
” сравнение производиться с учётом регистра, а для
“gti
” сравнение не зависит от регистра букв.
isip {<string>}
Смотрите
“isip6
”.
isip4 {<string>}
Смотрите
“isip6
”.
isip6 {<string>}
Вначале подстрока раскрывается, затем проверяется, имеет ли она форму адреса IP. Оба адреса, IPv4 и IPv6 действительны для
“isip
”, тогда как
“isip4
” и
“isip6
” проверяют лишь адреса IPv4 и IPv6 соответственно. Например, можно использовать:
${if isip4{$sender_host_address}...
|
для проверки версии протокола IP хоста, с которого осуществляется входящее SMTP подключение.
ldapauth {<ldap query>}
Это условие поддерживает пользовательскую аутентификацию, с использованием LDAP. Смотрите секцию 9.13 для получения дополнительных деталей как использовать LDAP в поисках, и каков синтаксис запросов. Для этого использования, запрос должен содержать имя пользователя и пароль. Сам запрос не используется, он может быть пустым. Условие истинно, если пароль не пуст, и имя пользователя и пароль приняты сервером LDAP. Пустой пароль отбрасысается, без вызова LDAP, поскольку LDAP считает соединения с пустым паролем анонимными, вне зависимости от имени пользователя, согласно настройкам в большинстве конфигураций. Смотрите раздел 33 для получения дополнительных деталей о SMTP аутентификации, и раздел 34 для примеров использования.
le {<string1>}{<string2>}
Смотрите
“lei
”.
lei {<string1>}{<string2>}
Вначале раскрываются обе подстроки. Условие истинно, если первая строка лексически меньше или равна второй. Для
“le
” сравнение производиться с учётом регистра, а для
“lei
” сравнение не зависит от регистра букв.
lt {<string1>}{<string2>}
Смотрите
“lti
”.
lti {<string1>}{<string2>}
Вначале раскрываются обе подстроки. Условие истинно, если первая строка лексически меньше второй. Для
“lt
” сравнение производиться с учётом регистра, а для
“lti
” сравнение не зависит от регистра букв.
match {<string1>}{<string2>}
Вначале раскрываются обе подстроки. Вначале, вторая обрабатывается как регулярное выражение. Из-за предварительного раскрытия, если регулярное выражение содержит символ
“$
”, или символы начинающиеся с обратного слэша, они должны быть экранированы. Также следует проявить внимание, если регулярное выражение содержит фигурные скобки. Закрывающая скобка должна стоять так, чтобы не вызывать преждевременного завершения
“<string2>
”. Самый лёгкий подход заключается в использовании
“\N
”, для отключения раскрытия регулярного выражения. Например:
${if match {$local_part}{\N^\d{3}\N} ...
|
Если вся раскрываемая строка находиться в двойных кавычках, то требуется дальнейшее экранирование обратных слэшей.
Условие истинно, если регулярное выражение срабатывает. Регулярное выражение не обязано начинаться с метасимвола крышки (
“^
”), но если его нет, то выражение не поставлено на якорь и может соответствовать не только вначале строки, но и где-то в другом месте. Если вы хотите добиться соответствия паттерна в конце объекта, то необходимо включить метасимвол
“$
” в соответствующем месте.
Вначале раскрытия
“if
” запоминаются значения числовых переменных (
“
$1
”). Удовлетворение условия
“match
” сбрасывает их к подстрокам этого условия, и они будут иметь эти значения в процессе раскрытия успешной подстроки. В конце
“if
” предыдущие значения будут восстановлены. После проверки комбинации использования условий
“or
”, последующие значения числовых переменных - таковые из условия, которое было успешным.
match_address {<string1>}{<string2>}
Смотрите
“match_local_part
”.
match_domain {<string1>}{<string2>}
Смотрите
“match_local_part
”.
match_ip {<string1>}{<string2>}
Это условие проверяет IP-адрес на соответствие списку шаблонов IP-адресов. Оно должно содержать два параметра. Первый параметр, после раскрытия, должен быть IP-адресом или пустой строкой. Второй (после раскрытия) ограниченным списком хостов, который может соответствовать только IP-АДРЕСУ, но не имени хоста. Например:
${if match_ip{$sender_host_address}{1.
2
.
3
.
4
:
5
.
6
.
7
.8}{...}{...}}
|
В списке разрешаются определённые типы элементов, согласно списку:
Адрес IP, опционально с маской CIDR.
Отдельная звёздочка, соответсвующая любому IP-адресу.
Пустой пункт, который совпадает с только в случае если IP-адрес пуст. Это может быть полезным, для проверки локально отправленных сообщений, или одного из специфических хостов, в одной проверке, типа:
${if match_ip{$sender_host_address}{:
4
.
3
.
2
.
1
:...}{...}{...}}
|
где первый элемент в списке - пустая строка.
Элемент
“@[]
” совпадает с любым из адресов, на интерфейсах локальной машины.
Поиск предполагает стиль поиска
“net-
”, даже если
“net-
” не задан. Таким образом, следующие два примера эквивалентны:
${if match_ip{$sender_host_address}{lsearch;/some/file}...
${if match_ip{$sender_host_address}{net-lsearch;/some/file}...
|
Вам нужно использовать приставку
“net-
” в случае если нужно задать определённую маску, например, при использовании
“net24-
”
Просмотрите раздел 10.11 для получения дополнительных деталей по этим паттернам.
match_local_part {<string1>}{<string2>}
Это условие, вместе с
“match_address
” и
“match_domain
”, позволяет проверить домен, адрес, и локальную часть. Каждое условие требует двух аргументов: элемент и список соответствия. Тривиальный пример:
${if match_domain{a.b.c}{x.y.z:a.b.c:p.q.r}{yes}{no}}
|
В каждом случае, второй аргумент может содержать любой из допустимых пунктов для списка соответсвующего типа. Кроме того, поскольку второй параметр (после раскрытия) представляет собой список стандартной формы, то можно обратиться к именованному списку. Таким образом, можно использовать такие условия:
${if match_domain{$domain}{+local_domains}{...
|
Для списка адресов, совпадения не зависят от регистра, но может использоваться элемент
“+caseful
” как во всех списках, если захотите чтобы локальная часть совпадала регистрозависимо. Имя домена всегда сравнивается регистронезависмо.
Отметтьте: Списки хостов (видимо, имеется ввиду - IP-адресов хостов) тут не поддерживаются. Причина в том, что хост имеет два идентификатора: имя и IP-адрес, и не ясно какой из них бы тут использовался для проверки. Тем не менее, проверку IP-адресов можно провести используя
“match_ip
”.
pam {<string1>:<string2>:...}
Подключаемые Модули Аутентификации (Pluggable Authentication Modules - http://www.kernel.org/pub/linux/libs/pam/) - это средство, которое стало доступно в последних выпусках Solaris, и в некоторых реализациях GNU/Linux (почему-то неоправданно забыта FreeBSD. Непорядок - ибо во FreeBSD PAM также доступен). Exim поддерживает PAM, для использования с командой
“SMTP AUTH
”, только в случае, если он собран с
в
“
Local/Makefile
”. Вероятно, будет необходимо добавить
“-lpam
” к
“EXTRALIBS
”, а в некоторох реализациях GNU/Linux, также будет необходим
“-ldl
”.
Вначале раскрываются аргументы строки, и результатом должен быть спсок, разделённый двоеточиями. Начальное и конечное пустое пространство игнорируется. Модуль PAM инициализируется с сервисным именем
“exim
” и именем пользователя взятым из первого элемента списка в строке разделённой двоеточиями (
“<string1>
”). Остающиеся в строке пункты передаются в ответ на запросы функции опознавания. В простом случае будет лишь один запрос, для пароля, и таким образом данные будут содержать лишь две строки.
Могут быть проблемы, если в любой из строк разрешено содержаться двоеточию. Обычно, они должны быть удвоены, чтобы избежать возможности быть разделителями. Если данные вставляются из переменной, может использоваться функция
“sg
”, для удвоения любых существующих двоеточий. Например, конфигурация аутентификатора
“LOGIN
” может содержать эти настройки:
server_condition = ${if pam{$1:${sg{
$2}{:}{::}}}{yes}{no}}
|
Для
“PLAIN
”-аутентификатора можно использовать:
server_condition = ${if pam{$2:${sg{
$3}{:}{::}}}{yes}{no}}
|
В некоторых операционных системах PAM-аутентификация может быть сделана только от процесса работающего от пользователя root. Так как exim выполняется от пользователя
“exim
”, при приёме сообщений, то это означает что PAM не может непосредствено использоваться в таких системах. Пропатченная версия модуля
“pam_unix
”, который идёт с пакетом Linux PAM, доступна на http://www.e-admin.de/pam_exim/. Пропатченный модульразрешает одной специальной комбинации uid/gid, дополнительно root, аутентифицироваться. Если вы собираете пропатченный модуль для того, чтобы разрешить пользователя и группу exim, PAM сможет использоватся в аутентификаторе exim.
pwcheck {<string1>:<string2>}
Этот кондишен поддерживает аутентификацию пользователей с использованием даемона аутентификации Cyrus pwcheck. Это один из способов проверить пароли процессу не запущенному от root. Заметтьте: сейчас, использование pwcheck не рекомендуется. Его замена - saslauthd (смотрите ниже).
Поддержка
“pwcheck
” не включена в exim по-умолчанию. Вы должны задать местоположение сокета даемона
“pwcheck
” в
“
Local/Makefile
” до сборки exim. Например:
CYRUS_PWCHECK_SOCKET=/var/pwcheck/pwcheck
|
Нет необходимости устанавливать всё программное обеспечение Cyrus для использования даемона
“pwcheck
”. Вы можете собрать и установить только даемона из библиотеки Cyrus SASL. Обеспечьте, чтобы пользоваетель exim`a был единственным пользователем, имеющим доступ к директории где лежит сокет даемона
“pwcheck
”.
У условия
“pwcheck
” один аргумент, которое является и именем пользователя, и паролем, разделёнными двоеточием. Например, для аутентификации типа
“LOGIN
”, можно сделать так:
server_condition = ${if pwcheck{$1:$2}{1}{0}}
|
queue_running
Это условие не имеет данных, и является истинным в течение попыток доставки сообщения инициированными процессо доставки, и ложным в другие моменты.
radius {<authentication string>}
Аутентификация Radius (RFC2865) поддерживается похожим на PAM способом. Вы должны определить опцию
“RADIUS_CONFIG_FILE
” в
“
Local/Makefile
” для задания местоположения конфигурационного файла Radius, при сборке exim.
При установке только этой опции, exim ожидает что будет слинкован с библиотекой
“radiusclient
”, с использованием оригинального API. Если же используется релиз этой библиотеки 0.4.0 или более поздний, то нужно установить опцию:
RADIUS_LIB_TYPE=RADIUSCLIENTNEW
|
в
“
Local/Makefile
” при сборке exim. Также можно слинковать exim с библиотекой
“libradius
”, идущей в составе FreeBSD. Для использования этого, установите:
в
“
Local/Makefile
”, в дополнение к установленной опции
“RADIUS_CONFIG_FILE
”. Также, вероятно, надо будет настроить
“EXTRALIBS
” чтобы библиотека Radius`a была найдена при линковке exim.
Строка, определённая в
“RADIUS_CONFIG_FILE
” раскрывается, и передаётся клиентской библиотеке Radius`a, которая связывается с сервером Radius. Условие истинно, если аутентификация успешнаю Например:
server_condition = ${if radius{<arguments>}{yes}{no}}
|
saslauthd {{<user>}{<password>}{<service>}{<realm>}}
Этот кондишен поддерживает аутентификацию пользователей с использованием даемона Cyrus saslauthd. Он заменяет даемона pwcheck, который больше не поддерживается. Использование этого даемона - один из способов проверки паролей процессом работающим не от рута.
Поддержка
“saslauthd
” не включена в exim по-умолчанию. Вы должны указать местоположение сокета даемона
“saslauthd
” в
“
Local/Makefile
”, до сборки exim`a. Например:
CYRUS_SASLAUTHD_SOCKET=/var/state/saslauthd/mux
|
Нет необходимости устанавливать всё программное обеспечение Cyrus для использования даемона
“saslauthd
”. Вы можете собрать и установить только даемона из библиотеки Cyrus SASL.
До четырёх аргументов могут использоваться с кондишном
“saslauthd
”, но только два обязательны. Например:
server_condition = ${if saslauthd{{$1}{
$2}}{1}{0}}
|
Сервис и окружение(?) являются опциональными параметрами (поэтому их параметры находятся в собственной паре фигурных скобок). Для деталей по этой службе, и как запустить даемона, обратитесь к документации по Cyrus.
11.8 Комбинирование условий раскрытия.
Несколько условий могут быть проверены за один раз, обединив их условиями
“and
” и
“or
”. Заметтьте, что условия
“and
” и
“or
” самостоятельные, полноценные условия, и предшествуют своим спискам субпаттернов. Каждое подусловие должно находиться внутри фигурных скобок, вместе с общими ффигурными скобками в которых находиться список. Не должно быть повторений, если используется условие
“if
”.
or {{<cond1>}{<cond2>}...}
Подусловия оцениваются слева направо. Условие исинно, если одно из подусловий истинно. Например:
${if or {{eq{$local_part}{spqr}}{eq{
$domain}{testing.com}}}...
|
Когда находиться истинное подусловие, то остальные парсятся, но не оцениваются. Если тут несколько подусловий
“match
”, то значения числовых переменных берутся от того, которое первым будет успешно.
and {{<cond1>}{<cond2>}...}
Подусловия оцениваются слева направо. Условие исинно, если все подусловия верны. Если тут несколько подусловий
“match
”, то значения числовых переменных берутся от последнего. Если найдено ложное подусловие, то остальные парсятся, но не оцениваются.
11.9 Переменные раскрытия.
Этот раздел содержит алфавитный список всех переменных раскрытия. Некоторые из них доступны только тогда, когда exim собран со специфическими опциями, типа поддержки TLS или опцией контентного сканирования.
$0, $1, и т.д.
Когда успешно условие
“match
”, эти переменные содержат фиксированные подстроки идентифицированные по регулярному выражению в течение последующего процесса успешной строки сожержащей элемент
“if
”. Также, они могут быть установлены внешне, некоторыми другими процессами, предшествующими раскрытию строки. Например, команды доступные в файлах фильтрa exim`a включают команду
“if
” с её собственным регулярным выражением, соответствующим условию.
$acl_c0 - $acl_c19
Значения могут быть помещены в эти переменные, при помощи модификатора
“set
” в ACL. Значения сохраняются на протяжении всей жизни SMTP подключения. Они могут использоваться для передачи информации между ACL, и различными запросами того же самого ACL. После получения сообщения, значения переменных сохраняются вместе с сообщением, и могут использоваться в фильтрах, роутерах, и транспортах в течение последующей доставки.
$acl_m0 - $acl_m19
Значения могут быть помещены в эти переменные, при помощи модификатора
“set
” в ACL. Они сохраняют их значения пока сообщение в процессе получения, но сбрасываются после получения. Они, также, сбрасываются командами
“MAIL
”,
“RSET
”,
“EHLO
”,
“HELO
”, и после начала сессии TLS. После получения сообщения, значения переменных сохраняются вместе с сообщением, и могут использоваться в фильтрах, роутерах, и транспортах в течение последующей доставки.
$acl_verify_message
После неудачной проверки адреса, эта переменная содержит сообщение об отказе. Она сохраняет своё значение для использования в последующих модификаторах.Сообщение может быть использовано в коде, типа такого:
warn !verify = sender
set acl_m0 = $acl_verify_message
|
Вы можете использовать
“
$acl_verify_message
” в процессе раскрытия модификаторов
“message
” или
“log_message
”, для всключения информации о причине отказа.
$address_data
Эта переменная устанавливается посредством опции
“address_data
” в роутере. В процессе обработки последующими маршрутизаторами, роутерами и транспортами значение остаётся с адресом. Если транспорт обрабатывает много адресов, используется значение первого адреса. Смотрите главу 15 для получения дополнительных деталей. Отметтьте:Содержимое переменной
“
$address_data
” видимо (в смысле, доступно) в файлах пользовательских фильтров.
Если
“
$address_data
” установлена когда роутер вызывает ACL для проверки адреса получателя, конечное значение всё ещё находиться в переменной для последующих условий и модификаторов ACL. Если роутинг сделал переадресацию только к одному адресу, дочерний адрес также роутится как часть проверки, и в этом случае окончательное содержимое
“
$address_data
” получено из дочернего процесса.
Если
“
$address_data
” установлена когда роутер вызывает ACL для проверки адреса отправителя, окончательное значение также сохраняется, но на этот раз в переменной
“
$sender_address_data
”, чтобы можно было отличить от данных адреса получателя.
В обоих случаях (проверки получателя и отправителя), значение не сохраняется после конца текущей проверки ACL. Если необходимо сохранить их дальше, то можно сохранить их переменных ACL.
$address_file
Когда в результате альясинга, форвардинга или фильтрации сообщение направлено в специфический файл, эта переменная содержит имя файла, пока выполняется транспортировка. В другое время, переменная пуста. Например, используя дефолтовую конфигурацию, у пользователя
“r2d2
” (однако, документацию писали юмористы :)) в файле
“
.forward
” содержится:
Тогда когда работает транспорт
“address_file
”, переменная
“
$address_file
” содержит
“/home/r2d2/savemail
”.
Для фильтров Sieve, значение может быть
“inbox
” или относительным именем директории. Так продолжается до запуска транспорта, который построит абсолютный путь к необходимому файлу.
$address_pipe
Когда в результате альясинга или форвардинга сообщение направляется в трубу (по другому - pipe, или именованный канал), переменная содержит команду трубы, пока работает транспорт.
$auth1 - $auth3
Эти переменные используются в SMTP аутентификаторах (смотрите разделы 34-37). В других местах они пусты.
$authenticated_id
Когда сервер полностью аутентифицирует клиента, то это (видимо, в этот момент) может быть сконфигурировано для сохранения части аутентификационной информации в переменной
“
$authenticated_id
” (смотрите раздел 33). Например, конфигурация аутентификатора user/password могла бы сохранить имя пользователя, для использования в роутерах. Отметтьте, что это не таже самая информация, которая сохраняется в
“
$sender_host_authenticated
”. Когда сообщение посылается локально, не через TCP соединение, переменная
“
$authenticated_id
” содержит имя пользователя вызвавшего процесса.
$authenticated_sender
Когда exim работает как сервер, он берёт во внимание параметр
“AUTH=
” для поступающей SMTP команды MAIL, если отправителю можно доверять, как описано в секции 33.2. Если данные, не являются строкой
“<>
” (странно, получается аутентифицировавшийся отправитель без имени...?), то устанавливается что сообщение шлёт аутентифицированный отправитель, и значение доступно в процессе доставки в переменной
“
$authenticated_sender
”. Если отправитель не доверенный, то exim принимает синтаксис
“AUTH=
”, но игнорирует данные.
Когда сообщение отправляется локально (т.е. не через TCP соединение), значение переменной
“
$authenticated_sender
” является адресом, сконструированным из имени пользователя, и значения переменной
“
$qualify_domain
”.
$authentication_failed
Эта переменная устанавливается в
“1
”, в серевере exim, если клиент использует команду
“AUTH
” которая неуспешна. Иначе она устанавливается в
“0
”. Это позволяет различить
“did not try to authenticate
” (не пробовал провести аутентификацию -
“
$sender_host_authenticated
” -пуста,
“
$authentication_failed
” равна нулю) и
“tried to authenticate but failed
” (пробовал провести аутентификацию, но неуспешно -
“
$sender_host_authenticated
” -пуста,
“
$authentication_failed
” равна единице). Отказ включает любой отрицательный ответ на команду
“AUTH
”, включая (к примеру) попытку использовать неизвестный/неопределённый аутентификационный механизм.
$body_linecount
Когда сообщение передаётся или принимается, эта переменная содержит число строк тела сообщения. Смотрите также
“
$message_linecount
”.
$body_zerocount
Когда сообщение передаётся или принимается, эта переменная содержит число бинарных нулевых байт в теле сообщения.
$bounce_recipient
В этой переменной устанавливатеся адрес получателя отлупа, когда exim его создаёт. Полезно, если используется используется настраиваемый текстовый файл отлупов (смотрите раздел 45).
$bounce_return_size_limit
Эта переменная содержит значение опции
“bounce_return_size_limit
”, округлённой к числу кратному 1000. Полезно, если используется используется настраиваемый текстовый файл ошибок сообщений (смотрите раздел 45).
$caller_gid
Содержится реальный id той группы, под которой выполнялся процесс exim. Это не тоже самое что и gid создателя сообщения (смотрите
“
$originator_gid
”). Если exim перезапускает себя, эта переменная в нормальнос состоянии, содержит gid exim.
$caller_uid
Реальный uid пользователя, под которым выполняется процесс exim. Это не тоже самое что и uid создателя сообщения (смотрите
“
$originator_uid
”). Если exim перезапускает себя, эта переменная в нормальнос состоянии, содержит uid exim.
$compile_date
Дата, когда был скомпилен бинарник exim.
$compile_number
Прочесс сборки exim сохраняет число раз, сколько он был скомпилен. Это позволяет отличить другие компиляции одной и той же версии программы.
$demime_errorlevel
Эта переменная доступна когда exim собран с поддержкой content-scanning и вышедшим из употребления условием
“demime
”. Детали смотрите в секции 40.6.
$demime_reason
Эта переменная доступна когда exim собран с поддержкой content-scanning и вышедшим из употребления условием
“demime
”. Детали смотрите в секции 40.6.
$dnslist_domain
Когда для клиентского хоста найдена запись в блэк-листе DNS, то имя домена помещается в эту переменную, чтобы можно было включить эту информацию в сообщение об отлупе.
$dnslist_text
Когда для клиентского хоста найдена запись в блэк-листе DNS, содержание любой ассоциированной TXT-записи помещается в эту переменную.
$dnslist_value
Когда для клиентского хоста найдена запись в блэк-листе DNS, IP-запись для ресурса помещается в эту переменную. Если запесей много, то все адреса включаются, разделённые запятыми с пробелами.
$domain
Когда адрес роутится, или самостоятельно доставляется, эта переменная содержит имя домена. Глобальная перезапись адреса происходит когда сообщение получено, таким образом значение
“
$domain
” в течение марщрутизации и доставки - значение после перезаписи. Переменная
“
$domain
” установлена во время пользовательской фильтрации, но не во время системной фильтрации, поскольку сообщение может иметь много получателей и системный фильтр вызывают только один раз.
Когда доставляется больше одного адреса за раз, (например, несколько команд RCPT в одном SMTP соединении)
“
$domain
” установлена лишь в случае, если все они имеют один и тот же домен. Транспорты могут быть ограничены обработкой только одного домена за раз, если значение
“
$domain
” требуется во время работы транспорта - это, значение по-умолчанию для локальных транспортов. Для дополнительных деталей о переменных окружения во время выполнения транспортировки, смотрите главу 23.
В конце доставки, если все отсроченные адреса имеют один домен, он помещается в
“
$domain
” в процессе раскрытия
“delay_warning_condition
”.
Переменная
“
$domain
” также используется при некоторых других обстоятельствах:
Когда выполняется ACL для команды RCPT, переменная
“
$domain
” содержит домен адреса получателя. Домен адреса отправителя находиться в
“
$sender_address_domain
” во время команд MAIL и RCPT. Переменная
“
$domain
”, обычно не устанавливается во время оаботы MAIL ACL. Однако, если адрес отправителя проверен при помощи callout в процессе MAIL ACL, домен отправителя помещается в
“
$domain
” в процессе раскрытия
“hosts
”,
“interface
”, and
“port
” и в
“smtp
” транспорте.
Во время обработки перезаписи (смотрите раздел 31), переменная
“
$domain
” содержит доменную часть адреса, который перезаписывается. Это может быть использовано в в раскрытии адреса замены, например, для замены домена поиском по файлу.
Каждый раз когда просматривается список доменов, за одним исключением,
“
$domain
” содержит обрабатываемый домен. Исключение: Когда список доменов в условии
“sender_domains
” обрабатывается в ACL, обрабатываемый домен содержится в
“
$sender_address_domain
”, а не в
“
$domain
”. Так сделано для того, чтобы в RCPT ACL список доменов отправителя мог зависеть от домена получателя (который в это время содержится в
“
$domain
”).
Когда раскрывается опция
“smtp_etrn_command
”, переменная
“
$domain
” содержит полный параметр команды ERTN (смотрите раздел 44.8)
$domain_data
Когда опция
“domains
” на маршрутизаторе совпадает с доменом найденным поиском, данные прочитанные поиском, доступны в течение работы роутера как
“
$domain_data
”. Кроме того, если драйвер направляет адрес в транспорт, то значение доступно и в транспорте. Если транспорт обрабатывает много адресов, используется значение из первого адреса.
Переменная
“
$domain_data
” также устанавливается когда кондишен
“domains
”в ACL совпадает с доменом найденным поиском. Данные прочитанные поиском доступны в течение остальной части условия ACL. Во всех других случаях, эта переменная ничего не содержит.
$exim_gid
Эта переменная содержит числовое значение gid группы от которой работает exim.
$exim_path
Эта переменная содержит путь к бинарному файлу exim.
$exim_uid
Эта переменная содержит числовое значение uid пользователя от которого работает exim.
$found_extension
Эта переменная доступна, когда exim собран с поддержкой content-scanning (сканирования содержимого, на вирусы, например), и устаревшим условием -
“demime
”. За дополнительными деталями, обратитесь к разделу 40.6.
$header_<name>
Это не строгая переменная раскрытия. Это - синтаксис раскрытия для вставки строки заголовка сообщения с указанным именем. Заметтьте, что имя может оканчиваться двоеточием или пробелом, поскольку оно может содержать разнообразные символы. Также заметтьте, что фигурные скобки не должны использоваться.
$home
Когда в роутере установлена опция
“check_local_user
”, в случае успешной проверки, домашняя директория пользователя помещается в переменную
“
$home
”. В частности, это означает, что она установлена в процессе выполнения фалов фильтров пользователей. Роутер, также может явно установить основную домашнюю директорию для использования транспортом. Это может быть отменено непосредственной установкой транспорта.
Когда работает тест фильтра, через опцию
“-bf
”, в
“
$home
” устанваливается значение перемeнной окружения HOME.
$host
Когда транспорт
“smtp
” раскрывает опции, для шифрования с использованием TLS,
“
$host
” содержит имя приконнектившегося хоста. Аналогично, когда используется клиентская часть конфигурации аутентификации (смотрите раздел 33), переменная
“
$host
” содержитимя сервера к которому подключился клиент.
Когда используется транспортный фильтр (смотрите раздел 24),
“
$host
” содержит учивствующий в текущем соединении. Когда локальный транспорт запущен как результат роутера который устанавливает список хостов,
“
$host
” содержит имя первого хоста.
$host_address
Эта переменная содержит IP-адрес удалённого хоста каждый раз, когда устанавливается
“
$host
” для удалённого соединения. Также в неё устанавливается адрес IP проверяемый в опции
“ignore_target_hosts
”.
$host_data
Если кондишен
“$hosts
” в ACL удовлетворяется посредством поиска, результат поиска становиться доступен в переменной
“
$host_data
”. Это позволяет далать, например, такие вещи:
deny hosts = net-lsearch;/some/file
message = $host_data
|
$host_lookup_deferred
В нормальном состоянии, эта переменная содержит
“0
”, что делает
“
$host_lookup_failed
”. Когда сообщение приходит с удалённого хоста и производиться попытка поиска имени хоста по его IP-адресу, и если попытка безуспешна, эта переменная устанавливается в
“1
”.
Если поиск получает какой-то отрицательный ответ (например, поиск в DNS успешен, но записей не найдено),
“
$host_lookup_failed
” устанавливается в
“1
”.
Если во время поиска происходят какие-то проблемы, такие, что в итоге exim не может утверждать задано ли имя хоста (например, таймаут поиска в DNS),
“
$host_lookup_failed
” устанавливается в
“1
”.
Поиск имени хоста по его IP-адресу содержит больше чем просто один обратный поиск. Exim проверяет полученное имя в обратную сторону - приведёт ли оно к оригинальному IP-адресу. Если это не так, exim не принимает найденное имя, и переменная
“
$host_lookup_failed
” устанавливается в
“1
”. Таким образом, возможность находить имя по IP-адресу (например PTR запись в DNS) не является достаточным условием для успешного поиска имени хоста. Если обратный поиск успешен, но есть проблемы с прямым поиском, например таймаут, то имя не принимается, и
“
$host_lookup_deferred
” устанавливается в
“1
”. Смотрите также,
“
$sender_host_name
”.
$host_lookup_failed
Смотрите
“
$host_lookup_deferred
”.
$inode
Единственный момент времени, когда эта переменная установлена - при раскрытии опции
“directory_file
” в транспорте
“appendfile
”. Переменная содержит номер иноды временного файла который должен быть переименован. Это может использоваться для создания уникального имени файла.
$interface_address
Как только сервер начинает обрабатывать TCP/IP соединение, эта переменная принимает значение IP-адреса локального интерфейса, а в переменную
“
$interface_port
” устанавливается номер порта. Поэтому эти значения доступны для использования в
“connect
” ACL. Также смотрите опцию командной строки
“-oMi
”. Как присутствующая в ACL, эта переменная может использоваться, например, для создания имени файла, для сертификата TLS, зависящего от того какой порт/интерфейс используется.
$interface_port
Смотрите
“
$interface_address
”.
$ldap_dn
Эта переменная доступна лишь если exim собран с поддержкой LDAP, и содержит DN для последнего успешного поиска в LDAP.
$load_average
Эта переменная содержит среднюю загрузку системы, умноженную на 1000, и является целым числом. Например, если загрузка 0.21, то значение переменной 210. Значение пересчитывается каждый раз, когда ссылаются на эту переменную.
$local_part
Когда адрес роутится или доставляется владельцу, эта переменная содержит локальную часть адреса. Когда идёт одновременная доставка нескольких адресов (например, несколько RCPT команд в SMTP сессии), переменная
“
$local_part
” не задана.
Глобальная перезапись адресов происходит при получении сообщения, таким образом значение
“
$local_part
” в течение роутинга и доставки - значение после перезаписи.
“
$local_part
” устанавливается во время работы пользовательского фильтра, но не во время системного, потому что сообщение может иметь много получателей, и системный фильтр вызывается лишь один раз.
Если локальная часть преффикса или суффикса была успешно разобрана, то это не включается в значение
“
$local_part
” в процессе роутинга и последующей доставки. Значения любой приставки или суффикса находятся в
“
$local_part_prefix
” и
“
$local_part_suffix
” соотвественно.
Когда сообщение доставляется в файл, трубу или транспорт автоответа, в результате альясинга или форвардинга,
“
$local_part
” устанавливается в локальную часть родительского адреса, не к имени файла или команды (смотрите
“
$address_file
” и
“
$address_pipe
”).
Когда ACl запускается для команды RCPT,
“
$local_part
” содержит локальную часть адреса получателя.
Когда срабатывает перезапись (смотрите раздел 31),
“
$local_part
” содержит локальную часть адреса который перезаписывается, это может быть использовано, например, в раскрытиях замены адреса.
Во всех регистрах, все кавычки удаляются из локальной части. Например, оба адреса
"abc:xyz"@test.example
abc\:xyz@test.example
|
дадут значение
“
$local_part
”
Если вы используете
“
$local_part
” для создания других адресов, вы всегда должны обрабатывать его в операторе
“quote
”. Например, в переадресовывающем роутере, можно сделать так:
data = ${quote_local_part:$local_part}@new.domain.example
|
Отметтьте: Обычно, значение
“
$local_part
” в нижнем регисте, если вы хотите обрабатывать локальные части в роутере в регистрозависимой манере, вы должны установить опцию
“caseful_local_part
” (смотрите раздел 15).
$local_part_data
Когда опция
“local_part
” на роутере совпадает с локальной частью найденной поиском, данные прочитанные поиском доступны в течение выполнения роутара, как
“
$local_part_data
”. Кроме того, если драйвер роутит адрес в транспорт, значение доступно и в транспорте. Если транспорт обрабатывает много адресов, используется значение первого адреса.
Переменная
“
$local_part_data
” также устанавливается когда кондишен
“local_part
” в ACL совпадает с локальной частью найденной поиском. Данные прочитанные поиском доступны в течение остальной части ACL. Во всех других ситуациях, значение переменной пустое.
$local_part_prefix
Когда адрес роутится или доставляется владельцу, и распознан специфический преффикс для локальной части, он доступен в этой переменной, удалённой из
“
$local_part
”.
$local_part_suffix
Когда адрес роутится или доставляется владельцу, и распознан специфический суффикс для локальной части, он доступен в этой переменной, удалённой из
“
$local_part
”.
$local_scan_data
Эта переменная содержит текст, возвращённый функцией
“
local_scan()
”, при получении сообщения. За дополнительными деталями, обратитесь к разделу 41.
$local_user_gid
Смотрите
“
$local_user_uid
”.
$local_user_uid
В эту переменную, и
“
$local_user_gid
” устанавливаются значения uid и gid после успешного предварительного условия
“check_local_user
” в роутере. Это означает, что их значения доступны для остальных, неотработавших, предварительных условий (
“senders
”,
“require_files
”, и
“condition
”), для раскрытия
“address_data
”, и дя других, специфичных для роутера условий. В любой другой момент времени, значения в этих переменных (uid_t)(-1) и (gid_t)(-1), соответственно.
$localhost_number
Тут содержится раскрытое значение опции
“localhost_number
”. Это раскрытие происходит после прочтения основных опций.
$log_inodes
Число свободных inode в дисковом разделе, куда пишутся логи exim`a. Это значение пересчитывается каждый раз, когда ссылаются на эту переменную. Если файловая система не знает, что такое inode, то значение переменной равно
“-1
”. Также смотрите опцию
“check_log_inodes
”.
$log_space
Размер свободного места (в килобайтах) на дисковом разделе, в который пишутся логи exim`a. Это значение пересчитывается каждый раз, когда ссылаются на эту переменную. Если операционная система не способна вычислять размер свободного пространства (истинно только для экспериментальных систем), то значение переменной равно
“-1
”. Также смотрите опцию
“check_log_space
”.
$mailstore_basename
Эта переменная устанавливается только при работе доставки в формате
“mailstore
” в транспорт
“appendfile
”. В процессе раскрытия опций
“mailstore_prefix
”,
“mailstore_suffix
”,
“message_prefix
”, и
“message_suffix
” она содержит имена записываемых файлов, т.е. имя без суффикса
“.tmp
”,
“.env
”, или
“.msg
”. В любое другое время переменная пуста.
$malware_name
Эта переменная доступна когда exim скомпилен с поддержкой контентного сканирования. Она устанавливается в имя вируса, который был найден, когда условие
“malware
” ACL истинно (40.1).
$message_age
Эта переменная устанавливается в начале попытки доставки сообщения, в число секунд с тех пор как сообщение было получено. Оно не изменяется в течение одной (видимо, текущей) попытки доставки.
$message_body
Во время доставки, эта переменная содержит начальную часть сообщения, и предназначена, главным образом, для файлов фильтра пользователей. Максимальное число символов тела сообщения, помещаемое в переменную, устанавливается конфигурационной опцией
“message_body_visible
”; по дефолту - 500. Символы новой строки преобразуются в пробелы, для облегчения поиска фраз, которые были бы разбиты по переводу строки. Двоичные нули также преобразовываются в пробелы.
$message_body_end
Во время доставки, эта переменная содержит конец тела сообщения. Формат и максимальный размер такой же как и у
“
$message_body
”.
$message_body_size
Во время доставки, эта переменная содержит размер тела сообщения в байтах. Счёт начинается после с символа после пустой линии, отделяющей заголовки от сообщения. Смотрите также
“
$message_size
”,
“
$body_linecount
” и
“
$body_zerocount
”.
$message_exim_id
Когда сообщение получается или доставляется, эта переменная содержит уникальный идентификатор сообщения, генерируемый и используемый exim`ом для идентификации сообщения. Идентификатор не создаётся для сообщения до тех пор, пока его заголовок не получен. Заметтьте: Это не содержимое стрки заголовка
“Message-ID:
”, это локальный идентификатор назначаемый exim`ом сообщению, например
“1BXTIK-0001yO-VA
”.
$message_headers
Эта переменная содержит все строки заголовка, во время обработки сообщения, за исключением строк добавленных роутерами и транспортами. Строки заголовка разделены символами новой строки.
$message_id
Это старое название
“
$message_exim_id
”, которое теперь не используется.
$message_linecount
Эта переменная содержит общее количество строк в заголовке и теле сообщения. Сравните с
“
$body_linecount
” содержащей лишь число строк в теле сообщения. В процессе DATA и ACL занимающихся контентным сканированием
“
$message_linecount
” содержит число полученных строк. До доставки (т.е. перед фильтрами, маршрутизаторами, роутерами и транспортами) счётчик увеличен, чтобы включить строку заголовка
“Received:
”, стандартно добавляемую exim`ом, и любые другие заголовки, добавляемый ACL`ами. Пустая строка, отделяющая заголовки от тела сообщения не подсчитывается. Вот пример использования этой переменной в DATA ACL:
deny message = Too many lines in message header
condition = \
${if <{250}{${eval:$message_linecount - $body_linecount}}}
|
В MAIL и RCPT ACL`ах значение этой переменной - ноль, поскольку на этих стадиях сообщение ещё не получено.
$message_size
Когда сообщение находится в процессе обработки, эта переменная содержит число байт. В большинстве случаев, размер включает те заголовки, которые были получены с сообщением, но не те (типа
“Envelope-to:
”), которые были добавлены индивидуальными доставкми.Однако, есть один специальный случай: в процессе раскрытия опции
“maildir_tag
” в транспорте
“appendfile
”, когда доставка происходит в формате
“maildir
”, значение
“
$message_size
” - точный размер файла, который был записан (на диск). Смотрите также
“
$message_body_size
”,
“
$body_linecount
” и
“
$body_zerocount
”.
ПРи выполнении ACL во время команды SMTP RCPT,
“
$message_size
” содержит размер предоставленный командой MAIL, или
“-1
”, если он не был предоставлен. Разумеется, значение может быть неверным или заведомо ложным.
$mime_xxx
Множество переменных, с именами начинающимися на
“
$mime
” доступны, в случае, если exim собран с поддержкой контентного сканирования. Для дополнительных делалей, смотрите раздел 40.4.
$n0 - $n9
Эти переменные - счётчики, которые могут быть увеличены при помощи команды
“add
” в файлах фильтров.
$original_domain
Когда адрес верхнего уровня обрабатывается для доставки, эта переменная содержит тоже самое значение, что и
“
$domain
”. Однако, если
“дочерний
” адрес (например, сгенерённый альясом, форвардом или файлом фильтра) обрабатывается, эта переменная содержит доменную часть оригинального адреса. Это отличается от
“
$parent_domain
” только когда здесь больше одного уровня альясинга или форвардинга. Когда происходит доставка более чем по одному адресу в одном транспорте, переменная
“
$original_domain
” не установлена.
Если новый адрес создан с помощью команды
“deliver
” в системном фильтре, то она (эта переменная) установлена с искуственным
“родительским
” адресом. В таком случае локальная часть
“system-filter
” и доменная - дефолтовый домен, из конфига.
$original_local_part
Когда адрес верхнего уровня обрабатывается для доставки, эта переменная содержит тоже самое значение, что и
“
$local_part
”, за исключением, если суффикс или преффикс были удалены из локальной части, поскольку
“
$original_local_part
” всегда содержит полную локальную часть. Когда
“дочерний
” адрес (например, сгенерённый альясом, форвардом или файлом фильтра) обрабатывается, эта переменная содержит полную локальную часть оригинального адреса.
Если роутер (процесс переназначения) нечувствителен к регистру локальной части адреса, значение
“
$original_local_part
” в нижнем регистре букв.Эта переменная отличается от
“
$parent_local_part
” только в случае, если больше одного уровня альясинга или форвардинга. Когда происходит доставка более чем по одному адресу в одном транспорте, переменная
“
$original_local_part
” не установлена.
Если новый адрес создан с помощью команды
“deliver
” в системном фильтре, то она (эта переменная) установлена с искуственным
“родительским
” адресом. В таком случае локальная часть
“system-filter
” и доменная - дефолтовый домен, из конфига.
$originator_gid
Эта переменная содержит значение переменной
“
$caller_uid
”, установленной при получении сообщения. Для сообщений полученных через командную строку, это gid пославшего его пользователя. Для сообщений полученных через TCP/IP, это, обычно, gid пользователя от которого работает exim.
$parent_domain
Эта переменная подобна
“
$original_domain
” (смотрите выше), за исключением того, что относится непосредственно к предыдущему родительскому адресу.
$parent_local_part
Эта переменная подобна
“
$original_local_part
” (смотрите выше), за исключением того, что относится непосредственно к предыдущему родительскому адресу.
$pid
Эта переменная содержит идентификатор процесса текущего процесса.
$pipe_addresses
Это не раскрываемая переменная, но она упомянута тут, поскольку строка
“
$pipe_addresses
” обрабатывается специально в командной спецификации для транспорта
“pipe
” (раздел 29) и в транспортных фильтрах (описанных как
“
transport_filter
” в разделе 24). Она не может использоваться в основных строках раскрытия и вызывает ошибку
“неизвестная переменная
” если с ней там сталкиваются.
$primary_hostname
Эта переменная содержит значение установленное пунктом
“primary_hostname
” в конфигурационном файле, или прочитанное функцией uname(). Если uname() возвращает однокомпонентное имя, то exim вызывает функцию gethostbyname() (или getipnodebyname() - какая доступна) в попытке получить полное имя хоста. Смотрите также
“
$smtp_active_hostname
”.
$prvscheck_address
Эта переменная используется вместе с элементом раскрытия
“prvscheck
”, который описан в разделах 11.5 и 39.38.
$prvscheck_keynum
Эта переменная используется вместе с элементом раскрытия
“prvscheck
”, который описан в разделах 11.5 и 39.38.
$prvscheck_result
Эта переменная используется вместе с элементом раскрытия
“prvscheck
”, который описан в разделах 11.5 и 39.38.
$qualify_domain
Значение этой переменной устанавливается опцией
“qualify_domain
” из конфигурационного файла.
$qualify_recipient
Значение этой переменной устанавливается опцией
“qualify_recipient
” из конфигурационного файла, или, если там не задано, значением
“
$qualify_domain
”.
$rcpt_count
Когда сообщение получается по SMTP, эта переменная содержит число команд RCPT переданных для текущего сообшения. Если эта переменная используется в RCPT ACL, то её значение включает текущую команду.
$rcpt_defer_count
Когда сообщение получается по SMTP, эта переменная содержит число команд RCPT в текущем сообщении, которые были ранее отклонены с временным (4xx) ответом.
$rcpt_fail_count
Когда сообщение получается по SMTP, эта переменная содержит число команд RCPT в текущем сообщении, которые были ранее отклонены с постоянным (4xx) ответом.
$received_count
Эта переменная содержит число заголовков
“Received:
” в сообщении, включая один, добавленный exim`ом (таким образом, это значение всегда больше нуля). Оно доступно в DATA ACL, в не-SMTP ACL, и во время роутинга и доставки.
$received_for
Если во входящем сообщении только один адрес получателя, то эта переменная содержит адрес, из строки заголовка
“Received:
”, после её получения. Значение копируется после перезаписи адреса получателя, но до запуска функции local_scan().
$received_protocol
При обработке сообщения, эта переменная содержит имя протокола по которому получено сообщение. Большинство имён, используемых exim, определено RFC821, RFC2821, и RFC3848. Они начинаются с
“smtp
” (клиент использовал HELO) или
“esmtp
” (клиент использовал EHLO). Они могут содержать
“s
” если было безопасное (шифрованное) соединение и/или
“a
” для аутентифицированных. таким образом, если получается протокол
“esmtpsa
”, то сообщение было передано по шифрованному SMTP соединению, и клиент был успешно аутентифицирован.
Exim использует имя протокола
“smtps
” для случая, когда шифрование автоматически включается при соединении без использования STARTTLS (смотрите
“tls_on_connect_ports
”), и клиент использует HELO для начала шифрованного сеанса SMTP. Имя
“smtps
” также используется для редкой ситуации, когда клиент первоначально использует EHLO, устанавливает шифрованное соединение, используя STARTTLS, и затем использует HELO.
Опция
“-oMr
” обеспечивает возможность определить имя протокола для сообщений которые отправлены локально, от доверенных отправителей. Обычно это используется для идентификации сообщений, которые повторно инжектятся после сканирования.
$received_time
Эта переменная содержит дату и время, когда текущее сообщение было получено, в виде секунд с начала эпохи Unix.
$recipient_data
Эта переменная устанавливается после успешного индексного поиска в кондишене ACL
“recipients
”. Она содержит данные из поиска, и значение остаётся установленным до следующей проверки
“recipients
”. Таким образом, можно делать такие вещи:
require recipients = cdb*@;/some/file
deny some further test involving $recipient_data
|
Внимание; Эта переменная установлена только в случае, если поиск как метод индексации в списке адресов, с использованием синткаксиса точки с запятой, как в примере. Переменная не установлена для поиска, который используется как часть раскрытия строки, которому все такие списки подвергаются до интерпретации.
$recipient_verify_failure
В ACL, когда проверка получателя неудачна, эта переменная содержит информацию о ошибке. Это может быть одно из следующих слов:
“qualify
”: Адрес был неполный (нет домена), и сообщение не являлось ни локальным, ни прибывшим от неучтённого хоста.
“route
”: Неудачная маршрутизация.
“mail
”: Маршрутизация была удачной, и был предпринят обратный вызов; отклонение произошло до команды MAIL (n/t при начальном подключении, HELO, или MAIL)
“recipient
”: Команда RCPT в обратном вызове была отклонена.
“postmaster
”: Была отклонена проверка postmaster`а в обратном вызове.
Ожидаемое главное использование этой переменной, для различения реджектов MAIL и реджектов RCPT.
$recipients
Эта переменная содержит список получателей сообщения. Адреса разделяютя запятыми и пробелами в тексте замены. Однако, перменная не является общедоступной, для предотвращения просмотра
“Bcc
” получателей в непривелигированных пользовательских фильтрах. Вы можете использовать
“
$recipients
” только в этих двух случаях:
1. В файле системного фильтра.
2. В ACL ассоциированных с командой DATA, тоесть ACL определённые как
“acl_smtp_predata
” и
“acl_smtp_data
”.
$recipients_count
В процессе обработки сообщения эта переменная содержит число получателей сообщения, которые шли с сообщением (имеется ввиду, что тут не учтены получатели, добавленные в процессе обработки). Дубликаты не исключаются из подсчёта. Во время приёма сообщения по SMTP, число увеличивается, для каждого принятого получателя.
$reply_address
В процессе обработки сообщения, в этой переменной находится содержимое строки заголовка
“Reply-To:
”, если она существует и непуста, иначе она содержит значение из строки заголовка
“From:
”. Кроме удаления начального пустого пространства, эта переемнная никак не обрабатывается. В частности, не производится расшифровка по RFC2047 или символьная замена кода.
$return_path
Во время доставки сообщения, эта переменная содержит обратный путь - поле отправителя, посылаемую как часть конверта. Оно не заключено в символы
“<>
”. В начале маршрутизации адреса,
“
$return_path
” установлена в тоже значение, что и
“
$sender_address
”, но если, например, входящее сообщение листа рассылки раскрыто роутером, определяющим другой адрес для возврата, то впоследствии
“
$return_path
” содержит другой адрес возврата, тогда как
“
$sender_address
” всегда содержит оригинальный адрес отправителя, полученный с сообщением. Если сказать по-другому,
“
$sender_address
” содержит адрес отправителя входящего конверта, и
“
$return_path
” содержит адрес исходящего конверта.
$return_size_limit
Это устаревшее название
“
$bounce_return_size_limit
”.
$runrc
Эта переменная содержит код возврата команды, выполненой в элементе раскрытия
“${run...}
”. Предупреждение: В роутере или транспорте, вы не можете предположить порядок раскрытия опций, за исключением тех предварительных условий, чей порядок тестирования задокументирован. Поэтому невозможно ожидать установки
“
$runrc
” в раскрытии одной опции, и использовать её в другой.
$self_hostname
Когда адрес направлен к возможному удалённому хосту, тут устанавливается локальный хост, этот случай контролируется общей
“self
” опцией роутера. Одно из его значений заставляет передать адрес другому роутеру. Когда такое происходит, значение
“
$self_hostname
” будет именем локального хоста, с которым столкнулся роутер. При других обстоятельствах оно будет пустым (null).
$sender_address
При обработке сообщения, эта переменная содержит адрес отправителя полученный в коныерте сообщения. Для возвращаемых сообщений, значение будет пустой строкой. Смотрите также
“
$return_path
”.
$sender_address_data
Если переменная
“
$address_data
” установлена, когда роутеры вызываются из ACL для проверки адреса отправителя, то окончательное значение сохраняется в
“
$sender_address_data
”, для возможности отличить его от адреса получателя. Значение не сохраняется после окончания текущей ACL. Если необходимо сохранять его дольше, то вы можете сохранить его в переменных ACL.
$sender_address_domain
Доменная часть
“
$sender_address
”.
$sender_address_local_part
Локальная часть
“
$sender_address
”.
$sender_data
Эта переменная устанавливается после успешного поиска в условии ACL
“senders
”, или в опции
“senders
”, роутера. Оно содержит данные поиска, и и значение остаётся установленным до следующей проверки
“senders
”. Таким образом, можно делать такие вещи:
require senders = cdb*@;/some/file
deny some further test involving $sender_data
|
Внимание: Эта переменная установлена тольков случае, если поиск используется как метод индексации в списке адресов, используя синтаксис точки с запятой, как в примере выше. Переменная не установлена для поиска который использует часть строки раскрытия, которому подвергаются все списки, до интерпретации.
$sender_fullhost
Когда сообщение получено от удалённого хоста, эта переменная содержит имя хоста и адрес IP в одной строке. Она заканчиватся IP-адресом в квадратных скобках, с номером порта через двоеточие, если включено логирование портов. Формат остальной части строки зависит от того, какая была SMTP команда хоста - HELO или EHLO, и было ли подверждено имя хоста поиском по его IP-адресу. (Поиск IP-адреса модет быть вызыван опцией
“host_lookup
”, независимой от проверки). Простое имя хоста в начале строки - провереное имя хоста; если оно отсутствует, проверка или не проводилась, или не требовалась. Имя хоста в круглых скобках - параметр команды HELO или EHLO. Оно пропущено, если оно идентично проверенному имени хоста или IP-адресу в квадратных скобках.
$sender_helo_name
Когда сообщение получено с удалённого хоста, давшего команду HELO или EHLO, аргумент этой команды помещается в эту переменную. Также оно устанавливается если HELO или EHLO использовалось при локальном SMTP с опциями
“-bs
” или
“-bS
”.
$sender_host_address
Когда сообщение получено от удалённого хоста, эта переменная содержит IP-адрес удалённого хоста. Для локальных сообщений значение пустое.
$sender_host_authenticated
Эта переменная содержит имя (не публичное имя) драйвера аутентификации, который успешно подтвердил подлинность клиента, от которого получено сообщение. Оно пустое, если аутентификации не было. Смотрите также
“
$authenticated_id
”.
$sender_host_name
Когда сообщение передаётся с удалённого хоста, эта переменная содержит имя хоста, полученное поиском по его IP-адресу. Для сообщений полученных другими способами, эта переменная пуста.
Если имя хоста предварительно не искалось, ссылка на
“
$sender_host_name
” вызывает поиск (для сообщений с удалённых хостов). Найденное имя принимвается, только если оно, при прямом поиске по нему, возвращает оригинальный IP. Если или прямой, или обратный поискне могут найти какие-то данные, или если прямой поиск не приводит к первоначальному IP, то
“
$sender_host_name
” остаётся пустым, и
“
$host_lookup_failed
” устанавливается в
“1
”.
Однако, если любой из поисков не может быть завершён (например, произошёл таймаут DNS),
“
$host_lookup_deferred
” устанавливается в
“1
”, и
“
$host_lookup_failed
” остаётся установленным в
“0
”.
Когда
“
$host_lookup_failed
” установлена в
“1
”, exim не пробует снова найти имя хоста при наличии информации о
“
$sender_host_name
” в другом процессе exim`a, но он пробует ещё раз, если
“
$host_lookup_deferred
” установлена в
“1
”.
Exim не ищет, автоматически, каждое имя хоста. Если вы хотите максимальной эффективности, вы должны упорядочить вашу конфигурацию так, чтобы вообще избежать этого поиска. Поиск происходит лишь в случае, если одно или больше условий истинны:
Строка содержащая
“
$sender_host_name
” раскрыта.
Хост с которого идёт запрос, совпадает со списком
“host_lookup
”. В дефолтовой конфигурации, эта опция установлена в *, для устранения поиска надо этот пункт изменить (закомментить - в самом коде эта опция по дефолту не включена).
Экзим нуждается в имени хоста, для проверки элемента в списке хостов. Пункты, которые требуют этого, описаны в разделе 10.13 and 10.15.
Хост запроса соответствует
“helo_try_verify_hosts
” или
“helo_verify_hosts
”. В этом случае, имя хоста требует сравнения с именем, указанным в командах EHLO или HELO, отданных клиентом.
Удалённый хост даёт команду EHLO или HELO, которая содержит один из доменов в
“helo_lookup_domains
”. Значение по-умолчанию этой опции:
helo_lookup_domains = @ : @[]
|
и она вызывает поиск лишь в случае, если удалённый хост некорректно отдал имя сервера или IP-адрес в команде EHLO или HELO.
$sender_host_port
Когда сообщение получено с удалённого хоста, эта переменная содержит номер порта использовавшегося удалённым хостом.
$sender_ident
Когда сообщение получено с удалённого хоста, эта переменная содержит идентификацию перезанную в ответ на запрос по RFC1413. Когда сообщение получено локально, эта переменная содержит имя пользователя вызвавшего exim.
$sender_rate_xxx
Множество переменных, имена которых начинаются с
“
$sender_rate_
”, установленных как часть условия ACL
“ratelimit
”. Детали смотрите в секции 39.30.
$sender_rcvhost
Это необходимо для использования в заголовках
“Received:
”. Она начинается с любого проверенного имени хоста (полученного от обратным поиском в DNS) или, если нет проверенного имени, IP-адресом в квадратных скобках. После этого, в круглых скобках может быть текст. Когда первый пункт - проверенное имя хоста, первый элемент в круглых скобках - IP-адрес в квадратных скобках, с номером порта через двоеточие, если разрешено логирование портов. Когда первый элемент - IP-адрес, то порт записывается внутри круглых скобок, в виде
“port=xxxx
”.
Также могут быть пункты вида
“helo=xxxx
”, если использовались HELO или EHLO, и их параметр не был идентичен реальному имени хоста или IP, и
“ident=xxxx
” если доступна строка ident из RFC1413. Если все три элемента присутствуют в круглых скобках, то в строку вставляется символ новой линии и символ табуляции для улучшения читабельности заголовка
“Received:
”.
$sender_verify_failure
В ACL, когда проверка отправителя неудачна, эта переменная содержит информацию об ошибке.Детали такие же как и у
“
$recipient_verify_failure
”.
$smtp_active_hostname
Во время сеанса SMTP, эта переменная содержит значение имени активного хоста, определённого опцией
“smtp_active_hostname
”. Значение
“
$smtp_active_hostname
” сохраняется с любым переданным сообщением, и его значение можно использовать во время роутинга и доставки.
$smtp_command
В процессе обработки входящей SMTP команды, эта переменная содержит всю команду. Это позволяет различать HELO и EHLO в ACL, а иакже различать команды, типа:
MAIL FROM:<>
MAIL FROM: <>
|
Для команды MAIL, могут быть просмотрены дополнительный параметры, типа SIZE. Для команды RCPT, адрес в
“
$smtp_command
” - оригинальный адрес, до любой перезаписи, тогда как значения в
“
$local_part
” и
“
$domain
” взяты из адреса после SMTP-перезаписи.
$sn0 - $sn9
Эти переменные - копии значений
“
$n0
”-
“
$n9
”, сумматоры бывшие в конце файла системного фильтра. Это позволяет системному фильтру устанавливать значения, которые могут быть проверены в файлах фильтров пользователей. Например, системный фильтр мог установить значение, указывающее, что это сообщение, вероятно, является спамом.
$spam_xxx
Множество переменных с именами начинающимися с
“
$spam
” доступны, если exim скомпилен с расширением контентного сканирования. Для дополнительных деталей, смотрите секцию 40.2.
$spool_directory
Имя директории спула для exim`a.
$spool_inodes
Число свободных inоde в дисковом разделе, где exim держит свои spool-файлы. Значение пересчитывается каждый раз, когда к нему обращаются. Если файловая система не имеет понятия inode, то значение будет -1. Также смотрите опцию
“check_spool_inodes
”.
$spool_space
Количество свободного места (как число килобайт) в дисковом разделе, где пишутся spool-файлы exim`a. Значение пересчитывается каждый раз, когда на переменную ссылаются. Если операционная система не может подсчитать количество свободного места (истинно для экспериментальных систем), то значение будет -1. Например, чтобы проверит в ACL, что есть хотябы 50 мегабайт свободного места в спуле, можно написать:
condition = ${if > {$spool_space}{50000}}
|
Также смотрите опцию
“check_spool_space
”.
$thisaddress
Эта переменная установлена только в процессе обработки команды
“foranyaddress
” в файле фильтра. Её использование объясняется в описании той команды, которая может быть найдена в документации на интерфейс фильтрации почты exim`a.
$tls_certificate_verified
Эта переменная установлена в
“1
”, если при приёме сообщения сертификат TLS проверен, и
“0
” в обратном случае.
$tls_cipher
Когда сообщение получено с удалённого хоста по шифрованному SMTP-подключению, эта переменная содержит использовавшийся тип шифрования, например DES-CBC3-SHA. При других обстоятельствах, в частности, для сообщения полученного по незашифрованным подключениям, переменная пуста. Смотрите главу 38 для подробностей о поддержке TLS.
$tls_peerdn
Когда сообщение получено с удалённого хоста по шифрованному SMTP-подключению, и exim сконфигурирован для запроса сертификата с клиента, значение переменной - имя сертификата, доступное в ней в процессе последующей обработки.
$tod_bsdinbox
Время и дата в формате BSD-майлбокса, например: Thu Oct 17 17:14:09 1995.
$tod_epoch
Время и дата в виде числа секунд с начала эпохи Unix.
$tod_full
Полная версия времени и даты, например: Wed, 16 Oct 1995 09:51:40 +0100. Временной пояс всегд даётся как часово смещение от UTC, с положительными значениями для поясов которые впереди (к востоку), и отрицательных значений для тех, которые позади (на западе).
$tod_log
Время и дата в формате используемом exim`ом в его лог-файлах, например: 1995-10-12 15:32:29, но без временной зоны.
$tod_logfile
Эта переменная содержит дату в формате yyyymmdd. Этот формат используется для штампа даты в файлах логов, когда
“log_file_path
” содержит флаг
“%D
”.
$tod_zone
Эта переменная содержит числовое значение локальной временной зоны, например: -0500.
$tod_zulu
Эта переменная содержит дату и время в формате
“Zulu
”, как задано в ISO8601, например: 20030221154023Z.
$value
Эта переменная содержит результат раскрытия поиска, операции извлечения, или внешней команды, как описано выше.
$version_number
Номер версии exim.
$warn_message_delay
Эта переменная установлена только в течение создания предупредительного сообщения о задержке доставки. Детали по её использованию раскрыты в разделе 45.2.
$warn_message_recipients
Эта переменная установлена только в течение создания предупредительного сообщения о задержке доставки. Детали по её использованию раскрыты в разделе 45.2.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
13. Запуск даемона, и использование сетевых интерфейсов
Хост, который связан сетью TCP/IP, может иметь один, или более, аппаратных (физических) сетевых интерфейсов. Каждый из этих интерфейсов может быть сконфигурирован как один или несколько
“логических
” интерфейсов, с которыми, фактически, работает программа. Каждый из этих логических интерфейсов ассоциирован с IP-адресом. Кроме того, программное обеспечение TCP/IP поддерживает
“loopback
”-интерфейсы (
“127.0.0.1
” в IPv4 и
“::1
” в IPv6), которые не используют какиое-либо физическое устройство. Exim`у требуется информация о интерфейсах хоста для использования в трёх различных обстоятельствах:
1. Когда запущен слушающий даемон, exim должен знать, какие интерфейсы и порты ему нужно слушать.
2. Когда exim роутит адрес, он должен знать, какие IP-адреса ассоциированы с локальными интерфейсами. Это требуется для корректной обработки списков MX, удаляя локальный хост и прочие, с такими же или более высокоприоритетными значениями. Также, exim должен обнаруживать случаи, когда адрес роутится на IP адрес принадлежащий локальному хосту. За исключением опции
“
self
” в роутере, или если опция
“
allow_localhost
” в SMTP-транспорте установлена (как соответствующая), это обрабатывается как ошибочная ситуация (наверно, речь идёт о роутинге адреса на свой собственный хост - прим. lissyara).
3. Когда exim коннектится к удалённому хосту, ему может быть необходимым знать, какой интерфейс использовать для исходящего соединения.
Дефолтовое поведение exim`a, вероятно, будет подходящим, в подавляющем большинстве случаев. Если у вашего хоста лишь один интерфейс, и вы хотите, чтобы все его IP-адреса были обработаны одинаково, и вы используете стандартный SMTP-порт, то вы не должны предпринимать каких-либо специальных действий. Остальная часть этой главы к вам не относится.
В более сложных ситуациях, вам может быть необходимо слушать только на определённых интерфейсах, или на различных портах, и для этого есть много опций, которые можно использовать для влияния на поведение exim`a. Остальная часть этой главы описывает, как они работают.
Когда сообщение получено через TCP/IP, интерфейс и порт, которые фактически использовались, установлены в переменных
“
$interface_address
” и
“
$interface_port
”.
13.1 Запуск слушающего даемона
Когда слушающие даемон запущен (путём опции командной строки
“
-bd
”), интерфейсы и порты на которых он слушает управляются следующими опциями:
“
daemon_smtp_ports
” содержит список дефолтовых портов. (для обратной совместимости, эта опция также может быть задана в единственном числе.)
“
local_interfaces
” содержит список IP адресов интерфейсов, которые слушаются. Каждый элемент может? опционально, определять порт.
В обоих случаях, дефолтовый разделитель списка - двоеточие, но он может быть изменён, как описано в разделе 6.19. Когда используются адреса IPv6, обычно, лучше изменять разделитель, чтобы избежать необходимости удваисать все двоеточия. Например:
local_interfaces = <;
127
.
0
.
0
.
1
; \
192
.
168
.
23
.
65
; \
::
1
; \
3ffe:ffff:836f::fe86:a061
|
Есть два различных формата для задания порта с IP-адресом в
“
local_interfaces
”:
1. Порт добавлен в адрес, с разделеителем в виде точки. Например, для прослушивания порта 1234 на двух различных адресах:
local_interfaces = <;
192
.
168
.
23
.
65
.
1234
; \
3ffe:ffff:836f::fe86:a061.
1234
|
2. IP-адрес заключается в квадратные скобки, и порт добавляется с разделителем в виде двоеточия, например:
local_interfaces = <; [
192
.
168
.
23
.
65
]:
1234
; \
[3ffe:ffff:836f::fe86:a061]:
1234
|
Когда прот не задан, используется значение
“
daemon_smtp_ports
”. Дефолтовая настройка содержит лишь один порт:
Если перечислено более одного порта, каждый интерфейс, для которого не определён его собственный порт, слушает на всех них. Порты перечисленные в
“
daemon_smtp_ports
” могут быть идентифицированы по имени (определённому в
“
/etc/services
”), или по номеру. Однако, когда порты даны в с индивидуальными IP-адресами в
“
local_interfaces
”, только номера (не имена) могут использоваться.
13.2 Специальный IP слушающий адреса
Адрес
“0.0.0.0
” и
“::0
” обрабатываются особенно. Они интерпретируются как
“все интерфейсы IPv4
” и
“все интерфейсы IPv6
”, соответственно. В каждом случае, exim говорит стеку TCP/IP
“слушать на всех интерфейсах IPvx
” вместо установки отдельных слушающих сокетов для каждого интерфейса. Дефолтовое значение
“
local_interfaces
”:
local_interfaces =
0
.
0
.
0
.
0
|
когда exim собран без поддержки IPv6; иначе оно:
local_interfaces = <; ::
0
;
0
.
0
.
0
.
0
|
Таким образом, по умолчанию, exim слушает все доступные интерфейсы, на SMTP-порту.
13.3 Отмена
“local_interfaces
” и
“daemon_smtp_ports
”
Опция командной строки
“
-oX
” может быть использована для переопределения значений
“
daemon_smtp_ports
” и/или
“
local_interfaces
” для специфичаского случая даемона. Другой способ сделать это состоял бы в использовании макроса и опции
“
-D
”. Однако,
“
-oX
” может использоваться лишь административными пользователями, тогда как модификация рабочей конфигурации, использованием опции
“
-D
”, разрешена только когда вызывающий - root или пользователь exim`a.
Значение
“
-oX
” - список значений. Дефолтовый разделитель, двоеточие, может быть изменён обычным способом, если требуется. Если есть элементы не содержащие точек или двоеточий (т.е. не IP адреса), значение
“
daemon_smtp_ports
” заменяется списком этих элементов. Если тут есть какие-то пункты содержащие точки или двоеточия, значение
“
local_interfaces
” заменяется этими элементами. Таким образом, например:
перезадаёт
“
daemon_smtp_ports
”, но оставляет
“
local_interfaces
” неизменным, тогда как
-oX
192
.
168
.
34
.
5
.
1125
|
перезадаёт
“
local_interfaces
”, оставляя неизменным
“
daemon_smtp_ports
”. (Однако, с этого момента
“
local_interfaces
” не содержит элементов без портов, и в этом примере значение
“
daemon_smtp_ports
” неуместно.)
13.4 Поддержка устаревшего протокола SSMTP (или SMTPS)
Exim поддерживает устаревший протокол SSMTP (также известный как SMTPS), который использовался прежде чем для SNMP была стандартизована команда STARTTLS. Некоторые старый клиенты до сих пор используют этот протокол. Если опция
“
tls_on_connect_ports
” установлена в список портов, подключение к этим портам должно использовать SSMTP. Обычное использование этой опции - такое:
tls_on_connect_ports =
465
|
поскольку 465 - обычный порт используемый старыми клиентами. Также есть опция командной строки
“
-tls-on-connect
”, которая вынуждает все порты вести себя так, при старте даемона.
Предупреждение: Установка
“
tls_on_connect_ports
” не вынуждает даемома слушать пречисленные в ней порты. Вы всё равно должны задать
“
daemon_smtp_ports
”,
“
local_interfaces
” или
“
-oX
”. (Это так, потому что
“
tls_on_connect_ports
” обращается к подключениям через
“
inetd
” также, как и к подключениям через даемон)
13.5 Области адресов IPv6
Адреса IPv6 имеют
“области
” (
“scopes
”), и хост с многими аппаратными интерфейсами, в принцмпе, может иметь один и тотже локальный (не до конца понятно, в документации это обозвано link-local - локальный, или локально ссылающийся, чтоли... Не очень я знаю IPv6 - прим. lissyara) адрес IPv6 на различных интерфейсах. Таким образом, необходима дополнительная информация, кроме IP-адреса, чтобы различать индивидуальные интерфейсы. В некоторых случаях, было принято соглашение, о использовании символа процента, сопровождаемого чем-либо (часто - именем интерфейса), приводя к адресам вроде такого:
fe80::
202
:b3ff:fe03:45c1%eth0
|
Для согласования этого использования, символ процента, сопровождаемый произвольной строкой, разрешён в конце адреса IPv6. По дефолту, exim вызывает
“
getaddrinfo()
”, чтобы преобразовать текстовый адрес IPv6 для фактического использования. Эта функция распознаёт соглашение процента в операционных системах, которые поддерживают его, и соответственно обрабатывают адрес. К сожалению, некоторые старые библиотеки имеют проблемы с
“
getaddrinfo()
”. Если
установлена в
“
Local/Makefile
” (или в ОС-зависимом
“
Makefile
”) когда exim собирается, exim использует
“
inet_pton()
” для конвертации текстового адреса IPv6 в реально используемый, вместо
“
getaddrinfo()
”. (До версии 4.14, всегда использовалась эта функция.) Конечно, это означает, что дополнительные возможности
“
getaddrinfo()
” - распознание областей адресов - потеряны.
13.6 Отключение IPv6
Иногда случается, что бинарник exim`a собранный с поддержкой IPv6, запускается на хосте, ядро которого не знает о IPv6. Бинарник продолжает использовать IPv4, но это может вызывать пустую растрату ресурсов на поиск AAAA записей, и попыток коннекта к адресам IPv6, вызывающие задержки в доставке почты. Если вы устанвите опцию
“
disable_ipv6
” в
“истина
”, даже когда бинарник exim`a поддерживает IPv6, IPv6 не активируется. AAAA записи никогда не ищутся, и любые адреса IPv6 перечисленные в
“
local_interfaces
”, данных для маршрутизатора
“
manualroute
” и т.д. - игнорируются. Eсли IP литералы включены (доставка не по имени а по IP - прим. lissyara), роутер
“
ipliteral
” отказывается обрабатывать адреса IPv6.
C другой стороны, когда используется IPv6, могут быть моменты, когда вы хотите отключить его для определённых хостов или доменов. Вы можете использовать опцию
“
dns_ipv4_lookup
” для глобальног подавления поиска AAAA записей для указанных доменов, и можете использовать общую опцию роутеров
“
ignore_target_hosts
”, для игнорирования адресов IPv6 в индивидуальном роутере.
13.7 Примеры запуска слушающего даемона
Дефолтовый случай в среде IPv6 таков:
daemon_smtp_ports = smtp
local_interfaces = <; ::
0
;
0
.
0
.
0
.
0
|
Этим определяется слушать smtp-порт на всех интерфейсах IPv4 и IPv6. Могут использоваться один или два сокета, в зависимости от характеристик стека TCP/IP. (Это запутанно, и беспорядочно; для дополнительной информации прочтите комментарии в файле исходников
“
daemon.c
”)
Для задания прослушивания портов 25 и 26 на всех интерфейсах:
daemon_smtp_ports =
25
:
26
|
(оставляя
“
local_interfaces
” с дефолтовыми настройками), или, более явно:
local_interfaces = <; ::
0
.
25
; ::
0
.
26
\
0
.
0
.
0
.
0
.
25
;
0
.
0
.
0
.
0
.
26
|
Для того, чтобы слушать на дефолтовом порту всех IPv4 интерфейсов и порту 26, только на адресе обратной петли:
local_interfaces =
0
.
0
.
0
.
0
:
127
.
0
.
0
.
1
.
26
|
Для того, чтобы слушать на дефолтовом порту, только на специфических интерфейсах:
local_interfaces =
192
.
168
.
34
.
67
:
192
.
168
.
34
.
67
|
Предупреждение: Такая установка исключает прослушивание интерфейса обратной петли.
13.8 Распознание локального хоста
Опция
“
local_interfaces
” также используется, когда exim`y необходимо определить, действительно ли IP адрес относится к локальному хосту. таким образом, все IP-адреса, на которых слушает даемон, всегда обрабатываются как локальные.
Для этого использования, номера портов в
“
local_interfaces
” игнорируются. Если встречается один из двух элементов
“0.0.0.0
” или
“::1
”, exim получает полный список доступных интерфейсов от операционной системы, и извлекает уместные (т.е. IPv4 или IPv6) адреса, чтобы использовать для проверки.
Некоторые системы устанавливают большое число вирутальных интерфейсов, для обеспечения большого числа виртуальных серверов в сети. В этой ситуации, вы можете захотеть слушать лишь некоторые доступные интерфейсы для получения почты, но обрабатывать все локальные интерфейсы как местные, при роутинге. Вы можете сделать это установкой
“
extra_local_interfaces
” в список IP-адресов, возможно, включая подстановочное значение
“все
”. Эти адреса распознаются как локальные, но не используются для прослушивания. Рассмотрите этот пример:
local_interfaces = <;
127
.
0
.
0
.
1
; ::
1
; \
192
.
168
.
53
.
235
; \
3ffe:
2101
:
12
:
1
:a00:20ff:fe86:a061
extra_local_interfaces = <; ::
0
;
0
.
0
.
0
.
0
|
даемон слушает на интерфейсе обратной петли, и лишь на одном адресе IPv4 и одном адресе IPv6, но все доступные интерфейсы обрабатываются как локальные, при роутинге.
В некотором количестве окружения, имя локального хоста может быть в списке MX, но с IP-адресом не назначенным ни одному местному интерфейсу. В других случаях, может быть желательным обработать другие имена хостов, как будто они ссылаются на локальный хост. Оба этих случая могут быть обработаны установкой опции
“
hosts_treat_as_local
”. Она содержит имена хостов, а не IP-адреса. Когда на хост ссылаются в процессе маршрутизации, или через MX-запись, или непосредственно, он обрабатывается как локальный хост, если его имя совпадает с
“
hosts_treat_as_local
”, или если любой из его IP-адресов совпадает с
“
local_interfaces
” или
“
extra_local_interfaces
”.
13.9 Доставка к удалённому хосту
Доставка к удалённому хосту обрабатывается smtp-транспортом. По-умолчанию, это позволяет системным функциям TCP/IP выбирать, какой интерфейс использовать (если их больше одного) при соединении с удалённым хостом. Однако, опцией
“
interface
” может быть установлено, какой интерфейс использовать. Смотрите описание smtp-транспотра в разделе 30, для получения дополнительных деталей.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
14. Главная конфигурация
Первая часть файла рабочей конфигурации содержит три типа элементов:
Макроопределения: Эти строки начинаются с символа в верхнем регистре. Смотрите раздел 6.4 для получения дополнительных деталей о макрообработке.
Определения именованных списков: Эти строки начинаются с одного из слов
“domainlist
”,
“hostlist
”,
“addresslist
”, или
“localpartlist
”. Их использование описано в разделе 10.5.
Главные конфигурационные настройки: Каждая установка занимает одну строку файла (с возможностью продолжения). Если какой-либо установке предшествует слово
“hide
”, опция командной строки
“
-bP
” отображает её значение лишь административным пользователям. Смотрите раздел 6.10 для описания синтаксиса этих параметров настройки.
Эта глава определяет все главные конфигурационные опции, наряду с их типами и дефолтовыми значениями. Для простоты нахождения специфической опции, они перечислены в алфавитном порядке ниже, в разделе 14.23. Однако, поскольку сейчас тут очень много опций, они, вначале, кратко перечислены в функциональных группах, как помощь, для нахождения имени опции, которую вы ищете. Некоторые опции перечислены более чем в одной группе.
14.1 Разное
“
bi_command
” - запускается при опции командной строки
“
-bi
”
“
disable_ipv6
” - не обрабатывать IPv6
“
keep_malformed
” - для повреждённых файлов - должно не случаться
“
localhost_number
” - для уникальных идентификаторов сообщений, в кластерах
“
message_body_visible
” - как много показывать в
“
$message_body
”
“
mua_wrapper
” - работать в режиме
“MUA wrapper
”
“
print_topbitchars
” - печатать символы верхних битов
“
timezone
” - принудительная установка часового пояса
14.2 Параметры exim
“
exim_group
” - переопределяет вкомпиленное значение
“
exim_path
” - переопределяет вкомпиленное значение
“
exim_user
” - переопределяет вкомпиленное значение
“
primary_hostname
” - дефолт из
“
uname()
”
“
split_spool_directory
” - использовать много директорий
“
spool_directory
” - переопределяет вкомпиленное значение
14.3 Настройки привелегий
“
admin_groups
” - не логгировать подключения
“
deliver_drop_privilege
” - отказ от root`овых прав при доставке
“
local_from_check
” - вставлять
“
Sender:
”, если необходимо
“
local_from_prefix
” - для проверки
“
From:
”, для локального отправителя
“
local_from_suffix
” - для проверки
“
From:
”, для локального отправителя
“
local_sender_retain
” - оставлять
“
Sender:
”, для недоверенных пользователей
“
never_users
” - не запускать доставки под этими пользователями
“
prod_requires_admin
” - принудительная доставка требует административного пользователя
“
queue_list_requires_admin
” - листинг очереди требует административного пользователя
“
trusted_groups
” - группы, которым доверяют
“
trusted_users
” - пользователи, которым доверяют
14.4 Логгинг
“
hosts_connection_nolog
” - не логгировать соединения
“
log_file_path
” - переопределяет вкомпиленные значения
“
log_selector
” - установить/сбросить опциональный логгинг
“
log_timezone
” - добавлять в строки логов временную зону
“
message_logs
” - создавать логи для каждого сообщения
“
preserve_message_logs
” - оставлять логи каждого сообщения после обработки
“
process_log_path
” - для SIGUSR1 и
“
exiwhat
”
“
syslog_duplication
” - контролировать повторяющиеся строки логов в syslog
“
syslog_facility
” - установка поля
“facility
” в syslog
“
syslog_processname
” - установка поля
“ident
” в syslog
“
syslog_timestamp
” - временная метка в строках syslog
“
write_rejectlog
” - контролирует использование лога сообщений
14.5 Замороженные сообщения
“
auto_thaw
” - устанавливает время повтора, для замороженного сообщения
“
freeze_tell
” - посылка сообщения, когда происходит заморозка
“
move_frozen_messages
” - в другую директорию
“
timeout_frozen_after
” - как долго хранить замороженные сообщения
14.6 Поиск данных
“
ldap_default_servers
” - используется, если нет сервера в запросе
“
ldap_version
” - устанавливает версию протокола
“
lookup_open_max
” - сколько файлов держать открытыми
“
mysql_servers
” - смысл соответствует названию опции
“
oracle_servers
” - смысл соответствует названию опции
“
pgsql_servers
” - смысл соответствует названию опции
“
sqlite_lock_timeout
” - смысл соответствует названию опции
14.7 Идентификаторы сообщений
“
message_id_header_domain
” - используется для построения заголовка
“
Message-ID:
”
“
message_id_header_text
” - смысл соответствует названию опции
14.8 Запуск встроенного perl`a
“
perl_at_start
” - всегда запускать интерпретатор
“
perl_startup
” - код для выполнения, при запуске perl
14.9 Даемон
“
daemon_smtp_ports
” - дефолтовые порты
“
daemon_startup_retries
” - число повторов при неудачном запуске
“
daemon_startup_sleep
” - время ожидания между повторными запусками
“
extra_local_interfaces
” - какие интерфейсы необязательно слушать
“
local_interfaces
” - какие интерфейсы слушать, с опциональным номером порта
“
pid_file_path
” - перезадаёт вкомпиленное значение
“
queue_run_max
” - максимальное число одновременных обработчиков очереди
14.10 Контроль ресурсов
“
check_log_inodes
” - до приёма сообщения
“
check_log_space
” - до приёма сообщения
“
check_spool_inodes
” - до приёма сообщения
“
check_spool_space
” - до приёма сообщения
“
deliver_queue_load_max
” - не обрабатывать очередь при высокой загрузке
“
queue_only_load
” - при высокой загрузке, входящие сообщения, только класть в очередь
“
queue_run_max
” - максимальное число одновременных обработчиков очереди
“
remote_max_parallel
” - параллельных SMTP доставок, на сообщение
“
smtp_accept_max
” - одновременных входящих соединений
“
smtp_accept_max_nommail
” - не-почтовых команд
“
smtp_accept_max_nonmail_hosts
” - хосты к которым применяются ограничения
“
smtp_accept_max_per_connection
” - сообщений за соединение
“
smtp_accept_max_per_host
” - соединений с одного хоста
“
smtp_accept_queue
” - при большом числе соединений, класть сообщения в очередь, не доставлять
“
smtp_accept_queue_per_connection
” - класть в очередь, при большом числе сообщений за одно соединение
“
smtp_accept_reserve
” - принимать только от зарезервированных хостов, если много соединений
“
smtp_check_spool_space
” - проверять свободное место, исходя из SIZE в команде MAIL
“
smtp_connect_backlog
” - передаётся стеку TCP/IP
“
smtp_load_reserve
” - SMTP с зарезервированных хостов, при высокой загрузке
“
smtp_reserve_hosts
” - список зарезервированных хостов
14.11 Управление политиками
“
acl_not_smtp
” - ACL для не-SMTP сообщений
“
acl_not_smtp_mime
” - ACL для не-SMTP частей MIME
“
acl_smtp_auth
” - ACL для AUTH
“
acl_smtp_connect
” - ACL для соединений
“
acl_smtp_data
” - ACL для DATA
“
acl_smtp_etrn
” - ACL для ERTN
“
acl_smtp_expn
” - ACL для EXPN
“
acl_smtp_helo
” - ACL для HELO или EHLO
“
acl_smtp_mail
” - ACL для MAIL
“
acl_smtp_mailauth
” - ACL для команды AUTH в команде MAIL
“
acl_smtp_mime
” - ACL для чaстей MIME
“
acl_smtp_predata
” - ACL для начала данных
“
acl_smtp_quit
” - ACL для QUIT
“
acl_smtp_rcpt
” - ACL для RCPT
“
acl_smtp_starttls
” - ACL для STARTTLS
“
acl_smtp_vrfy
” - ACL для VRFY
“
av_scanner
” - определяет сканер вирусов
“
check_rfc2047_length
” - проверяет, длинну
“закодированных слов
” (по RFC2047)
“
dns_csa_search_limit
” - контролирует вложенность поисков CSA
“
dns_csa_use_reverse
” - включение/выключение реверсивных поисков IP CSA
“
header_maxsize
” - полный размер заголовка сообщения
“
header_line_maxsize
” - ограничения строки одного заголовка
“
helo_accept_junk_hosts
” - позволить синтаксические ошибки для этих хостов
“
helo_allow_chars
” - разрешить неправильные символы в HELO
“
helo_lookup_domains
” - искать имя хоста для этих имён в HELO
“
helo_try_verify_hosts
” - мягкая проверка HELO для этих хостов
“
helo_verify_hosts
” - жёсткая проверка HELO для этих хостов
“
host_lookup
” - искать имя хоста (в DNS - прим. lissyara) для этих хостов
“
host_lookup_order
” - порядок поиска имён в DNS и локально
“
host_reject_connection
” - отклонить соединения с этих хостов
“
hosts_treat_as_local
” - полезно для некоторых кластерных конфигураций
“
local_scan_timeout
” - таймаут для
“
local_scan()
”
“
message_size_limit
” - для всех сообщений
“
percent_hack_domains
” - распознавать %-хак, для этих доменов
“
spamd_address
” - указать интерфейс к SpamAssassin
14.12 Кэш обратных вызовов
“
callout_domain_negative_expire
” - таймаут для элементов негативного кэша доменов
“
callout_domain_positive_expire
” - таймаут для элементов позитивного кэша доменов
“
callout_negative_expire
” - таймаут для элементов негативного кэша адресов
“
callout_positive_expire
” - таймаут для элементов позитивного кэша адресов
“
callout_random_local_part
” - строка используемая для
“случайного
” тестирования
14.13 TLS
“
tls_advertise_hosts
” - информировать о TLS эти хосты
“
tls_certificate
” - расположение сертификата сервера
“
tls_crl
” - список аннулированых сертификатов
“
tls_dhparam
” - параметры DH для сервера
“
tls_on_connect_ports
” - задание порта SSMTP (SMTPS)
“
tls_privatekey
” - расположение приватного ключа сервера
“
tls_remember_esmtp
” - не сбрасывать после начала TLS
“
tls_require_ciphers
” - определить разрешённые цифры
“
tls_try_verify_hosts
” - пробовать проверить сертификаты клиента
“
tls_verify_certificates
” - ожидаемые сертификаты клиентов
“
tls_verify_hosts
” - обязательная проверка сертификатов клиента
14.14 Локальная обработка пользователей
“
finduser_retries
” - полезна в окружении NIS
“
gecos_name
” - используется при создании
“
Sender:
”
“
gecos_pattern
” - смысл соответствует названию опции
“
max_username_length
” - для систем, укорачивающих имена
“
unknown_login
” - используется, когда не найден логин
“
unknown_username
” - смысл соответствует названию опции
“
uucp_from_pattern
” - для распознания строк
“From
”
“
uucp_from_sender
” - смысл соответствует названию опции
14.15 Все входящие сообщения (SMTP и не-SMTP)
“
header_maxsize
” - полный размер заголовка сообщения
“
header_line_maxsize
” - ограничение отдельной строки заголовка
“
message_size_limit
” - применяется ко всем сообщениям
“
percent_hack_domains
” - распознавать %-хак для этих доменов
“
received_header_text
” - раскрывать для создания
“
Received:
”
“
received_headers_max
” - для детектирования зациклиания почты
“
recipients_max
” - ограничение на сообщение
“
recipients_max_reject
” - отклонять сообщения у которых слишком много получателей
14.16 Входящие не-SMTP сообщения
“
receive_timeout
” - для не-SMTP сообщений
14.17 Входящие не-SMTP сообщения
Также смотрите выше, раздел
“
Управление политиками
”.
“
host_lookup
” - поиск имени хоста для этих хостов
“
host_lookup_order
” - порядок поиска имени в DNS и локально
“
recipient_unqualified_hosts
” - может слать с неквалифицированным получателем
“
rfc1413_hosts
” - создаёт вызов ident к этим хостам
“
rfc1413_query_timeout
” - ноль - отключает вызовы ident
“
sender_unqualified_hosts
” - может слать с неквалифицированным отправителем
“
smtp_accept_keepalive
” - немного магии TCP/IP
“
smtp_accept_max
” - одновременных входящих соединений
“
smtp_accept_max_nonmail
” - не-почтовых команд
“
smtp_accept_max_nonmail_hosts
” - хосты к которым применяются ограничения
“
smtp_accept_max_per_connection
” - сообщений через соединение
“
smtp_accept_max_per_host
” - соединений с одного хоста
“
smtp_accept_queue
” - оставлять в очереди, если много соединений
“
smtp_accept_queue_per_connection
” - оставлять в очереди, если много сообщений в соединении
“
smtp_accept_reserve
” - только зарезервированные хосты, если много соединений
“
smtp_active_hostname
” - имя хоста для использования в сообщении
“
smtp_banner
” - текст для приветственного баннера
“
smtp_check_spool_space
” - из SIZE в команде MAIL
“
smtp_connect_backlog
” - передаётся стеку TCP/IP
“
smtp_enforce_sync
” - синхронизация SMTP команд/ответов
“
smtp_etrn_command
” - что запускать для ETRN
“
smtp_etrn_serialize
” - лишь один одновременно
“
smtp_load_reserve
” - только зарезервированные хосты, если такая загрузка
“
smtp_max_unknown_commands
” - до разрыва соединения
“
smtp_ratelimit_hosts
” - применять ограничения частоты для этих хостов
“
smtp_ratelimit_mail
” - ограничения частоты для команд MAIL
“
smtp_ratelimit_rcpt
” - ограничения частоты для команд RCPT
“
smtp_receive_timeout
” - для команды, или строки данных
“
smtp_reserve_hosts
” - список зарезервированных хостов
“
smtp_return_error_details
” - выдавать детали о отклонении
14.18 Расширения SMTP
“
accept_8bitmime
” - информировать о 8BITMIME
“
auth_advertise_hosts
” - информировать эти хосты о AUTH
“
ignore_fromline_hosts
” - разрешить
“From
”, для этих хостов
“
ignore_fromline_local
” - разрешить
“From
”, для локальных SMTP
“
pipelining_advertise_hosts
” - информировать эти хосты о конвейерной обработке
“
tls_advertise_hosts
” - информировать эти хосты о TLS
14.19 Обработка сообщений
“
allow_domain_literals
” - распознавать синтаксис доменных литералов
“
allow_mx_to_ip
” - разрешить MX указывать на IP-адрес
“
allow_utf8_domains
” - в адресе
“
check_rfc2047_length
” - проверяет, длинну
“закодированных слов
” (по RFC2047)
“
delivery_date_remove
” - из входящих сообщений
“
envelope_to_remote
” - из входящих сообщений
“
extract_addresses_remove_arguments
” - затрагивает обработку
“
-t
”
“
headers_charset
” - значение по умолчанию для переводов
“
qualify_domain
” - значение по умолчанию для отправителей
“
qualify_recipient
” - значение по умолчанию для получателей
“
return_path_remove
” - из входящих сообщений
“
strip_excess_angle_brackets
” - в адресах
“
strip_trailing_dot
” - в конце адресов
“
untrusted_set_sender
” - недоверенные могут устанавливать отправителя конверта
14.20 Системный фильтр
“
system_filter
” - расположение системного фильтра
“
system_filter_directory_transport
” - транспорт для доставки в директорию
“
system_filter_file_transport
” - транспорт для доставки в файл
“
system_filter_group
” - группа, от которой работает фильтр
“
system_filter_pipe_transport
” - транспорт для доставки в трубу
“
system_filter_reply_transport
” - транспорт для доставки автоответа
“
system_filter_user
” - пользователь, от которого работает системный фильтр
14.21 Роутинг и доставка
“
disable_ipv6
” - не обрабатывать IPv6
“
dns_again_means_nonexist
” - для битых доменов
“
dns_check_names_pattern
” - предварительная синтаксическая проверка DNS
“
dns_ipv4_lookup
” - для этих доменов, поиск только v4
“
dns_retrans
” - параметр для резольвера
“
dns_retry
” - параметр для резольвера
“
hold_domains
” - задержать доставку для этих доменов
“
local_interfaces
” - для проверок роутинга
“
queue_domains
” - нет немедленной доставки для этих доменов
“
queue_only
” - нет немедленной доставки для всех
“
queue_only_file
” - нет немедленной доставки, если файл существует
“
queue_only_load
” - нет немедленной доставки, если высокая загрузка
“
queue_only_override
” - позволить отменять с командной строки
“
queue_run_in_order
” - порядок доставки
“
queue_run_max
” - одновременных обработчиков очереди
“
queue_smtp_domains
” - нет немедленной SMTP доставки для этих доменов
“
remote_max_parallel
” - параллельных SMTP доставок на сообщение
“
remote_sort_domains
” - порядок удалённых доставок
“
retry_data_expire
” - таймаут для данных повторов
“
retry_interval_max
” - безопасная сеть для правил повторов
14.22 Рикошеты и предупрждающие сообщения
“
bounce_message_file
” - содержимое рикошета
“
bounce_message_text
” - содержимое рикошета
“
bounce_return_body
” - включать тело, если сообщение возвращается
“
bounce_return_message
” - включать оригинальное сообщение в рикошет
“
bounce_return_size_limit
” - ограничение на возвращаемые сообщения
“
bounce_sender_authentication
” - посылать аутентифицированному отправителю с рикошетом
“
errors_copy
” - копировать рикошеты
“
errors_reply_to
” -
“
Reply-to:
” в рикошетах
“
delay_warning
” - планирование времени
“
delay_warning_condition
” - условие для предупреждающих сообщений
“
ignore_bounce_errors_after
” - уничтожать недоставленные рикошеты
“
smtp_return_error_details
” - выдывать детали при отклонении
“
warn_message_file
” - содержимое предупреждающего сообщения
14.23 Алфавитный список главных опций
Те опции, которые подвергаются раскрытию строки, до использования, помечены символом
Ҡ
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
accept_8bitmime
|
main
|
boolean
|
false
|
|
Эта опция заставляет exim посылать 8BITMIME в его ответе на команду SMTP EHLO, и принимать параметр BODY= в командах MAIL. Однако, хотя exim чисто 8-битовый, он не конвертер протоколов, и не принимает каких-либо специальных действий для сообщений полученных в соответствии с этим маршрутом. Следовательно, по умолчанию эта опция отключена.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_not_smtp
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемый до начала приёма не-SMTP-сообщения. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_not_smtp_mime
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемый для индивидуальных частей MIME не-SMTP-сообщений. Она работает таким же образом, как и
“
acl_smtp_mime
” для SMTP-сообщений.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_auth
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP AUTH. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_connect
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_data
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую после обработки команды SMTP DATA, и получения самого сообщения, но до посылки заключительного подтверждения. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_etrn
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP ETRN. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_expn
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP EXPN. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_helo
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP HELO или EHLO. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_mail
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP MAIL. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_mailauth
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды AUTH с командой MAIL. Для дополнительных деталей ACL смотрите раздел 39, и раздел 33 для деталей аутентификации.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_mime
|
main
|
string†
|
unset
|
|
Эта опция доступна когда exim собран с расширением контентного сканирования. Это задаёт ACL запускаемую для каждой MIME части в сообщении. Смотрите раздел 40.4 для получения дополнительных деталей.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_predata
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP DATA, до получения самого сообщения. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_quit
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP QUIT. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_rcpt
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP RCPT. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_starttls
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP STARTTLS. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
acl_smtp_vrfy
|
main
|
string†
|
unset
|
|
Эта опция определяет ACL, выполняемую при получении команды SMTP VRFY. Для дополнительных деталей смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
admin_groups
|
main
|
string†
|
unset
|
|
Эта опция раскрывается один раз, в процессе старта exim. Если текущая группа или любая из дополнительных групп вызвавшего exim (пользователя, видимо - прим. lissyara) находятся в этом списке, разделённом двоеточиями, вызывающий имеет административные привилегии. Если все ваши системные программисты находятся в определённой группе, например, вы можете дать им всем привилегии администратора exim`a, поместив их группу в
“
admin_groups
”. Однако, это не разрешает читать им читать файлы спула exim`a (группа которых - группа exim`a). Для разрешения этого, вы должны добавить отдельных людей в группу exim`a.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
allow_domain_literals
|
main
|
boolean
|
false
|
|
Если эта опция установлена, формат буквальных адресов (с иcпользованием IP-адреса вместо домена - прим. lissyara), в соответствии с RFC2822, разрешён в e-mail адресах. По умолчанию, эта опция не задана, поскольку доменные литералы не требуются в наши дни, и немногие люди знают о них. Однако это эксплуатируется спамерами.
К сожалению, кажется, некоторые майнтайнеры (чё-то не нашёл синонима в русском - короче люди, осуществляющие поддержку - прим. lissyara) чёрных списков DNS, используют этот формат для сообщения постмастеру, о попадении хоста в чёрные списки. Если вы хотите принимать почту, адресованную вашему хосту по IP-адресу, вам необходимо установить опцию
“
allow_domain_literals
” в истину, и, также, добавить
“@[]
” в список локальных доменов (заданный в именованом списке доменов
“
local_domains
”, в дефолтовой конфигурации). Эта
“волшебная строка
” соответствует форме доменных литералов для всех IP-адресов локального хоста.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
allow_mx_to_ip
|
main
|
boolean
|
false
|
|
Кажется, что что всё больше и больше администраторов DNS-зон нарушают правила и помещают доменные имена, которые похожи на IP-адреса справа от MX-записей. Exim следует правилам, и отклоняет их, выдавая сообщение о ошибке, объясняющее неверную конфигурацию. Однако, некоторые другие MTA поддерживают эту практику, и для избежания жалоб
“Почему exim не может этого?
”, существует
“
allow_mx_to_ip
”, для допущения этой отвратительной деятельности. Это не рекомендуется, кроме случаев, когда у вас нет иного выбора.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
allow_utf8_domains
|
main
|
boolean
|
false
|
|
Большое обсуждение продолжается о интернационализированых доменных именах. Один лагерь - настаивает на использовании только символов UTF-8, и кажется, что по крайней мере два других MTA мешают этому. Эта опция позволяет пользователям exim`a экспериментировать, если они этого желают.
Если она установлена в истину, функция парсинга доменов exim`a разрешает появляение допустимых мультисимволов UTF-8 в компонентах доменного имени, в дополнение к буквам, цифрам и дефисам. Однако, лишь установки этой опции - недостаточно; если вы хотите искать такие имена в DNS, вы также должны корректировать значение
“
dns_check_names_pattern
”, для соответствия расширенной форме.Подходящая настройка:
dns_check_names_pattern = (?i)^(?>(?(
1
)\.|())[a-z0-9\xc0-\xff]\
(?>[-a-z0-9\x80-\xff]*[a-z0-9\x80-\xbf])?)+$
|
Альтернативно, вы можете только отключить эту возможность, установив
dns_check_names_pattern =
|
Таким образом, установка опции в пустую строку, не производит проверку.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
auth_advertise_hosts
|
main
|
host list†
|
*
|
|
Если сконфигурированы какие-либо серверный аутентификационные механизмы, exim информирует о них в ответе на команду HELO, лишь если хост запроса соответствует этому списку. Иначе, exim не информирует AUTH. Exim не принимает команды AUTH от клиентов, которым не сообщалось о доступности AUTH. Информированием о индивидуальных аутентификационных механизмах можно управлять использованием общей аутентификационной опции
“
server_advertise_condition
” в индивидуальных аутентификаторах. Для дополнительных деталей смотрите раздел 33.
Определённые почтовые клиенты (например Netscape) требуют, чтобы пользователь предоставил имя пользователя и пароль для идентификации, если информируется AUTH, даже при том, что может не являться необходимым (хост может принимать сообщения от хостов из своей LAN без аутентификации, например). Опция
“
auth_advertise_hosts
” может быть использована чтобы сделать этих клиентов более дружелюбными, путём исключения их из хостов к которым выводиться информация о AUTH.
Если вы хотите информировать о доступности AUTH лишь когда подключение зашифровано с использованием TLS, вы можете использовать тот факт, что значение этой опции раскрывается, установкой типа такой:
auth_advertise_hosts = ${if eq{$tls_cipher}{}{}{*}}
|
Если
“
$tls_cipher
” пуста, сессия не шифрованная, и результат раскрытия пуст, таким образом, не соответствуя никаким хостам. Иначе, разультат раскрытия
“*
”, соответствующая всем хостам.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
auto_thaw
|
main
|
time
|
0s
|
|
Если в этой опции будет время большее нуля, то обработчик очереди будет пробовать произвести новую попытку доставки для любых замороженных сообщений, кроме рикошетов, если прошло много времени с того момента как они заморожены. Это может привести к повторной заморозке сообщения, если ничего не изменилось с момента последней попытки доставки. Это - способ сказать
“пытаюсь, несмотря на большие проблемы
”.
Отметтьте: Это старая опция, которая предшествовала
“
timeout_frozen_after
” и
“
ignore_bounce_errors_after
”. Она сохранена для совместимости, но она не многим полезна, и лучше избегать её использования.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
av_scanner
|
main
|
string
|
смотрите ниже
|
|
Эта опция доступна, если exim собран с расширением контентного сканирования. Она задаёт, какой антивирусный сканер будет использоваться. Значение по умолчанию:
Если значение
“
av_scanner
” начинается с символа
“$
”, то оно раскрывается перед использованием. Для дополнительных деталей смотрите раздел 40.1.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bi_command
|
main
|
string
|
string
|
|
Эта опция предоставляет имя команды, которая будет выполнена когда exim вызывается с опцией
“
-bi
” (смотрите раздел 5). Значение строки - лишь имя команды, а не полная командная строка. Если требуются аргументы, они должны быть из опции командной строки
“
-oA
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bounce_message_file
|
main
|
string
|
string
|
|
Эта опция определяет файл шаблона, содержащий параграфы текста, используемые для конструирования сообщения рикошета. Детали о содержимом файла даны в разделе 45. Смотрите также
“
warn_message_file
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bounce_message_text
|
main
|
string
|
unset
|
|
Когда задана эта опция, её содержимое включается в дефолтовое рикошет, сразу после
“This message was created automatically by mail delivery software.
” Она не используется, если установлена опция
“
bounce_message_file
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bounce_return_body
|
main
|
boolean
|
true
|
|
Эта опция контролирует, включено ли тело входящего сообшения в рикошет, когда
“
bounce_return_message
” - истина. Дефолтовая настройка включает всё сообщение, и заголовок и тело, в возвращаемое сообщение (подчиняясь значению
“
bounce_return_size_limit
”). Если эта опция ложна, включаются лишь заголовки сообщения. В случае не-SMTP-сообщения, содержащего ошибку, обнаруженную в точке приёма, возвращаются лишь те строки заголовка, которые предществуют пункту, где была обнаружена ошибка.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bounce_return_message
|
main
|
boolean
|
true
|
|
Если эта опция установлена в ложь, ничего из оригинального сообщения не включается в сообщение генерируемое exim`ом. Смотрите, также,
“
bounce_return_size_limit
” и
“
bounce_return_body
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bounce_return_size_limit
|
main
|
integer
|
100K
|
|
Эта опция устанавливает лимит, в байтах, на размер сообщения возвращаемого отправителю как часть сообщения рикошета, когда опция
“
bounce_return_message
” истинна. Предел должен быть меньше, чем значение глобальной опции
“
message_size_limit
” и любых настроек
“
message_size_limit
” в транспортах, для разрешения генерируемого exim`ом текста о срыве доставки сообщения. Если эта опция установленна в ноль, то нет ограничений на размер.
Когда тело любого сообщения, которое должно быть включено в рикошет, больше этого предела, оно усекается, и вверху добавляется комментарий о этом. Фактическое сокращение может быть больше данного значения, вследствие использования буферизации, для передачи сообщения кусками (обычно, размером 8k). Идея состоит в сохранении пропускной способности на недоставленных сообщениях, размером 15 мегабайт (видимо, это был пример - прим. lissyara).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
bounce_sender_authentication
|
main
|
string
|
unset
|
|
Эта опция предоставляет адрес аутентифицированного отправителя, который шлёт любые сообщения рикошета, сгенерированные exim`ом, посылаемые через аутентифицированное SMTP-соединение. Типичная установка такая:
bounce_sender_authentication = mailer-daemon@my.domain.example
|
которая вынудила бы посылать рикошеты с использованием такой SMTP-команды:
MAIL FROM:<> AUTH=mailer-daemon@my.domain.example
|
Значение
“
bounce_sender_authentication
” всегда должно быть полным e-mail адресом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
callout_domain_negative_expire
|
main
|
time
|
3h
|
|
Эта опция определяет срок использования негативных кэшированных данных доменов, для обратных вызовов. Смотрите раздел 39.32 для дополнительных деталей о проверке обратных вызовов, и раздел 39.34, для деталей о кэшировании.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
callout_domain_positive_expire
|
main
|
time
|
3d
|
|
Эта опция определяет срок использования позитивных кэшированных данных доменов, для обратных вызовов. Смотрите раздел 39.32 для дополнительных деталей о проверке обратных вызовов, и раздел 39.34, для деталей о кэшировании.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
callout_negative_expire
|
main
|
time
|
2h
|
|
Эта опция определяет срок использования негативных кэшированных данных адресов, для обратных вызовов. Смотрите раздел 39.32 для дополнительных деталей о проверке обратных вызовов, и раздел 39.34, для деталей о кэшировании.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
callout_positive_expire
|
main
|
time
|
24h
|
|
Эта опция определяет срок использования позитивных кэшированных данных адресов, для обратных вызовов. Смотрите раздел 39.32 для дополнительных деталей о проверке обратных вызовов, и раздел 39.34, для деталей о кэшировании.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
callout_random_local_part
|
main
|
string†
|
смотрите ниже
|
|
Эта опция определяет
“случайную
” локальную часть, которая будет использоваться как часть проверки обратным вызовом. Значение по умолчанию:
$primary_host_name-$tod_epoch-testing
|
Смотрите раздел 39.33 для получения дополнительных сведений о использовании этого значения.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_log_inodes
|
main
|
integer
|
0
|
|
Смотрите ниже, опцию
“
check_spool_space
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_log_space
|
main
|
integer
|
0
|
|
Смотрите ниже, опцию
“
check_spool_space
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_rfc2047_length
|
main
|
boolean
|
true
|
|
RFC2047 определяет способ кодирования не-ASCII-символов в заголовках, используя систему
“закодированных слов
”. RFC определяет максимальную длинну для закодированного слова; строки, которые будут закодированы, превышающие эту длинну, должны использовать несколько закодированных слов. По умолчанию, exim не распознаёт закодированные слова, превышающие максимальную длинну. Однако, некоторые программы, в нарушение RFC, создают слишком длинные закодированные слова. Если
“
check_rfc2047_length
” установлена в ложь, exim распознаёт закодированные слова любой длинны.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_spool_inodes
|
main
|
integer
|
0
|
|
Смотрите ниже, опцию
“
check_spool_space
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_spool_space
|
main
|
integer
|
0
|
|
Четыре опции
“
check_....
” разрешают проверку дисковых ресурсов до приёма сообщения.
Когда любая из этих опций установлена, они применяются ко всем входящим сообщениям. Если вы хотите применить различные проверки к различным видам сообщений, вы можете сделать это путём проверки переменных
“
$log_inodes
”,
“
$log_space
”,
“
$spool_inodes
” и
“
$spool_space
” в ACL с соответствующими дополнительными условиями.
“
check_spool_space
” и
“
check_spool_inodes
” проверяют раздел спула, что любое значение больше нуля, например:
check_spool_space = 10M
check_spool_inodes =
100
|
Раздел спула - тот, который содержит каталог, заданный как
“SPOOL_DIRECTORY
” в
“
Local/Makefile
”. Он используется для того, чтобы хранить сообщения в процессе доставки.
“
check_log_space
” и
“
check_log_inodes
” проверяют раздел, в который пишутся логи, что они больше нуля. Они должны быть установлены, лишь если
“
log_file_path
” и
“
spool_directory
” ссылаются на разные разделы.
Если свободного места или инод меньше, чем требуется, exim отказывается принимать входящую почту. В случае SMTP это делается выдачей 452-й временной ошибки в ответе на команду MAIL. Если используется ESMTP, и был параметр SIZE в команде MAIL, его значение добавляется к значению
“
check_spool_space
”, и выполняется проверка, даже если
“
check_spool_space
” - ноль, если
“
no_smtp_check_spool_space
” не установлена.
Значения для
“
check_spool_space
” и
“
check_log_space
” содержатся в числе килобайт. Если число некратно 1024 - оно округляется.
Для не-SMTP ввода, и для ввода пакетного SMTP, тестирование производится при запуске; сообщение о ошибке пишется на стандартный вывод ошибок, и exim выходит с кодом отличным от нуля, поскольку, очевидно, не может послать сообщение о любом виде ошибок.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
daemon_smtp_ports
|
main
|
string
|
smtp
|
|
Эта опция задаёт один, или несколько дефолтовых портов SMTP, которые слушаются даемоном exim`a. Смотрие раздел 13 для деталей о её использовании. Для обратной совместимости,
“
daemon_smtp_port
” (в единственном числе) - синоним.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
daemon_startup_retries
|
main
|
integer
|
9
|
|
Эта опция, наряду с
“
daemon_startup_sleep
”, контролирует повторения, сделанные даемоном при старте, когда он не может немедленно связаться с слушаемым сокетом (обычно, поскольку он уже занят):
“
daemon_startup_retries
” задаёт число повторов после первой ошибки, и
“
daemon_startup_sleep
” задаёт отрезок времени ожидания между повторами.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
daemon_startup_sleep
|
main
|
time
|
30s
|
|
Смотрите
“
daemon_startup_retries
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
delay_warning
|
main
|
time list
|
24h
|
|
Когда сообщение задерживается, exim посылает предупреждающее письмо отправителю, с интервалами определёнными этой опцией. Данные - разделённый двоеточиями список времён, после которых шлются предупреждающие сообщения. Если значение этой опции - пустая строка, или ноль, то предупреждения не шлются. Может быть задано до 10 времён. Если сообщение находилось в очереди больше, чем последнее время, для вычисления последующего времени предупреждения используется последний интервал. Например, при:
delay_warning = 4h:8h:24h
|
первое сообщение посылается по прошествии 4-х часов, следующее через 8 и третье после 24-х. После этого, сообщения посылаются каждые 16 часов, поскольку этот интервал между двумя прошлыми временами в списке. Если вы зададите лишь одно время, оно определяет интервал повторения. Например, при:
сообщения повторяются каждые 6 часов. Для остановки предупреждений после этого времени, установите в конце списка очень большое время. Например:
delay_warning = 2h:12h:99d
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
delay_warning_condition
|
main
|
string†
|
смотрите ниже
|
|
Строка раскрывается в то время, когда могло бы быть послано сообщение. Если все отсроченные адреса имеют одинаковый домен, он устанавливается в
“
$domain
” в процессе раскрытия. Иначе, переменная
“
$domain
” пуста. Если результат раскрытия принудительный отказ, пустая строка, или строка соответствующая
“0
”,
“no
” или
“false
” (сравнение производится регистронезависмо) тогда предупреждающее сообщение не посылается. Значение по умолчанию:
delay_warning_condition = \
${if match{$h_precedence:}{(?i)bulk|list|junk}{no}{yes}}
|
подавляющая посылку предупреждений о сообщениях содержащих
“bulk
”,
“list
” или
“junk
” в заголовке
“Precedence:
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
deliver_drop_privilege
|
main
|
boolean
|
false
|
|
Если эта опция истинна, exim отказывается от root`овых привилегий при запуске процесса доставки, и повсюду работает как пользователь exim`a. Это строго ограничивает возможные виды локальной доставки, но жизнеспособно лишь в определённых типах конфигурации. Имеется обсуждение о использовании root`овых привилегий в разделе 51
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
deliver_queue_load_max
|
main
|
fixed-point
|
unset
|
|
Если эта опция установленна, обработка очереди останавливается, если средняя загрузка системы больше значения этой опции. Опция не имеет эффекта на древних ОС, в которых exim не может определить среднюю загрузку. Смотрит, также, опции
“
queue_only_load
” и
“
smtp_load_reserve
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
delivery_date_remove
|
main
|
boolean
|
true
|
|
Транспорты exim`a имеют опцию, для добавления заголовка
“
Delivery-date:
” в сообщение, когда оно доставляется, точно также обрабатывается
“
Return-path:
”.
“
Delivery-date:
” делает запись фактического времени доставки. Такие заголовки не должны присутствовать во входящих сообщениях, и эта опция вызывает их удаление во время получения сообщения, для избежания любых возможных проблем, которые могли бы произойти при пересылке сообщения другому адресату.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
disable_ipv6
|
main
|
boolean
|
false
|
|
Если эта опция истинна, даже если бинарник exim`a имеет поддержку IPv6, не будет никакой активности IPv6. Записи AAAA никогда не ищутся, и любые адреса IPv6, которые перечисленны в
“
local_interfaces
”, данные для маршрутизатора
“
manualroute
” и т.п. игноруруются. Если IP-литералы включены, роутер
“
ipliteral
” отказывается обрабатывать литеральные адреса IPv6.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_again_means_nonexist
|
main
|
domain list†
|
unset
|
|
Поиски в DNS дают ответ
“try again
” для ошибок DNS
“non-authoritative host not found
” и
“SERVERFAIL
”. Это может заставить exim продолжать попытки доставки, или повторно выдать временную ошибку для входящей почты. Иногда эффект вызывается плохо настроенным сервером имён, и может сохраняться в течение долгого времени. Если домен, вызывающий эту проблему, соответствует чему-либо в
“
dns_again_means_nonexist
”, он обрабатывается, как будто его не существет.Эта опция должна использоваться с осторожностью. Вы можете применять её к обратным поискам, настройкой типа такой:
dns_again_means_nonexist = *.in-addr.arpa
|
Эта опция применяется ко всем DNS-поискам, производимым exim`ом. Она также применяется когда функция
“
gethostbyname()
” или
“
getipnodebyname()
” выдаёт временную ошибку, т.к. они, вероятнее всего, будут вызваны проблемами поиска в DNS. У роутера
“
dnslookup
” есть собственные опции, для контроля происходящего, если происходит временная ошибка при поиске записей MX или SRV. Эти более специфические опции применяются после глобальных опций.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_check_names_pattern
|
main
|
string
|
смотрите ниже
|
|
Когда эта опция установлена в непустую строку, она заставляет exim проверять доменные имена на символы, не разрешённые в именах хостов, до передачи их DNS-резольверу, поскольку некоторые резольверы выдают временные ошибки для имён содержащих необычные символы. Если доменное имя содержит какие-либо нежелательные символы, принудительно возвращается результат
“not found
”, и резольвер не вызывается. Проверка делается путём сравнения доменного имени с регулярным выражением, являющимся значением этой опции. Дефолтовый паттерн такой:
dns_check_names_pattern = \
(?i)^(?>(?(
1
)\.|())[^\W_](?>[a-z0-
9
/-]*[^\W_])?)+$
|
разрешающий лишь буквы, цифры, ck'ib и дефисы в компонентах, но они должны начинаться и заканчиваться буквой или цифрой. Дефисы не разрешены, фактически, в именах хостов, но они находятся в определённых NS-записях (к которым можно обратится в exim`e, используя поиск
“
dnsdb
”). Если вы установите
“
allow_utf8_domains
”, то вы должны изменить этот паттерн, или установить опцию в пустую строку.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_csa_search_limit
|
main
|
integer
|
5
|
|
Эта опция контролирует глубину поиска для записей CSA SRV в DNS, как подробно описано в разделе 39.37.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_csa_use_reverse
|
main
|
boolean
|
true
|
|
Эта опция контролирует действительно ли, адрес данный как домен CSA, обратим и ищется в обратной зоне DNS, как подробно описано в разделе 39.37.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_ipv4_lookup
|
main
|
domain list†
|
unset
|
|
Когда exim собран с поддержкой IPv6 и опция
“
disable_ipv6
” не задана, он ищет для IPv6 адресные записи AAAA также, как и для IPv4 адресные записи A, пробуя найти IP-адреса для хостов, если домен не соответствует этому списку.
Это придумано для того, чтобы помочь с серверами имён дающими большую задержку, или иначе не работающими с типами записей AAAA. Когда мировые сервера имён будут должным образом модернизированы, в этой опции не будет необходимости.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_retrans
|
main
|
time
|
0s
|
|
Опция
“
dns_retrans
” и
“
dns_retry
” могут использоваться для повторной передачи и параметров повтора для поисков DNS. Значение нуля (по умолчанию) оставляет дефолтовые системные настройки без изменения. Первое значение - время между повторениями, и второе - число повторов. Не полностью ясно, как эти настройки затрагивают полное время, затрачиваемое на поиск в DNS. Я не нашёл никакой информации о таймаутах в поисках DNS; эти значения доступны во внешних структурах интерфейса резольвера, но нигде нет описания, как они используются, или что вы могли бы в них установить.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
dns_retry
|
main
|
integer
|
0
|
|
Смотрите опцию
“
dns_retrans
”, выше.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
drop_cr
|
main
|
boolean
|
false
|
|
Это - устаревшая опция, которая сейчас не используется. Она использовалась для изменения способа обработки exim`ом символов CR и LF во входящих сообщениях. Что происходит сейчас, описано в разделе 43.2.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
envelope_to_remove
|
main
|
boolean
|
true
|
|
Траспорты exim`a имеют опцию для добавления заголовка
“
Envelope-to:
” в сообщение, при его доставке, точно таким же образом, обрабатывается
“
Return-path:
”.
“
Envelope-to:
” - делает запись оригинального адреса получателя, из конверта сообщения, вызвавшего доставку. Такие заголовки не должны присутствовать во входящих сообщениях, и эта опция вызывает их удаление во время получения сообщения, для избежания возможных проблем, если доставленное сообщение впоследствии пересылается другому получателю.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
errors_copy
|
main
|
string list†
|
unset
|
|
Установка этой опции заставляет exim посылать копии генерируемых рикошетов по другим адресам. Отметтьте: Это не применяется к рикошетам, приходящим из других мест. Значение опции - список элементов, разделеённый двоеточиями. Каждый элемент содержит паттерн, завершаемый пробелом, сопровождаемый списком почтовых адресов, разделеных запятыми. Если паттерн содержит пробелы, он должен быть заключён в двойные кавычки.
Каждый паттерн обрабатывается также, как единичный пункт в списке адресов (смотрите раздел 10.18). Когда паттерн совпадает с получателем рикошета, сообщение копируется на адреса в списке. Элементы просматриваются по порядку, и как только найдено совпадение, дальнейшие элементы не сравниваются. Например:
errors_copy = spqr@mydomain postmaster@mydomain.example :\
rqps@mydomain hostmaster@mydomain.example,\
postmaster@mydomain.example
|
Список адресов раскрывается до использования. Переменные раскрытия -
“
$local_part
” и
“
$domain
” устанавливаются из оригинального получателя сообщения о ошибке, и если был какой-либо подстановочный знак в паттерне, переемнные раскрытия -
“
$0
”,
“
$1
”, и т.д. устанавливаются обычным способом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
errors_reply_to
|
main
|
string
|
unset
|
|
По умолчанию, в exim`e, предупреждающие сообщения о рикошетах и доставке содержат строку заголовка
From: Mail Delivery System <Mailer-Daemon@qualify-domain>
|
где
“
qualify-domain
” - значение опции
“
qualify_domain
”. Предупреждеющее сообщение, созданное опцией
“
quota_warn_message
” в транспорте
“
appendfile
”, может содержать его собственный заголовок
“
From:
”, отменяющий значение по умолчанию.
Опыт показывает, что люди отвечают на сообщения о рикошете. Если установлена опция
“
errors_reply_to
”, в предупреждающие сообщения и рикошеты добавляется заголовок
“
Reply-To:
”. например:
errors_reply_to = postmaster@my.domain.example
|
Значение этой опции не раскрывается. Оно должно быть правильным адресом, в соответствии с RFC2822. Однако, если предупреждающее сообщение, созданное опцией
“
quota_warn_message
” в транспорте
“
appendfile
”, содержит собственный заголовок
“
Reply-To:
”, значение опции
“
errors_reply_to
” не используется.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
exim_group
|
main
|
string
|
сконфигурировано при компиляции
|
|
Эта опция изменяет gid под которым exim работает, после отказа от привилегий суперпользователя. Дефолтовое значение вкомпилено в бинарник. Значение этой опции сипользуется лишь когда, также, задано
“
exim_user
”. Если значение не состоит полностью из цифр, ищется строка, используя
“
getgrnam()
”, и ошибка вызывает ошибку конфигурации. Смотрите главу 51, для обсуждения проблем безопасности.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
exim_path
|
main
|
string
|
смотрите ниже
|
|
Эта опция определяет путь к бинарному файлу exim`a, который используется когда exim`y надо перезапустить самого себя. Дефолт установлен на файл
“
exim
” в директории, сконфигурированной при компиляции установкой BIN_DIRECTORY. Изменить
“
exim_path
” бывает необходимо, исключительно если нужно запускать exim из другого места. Предупрежедние: не используйте макрос для установки значения этой опции, поскольку вы прервёте те утилиты exim`a, которые сканируют конфигурационный файл для находжения местоположения бинарника. (Тогда они используют опцию
“
-bP
”, для извлечения настройки опции, типа значения
“
spool_directory
”.)
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
exim_user
|
main
|
string
|
сконфигурировано при компиляции
|
|
Эта опция изменяет uid, под которым работает exim, после отказа от root`овых привилегий. Дефолтовое значение вкомпилено в бинарник. Владелец файла рабочей конфигурации при использование опций командной строки
“
-C
” и
“
-D
” сверяется с бинарником, не с тем что установлено тут.
Если значение не состоит полностью из цифр, ищется строка, используя
“
getgrnam()
”, и ошибка вызывает ошибку конфигурации. Если
“
exim_group
” также не установлена, gid берётся из разультата
“
getgrnam()
”, если оно используется. Смотрите главу 51, для обсуждения проблем безопасности.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
extra_local_interfaces
|
main
|
string list
|
unset
|
|
Эта опция задаёт сетевые интерфейсы, которые нужно считать местными при роутинге, но которые не слушаются даемоном. Смотрите раздел 13.8, для получения дополнительных деталей.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
extract_addresses_remove_arguments
|
main
|
boolean
|
true
|
|
Согласно некоторой документации sendmail (SUN, IRIX, HP-UX), если какие-либо адреса представлены в командной строке, когда опция
“
-t
” используется для построения конверта из заголовков сообщения
“
To:
”,
“
Cc:
” и
“
Bcc:
”, адреса командной строки удаляются из списка получателей. Однако, другая документация Sendmail (книга O'Reilly), утверждает, что адреса командной строки добавляются к строкам полученным из заголовков. Когда
“
extract_addresses_remove_arguments
” истинна (по умолчанию), exim вычитает аргументы заголовков. Если она установлена в ложь, exim добавляет, а не удаляет адреса параметров.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
finduser_retries
|
main
|
integer
|
0
|
|
В системах, где работает NIS, или другие схемы с использованием информации о пользователях и группах из удалённой системы, могут быть времена, когда
“
getpwnam()
” и связанные функции терпят неудачу, даже когда даны достоверные данные, поскольку происходит таймаут. К сожалению, эти отказы не могут быть отличены от подлинной ошибки
“not found
”. Если
“
finduser_retries
” установлена более чем в ноль, exim будет повторять попытки много раз, для нахождения пользователя или группы, ожидая секунду между повторами.
Вы не должны устанавливать эту опцию более чем в ноль, если ваша пользовательская находится в традиционном файле
“
/etc/passwd
”, поскольку это заставляет exim напрасно искать в файле несуществующих пользователей, и также вызовет задержку.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
freeze_tell
|
main
|
список разделенный запятыми
|
незадано
|
|
При столкновении с определёнными ошибками, или когда так сконфигурено в системном фильтре, ACL, или специальном роутере, exim замораживает сообщене. Это означает, что дальнейших попыток не предпринимается, пока администратор не разморозит сообщение, или опции
“
auto_thaw
”,
“
ignore_bounce_errors_after
”, или
“
timeout_frozen_after
” не вызовут их обработку. Если установлена
“
freeze_tell
”, exim генерит предупреждающее сообщение каждый раз, когда что-то замораживает, исключая, если замороженные сообщения - локально созданные рикошеты. (Без этого, есть возможность образования петель.) Предупреждающие сообщения посылаются по адресам, предоставленным как значение этой опции, в виде списка, разделённого запятыми. Если несколько адресов сообщений вызывают заморозку, лишь одно сообщение посылается. Если замораживание было автоматическим, причины замораживания могут быть найдены в логах. Если вы конфигурируете замораживание в фильтре, или ACL, вы можете настроить любое логгирование, какое вам требуется.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
gecos_name
|
main
|
string†
|
unset
|
|
Некоторые операционные системы, особенно HP-UX, используют поле
“gecos
” в системном файле паролей, для хранения иной информации, в дополнение к рельным именам пользователя. Exim ищет эту область для использования при создании заголовков
“
Sender:
” и
“
From:
”. Если
“
gecos_pattern
” или
“
gecos_name
” незаданы, используется неизменное содержимое этого поля, за тем исключением, что при столкновении со знаком
“&
”, он заменяется логином пользователя с первым заглавным символом, т.к. это - соглашение, соблюдаемое во многих системах.
Когда эти опции установлены,
“
gecos_pattern
” обрабатывается как регулярное выражение, которое должно быть применено к полю (снова с
“&
” заменяемым именем пользователя), и, если оно совпадает,
“
gecos_name
” раскрывается, и используется как имя пользователя.
Числовые переменные, типа
“
$1
”,
“
$2
” и т.д., могут использоваться в раскрытии для собирания субполей, которые совпадают с паттерном В HP-UX, где имя пользователя заканчивается в первой запятой, может использоваться следующее:
gecos_pattern = ([^,]*)
gecos_name = $1
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
gecos_pattern
|
main
|
string
|
unset
|
|
Смотрите выше, опцию
“
gecos_name
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers_charset
|
main
|
string
|
смотрите ниже
|
|
Эта опция задаёт дефолтовую кодировку для трансляции из закодированных MIME
“слов
”, в строках заголовков, когда ссылаются из раскрытия
“
$h_xxx
”. Дефолтовое значение - значение HEADERS_CHARSET в
“
Local/Makefile
”. Окончательное значение по умолчанию - ISO-8859-1. Для дополнительных деталей, смотрите описание вставки заголовков в разделе 11.5.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
header_maxsize
|
main
|
integer
|
смотрите ниже
|
|
Эта опция контролирует полный максимальный размер секции заголовков сообщения. Дефолт - значение HEADER_MAXSIZE в
“
Local/Makefile
”; значение по умолчанию - 1M. Сообщения с большим размером заголовков, отклоняются.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
header_line_maxsize
|
main
|
integer
|
0
|
|
Эта опция ограничивает длинну любой индивидуальной строки заголовка, после того, как были объединены все продолжения. Сообщения, в которых отдельные строки длиннее этого ограничения, отклоняются. Значение по умолчанию - ноль, означающее
“нет ограничений
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
helo_accept_junk_hosts
|
main
|
host list†
|
незадана
|
|
Exim проверяет синтаксис команд HELO и EHLO, для входящей SMTP почты, и выдаёт ошибочный ответ для недопустимых данных. К сожалению, есть SMTP-клиенты, посылающие синтаксических хлам. Они могут быть обработаны, путём установки этой опции. Отметтьте - что это лишь синтаксическая проверка. Смотрите
“
helo_verify_hosts
”, если вам необходимо провести и семантическую проверку. Также смотрите
“
helo_allow_chars
”, для возможности расширить набор разрешённых символов.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
helo_allow_chars
|
main
|
string
|
незадана
|
|
В этой опции могут быть установлены запрещённые символы, которые будут разрешены во всех HELO и EHLO именах, в дополнение к стандартным буквам, цифрам, дефисам и точкам. Если вам реально необходимо разрешить символы подчёркивания, вы можете усановить:
Отметтьте, что значение - одна строка, а не список.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
helo_lookup_domains
|
main
|
domain list†
|
@:@[]
|
|
Если домен, данный клиентом в команде HELO или EHLO совпадает с этим списком, производится обратный поиск, для установления истинного имени хоста. Дефолтовое значение вызывает поиск, если клиентом даётся имя сервера, или любой из его IP-адресов (в скобках), что, как замечено, делают кривые клиенты.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
helo_try_verify_hosts
|
main
|
host list†
|
незадано
|
|
По умолчанию, exim лишь проверяет синтаксис команд HELO и EHLO (смотрите
“
helo_accept_junk_hosts
” и
“
helo_allow_chars
”). Однако, некоторые домены любят делать более расширенную проверку данных, предоставленных этими командами. Условие ACL
“verify = helo
” предоставляется, для возможности это сделать. Прежде, также было необходимо установить эту опцию (
“
helo_try_verify_hosts
”) для принудительной проверки. Начиная с релиза 4.53, это более не требуется. Если проверка не была сделана до встречи с
“verify = helo
”, она делается в момент встречи. Следовательно, эта опция является устаревшей. Её спецификация, здесь, сохранена для совместимости.
При получении команды HELO или EHLO, если вызывающий хост соответствует
“
helo_try_verify_hosts
”, exim проверяет что имя хоста, данное в команде HELO или EHLO, также:
является IP-литералом, совпадающим с адресом вызывающего хоста, или
совпадает с именем хоста, которое exim получает, произведя обратный поиск адреса вызывающего хоста, или
когда поиск путём
“
gethostbyname()
” (или
“
getipnodebyname()
”, когда доступна) приводит к адресу вызывающего хоста.
Однако, команда HELO или EHLO не отклоняется, если любая из проверок неудачна. Обработка продолжается, но результат проверки запомнен, и может быть обнаружен в ACL, путём условия
“verify = helo
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
helo_verify_hosts
|
main
|
host list†
|
незадана
|
|
Как и
“
helo_try_verify_hosts
”, эта опция устарела, и сохранена лишь для обратной совместимости. Для хостов, совпадающих с этой опцией, exim проверяет имя хоста данное в HELO или EHLO, также как для
“
helo_try_verify_hosts
”. Если проверка неудачна, команда HELO/EHLO отклоняется с 550-й ошибкой, и пишутся логи в главный лог, и лог отклоненных хостов. Если команада MAIL передаётся до HELO/EHLO, она отклоняется с 503-й ошибкой.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hold_domains
|
main
|
domain list†
|
незадана
|
|
Эта опция разрешает проводить почту вручную по очереди, для некоторых доменов. Опция переопределяется, если сообщение принудительно доставляется с опциями
“
-M
”,
“
-qf
”,
“
-Rf
” и
“
-Sf
”, и также, когда тестируется или проверяется адрес с использованием
“
-bt
” или
“
-bv
”. Иначе, если домен совпадает с элементом в
“
hold_domains
”, для этого адреса не производятся маршрутизация или доставка, и он задерживается при каждом просмотре сообщения.
Эта опция используется как временная операционная мера для задержки доставки почты, пока разбираются в какой-то проблеме, или проверяется новая конфигурация. Если вы хотите лишь задержать почту для некоторых доменов, пока работает очередь, вы должны использовать
“
queue_domains
” или
“
queue_smtp_domains
”, но не
“
hold_domains
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
host_lookup
|
main
|
host list†
|
незадана
|
|
Exim не ищет имя вызывающего хоста, по его IP, если его не требуется сравнивать с каким-то списком хостов, или хост совпадает с
“
helo_try_verify_hosts
” или
“
helo_verify_hosts
”, или хост совпадает с этой опцией (которая, обычно, содержит IP-адреса, а не имена хостов). Дефолтовый конфигурационный файл содержит
что вызывает поиск для всех хостов. Если накладные расходы на этот поиск очень велики, установка может быть изменена, или удалена.
После успешного обратного поиска, exim производит прямой поиск по полученному имени, для подтверждения, что он приведёт к тому IP, с которого всё началось. Если эта проверка безуспешна, exim ведёт себя так, как будто поиск по имени был неудачен.
После любого вида ошибки, имя хоста (в
“
$sender_host_name
”) остаётся незаданным, и
“
$host_lookup_failed
” устанавливается в
“1
”. Смотрите также,
“
dns_again_means_nonexist
”,
“
helo_lookup_domains
”, и
“verify = reverse_host_lookup
” в ACL.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
host_lookup_order
|
main
|
string list
|
bydns:byaddr
|
|
Эта опция определяет порядок различных методов поиска, когда exim пытается найти имя хоста по его IP-адресу. Дефолт - вначале производит поиск по DNS, и затем пробует локальный поиск (используя
“
gethostbyaddr()
”, или эквивалент), если он неудачен. Вы можете изменить порядок этих поисков, или удалить ненужный.
Предупреждение: Метод
“byaddr
” не всегда приводит к альясам, когда много PTR-записей в DNS и IP-адрес не перечислен в
“
/etc/hosts
”. Различные ОС дают, в таких случаях, различные результаты. Именно поэтому, exim с дефолтовым значением, вначале пробует произвести поиск в DNS.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
host_reject_connection
|
main
|
host list†
|
незадана
|
|
Если эта опция задана, входящие SMTP вызовы от перечисленных хостов отклоняются, сразу же, при подключении.Эта опция устаревшая, и сохранена только для обратной совместимости, поскольку, в настоящее время, ACL определённая как
“
acl_smtp_connect
” также может немедленно отклонять входящие соединения.
Способность выдвать немедленное отклонение (или этой опцией, или использованием ACL) предусмотрена для использования в необычных случаях. Многие хосты просто сразу пробуют вновь, иногда без задержки. Обычно, лучше использовать ACL для отклонения входящих соединений на более поздней стадии, например после команды RCPT. Смотрите раздел 39.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_connection_nolog
|
main
|
host list†
|
незадана
|
|
Эта опция задаёт список хостов, при коннекте с которых не происходит логгирования, даже если лог-селектор
“
smtp_connection
” установлен. Для примера, вы можете не регистрировать SMTP-соединения от локальных процессов, или с 127.0.0.1, или с вашей локальной сети. Эта опция консультирует в основном цикле даемона; поэтому, вы должны стремиться к ограничению значения коротким списком IP и сетей. Для отключения логгирования SMTP-подключений от локальных процессов, вы должны создать список хостов с пустым элементом. Например:
hosts_connection_nolog = :
|
Если лог-селектор
“
smtp_connection
” не установлен, от этой опции не будет никакого эффекта.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
hosts_treat_as_local
|
main
|
domain list†
|
незадана
|
|
Если эта опция задана, при просмотре exim`ом списка хостов полученного из MX-записей, или другого источника, любые имена хостов совпадающие со списком доменов, обрабатываются как будто они - локальный хост. Отметтьте, что значение этой опции - список доменов, не список хостов, поэтому она всегда используется для проверки имён хостов, а не IP-адресов.
Эта опция также применяется, когда exim сравнивает специальные элементы
“@mx_any
”,
“@mx_primary
”, и
“@mx_secondary
” в списке доменов (смотрите раздел 10.8), и когда проверяется опция
“
hosts
” в транспорте
“
smtp
”, для локального хоста (смотрите опцию
“
allow_localhost
” в этом транспорте). Также смотрите
“
local_interfaces
”,
“
extra_local_interfaces
”, и раздел 13, который содержит обсуждение о локальных сетевых интерфейсах и распознавании локального хоста.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ignore_bounce_errors_after
|
main
|
time
|
10w
|
|
Эта опция затрагивает обработку рикошетов, которые не могут быть доставлены, т.е. те, у которых постоянная неудача доставки. (Рикошеты, у которых временная ошибка доставки, обрабатываются обычным способом.)
После постоянной неудачи доставки, рикошеты замораживаются, поскольку нет отправителя, которому они могди бы быть возвращены. Когда замороженный рикошет был в очереди больше заданного времени, он размораживается в следующую обработку очереди, и предпринимаются дальнейшие попытки доставки. Если снова происходит ошибка доставки, рикошет отбрасывается. Эта опция позволяет оставлять неудачные рикошеты в течение более которокого периода времени, чем максимальное обычное время повтора, для замороженных сообщений. Например,
ignore_bounce_errors_after = 12h
|
повторяет доставку неудачных рикошетов после 12 часов, отбрасывая любые последующие неудачи. Если значение этой опции установлено в нулевой период времени, рикошеты отбрасываются немедленно. Установка очень большого времени (как в дефолтовом значении), имеет эффект отключения этой опции. Для способов автоматического поведения других видов замороженных сообщений, смотрите опции
“
auto_thaw
” и
“
timeout_frozen_after
”
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ignore_fromline_hosts
|
main
|
host list†
|
незадана
|
|
Некоторые кривые SMTP-клиенты настаивают на посылке похожей на UUCP
“From
”, до заголовков сообщения. По умолчанию, это обрабатывается как начало тела сообщения, что означает, что любые следующие заголовки также не распознаются. Можно заставить exim игнорировать это, путём установки
“
ignore_fromline_hosts
” для совпадения с этими хостами, настивающими на посылке таких строк. Если отправитель является локальным процессом, а не удалённым хостом, и он использует
“
-bs
” для ввода сообщений, для достижения такого эффекта должна использоваться опция
“
ignore_fromline_local
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ignore_fromline_local
|
main
|
boolean
|
false
|
|
Смотрите выше, опцию
“
ignore_fromline_hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
keep_malformed
|
main
|
time
|
4d
|
|
Эта опция определяет, сколько времени оставлять сообщения, чьи spool-файлы повреждены каким-либо образом. Этого, конечно, никогда не должно происходить. При следующей попытке доставки этого сообщения, оно удаляется. Инцидент заносится в логи.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ldap_default_servers
|
main
|
string list
|
незадана
|
|
Эта опция предоставляет список серверов LDAP, которые пробуются по очереди, когда запрос LDAP не содердит сервер. Смотрите раздел 9.14 для подробной информации о запросах LDAP. Эта опция доступна лишь в случае, если exim собран с поддержкой LDAP.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ldap_version
|
main
|
integer
|
незадана
|
|
Эта опция может использоваться для принудительной установки использования exim`ом опредлённой версии протокола для LDAP. Если эта опция не задана, она отображается при опции командной строки
“
-bP
” как равная
“-1
”. В этом случае, значение по умолчанию - 3, если в заголовках LDAP задано LDAP_VERSION3; иначе, оно - 2. Эта опция доступна лишь в случае, если exim собран с поддержкой LDAP.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_from_check
|
main
|
boolean
|
true
|
|
Когда сообщение передаётся локально (т.е. не через TCP/IP соединение) недовереным пользователем, exim удаляет любые существующие заголовки
“
Sender:
”, и проверяет, что строка заголовка
“
From:
” совпадает с логином вызывающего пользователя, и домен соответсвует
“
qualify_domain
”.
Отметтьте: Дисквалифицированный адрес (без домена) в заголовке
“
From:
”, в локально переданных сообщениях, автоматически квалифицируется exim`ом, кроме как при использовании опции командной строки -
“
-bnq
”.
Вы можете использовать опции
“
local_from_prefix
” и
“
local_from_suffix
” для разрешения аффиксов в локальных частях. Если строка заголовка
“
From:
” не совпадает, exim добавляет заголовок
“
Sender:
” с адресом сконструированным из логина вызывающего пользователя, и дефолтового домена.
Если
“
local_from_check
” установлена в ложь, проверка заголовока
“
From:
” отключена, и не добавляется заголовок
“
Sender:
”. Кроме того, если вы хотите сохранить строку заголовка
“
Sender:
”, переданную недоверенным пользователем, вы, также, должны сделать истинной опцию
“
local_sender_retain
”.
Эти опции имеют эффект лишь для строк заголовков в сообщении. Отправитель конверта продолжает оставться идентификатором логина с квалификационным доменом, если
“
untrusted_set_sender
” не разрешает пользователю передавать отправителя конверта.
Для сообщений переданных через TCP/IP, ACL может определить
“режим подачи
”, для запроса подобной проверки строки заголовка. Смотрите раздел 43.16,содержащем больше деталей о обработке
“
Sender:
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_from_prefix
|
main
|
string
|
незадана
|
|
Когда exim проверяет строку заголовка
“
From:
” локально переданных сообщений на совпадение с идентификатором логина (смотрите выше, опцию
“
local_from_check
”), он может быть сконфигурен для игнорирования определённых приставок и суффиксов в локальной части адресов. Это делается установкой
“
local_from_prefix
” и/или
“
local_from_suffix
” для подходящих списков, в такой же форме как опции роутера
“
local_part_prefix
” и
“
local_part_suffix
” (смотрите раздел 15). Для примера, если
устанавлено, строка
“
From:
” содержит
From: anything-user@your.domain.example
|
не будет заставлять добавлять заголовок
“
Sender:
”, если
“
user@your.domain.example
” фактически соответствует адресу отправителя, созданному из имени логина и квалификационного домена.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_from_suffix
|
main
|
string
|
незадана
|
|
Смотрите опцию
“
local_from_prefix
”, выше.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_interfaces
|
main
|
string list
|
смотрите ниже
|
|
Эта опция конторлирует, какие сетевые интерфейсы используются даемоном для прослушивания; также, они используются для идентификации локального хоста при маршрутизации. Раздел 13 содержит полное описание этой опции и связанных с ней опций
“
daemon_smtp_ports
”,
“
extra_local_interfaces
”,
“
hosts_treat_as_local
” и
“
tls_on_connect_ports
”. Дефолтовое значение для
“
local_interfaces
”
local_interfaces =
0
.
0
.
0
.
0
|
когда exim собран без поддержки IPv6; иначе, оно
local_interfaces = <; ::
0
;
0
.
0
.
0
.
0
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_scan_timeout
|
main
|
time
|
5m
|
|
Этот таймаут применяется к функции
“
local_scan()
” (смотрите раздел 41). Нулевое значение - нет таймаута. Если таймаут истёк, входящее сообщение отвергается с временной ошибкой, если это SMTP сообщение. Для не-SMTP сообщения, сообщение уничтожается и exim завершается с ненулевым кодом. Инцидент логгируется в главном логе, и логе отклонённых.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_sender_retain
|
main
|
boolean
|
ложь
|
|
Когда сообщение передаётся локально (т.е. не через TCP/IP соединение) недоверенным пользователем, exim удаляет любые соущаствующие строки заголовка
“
Sender:
”. Если вы не хотите чтобы это происходило, вы должны установить
“
local_sender_retain
” и также установить
“
local_from_check
” в ложь (exim будет ругаться, если этого не сделать). Смотрите также ACL модификатор
“control = suppress_local_fixups
”. Раздел 43.16 для получения дополнительных деталей о обработке
“
Sender:
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
localhost_number
|
main
|
string†
|
незадана
|
|
Идентификаторы сообщений exim`a, обычно, уникальны только в пределах локального хоста. Если требуется уникальность среди ряда хостов, на каждом хосте необходимо установить различное значение для опции
“
localhost_number
”. Строка раскрывается немедленно после чтения конфигурационного файла (таким образом, чтобы число могло быть вычислено из имени хоста, например), и результат раскрытия должен быть числом в диапазоне 0-16 (или 0-10, если файловая система нечувствительна к регистру букв). Это доступно в последующих раскрытиях строк через переменную
“
$localhost_number
”. Когда
“
localhost_number
” установлена, два финальных символа идентификатора сообщения, вместо того, чтобы просто быть дробной частью от времени, вычисляются из времени и номера локального хоста, как описано в разделе 3.4.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log_file_path
|
main
|
string list†
|
устанавливается при компиляции
|
|
Эта опция устанавливает путь, используемый для определения имён лог-файлов exim`a, или индикации что логгинг осуществляется через syslog, или и того и другого. Это раскрывается при входе exim`a, и она может, например, содержать ссылку на имя хоста. Если путь для ведения логов не установлен при компиляции или в рабочей конфигурации, они пишутся в субдиректорию, называемую
“
log
”, в директории спула exim`a. Раздел 48 содержит дальнейшие детали о логгинге exim`a, и раздел 48.1 описывает, как используется содержимое
“
log_file_path
”. Если эта строка установлена при инсталляции (не содержит никаких раскрываемых переменных), рекомендуется, чтобы вы не станавливали эту опцию в файле конфигурации, но предоставляли путь, используя LOG_FILE_PATH в
“
Local/Makefile
”, чтобы она сразу была доступна exim`y для логгинга ошибок, в частности ошибок чтения конфигурационного файла.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log_selector
|
main
|
string
|
незадана
|
|
Эта опция может использоваться для уменьшения или совращения числа событий котрые exim пишет в лог-файлы. Его параметр составлен из имён, котрым предшествуют символы плюса или минуса. Например:
log_selector = +arguments -retry_defer
|
Список возможных имён и что они контролируют дан в части о логгинге, в разделе 48.15.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log_timezone
|
main
|
boolean
|
ложь
|
|
По умолчанию, временная метка, в строках логов, в локальном времени, без временной зоны. Это означает, что если ваша временная зона меняется дважды в год, временная метка в логах неоднозначна в течение часа, когда часы возвращаются назад. Один способ избежать этой проблемы - установить временную зону в UTC. Альтернатива - установить
“
log_timezone
” в истину. Это включает дополнение временной зоны в строки логов. Включение этой опции может добавить довольно много к размеру логов, поскольку каждая строка становиться больше на 6 символов. Отметтьте, что переменная
“
$tod_log
” содержит временную метку без зоны, но есть другая переменная, назваемая
“
$tod_zone
”, которая содержит смещение часового пояса.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
lookup_open_max
|
main
|
integer
|
25
|
|
Эта опция ограничивает число одновременно открытых файлов, для одноключевого поиска, которые используют регулярные файлы (т.е.
“
lsearch
”,
“
dbm
” и
“
cdb
”). Обычно, exim оставляет эти файлы открытыми в течение маршрутизации, поскольку часто один и тот же файл требуется несколько раз. Если предел достигнут, exim закрывает самый давно использовавшийся файл. Отметтьте, что если вы используете библиотеку
“
ndbm
”, она, фактически, открывает два файла для каждой логической DBM базы данных, хотя для
“
lookup_open_max
” он всё ещё считается как один.Если вы получаете ошибку
“too many open files
” с NDBM, вы должны уменьшить (непонял, по идее, надо увеличить же? - прим. lissyara) значение
“
lookup_open_max
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
max_username_length
|
main
|
integer
|
0
|
|
Некоторые операционные системы кривые, в том, что они усекают длинный аргумент
“
getpwnam()
” до восьми символов, вместо того, чтобы вернуть
“no such user
”. Если эта опция установлена в число больше нуля, любые попытки вызова
“
getpwnam()
” с более длинным аргументом ведут себя так, будто вызов
“
getpwnam()
” был неудачен.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_body_visible
|
main
|
integer
|
500
|
|
Эта опция определяет, как много тела сообщения будет включено в переменные раскрытия
“
$message_body
” и
“
$message_body_end
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_id_header_domain
|
main
|
string†
|
незадана
|
|
Если эта опция задана, строка раскрывается и используется как правая сторона (домен) в заголовке
“
Message-ID:
”, который создаёт exim, если локально сгенерённое сообщение приходит без него. Локально сгенерённое - значит не полученное через TCP/IP. Иначе, используется первичное имя хоста. Разрешены только буквы, цифры, точки и дефисы; любые другие символы заменяются дефисами. Если раскрытие принудительно неудачно, или если результат - пустая строка, опция игнорируется.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_id_header_text
|
main
|
string†
|
незадана
|
|
Если эта опция задана, строка раскрывается и используется для увеличения текста заголовка
“
Message-id:
”, который exim создаёт если локально сгенерённое сообщение его не имеет. Текст этого заголовка требуется согласно RFC2822, для принятия формы адреса. По дефолту, exim использует его внутренние идентификаторы сообщений как локальную часть, и превичное имя хоста как домен. Если эта опция задана, она раскрывается, и если раскрытие не было неудачным, и не привело к пустой строке, результат вставляется в заголовок непосредственно до
“@
”, отделяясь от внутреннего идентификатора точкой. Любые символы, которые недопустимы в адресах, автоматически преобразуются в дефисы. Это означает, что могут использоваться переменные типа
“
$tod_log
”, поскольку все пробелы и двоеточия станут дефисами
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_logs
|
main
|
boolean
|
true
|
|
Если эта опция выключена, логи на каждое сообщение не создаются в субдиректории спула
“
msglog
”. Это уменьшает дисковый ввод-вывод, требуемый exim`y, уменьшает число файлов вовлечённых в обработку сообщенияот минимум четырёх (заголовок в файле спула, тело в файле спула, журнал доставки, и лог на каждое сообщение) до трёх. Другая причина активности ввода-вывода - главный лог-файл exim`a, не затрагиваемый этой опцией.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
message_size_limit
|
main
|
string†
|
50M
|
|
Эта опция ограничивает максимальный размер сообщения, обрабатываемого exim`ом. Значение раскрывается для каждого входящего сообщения, таким образом, например, оно может зависеть от IP-адреса, удалённого хоста, для сообщений передаваемых через TCP/IP. Отметтьте: Эти ограничения не могут быть зависмы от отправителя сообщения, или других свойств индивидуального сообщения, поскольку оно должно фигурировать в ответе сервера HELO. Ошибка раскрытия строки приводит к временной ошибке. Значение ноль означает - нет лимитов, но оно не рекомендуется для использования. Смотрите также опцию
“
bounce_return_size_limit
”.
Входящим SMTP-сообщениям выдаётся 552-я ошибка, если лимит исчерпан; сообщения, сгенерённые локально, получают сообщение на стандартный вывод ошибок, или сообщение о ошибке доставки, отправителю сообщения, в зависимости от установки
“
-oe
”. Отклонение сообщений с превышенным размером записывается в оба лога - главный, и лог отклонённых. Смотрите также общую опцию транспортов -
“
message_size_limit
”, которая ограничивает размер сообщения которое может обработать индивидуальный транспорт.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
move_frozen_messages
|
main
|
boolean
|
false
|
|
Эта опция, которая доступна лишь если exim собран с установкой
SUPPORT_MOVE_FROZEN_MESSAGES=yes
|
в
“
Local/Makefile
”, вызывает перемещение замороженных сообщений и их логов из директорий
“
input
” и
“
msglog
” в спуле, в
“
Finput
” и
“
Fmsglog
”, соответсвенно. В настоящее время в exim`e или стандартных утилитах нет поддержки, для обработки таких сообщений, и они не показывются в списках сгенерённых опцией
“
-bp
”, или монитором exim`a.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mua_wrapper
|
main
|
boolean
|
false
|
|
Установка этой опции в истину заставляет exim выполняться в очень ограниченном режиме, в котором он передаёт сообщения синхронно, на интелектуальный хост. Раздел 47 содержит полное описание этого средства.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
mysql_servers
|
main
|
string list
|
незадана
|
|
Эта опция предоставляет список MySQL серверов, и ассоциированных данных подключения, для использования с поиском
“
mysql
” (смотрите раздел 9.20). Опция доступна только если exim собран с поддержкой MySQL.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
never_users
|
main
|
string list†
|
незадана
|
|
Эта опция раскрывается лишь раз, в начале старта процесса exim`a. Локальные доставки сообщений, обычно, в процессах, выполняющихся от получателя, и удалённые доставки, обычно, работают под uid и gid exim`a. Из предосторожности, следует избегать любых доставок производимых от пользователя root.
При сборке exim`a, опция с именем FIXED_NEVER_USERS может быть установлена в список пользователей которые не могут использоваться для локальной доставки. Этот список установлен в бинарнике, и не может быть перезадан конфигурационны файлом. По умолчанию, он содержит лишь одно имя пользователя -
“root
”. Рабочая опция
“
never_users
” может использоваться для добавления большего количества пользователей к фиксированному списку.
Если сообщение необходимо доставить от одного из пользователей жёсткого списка, или списка
“
never_users
”, происходит ошибка, и доставка задерживается. Обычный пример:
never_users = root:daemon:bin
|
Включение root - избыточно, если он таже находится в фиксированном списке, но вреда не причиняет. Эта опция перезадаёт опцию
“
pipe_as_creator
” драйвера транспорта
“
pipe
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
oracle_servers
|
main
|
string list
|
незадана
|
|
Эта опция предоставляет список Oracle серверов, и ассоциированных данных подключения, для использования с поиском
“
oracle
” (смотрите раздел 9.20). Опция доступна только если exim собран с поддержкой Oracle.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
percent_hack_domains
|
main
|
domain list†
|
незадана
|
|
“percent hack
” - является соглашением, посредством которого, локальная часть, содержащая символ процента, интерпретируется как новый e-mail адрес, с процентом, заменённым
“@
”. Иногда, это называют маршрутизацией источника, хотя этот термин также применим к адресам RFC2822, начинающимся с символа
“@
”. Если эта опция задана, exim применяет феню с процентом для перечисленных доменов, но не для других. Это происходит до проверки SMTP-адреса при помощи ACL.
Предупреждение:
“percent hack
” часто используется людьми, пробующими обойти ограничения релеинга. Поэтому, лучше его избегать, если это возможно. К сожалению, много MTA не заботящихся о безопасности, применяют его безоговорочно. Если вы используете exim на межсетевом хосте, и роутите почту к внутреннему MTA, без обработки локальной части, то хорошей идеей будет отклонить адреса получателей с символами процента в локальной части. Дефолтовая конфигурация exim`a так и делает.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
perl_at_start
|
main
|
boolean
|
ложь
|
|
Эта опция доступна лишь когда exim собран с встроенным интерпретатором perl. Смотрите раздел 12, для получения деталей о её использовании.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
perl_startup
|
main
|
string
|
незадана
|
|
Эта опция доступна лишь когда exim собран с встроенным интерпретатором perl. Смотрите раздел 12, для получения деталей о её использовании.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
pgsql_servers
|
main
|
string list
|
незадана
|
|
Эта опция предоставляет список PostgreSQL серверов, и ассоциированных данных подключения, для использования с поиском
“
pgsql
” (смотрите раздел 9.20). Опция доступна только если exim собран с поддержкой PostgreSQL.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
pid_file_path
|
main
|
string†
|
устанавливается при компиляции
|
|
Эта опция задаёт имя файла, в который даемон exim`a записывает свой pid процесса. Строка раскрывается, таким образом она может содержать ссылку на имя хоста:
pid_file_path = /var/log/$primary_hostname/exim.pid
|
Если путь не задан, pid пишется в файл
“
exim-daemon.pid
” в директории спула exim`a. Значение установленное опцией может быть перезадано путём опции командной строки
“
-oP
”. Файл pid не записывается
“нестандартным
” даемоном, запущенным при помощи опции
“
-oX
”, если путь явно не задан опцией
“
-oP
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
pipelining_advertise_hosts
|
main
|
host list†
|
*
|
|
Эта опция может использоваться для подавления объявления расширения SMTP PIPELINING для определённых хостов. Когда PIPELINING не объявляется, и
“
smtp_enforce_sync
” истинна, сервер exim требует строгую синхронизацию для каждой SMTP команды, и ответа. Когда объявлено PIPELINING, exim предполагает что клиенты будут его использовать; ожидаются команды не по порядку, и они не считаются ошибками протокола (смотрите
“
smtp_max_synprot_errors
”).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
preserve_message_logs
|
main
|
boolean
|
ложь
|
|
Если эта опция задана, лог-файлы сообщений не удаляются, по окончании обработки сообщения. Вместо этого, они перемещаются в субдиректорию спула, с именем
“
msglog.OLD
”, где они остаются доступными для статистики и процесса отладки. Это опсная опция для установки на системах с заметным объёмом почты. Используйте с осторожностью!
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
primary_hostname
|
main
|
string
|
смотрите ниже
|
|
Эта опция задаёт имя текущего хоста. Она используется в дефолтовых командах HELO или EHLO, для исходящих SMTP сообщений (изменяется опцией
“
helo_data
” в транспорте
“
smtp
”), и как дефолт для
“
qualify_domain
”. Значение, также, используется, по умолчанию, в некоторых сообщениях SMTP-ответов сервера exim. Она может быть динамически изменена установкой
“
smtp_active_hostname
”.
Если
“
primary_hostname
” не задана, exim вызывает
“
uname()
”, для нахождения имени хоста. Если вызов неудачен, exim паникует и умирает. Если имя, возвращённое
“
uname()
” содержит лишь один компонент, exim передаёт его
“
gethostbyname()
” (или
“
getipnodebyname()
”, когда доступна) чтобы получить полностью квалифицированную версию. Переменная
“
$primary_hostname
” содержит имя хоста, полученный этой опцией, или дефолтовое.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
print_topbitchars
|
main
|
boolean
|
ложь
|
|
По умолчанию, exim рассматривает лишь те символы, которые закодированы в диапазоне 32-126 - печатные символы. Во многих обстоятельствах (например, при записи логов), непечатные символы конвертируются в прослэшенные последовательности, прежде всего, чтобы не испортить размещение. Если
“
print_topbitchars
” установлена, предполагается, что значения кодов более 128 - печатные символы.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
process_log_path
|
main
|
string
|
незадана
|
|
Эта опция устанавливает имя файла,в который exim записывает свой
“лог процесса
” (
“process log
”), когда посылается сигнал USR1. Это используется скриптом утилиты
“
exiwhat
”. Если эта опция незадана, используется файл с именем
“
exim-process.info
” в директории спула exim`a. Возможность задать имя явно может быть полезной в окружении где запущены два различных exim`a, используя различные директории spool`a.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
prod_requires_admin
|
main
|
boolean
|
true
|
|
Опции командной строки
“
-M
”,
“
-R
” и
“
-q
” требуют, чтобы вызывающий был административным пользователем, если опция
“
prod_requires_admin
” не установлена в ложь. Смотрите также
“
queue_list_requires_admin
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
qualify_domain
|
main
|
string
|
смотрите ниже
|
|
Эта опция определяет имя домена, которое добавляется к любому алресу отправителя конверта, не имеющему доменной части. Также она применяется к адресам получателей, если не установлена опция
“
qualify_recipient
”. Дисквалифицированые (без доменной части - прим. lissyara) адреса, по умолчанию, принимаются только для сгенерённых локально сообщений. Квалификация, также, применяется к адресам в строках заголовков, типа
“
From:
” и
“
To:
” для локально сгенерённых сообщений, если не используется опция командной строки
“
-bnq
”.
Сообщения из внешних источников всегда должны содержать полностью квалифицированный адрес, если посылающий хост не соответствует
“
sender_unqualified_hosts
” или
“
recipient_unqualified_hosts
” (соответственно), в этих случаях входящие адреса квалифицируются с
“
qualify_domain
” или
“
qualify_recipient
”, по необходимости. Внутри себя, exim всегда работает с полностью квалифицированными адресами конвертов. Если
“
qualify_domain
” не задана, по умолчанию используется значение
“
primary_hostname
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
qualify_recipient
|
main
|
string
|
смотрите ниже
|
|
Эта опция позволяет вам задать иной домен для квалификации адреса получателя. Смотрите
“
qualify_domain
” выше.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_domains
|
main
|
domain list†
|
незадана
|
|
Эта опция - список доменов, для которых немедленная доставка не требуется. Процесс доставки начинается при получении каждого сообщения, но обрабатываются лишь те домены, которые не соответствуют (этой опции, видимо - прим. lissyara). Все иные доставки ждут следующего запуска очереди. Смотрите также
“
hold_domains
” и
“
queue_smtp_domains
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_list_requires_admin
|
main
|
boolean
|
true
|
|
Опция командной строки
“
-bp
”, выводящая список сообщений в очереди, требует, чтобы вызывающий был административным пользователем, если
“
queue_list_requires_admin
” не установлена в ложь. Также смотрите опцию
“
prod_requires_admin
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_only
|
main
|
boolean
|
ложь
|
|
Если
“
queue_only
” задана, процесс доставки не стартует автоматически когда получено сообщение. Вместо этого, сообщение ждёт в очереди, следующего запуска очереди. Даже если
“
queue_only
” - ложна, входящие сообщения могут доставляться не сразу, когда происходят определённые условия (например большая загрузка).
Опция командной строки
“
-odq
” - имеет такой же эффект как и
“
queue_only
”. Опции командной строки
“
-odb
” и
“
-odi
” перезадают
“
queue_only
”, если не ложна
“
queue_only_override
”. Смотрите также
“
queue_only_file
”,
“
queue_only_load
” и
“
smtp_accept_queue
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_only_file
|
main
|
string
|
незадана
|
|
Эта опция может быть установлена в список, разделённый двоеточием, абсолютных имён путей, каждому из которых, опционально, предшествует
“smtp
”. Когда exim получает сообщение, эта опция проверяет существование каждого перечисленного пути, используя вызов
“
stat()
”. Для каждого пути, что существует, устанавливается опция очереди передачи. Для путей без преффикса,
“
queue_only
” - установлена; для путей с преффиксом
“smtp
”,
“
queue_smtp_domains
” устанавливается в совпадение со всеми доменами. Таким образом, например,
queue_only_file = smtp/some/file
|
заставляет exim вести себя, так, как будто
“
queue_smtp_domains
” установленна в
“*
”, когда существет файл
“
/some/file
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_only_load
|
main
|
fixed-point
|
незадана
|
|
Если средняя загрузка системы выше этого значения, входящие сообщения из всех источников ставяться в очередь, и автоматическая доставка не запускается. Если это происходит во время локального или SMTP ввода, все последующие сообщения, в том же соединении, ставяться в очередь. Доставки будут выполнены впоследствии, процессами обработчика очереди. Эта опция не имеет эффекта на старых операционных системах, в которых exim не может определить среднюю загрузку системы. Также смотрите
“
deliver_queue_load_max
” и
“
smtp_load_reserve
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_only_override
|
main
|
boolean
|
истина
|
|
Когда эта опция истинна, опция командной строки
“
-od
x
” перезадаёт установки
“
queue_only
” или
“
queue_only_file
” в конфигурационном файле. Если
“
queue_only_override
” установлена в ложь, опция
“
-od
x
” не может использоваться для перезадания; они принимаются, но игнорируются.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_run_in_order
|
main
|
boolean
|
ложь
|
|
Если эта опция установлена, работа очереди происходит в порядке прибытия сообщений, вместо произвольного порядка. Для того чтобы это случилось, до начала доставки должен быть создан полный список всей очереди. Когда очередь находится в единственном каталоге (по умолчанию), создаётся единственный список и для упорядоченных случаев, и для неупорядоченных. Однако, если установлена опция
“
split_spool_directory
”, единственный список не создаётся, когда опция
“
queue_run_in_order
” ложна. В этом случае, субдиректории обрабатываются по одному (в случайном порядке), и это позволяет избежать создания одного огромного списка для всей очереди. Таким образом, установка
“
queue_run_in_order
” с
“
split_spool_directory
” может ухудшить производительность, когда очередь большая, поскольку будет производиться дополнительная работа по созданию одного, большого списка. В большинстве случаев,
“
queue_run_in_order
” не должна быть установлена.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_run_max
|
main
|
integer
|
5
|
|
Эта опция контролирует максимальное число процессов обработчика очереди которые даемон exim`a может выполнять однвоременно. Это не значит, что он запускает их одновременно, а скорее, что если всё ещё работает максимальное число, когда приходит время запускать другой, он задерживает старт следующего. Это может случиться с очень большими очередями, и/или с очень медленными доставками. Однако, эта опция не блокирует другие процессы, таким образом дополнительные обработчики очереди могут быть запущены другими средствами, или уничтожением и перезапуском даемона.
Установка этой опции в ноль не подавляет выполнение очереди; вместо этого, это отключает лимит, разрешая выполняться любому числу одновременных процессов обработчика очереди. Если вы не хотите чтобы обработки очереди пересекались, опустите опцию
“
-qxx
” в командной строке даемона.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
queue_smtp_domains
|
main
|
domain list†
|
незадана
|
|
Когда эта опция установлена, процесс доставки запускается каждый раз, когда получено сообщение, роутинг выполнен, и имеют место локальные доставки. Однако, если SMTP доставки требуются для доменов совпадающих с
“
queue_smtp_domains
”, они не происходят немедленно, вместо этого сообщение ждёт в очереди следующего запуска очереди. С момента роутинга сообщения, exim знает, к каким удалённым хостам его нужно доставить, и, таким образом, когда происходит обработка очереди, много сообщений для одного хоста доставляются через одно SMTP соединение. В таком случае, опция командной строки
“
-odqs
” заставляет все SMTP доставки становиться в очередь, и это эквивалентно установке
“
queue_smtp_domains
” в
“*
”. Также смотрите
“
hold_domains
” и
“
queue_domains
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
receive_timeout
|
main
|
time
|
0s
|
|
Эта опция устанавливает таймаут для приёма не-SMTP сообщений, т.е. максимальное время, которое exim ждёт, читая сообщение на стандартном вводе. Если это значение равно нулю, он будет ждать вечно. Эта опция перезадаётся опцией командной строки
“
-or
”. Таймаут для входящих SMTP сообщение контролируется опцией
“
smtp_receive_timeout
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
received_header_text
|
main
|
string†
|
смотрите ниже
|
|
Эта опция задаёт содержимое заголовка сообщения
“
Received:
”, который добавляется к каждому собщению, за исключением штампа времени, который добавляется автоматчески в конце (с предшествующей точкой с запятой). Строка раскрывается каждый раз при использовании. Если раскрытие приводит к пустой строке, заголовок
“
Received:
” к сообщению не добавляется. Иначе, строка должна начинаться с текста
“Received:
”, и соответствовать спецификации RFC2822 для строк заголовка
“Received:
”. Значение по умолчанию:
received_header_text = Received: \
${if def:sender_rcvhost {from $sender_rcvhost\n\t}\
{${if def:sender_ident \
{from ${quote_local_part:$sender_ident} }}\
${if def:sender_helo_name {(helo=$sender_helo_name)\n\t}}}}\
by $primary_hostname \
${if def:received_protocol {with $received_protocol}} \
${if def:tls_cipher {($tls_cipher)\n\t}}\
(Exim $version_number)\n\t\
${if def:sender_address \
{(envelope-from <$sender_address>)\n\t}}\
id $message_exim_id\
${if def:received_for {\n\tfor $received_for}}
|
Ссылка на шифрование TLS опущена, когда exim собран без поддержки TLS. Использование условных раскрытий гарантирует, что это работает и для локально сгенерённых сообщений, и для сообщений полученных с удалённых достов, давая строки заголовка, типа таких:
Received: from scrooge.carol.example ([
192
.
168
.
12
.
25
] ident=root)
by marley.carol.example with esmtp (Exim
4
.
00
)
(envelope-from <bob@carol.example>)
id 16IOWa-00019l-
00
for chas@dickens.example; Tue,
25
Dec
2001
14
:
43
:
44
+
0000
Received: by scrooge.carol.example with local (Exim
4
.
00
)
id 16IOWW-
000083
-
00
; Tue,
25
Dec
2001
14
:
43
:
41
+
0000
|
Пока тело сообщения не получено, штамп времени - время начала приёма сообщения. Как только получено тело сообщения, и все проверки политик произошли, штамп времени обновляется, до времени в которое было принято сообщение.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
received_headers_max
|
main
|
integer
|
30
|
|
Когда сообщение должно быть доставлено, подсчитывается число заголовков
“Received:
”, и если оно больше этого параметра, предполагается, что произошло зацикливание почты, доставка прерывается, и генерится сообщение о ошибке. Это применяется к обоим - локальной и удалённой доставкам.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
recipient_unqualified_hosts
|
main
|
host list†
|
незадана
|
|
Эта опция - список тех хостов, от которых exim готов принять неквалифицированные адреса получателей, в конвертах сообщений. Адреса полностью квалифицируются путём дополнения значением
“
qualify_recipient
”. Эта опция, также, применяется к строкам заголовков. Exim не отклоняет неквалифицированные адреса получателей в заголовках, но он их квалифицирует только когда сообщение пришло с хоста совпадаюшего с
“
recipient_unqualified_hosts
”, или если сообщение было переданно локально (не используя TCP/IP), и не была установлена опция
“
-bnq
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
recipients_max
|
main
|
integer
|
0
|
|
Если эта опция установлена более чем в ноль, она определяет максимальное число оригинальных получателей для любого сообщения. Дополнительные получатели, которые сгенерированы альясингом или форвардингом не считаются. SMTP сообщения дают 452-й ответ для всех получателей, превышающих предел; более ранние получатели доставляются нормально. Не-SMTP сообщения со слишком большим числом получателей неуспешны, и никаких дотавок не происходит.
Отметтьте: RFC определяет, что SMTP-сервер должен принять по крайней мере 100 команд RCPT в одном сообщении.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
recipients_max_reject
|
main
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, exim отклоняет SMTP сообщения содержащие слишком много получателей, выдавая ошибку 552 на избыточные команды RCPT, и ошибку 554 на возможную команду DATA. Иначе (по умолчанию) он выдаёт ошибку 452 на избыточные команды RCPT и принимает сообщение от имени начального набора получателей. Удалённый сервер должен снова полать сообщение для оставшихся получателей, в более позднее время.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
remote_max_parallel
|
main
|
integer
|
2
|
|
Эта опция контролирует параллельные доставки одного сообщения к множеству удалённых хостов. Если значение меньше чем 2, параллельная доставка отключена, и exim делает все удалённые доставки для сообщения по одной. Иначе, если единичное сообщение нужно доставить более чем одному удалённому хосту, или если несколько копий необходимо доставить на один и тот же удалённый хост, одновременно производятся до
“
remote_max_parallel
” доставок. Если требуется более чем
“
remote_max_parallel
” доставок, запускается максимальное число процессов, и как только заканчивается один, начинается другой. Порядок запуска процессов точно такой же как при последовательной доставке, и может управляться опцией
“
remote_sort_domains
”. Если параллельная доставка имеет место когда включена работа с отладкой, отладочный вывод для каждого процесса доставки отмечается его идентификатором процесса.
Эта опция контролирует только максимальное число параллельных доставок для одного сообщения в одном процессе доставки exim`a. Поскольку exim не имеет центрального менеджера очереди, нет способа управлять общим числом одновременных доставок, если конфигурация позволяет попытку доставки сразу после получения сообщения.
Если вы хотите контролировать общее число доставок на систему, вам необходимо установить опцию
“
queue_only
”. Это гарантирует, что все входящие сообщения сановятся в очередь, без запуска процесса доставки. Затем, настройте даемон exim`a на запуск процесса обработчика очереди в соответствующих интервалах (скорей всего часто, например, раз в минуту), и ограничьте общее чило обработчиков очереди путём установки параметра
“
queue_run_max
”. Поскольку каждый обработчик очереди доставляет лишь одно сообщение за раз, максимальное число доставок, которые могут происходить одновременно, это -
“
queue_run_max
” умноженное на
“
remote_max_parallel
”.
Если вы просто хотите контролировать удалённые доставки, используйте
“
queue_smtp_domains
” вместо
“
queue_only
”. Это добавляет примущества, от использования SMTP-роутинга до очереди, таким обрахом, чтобы несколько сообщений для одного хоста доствлялись за одно соединение.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
remote_sort_domains
|
main
|
domain list†
|
незадана
|
|
Когда существует много удалённых доставок для сообщения, они сортируются по доменам, в порядке заданном этим списком. Например,
remote_sort_domains = *.cam.ac.uk:*.uk
|
вызвала бы попытку, вначале, доставить все адреса в домен
“
cam.ac.uk
”, затем в домен
“
uk
”, затем к остальным доменам.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
retry_data_expire
|
main
|
time
|
7d
|
|
Эта опция устаналивает время
“использовать до
” (
“use before
”), в информации повторов, в базе данных подсказок (hints) exim`a. Любые более старые данные повторов - игнорируются. Таким образом, это значит, что, например, если хост не был проверен в течение 7 дней, exim ведёт себя так, будто прошлых неудач не было.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
retry_interval_max
|
main
|
time
|
24h
|
|
Раздел 32 описывает механизмы exim`a, для контроля интервалов между попытками доставки сообщения, которое не может быть доставлено немедленно. Эта опция устанавливает полный предел временного отрезка между повторами. Она не может быть установлена более 24 часов; любая попытка так сделать приведёт к значению по умолчанию.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
return_path_remove
|
main
|
boolean
|
истина
|
|
RFC2821, секция 4.4, заявляет, что сервер SMTP должен вставить строку заголовка
“
Return-path:
” в сообщение, когда он совершает
“финальную доставку
”. Заголовок
“
Return-path:
” сохраняет адрес отправителя, как он был передан в команде MAIL. Это описание подразумевает, что этот заголовок не должен присутствовать во входящих сообщениях. Если опция
“
return_path_remove
” истинна, любой существующий заголовок
“
Return-path:
” удаляется из сообщения при его приёме. Транспорты exim`a имеют опции для добавления заголовка
“
Return-path:
” во время доставки. Обычно они используются только для заключительных локальных доставок.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
return_size_limit
|
main
|
integer
|
100K
|
|
Эта опция - устаревший синоним для
“
bounce_return_size_limit
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
rfc1413_hosts
|
main
|
host list†
|
*
|
|
Идентификационные запросы RFC1413, производимые к любому клентскому хосту, который совпадает с элементом в списке.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
rfc1413_query_timeout
|
main
|
time
|
5s
|
|
Эта опция устанавливает таймаут для идентификационных вызовов RFC1413. Если она установлена в ноль, вызовы RFC1413 не производятся.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
sender_unqualified_hosts
|
main
|
host list†
|
незадана
|
|
Эта опция - список тех хостов, от которых exim готов принять неквалифицированные адреса получателей. Адреса квалифицируются опцией
“
qualify_domain
”. Эта опция, также, затрагивает строки заголовков. Exim не отклоняет неквалифицированные адреса в заголовках которые содержат адрес отправителя, но он их квалифицирует лишь в случае, если сообщение пришло с хоста совпадающего с
“
sender_unqualified_hosts
”, или если сообщение было передано локально (не используя TCP/IP), и не была задана опция
“
-bnq
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_keepalive
|
main
|
boolean
|
истина
|
|
Эта опция управляет установкой опции SO_KEEPALIVE для входящих соединений сокетов TCP/IP. Когда она установлена, это говорит ядру периодически пробовать неактивные соединения, путём посыла пакета со старыми номерами последовательности. Другой конец соединеия должен послать подтверждение, если соединение всё ещё существует, или сброс, если соединение было прервано. Прина, по которой это делается, в том, что это вызывает полезный эффект освобождения определённых типов подключений, которые могут застревать, когда удалённый хост отсоединился без соответсвующего запроса TCP/IP. Механизм keepalive занимает несколько часов lzk обнаружения недостижимых хостов.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_max
|
main
|
integer
|
20
|
|
Эта опция определяет максимальное число одновременных входящих вызовов SMTP, которые exim примет. Это применяется только к слушающему даемону; она не управляет exim`ом, когда входящие SMTP-подключения обрабатываются
“
inetd
”. Если значение установлено в ноль, ограничения снимаются. Однако, она обязана быть отличной от нуля, если установлена опция
“
smtp_accept_max_per_host
” или
“
smtp_accept_queue
”. Также смотрите опцию
“
smtp_accept_reserve
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_max_nonmail
|
main
|
integer
|
10
|
|
Exim считает число
“непочтовых
” (
“non-mail
”) команд в SMTP-сессии, и разрывает её, если их слишком много. Эта опция задаёт
“слишком много
”. Проверка ловит некоторые атаки отказ-в-обслуживании, повторяющиеся неправильные AUTH, или сумашедшее зацикливание клиента, например посылая HELO. Проверка применяется лишь если клиентский хост совпадает с
“
smtp_accept_max_nonmail_hosts
”.
Когда ожидается новое сообщение, не подсчитывается одно RSET. Это позволяет клиентам посылать одну команду RSET до сообщения (это ненужно, но некотрые клиенты так делают). Exim также разрешает одну неподсчитываемую команду HELO или EHLO, и одну STARTTLS между сообщениями. После запуска TLS-сессии, ожидается иное HELO, таким образом, оно тоже не считается. Первая команда AUTH в соединении, или сразу после STARTTLS - также не считается. Иначе, подсчитываются все команды кроме MAIL, RCPT, DATA, и QUIT.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_max_nonmail_hosts
|
main
|
host list†
|
*
|
|
Вы можете контролировать, какие хосты подчиняются проверке
“
smtp_accept_max_nonmail
”, путём установки этой опции. Значение по умолчанию применяет её ко всем хостам. Изменяя значение, вы можете исключить любые хосты с неправильным поведением, с которыми вам надо переписываться.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_max_per_connection
|
main
|
integer
|
1000
|
|
Значение этой опции ограничивает число команд MAIL, которые exim готов принять в течение одного SMTP-подключения, вне зависимости от того, приводит ли каждая команада к передаче сообщения. После исчерпания лимита, выдаётся 421 ответ на последующие команды MAIL. Этот предел - предосторожность против сошедших с ума клиентов (были замечены такие инциденты).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_max_per_host
|
main
|
string†
|
незадана
|
|
Эта опция ограничивает число одновременных IP подключений с одного хоста (строго, с одного IP-адреса) к даемону exim`a. Опция раскрывается, для обнаружения различных ограничений применяемых к различным хостам, по
“
$sender_host_address
”. Когда лимит исчерпан, дополнительные попытки подключения с того же хоста отклоняются с кодом ошибки 421. Значение по умолчанию - ноль, не налагает никаких ограничений. Если опция установлена, она требует, чтобы
“
smtp_accept_max
” была ненулевой.
Предупреждение: При установке этой опции вы не должны использовать любые конструкции раскрытия, которые занимают заметное время. Раскрытие и проверка происходят в петле главного даемона, для отклонения дополнительных подключений без запуска дополнительного процесса (иначе, атака отказ-в-обслуживании может вызвать создание большого числа процессов). Во время выполнения этой обработки, даемон не может принимать другие входящие подключения.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_queue
|
main
|
integer
|
0
|
|
Если число одновременных входящих SMTP-подключений обрабатываемых слушающим даемоном превысит это значение, сообщения передаваемые через SMTP лишь помещаются в очередь; процессы доставки автоматически не запускаются. Значение ноль, означает отсутствие лимитов, и ясно, что полезны лишь значения отличные от нуля, лишь если оно меньше чем
“
smtp_accept_max
” (если оно не ноль). Также смотрите
“
queue_only
”,
“
queue_only_load
”
“
queue_smtp_domains
” и различные
“
-od
x
” опции командной строки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_queue_per_connection
|
main
|
integer
|
10
|
|
Эта опция ограничивает число процессов доставки, которые exim запускает автоматически, когда получает сообщение по SMTP, через даемона, или путём использования
“
-bs
” или
“
-bS
”. Если значение опции больше нуля, и число сообщений передаваемых в одной SMTP-сессии превышает это число, последующие сообщения помещаются в очередь, но процессы доставки не запускаются. Это помогает ограничить число процессов exim`a при перезапуске сервера после простоя, и есть много почты ожидающей его на других системах. На больших системах, значение по умолчанию вероятно, должно быть увеличено, и на системах с дозвоном по делефону (модему), оно, вероятно, должно быть равно нулю (т.е. - отключено).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_accept_reserve
|
main
|
integer
|
0
|
|
Когда
“
smtp_accept_max
” установлено в значение больше нуля, эта опция определяет число SMTP-соединений, которые зарезервированы для хостов перечисленных в
“
smtp_reserve_hosts
”. Значение в
“
smtp_accept_max
” включает это резервирование. Указанные хосты не ограничены этим числом подключений; опция определяет минимальное число соединений для них, не для максимумва. Это гарантирует, что группа хостов всегда может получить по крайней мере
“
smtp_accept_reserve
” число подключений.
Например, если
“
smtp_accept_max
” установлена в 50, и
“
smtp_accept_reserve
” установлена в 5, как только будет 45 активных соединений (от любых хостов), новые соединения будут приниматься лишь для хостов перечисленных в
“
smtp_reserve_hosts
”. Также смотрите
“
smtp_accept_max_per_host
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_active_hostname
|
main
|
string†
|
незадана
|
|
Эта опция предоставлена для многодомашних (multi-homed - лучше не перевёл - прим. lissyara) серверов, которые могут выдавать себя за несколько различных хостов. В начале SMTP соединения, это значение раскрывается, и используется в SMTP-ответах, вместо значения
“
$primary_hostname
”. Например, это используется как имя домена в ответ на входящую команду HELO или EHLO.
Также это используется в командах HELO, для проверки обратным вызовом. Активное имя хоста помещается в переменную
“
$smtp_active_hostname
”, которая сохраняется с любыми полученными сообщениями. Поэтому она доступна для использования в роутерах и транспортах, когда сообщение доставляется позднее.
Если эта опция незаданна, или раскрытие принудительно неудачно, или раскрытие вернуло пустую строку, используется значение
“
$primary_hostname
”. Другие ошибки раскрытия вызывают запись сообщения в главный лог и лог паники, и SMTP-командой передаётся временная ошибка. Обычно, значение
“
smtp_active_hostname
” зависит от адреса интерфейса, с которого идёт сообщение. Например:
smtp_active_hostname = ${if eq{$interface_address}{10.
0
.
0
.1}\
{cox.mydomain}{box.mydomain}}
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_banner
|
main
|
string†
|
смотрите ниже
|
|
Эта строка, которая раскрывается каждый раз при использовании, выводится как начальный положительный ответ на SMTP подключение. Значение по умолчанию такое:
smtp_banner = $smtp_active_hostname ESMTP Exim \
$version_number $tod_full
|
Ошибка раскрытия строки вызывает пническую ошибку. Если вы хотите создать многостроковую ответ на начальное SMTP соединение, используйте
“\n
” в соответствующих точках строки, но не в конце. Отметтьте, что 220 код не включен в строку. Exim добавляет его автоматически (многократно, в случае многострочного ответа).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_check_spool_space
|
main
|
boolean
|
истина
|
|
Когда эта опция установлена, если во входящем SMTP сеансе будет опция SIZE в команде MAIL, она проверяет, что есть достаточно свободного места, в директории спула, для приёма сообщения этого размера, где всё ещё остаётся свободным количество заданное
“
check_spool_space
” (даже если это значение - ноль). Если нет достаточного количества свободного места, возвращается код временной ошибки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_connect_backlog
|
main
|
integer
|
20
|
|
Эта опция задаёт максимальное число ожидающих SMTP соединений. Exim передаёт это значение системе TCP/IP, когда он устанавливает её слушателя. Тогда, это число соединений, ожидающих внимания даемона, последующим попыткам подключения отказывается на уровне TCP/IP. по крайней мере, это то, что гворится в мануалах; в некоторых ситуациях, наблюдались таймауты этих попыток соединения. Для больших систем, было бы хорошей идеей увеличить это значение (скажем, до 50). также это даёт некоторую защиту против атак типа отказ-в-ослуживании, SYN-флудом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_enforce_sync
|
main
|
boolean
|
истина
|
|
Спецификация протокола SMTP требует, чтобы клиент ждал ответа сервера в определённых точках диалога. Без PIPELINING, эти точки синхронизации - после каждой команды; с PIPELINING, их меньше, но они всё ещё существуют.
Некоторые спамеры высылают полный набор команд SMTP без ожидания какого-либо ответаю Exim защищает от этого, путём отклонения сообщения, если клиент посылал будущий ввод (команды - прим. lissyara), когда этого не должно было быть.Посылается ответ о ошибке
“554 SMTP synchronization error
”, и соединение обрывается. Тестирование на эту ошибку не может быть идеальным, поскольку задержки передачи (неожиданный ввод может находиться в пути, но не получен при проверках exim). Однако, этим детектируется много случаев.
Эта проверка может быть глобально отключена путём установки
“
smtp_enforce_sync
” в ложь. Если вы хотите выборочно отключить эту проверку (например, только для определённых хостов), вы можете это сделать путём соответствующего использования модификатора
“
control
” в ACL (смотрите раздел 39.18). Также, смотрите опцию
“
pipelining_advertise_hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_etrn_command
|
main
|
string†
|
незадана
|
|
Если эта опция установлена, данная команда выполняется каждый раз, при получении команды SMTP ETRN с хоста, которому разрешено давать такие команды (смотрите раздел 39). Строка разделяется на отдельные аргументы, которые раскрываются независимо. Переменная раскрытия
“
$domain
” устанавливается из аргумента команды ETRN, и проверок её синтаксиса не производится. Например:
smtp_etrn_command = /etc/etrn_command $domain \
$sender_host_address
|
Для запуска команды создаётся новый процесс, но exim не ждёт его завершения. Следовательно, его статус не может быть проверен. Если команда не может быть запущена, это пишется в лог паники, но вызывающему ETRN всё равно передаётся успешный код 250. Exim, обычно, запускается под собственным uid, когда получает SMTP, таким образом, невозможно сменить uid до выполнения команды.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_etrn_serialize
|
main
|
boolean
|
истина
|
|
Когда эта опция установлена,она предотвращает одновременное выполнение более чем одной идентичной команды, как результат ERTN в SMTP-соединении. Для получения дополнительных деталей, смотрите раздел 44.8.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_load_reserve
|
main
|
fixed-point
|
незадана
|
|
Если средняя загрузка системы становиться выше чем тут указано, входящие SMTP-соединения принимаются только от тех хостов, которые совпадают с
“
smtp_reserve_hosts
”. Если
“
smtp_reserve_hosts
” не задана, входящие SMTP-вызовы не принимаются, когда загрузка превышает лимит. Опция не имеет эффекта на старых операционных системах, в которых exim не может определить среднюю загрузку. Также смотрите
“
deliver_queue_load_max
” и
“
queue_only_load
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_max_synprot_errors
|
main
|
integer
|
3
|
|
Exim отклоняет команды SMTP содержащие ошибки синтаксиса или протокола. В частности, синтаксически неправильный адрес электронной почты в этой команде:
приводит к немедленному отклонению команды, до других проверок. (ACL не могут быть запущены, если нет допустимого адреса, для его установки.) Пример ошибки протокола - передача RCPT до MAIL. Если происходит слишком много синтаксических ошибок или ошибок протокола в одной SMTP-сессии, соединение разрывается. Ограничение устанавливается этой опцией.
Когда используется расширение SMTP - PIPELINING, некоторые ошибки протокола
“ожидаемы
”, например, команда RCPT после отклонённой команды MAIL. Exim предполагает, что PIPELINING будет использоваться, если он информировал о нём (смотрите
“
pipelining_advertise_hosts
”), и в этой ситуации,
“ожидаемые
” ошибки не суммируются к лимиту.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_max_unknown_commands
|
main
|
integer
|
3
|
|
Если слишком много нераспознанных команд во входящей SMTP-сессии, сервер exim обрывает соединение. Это - защита от некоторых спамеров, ломающих сайты, заставляя их создавать соединения на SMTP-порты; в этих случаях, сначала посылается много не-SMTP команд.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_ratelimit_hosts
|
main
|
host list†
|
незадана
|
|
Некотрые сервера считают полезным ограничивать частоту с которой определённые хосты могут им посылать письма, и частоту с которой индивидуальные сообщения могут определять получателей.
Exim имеет два фактора, ограничивающих частоту. Эта секция описывает старое средство, которое может ограничивать частоту в одном соединении. Более новое условие ACL может ограничивать частоту для всех соединений. Для получения деталей о новом средстве, смотрите раздел 39.30.
Когда хост совпадает с
“
smtp_ratelimit_hosts
”, используются значения
“
smtp_ratelimit_mail
” и
“
smtp_ratelimit_rcpt
” для контроля частоты приёма команд MAIL и RCPT в единственной SMTP-сессии, соответственно. Каждая опция, если задана, должна содержать четыре значения, разделённых запятыми:
Порог, до которого нет ограничений частоты.
Начальная задержка времени. В отличие от других времён в exim`e, тут разрешены цифры с десятичными дробными частями.
Фактор, по которому каждый раз увеличивается время задержки.
Максимальное значение для задержки. Оно, обычно, должно быть менее пяти минут, поскольку после этого времени, клиент подвергает SMTP-команду таймауту.
Например, эти установки успешно использовались на сервере, который первым предложил эту деталь, для контролирования почты от клиентов:
smtp_ratelimit_mail =
2
,
0
.5s,
1
.
05
,4m
smtp_ratelimit_rcpt =
4
,
0
.25s,
1
.
015
,4m
|
Первая установка определяет задержки, применяемые к командам MAIL после того, как две были переданы по одному соединению. Начальная задержка 0.5 секунды, увеличивающаяся по фактору 1.05 каждый раз. Втроая установка применяет задержки к командам RCPT, когда их бывает более четырёх в одном сообщении.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_ratelimit_mail
|
main
|
string
|
незадана
|
|
Смотрите выше, опцию
“
smtp_ratelimit_hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_ratelimit_rcpt
|
main
|
string
|
незадана
|
|
Смотрите выше, опцию
“
smtp_ratelimit_hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_receive_timeout
|
main
|
time
|
5m
|
|
Этим устанавливается значение таймаута для приёма SMTP. Это применяется ко всем формам ввода SMTP, включая пакетный SMTP. Если строка ввода (включая команды SMTP, или строки данных) не получена в пределах этого времени, подключение SMTP разрывается и сообщение бросается. В лог пишутся строки содержащие одно их следующих сообщений:
SMTP command timeout on connection from...
SMTP data timeout on connection from...
|
Первая означает, что exim ожидал чтения SMTP-команды; последняя означает, что он был в фазе данных, читая содержимое сообщения.
Значение этой опции может быть перезадано путём опции командной строки
“
-os
”. Установка значения времени в ноль - отключает таймаут, но это никогда не должно использоваться для SMTP через TCP/IP. (Это может быть полезным в некотрых случаях локального ввода, используя
“
-bs
” или
“
-bS
”.) Для не-SMTP ввода, таймаутом приёма управляет опция
“
receive_timeout
” или
“
-or
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_reserve_hosts
|
main
|
host list†
|
незадана
|
|
Эта опция задаёт хосты для которых резервируются SMTP-соединения; смотрите выше опции
“
smtp_accept_reserve
” и
“
smtp_load_reserve
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
smtp_return_error_details
|
main
|
boolean
|
ложь
|
|
В дефолтовом состоянии, когда происходит отклонение команд SMTP по настройкам политик, exim использует вежливые собщения, типа
“Administrative prohibition
”. Это нравиться многим системным администраторам, поскольку даёт мало информаци спамерам. Однако, некоторые другие системные администраторы, применяющие жёсткую политику проверки, хотят выдавать намного более полную информацию о ошибках. Установка
“
smtp_return_error_details
” в истину заставляет exim быть более приветливым. Например, вместо
“Administrative prohibition
”, он мог бы выдать:
550
-Rejected after DATA: '>' missing at end of address:
550
failing address in "From" header is: <user@dom.ain
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
spamd_address
|
main
|
string
|
смотрите ниже
|
|
Эта опция доступна лишь если exim собран с поддержкой расширения контентного сканирования. Этим определяется, как exim коннектится к даемону SpamAssassin`a. Дефолтовое значение:
Для получения дополнительных деталей, смотрите раздел 40.2.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
split_spool_directory
|
main
|
boolean
|
ложь
|
|
Если эта опция установлена, это заставляет exim разбить свой входной каталог на 62 субдиректории, каждая с именем в виде одного буквенно-цифрового символа. Шестой символ идентификатора сообщения используется для распределения сообщений по субдиректориям; это - наменее значащая из цифра, по основанию 62, времени прибытия сообщения.
Разделение спула позволяет увеличить производительность в системах, где длинные почтовые очереди, уменьшая число файлов в одном каталоге. Директория
“msglog
” делится таким же способом, как и
“input
”; однако, если
“
preserve_message_logs
” установлена, все старые логи всё равно помещаются в одну директорию
“
msglog.OLD
”.
Нет необходимости предпринимать какие-то действия для существующих сообщений, когда изменяется
“
split_spool_directory
”. Exim замечает сообщения, находящиеся в
“неверном
” месте, и продолжает обрабатывать их. Если опция будет отключена, то после периода обработки, субдиректории, в конечном счёте, опустеют, и будут автоматически удалены.
Когда опция
“
split_spool_directory
” установлена, изменяется поведение обработчика очереди. Вместо создания списка всех сообщений в очереди, и последующей попытки доставить каждое из них по очереди, он создаёт их список в одной субдиректории, и пробует доставить их, до перехода к следующему подкаталогу. Подкаталоги обрабатываются в случайном порядке. Это разворачивает сканирование входных директорий, и использует меньше памяти. Особенно это выгодно, когда в очереди много сообщений. Однако, если установлена опция
“
queue_run_in_order
”, не происходит ни одна из новых обработок. Вся очередь должна быть просмотрена, и отсортирована до того, как начнутся какие бы то ни было доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
spool_directory
|
main
|
string†
|
устанавливается при компиляции
|
|
Эта опция задаёт директорию, в которую exim сохраняет обрабатываемые сообщения, т.е. сообщения, ожидающие доставки. Дефолтовое значение берётся из компиляционных настроек, если они есть. Если нет, эта опция должна быть задана. Строка раскрывается, таким образом она может содержать, например, ссылку на
“
$primary_hostname
”.
Если имя директории спула задано при инсталляции, рекомендуется, чтобы вы использовали настройки из инсталляции, а не этой опции, особенно, если логи пишутся в директорию спула (смотрите
“
log_file_path
”). Иначе, логи не могут использоваться для ошибок, детектируемых на ранней стадии, типа ошибок в файле конфигурации.
Путём использования этой опции для отмены вкомпиленного пути, возможно запускать тесты exim`a без использования стандартного спула.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
sqlite_lock_timeout
|
main
|
time
|
5s
|
|
Эта опция контролирует таймаут, который используется поисками
“
sqlite
”, когда пытаются обратиться к БД SQLite. Для получения дополнительных деталей, смотрите раздел 9.24.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
strip_excess_angle_brackets
|
main
|
boolean
|
ложь
|
|
Если эта опция задана, из элемента адреса
“route-addr
”, удаляются избыточные пары угловых скобок. Например, <<xxx@a.b.c.d>> обрабатывается как <xxx@a.b.c.d>. Если это в конверте, и сообщение передаётся другому MTA, лишние угловые скобки не передаются. Если эта опция не задана, несколько пар угловых скобок вызывают ошибку синтаксиса.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
strip_trailing_dot
|
main
|
boolean
|
ложь
|
|
Если эта опция установлена, завершающая точка в конце домена, в адресе, игнорируется. Если это в конверте, и точка и сообщение передаётся другому MTA, точка не передаётся. Если эта опция не задана, точка в конце домена вызывает синтаксическую ошибку. Однако, адреса в строках заголовков проверяются только когда ACL запрашивает проверку синтаксиса заголовков.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
syslog_duplication
|
main
|
boolean
|
истина
|
|
Когда exim пишет логи в syslog, он пишет строки логов для своих трёх раздельных логов с различным приоритетом, таким образом, чтобы они, в принципе, могли быть разделены на хосте логгинга. Некоторые инсталляции не требуют этого разделения, и в этих случаях, дублирование определённых строк логов - неприятность. Если
“
syslog_duplication
” установлена в ложь, лишь одна копия любых специфических строк логов пишется в syslog. Для строк, обычно идущих в оба лога - главный и отклонённых, версия для лога отклонённых (возможно, содержащая строки заголовков сообщения) записывается, с приоритетом LOG_NOTICE. Строки, обычно идущие в оба - главный и лог паники, пишутся с приоритетом LOG_ALERT.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
syslog_facility
|
main
|
string
|
незадана
|
|
Эта опция устанавливает имя
“средства
” syslog, используемого когда exim пишет логи в syslog. Значение модет быть одной из строк
“mail
”,
“user
”,
“news
”,
“uucp
”,
“daemon
”, или
“localx
”, где
“
x
” - число между 0 и 17. Если эта опция незадана, используется
“mail
”. Для дополнительных деталей о логгинге exim`a смотрите раздел 48.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
syslog_processname
|
main
|
string
|
exim
|
|
эта опция устанавливает имя
“ident
” syslog`a, используемое когда exim пишет логи в syslog. Значение может быть не более 32-х символов. Для дополнительных деталей о логгинге exim`a смотрите раздел 48.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
syslog_timestamp
|
main
|
boolean
|
истина
|
|
Если опция
“
syslog_timestamp
” установлена в ложь, штампы времени в строках логов exim`a опущены, когда эти строки посылаются в syslog. Для дополнительных деталей о логгинге exim`a смотрите раздел 48.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
system_filter
|
main
|
string†
|
незадана
|
|
Эта опция определяет фильтр exim`a, применяемый ко всем сообщениям в начале каждой попытки доставки, до завершения любого роутинга. Системные фильтры должны быть фильтрами exim`a; они не могут быть фильтрами Sieve. Если системный фильтр генерит любую доставку в файл или трубу, или любое новое почтовое сообщение, должны быть установлена соответствующая опция
“
system_filter_..._transport
”, для определения, какие транспорты должны использоваться. Детали о этом средстве даны в разделе 42.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
system_filter_directory_transport
|
main
|
string†
|
незадана
|
|
Эта опция устанавливает драйвер транспорта, который будет использоваться, когда команда
“
save
”, в системном фильтре сообщений, определяет путь заканчивающийся на
“/
”, подразумевая доставку каждого сообщения в отдельный файл в какой-то директории. В течение доставки, переменная
“
$address_file
” содержит имя пути.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
system_filter_file_transport
|
main
|
string†
|
незадана
|
|
Эта опция устанавливает драйвер транспорта, который будет использоваться, когда команда
“
save
”, в системном фильтре сообщений, определяет путь не заканчивающийся на
“/
”. В течение доставки, переменная
“
$address_file
” содержит имя пути.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
system_filter_group
|
main
|
integer
|
незадана
|
|
Эта опция используется лишь когда задана опция
“
system_filter_user
”. Она устанавливает gid под которым работает системный фильтр, перезадавая любой gid ассоциированный с пользователем. Значение может быть цифровым или символическим.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
system_filter_pipe_transport
|
main
|
string†
|
незадана
|
|
Эта опция определяет драйвер транспотра, который будет использоваться при использовании команды
“
pipe
” в системном фильтре. В процессе доставки, переменная
“
$address_pipe
” содержит команду трубы (pipe).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
system_filter_reply_transport
|
main
|
string†
|
незадана
|
|
Эта опция определяет драйвер транспотра, который будет использоваться при использовании команды
“
mail
” в системном фильтре.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
system_filter_user
|
main
|
string
|
незадана
|
|
Если эта опция незадана, системный фильтр работает d главном процессе доставки exim, как root. Когда эта опция установлена, системный фильтр работает в отдельном процессе, под заданным пользователем. Если строка не состоит полностью из цифр, она ищется в БД паролей. Ошибка нахождения имени пользователя вызывает конфигурационную ошибку. Идентификатор группы - gid, или берётся из занных БД паролей, или определяется опцией
“
system_filter_group
”. Когда uid задан в цифровом виде,
“
system_filter_group
” должна быть установлена.
Если системный фильтр генерит доставку
“pipe
”,
“file
”, или
“reply
”, для транспортировки используется uid под которым работает системный фильтр, если опции транспотра не переопределяют этого. Обычно, вам необходимо устанавливать
“
system_filter_user
” если системный фильтр производит эти виды доставок.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tcp_nodelay
|
main
|
boolean
|
истина
|
|
Если эта опция установлена в ложь, это останавливает настройку опции TCP_NODELAY, даемона exim`a, на слушаемых сокетах. Установка TCP_NODELAY выключает
“Nagle algorithm
”, являющийся способом улучшить сетевую производительность в интерактивных (познаковых) ситуациях. Выключение его, должно немного улучшить работосопособность exim`a, таким образом, это и установлено по умолчанию. Однако, выявляются некоторые кривые клиенты, с которыми невозможно совладать, и происходит таймаут. Поэтому присутствует эта опция. Она имеет эффект только на те сокеты, которые установлены для слушающего даемона. Сокеты создаваемые транспортом smtp для доставки почты, всегда устанавливают TCP_NODELAY.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
timeout_frozen_after
|
main
|
time
|
0s
|
|
Если опция
“
timeout_frozen_after
” установлена во время большее нуля, замороженные сообщения любого вида, которые находятся в очереди больше данного времени, автоматически отменяются в следующую работу очереди. Если это рикошеты, они просто удаляются; иначе, отправителю посылается рикошет, в манере, подобной отмене опцией командной строки
“
-Mg
”. Если вы хотите сделать таймаут замороженных рикошетов меньше, чем других видов замороженных сообщений, смотрите опцию
“
ignore_bounce_errors_after
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
timezone
|
main
|
string
|
незадана
|
|
Значение опции
“
timezone
” используется для установки переменной окружения TZ, при работе exim`a (если она отличается от той, что была при входе). Это гарантирует, что все штампы времени, созданные exim`ом, находятся в нужном часовом поясе. Если вы хотите, чтобы все штампы времени были в UTC (т.е. - GMT), вы должны установить
Дефолтовое значение берётся из TIMEZONE_DEFAULT в
“
Local/Makefile
”, или, если оно не задано, из значения переменной окружения TZ, при сборке exim`a. Если
“
timezone
” установлено в пустую строку, или строится при выполнении, любая существующая переменная TZ удаляется из переменных окружения, при работе exim`a. Это соответствующее поведение для получения текущегов ремени на некоторых, но к сожалению не на всех, операционных системах.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_advertise_hosts
|
main
|
host list†
|
незадана
|
|
Когда exim собран с опддержкой шифрованных соединений TLS, доступность команды STARTTLS, для установки шифрованных сессий, сообщается в EHLO лишь тем клиентским хостам, которые совпадают с этой опцией. Для подробной информации о поддержке exim`ом TLS, смотрите раздел 38.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_certificate
|
main
|
string†
|
незадана
|
|
Значение этой опции раскрывается, и должно быть абсолютным путём к файлу, содержащему серверные сертификаты. Тайный ключ сервера, как предполагается, также находится в этом файле, если не задана опция
“
tls_privatekey
”. Для дополнительных деталей, смотрите раздел 38.
Отметтьте: Сертификаты, заданные этой опцией, используются лишь когда exim получает входящие сообщения как сервер. Если вы хотите предлагать для использования, когда сообщение посылается как клиент, вы должны установить опцию
“
tls_certificate
” в подходящем
“
smtp
” транспорте.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_crl
|
main
|
string†
|
незадана
|
|
Эта опция определяет список аннулирования сертификатов. Раскрытое значение может быть файлом, содержащим CLR в формате PEM.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_dhparam
|
main
|
string†
|
незадана
|
|
Значение этой опции раскрывается, и должно быть абсолютным путём к файлу, содержащему значения параметра DH, сервера. Это используется только для OpenSSL. Когда exim слинкован с GnuTLS, эта опция игнорируется. Для дополнительных деталей, смотрите раздел 38.2.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_on_connect_ports
|
main
|
string list
|
незадана
|
|
Эта опция определяет список входящих SSMTP (т.е. SMTPS) портов, которые должны управляться устаревшим SSMTP (SMTPS) протоколом, где сессии TLS устанавливается немедленно, без ожидания пока клиент даст команду STARTTLS. Для дополнительных деталей, смотрите раздел 13.4.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_privatekey
|
main
|
string†
|
незадана
|
|
Значение этой опции раскрывается, и должно быть абсолютным путём к файлу, который содержит секретные ключи сервера. Если эта опция незадана, или её раскрытие принудительно неудачно, или результат - пустая строка, предполагается что, частный ключ находится в том же файле, что и сертификаты сервера. Для дополнительных деталей, смотрите раздел 38.2.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_remember_esmtp
|
main
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, exim нарушает RFC, помня, что он в состоянии
“esmtp
”, после успешных переговоров о TLS сессии. Это предоставялет поддержку кривых клиентов, которые не в состоянии послать новую команду HELO, после начала сессии TLS.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_require_ciphers
|
main
|
string†
|
незадана
|
|
Эта опция контролирует, какие шифры могут использоваться для входящей сессии TLS. Транспорт
“
smtp
” имеет опцию с тем же самым именем, для контроля исходящих соединений. Эта опция раскрывается для каждого соединения, таким образом, может изменяться для различных клиентов, если это требуется. Значение этой опции должно быть списком разрешённых наборов шифров. Библиотеки OpenSSL и GnuTLS обрабатывают управление шифрами несколько различными способами. Если используется GnuTLS, клиент управляет предпочтительным порядком доступных шифров. Детали даны в разделах 38.4 и 38.5.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_try_verify_hosts
|
main
|
host list†
|
незадана
|
|
Смотрите ниже, опцию
“
tls_verify_hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_verify_certificates
|
main
|
string†
|
незадана
|
|
Значение этой опции раскрывается, и должно быть абсолютным путём к файлу, содержащему разрешённые сертификаты для клиентов, которые совпадают с
“
tls_verify_hosts
” или
“
tls_try_verify_hosts
”. Альтернативно, если вы используете OpenSSL, вы можете установить
“
tls_verify_certificates
” в имя директории содержащей файлы сертификатов. Это не работает с GnuTLS; опция должны быть установлена в имя одного файла, если вы используете GnuTLS.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
tls_verify_hosts
|
main
|
host list†
|
незадана
|
|
Эта опция, наряду с
“
tls_try_verify_hosts
”, контролирует проверку сертификатов клиентов. Ожидаемые сертификаты заданы опцией
“
tls_verify_certificates
”, которая должна быть установлена. Если установлена
“
tls_verify_hosts
” или
“
tls_try_verify_hosts
” и незадана
“
tls_verify_certificates
”, происходит конфигурационная ошибка.
Любые клиенты, совпадающие с
“
tls_verify_hosts
”, принудительно подвергаются
“
tls_verify_certificates
”. Клиент должне предоставить один из перечисленных сертификатов. Если он этого не делает, соединение разрывается.
Более слабая форма проверки предоставялется опцией
“
tls_try_verify_hosts
”. Если клиент совпадает с этой опцией (но не с
“
tls_verify_hosts
”), exim запрашивает сертификат, и проверяет что он соотетствует
“
tls_verify_certificates
”, но не разрывает соединение, если сертификата нет, или он не совпадает. Это может быть определено в ACL, делающей возможной осуществление политики типа
“принимать для релея лишь если был передан проверенный сертификат, но принимать для локальной доставки, если зашифрованное, даже без подтверждённого сертификата
”.
У хостов, не совпадающих с ни с одним из этих списков, не запрашиваются сертификаты.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
trusted_groups
|
main
|
string list†
|
незадана
|
|
Эта опция раскрывается лишь один раз, при старте процесса exim`a. Если она задана, доверенным является любой процесс, работающий в одной из перечисленных групп, или у которого одна из них является дополнительной. Группы могут быть заданы в цифровой форме, или по именам. Смотрите раздел 5.2, для получения дополнительной информации о том, что разрешено делать вызывающим доверенным группам. Если не установлены ни
“
trusted_groups
”, ни
“
trusted_users
”, доверие будет лишь к root и пользователю exim`a.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
trusted_users
|
main
|
string list†
|
незадана
|
|
Эта опция раскрывается лишь один раз, при старте процесса exim`a. Если она задана, доверенным является любой процесс, работающий под перечисленным пользователем. Пользователи могут быть заданы в цифровой форме, или по именам. Смотрите раздел 5.2, для получения дополнительной информации о том, что разрешено делать вызывающим доверенным пользователям. Если не установлены ни
“
trusted_groups
”, ни
“
trusted_users
”, доверие будет лишь к root и пользователю exim`a.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
unknown_login
|
main
|
string†
|
незадана
|
|
Это - специальная особенность, для использования в необычных конфигурациях. По умолчанию, если используя
“
getpwuid()
” не может быть найден uid того, кто вызывает exim, exim отключается. Опция
“
unknown_login
” может использоваться для задания логина использующегося в таких случаях. Эта опция раскрывается, таким образом, может быть задано значение типа
“
user
$caller_uid
”. Когда используется опция
“
unknown_login
”, значение
“
unknown_username
” используется для реального имени пользователя (поле geos), если оно не было задано путём опции
“
-F
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
unknown_username
|
main
|
string
|
незадана
|
|
Смотрите
“
unknown_login
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
untrusted_set_sender
|
main
|
address list†
|
незадана
|
|
Когда недоверенный пользователь передаёт сообщение exim`y используя стандартный ввод, exim, обычно, создаёт адрес отправителя конверта из логина пользователя и дефолтового квалификационного домена. Данные из опции
“
-f
” (для установки отправителей конверта не-SMTP сообщений) или команды SMTP MAIL (если используются
“
-bs
” или
“
-bS
”), игнорируются.
Однако, недоверенным пользователям разрешено устанавливать пустой адрес конверта, для объявления, что сообщение никогда не должно генерить рикошетов. Например:
exim -f '<>' user@domain.example
|
Опция
“
untrusted_set_sender
” разрешает вам позволить недоверенным пользователям устанавливать иного отправителя конверта, управляемым способом. Когда она установлена, недоверенным пользователям разрешено устанавливать адрес отправителя конверта, который совпадает с любым паттерном в этом списке. Как и все списки адресов, строка раскрывается. Идентичность пользователя находится в
“
$sender_ident
”, таким образом, вы можете, например, ограничить пользователей установкой отправителей начинающихся с их логинов, сопровождаемых дефисом, путём установки похожей на эту:
untrusted_set_sender = ^$sender_ident-
|
Если вы хотите разрешить недоверенным пользователям без ограничений устанавливать адрес отправителя конверта, вы можете использовать:
Опция
“
untrusted_set_sender
” применяется ко всем формам локального воода, но лишь к установке отправителя конверта. Она не позволяет недоверенным пользователям устанавливать иные опции, которые доверенные пользователи могут использовать для переопределения параметров сообщений. Кроме этого, она не мешает exim`y удалить из сообщения существующий заголовок
“
Sender:
”, или добавить заголовок
“
Sender:
”, если имеется необходимость. Смотрите опции
“
local_sender_retain
” и
“
local_from_check
”, для способов перезадания этих действий. Обработка заголовка
“
Sender:
” также описана в разделе 43.16.
Строки логов, для прибывших сообщений, показывают отправителя конверта сопровождаемого
“<=
”. Для локальных сообщений, логин пользователя всегда показан, после
“U=
”. В отображении
“
-bp
”, и в мониторе exim`a, если недоверенный пользователь устанавливает адрес отправителя конверта, логин пользователя показан, в круглых скобках, после адреса отправителя.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
uucp_from_pattern
|
main
|
string
|
смотрите ниже
|
|
Некоторые приложения, которые передают сообщения MTA через интерфейс командной строки, используют начальную строку, начинающуюся с
“From
”, для передачи конверта сообщения. В частности, это используется софтом UUCP. Exim распознаёт такую строку регулярным выражением, которое задано в
“
uucp_from_pattern
”. Когда паттерн совпадает, адрес отправителя конструируется путём раскрытия содержимого
“
uucp_from_sender
”, при условии, что exim вызывает доверенный пользователь. Дефолтовый паттерн распознаёт строки в следующих двух формах:
From ph10 Fri Jan
5
12
:
35
GMT
1996
From ph10 Fri,
7
Jan
97
14
:
00
:
00
GMT
|
Паттерн можно увидеть путём запуска
exim -bP uucp_from_pattern
|
Он проверяет только с точностью до часов и минут, и разрешает двух или четырёх цифровой год во втором случае. Первое слово, после
“From
” совпадает с регулярным выражением с субпаттерном. Дефолтовое значение для
“
uucp_from_sender
” -
“
$1
”, использующее лишь первое слово (
“ph10
”, в примере выше), как отправтеля сообщения. Такде смотрите опцию
“
ignore_fromline_hosts
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
uucp_from_sender
|
main
|
string†
|
$1
|
|
Смотрите выше, опцию
“
uucp_from_pattern
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
warn_message_file
|
main
|
string
|
незадана
|
|
Эта опция задаёт файл шаблона, содержащий параграфы текста, используемого для составления предупреждающего сообщения, посылаемого exim`ом, когда сообщение пробыло в очереди указанное время, как задано в
“
delay_warning
”. Детали о содержимом этого файла даны в разделе 45. Также смотрите опцию
“
bounce_message_file
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
write_rejectlog
|
main
|
boolean
|
истина
|
|
Если эта опция установлена в ложь, exim ничего не пишет в соответствующий лог отклонённых. Смотрите раздел 48, для получения деталей о том, что exim пишет в свои логи.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
15. Общие опции для роутеров
Эта глава описывает общие опции, применяемые ко всем роутерам. Те, которые являются предваоительными условиями, помечены символом
“‡
”, в поле
“использование
”.
Для общего описания, как работает маршрутизатор, смотрите раздел 3.10 и 3.12. Последний, определяет порядок в котормо проверяются предварительные условия. Порядок раскрытия опций, которые предоставляют данные для транспортов, таков:
“
errors_to
”,
“
headers_add
”,
“
headers_remove
”,
“
transport
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
address_data
|
routers
|
string†
|
незадана
|
|
Строка раскрывается лишь до запуска роутера, т.е. после успешного прохождения всех тестов предварительных условий. Если раскрытие принудительно неудачно, роутер отклоняется, значение
“
address_data
” остаётся неизменённым, и опция
“
more
” контролирует, что происходит дальше. Другие ошибки раскрытия вызывают задержку доставки адреса.
Когда раскрытие успешно, значение сохраняется вместе с адресом, и может быть доступно использованием переменной
“
$address_data
” в текушем роутере,последующих маршрутизаторах, и возможном окончательном транспорте.
Предупреждение: Если текущий, или последующий роутер - роутер
“
redirect
”, выполняющий файл фильтра пользователя, содержимое
“
$address_data
” доступно в фильтре. Обычно, это не проблема, поскольку обычно, эти данные не конфиденциальны, или они принадлежат текущему пользователю, но если вы помещаете конфиденциальные данные в
“
$address_data
”, вы должны помнить о этом пункте.
Даже если маршрутизатор отклоняется или принимается, значение
“
$address_data
” остаётся с адресом, хотя оно может быть изменено, путём установки иной
“
$address_data
” в последующем маршрутизаторе. Если роутер генерит дочерние адреса, значение
“
$address_data
” размножается на них. Также это применяется к специальному виду
“детей
”, которые генерятся роутерами с опцией
“
unseen
”.
Идея
“
address_data
” в том, что вы можете использовать её для поиска большого количества данных за раз, и позднее выбирать части данных. Для примера, вы можете использовать один поиск в LDAP, для возврата строки формы
uid=
1234
gid=
5678
mailbox=/mail/xyz forward=/home/xyz/.forward
|
В транспорте, вы могли бы выбрать почтовый ящик установкой типа
file = ${extract{mailbox}{
$address_data}}
|
Это делает конфигурационный файл менее грязным, и также уменьшает число поисков (хотя exim r'ibhetn поиски).
Средство
“
address_data
” также полезно как средство передачи информации от одного роутера к другому, и от роутера к транспорту. В дополнение к [видимо тут должен быть текcт, но его нету ни в HTML ни в текстовой версии... - прим. lissyara]
Когда
“
address_data
” установлена роутером при проверке адреса получателя из ACL, она остаёьтся доступной для использования в остальной части утверждения ACL. После проверки отправителя, значение передаётся в
“
$sender_address_data
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
address_test
|
routers‡
|
boolean
|
истина
|
|
Если эта опция установлена в ложь, маршрутизатор пропускается, когда роутинг тестируется при помощи опции командной строки
“
-bt
”. Это может быть удобным, когда ваш первый роутер посылает сообщения на внешний сканер, поскольку он сохраняет необходимость установки индикатора
“already scanned
”, при тестировании реальной маршрутизации адреса
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
cannot_route_message
|
routers
|
string†
|
незадана
|
|
Эта опция определяет текстовое сообщение, используемое когда адрес не может быть смаршрутизирован, поскольку exim исчерпал все маршруты. Дефолтовое сообщение -
“Unrouteable address
”. Эта опция полезна лишь в роутерах, где опция
“
more
” установлена в ложь, или последнем роутере конфигурации, поскольку используемое значение берётся из последнего просматриваемого роутера. Она включает роутеры, которые были пропущены, поскольку несоответствовали их предварительные условия, также как и отклоняемые маршрутизаторы. Например, используя дефолтовую конфигурацию, вы могли бы поместить:
cannot_route_message = Remote domain not found in DNS
|
в первом роутере, являющемся роутером
“
dnslookup
”, с опцией
“
more
” установленной в ложь, и
cannot_route_message = Unknown local user
|
в последнем роутере, где проверяются локальные юзеры. Если раскрытие стоки этой опции неудачно, используется дефолтовое сообщение. Если ошибка раскрытия не была неудачной принудительно, сообщение о ошибке пишется в главный лог и лог паники, в дополнение к обычному сообщению о ошибке роутинга.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
caseful_local_part
|
routers
|
boolean
|
ложь
|
|
По умолчанию, роутеры обрабатывают локальную часть адреса в регистронезависимой манере, хотя фактический регистр сохраняется, для передачи с сообщением. Если вы хотите, чтобы регистр букв был важен в роутере, вы должны установить эту опцию в истину. Для индивидуальных опций роутера, которые содержат адреса, или списки локальных частей (например,
“
local_parts
”), сравнение с учётом регистра может быть включено путём
“+caseful
”, как элемента списка. Смотрите раздел [url=./?id=1210#10.19], для получения дополнительных деталей.
Значение переменной
“
$local_part
” принудительно приводится к нижнему регистру, когда роутер запущен без установленной опции
“
caseful_local_part
”. Когда роутер назначает адрес на транспортировку, когда транспорт выполняется, значение
“
$local_part
” такое же. Точно также, когда роутер генерит дочерний адрес путём альясинга или форвардинга, значение
“
$original_local_part
” и
“
$parent_local_part
” те, которые использовались роутером редиректа.
Эти опции применяются к обработке адресов роутером. Когда адрес получателя обрабтывается в ACL, есть отдельный модификатор
“
control
”, который может использоваться для задания регистрозависимой обработки в пределах ACL (смотрите раздел 39.38).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
check_local_user
|
routers‡
|
boolean
|
ложь
|
|
Когда эта опция истинна, exim проверяет, что локальная часть адреса получателя (с удалёнными аффиксами, если они есть) - имя учётной записи в локальной системе. Проверка производиться путём вызова функции
“
getpwnam()
”, вместо попытки напрямую прочитать
“
/etc/passwd
”. Это означает, что другие методы проверки данных пароля (типа NIS), также поддерживаются. Если локальная часть - локальный пользователь, переменная
“
$home
” устанавливается из данных пароля, и может быть проверена в других предварительных условиях, оцениваемых после этого (порядок оценки даётся в разделе 3.12). Однако, значение
“
$home
” может быть перезадано
“
router_home_directory
”. Если локальная часть - не локальный пользователь, роутер пропускается.
Если вы хотите проверить, что локальная часть является именем пользователя, или совпадает с чем-то ещё, вы не можете объединять
“
check_local_user
” с установкой
“
local_parts
”, поскольку это определяет логическое
“и
” этих условий. Однако, вы можете использовать поиск
“
passwd
” в установке
“
local_parts
”, для достижения этого. Например:
local_parts = passwd;$local_part : lsearch;/etc/other/users
|
Отметтьте, однако, что побочные эффекты
“
check_local_user
” (типа установки домашней директории) не происходят, когда поиск
“
passwd
” используется в
“
local_parts
” (или любых других) предварительных условиях.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
condition
|
routers‡
|
string†
|
незадана
|
|
Эта опция определяет главный тест предварительного условия, который должен быть успешным, для вызова роутера. Опция
“
condition
” - последнее предварительное условие, для оценки (смотрите раздел 3.12). Строка раскрывается, и если результат принудительно неудачен, или пустая строка, или одна из строк
“0
”, или
“no
”, или
“false
” (проверяется без учёта регистра), роутер пропускается, и адрес предлагается следующему.
Если результат - любое другое значение, роутер запускается (поскольку это - последнее предварительное условие для оценки, все другие предварительные условия должны быть истинными).
Опция
“
condition
” предоставляет средство применения персональных условий для запуска роутеров. Отметтьте, что в случае простого раскрытия, дефолтовое значение раскрытия - именно то что требуется. например:
condition = ${if >{$message_age}{600}}
|
Из-за дефолтового поведения раскрытия строки, это эквивалентно
condition = ${if >{$message_age}{600}{true}{}}
|
Если раскрытие неудачно (кроме принудительной неудачи), поставка отсрочена. Некоторые другие опции предварительные условий - общие специальные случаи, которые могли быть фактически определены, используя
“
condition
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
debug_print
|
routers
|
string†
|
незадана
|
|
Если эта опция установлена, и отладка включена (смотрите опцию командной строки -
“
-d
”), строка раскрывается и включается в отладочный вывод. Если раскрытие строки неудачно, сообщение о ошибке записывается в отладочный вывод, и exim продолжает обработку. Эта опция предоставлена для помощи проверки значения переменных, и т.п. при отладке конфигурации роутера. Например, если кажется, что опция
“
condition
” не работает,
“
debug_print
” может использоваться для вывода ссылающихся на неёё переменных. Вывод происходит после проверки
“
domains
”,
“
local_parts
” и
“
check_local_user
”, но до проверки любых других предварительных условий. Новая строка добавляется к тексту, если она не оканчивается этим символом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
disable_logging
|
routers
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, ничего не логгируется для любых ошибок роутинга или для любых доставок, вызванных этим маршрутизатором. Вы не должны устанавливать эту опцию, если вы не понимаете что вы делаете. Также смотрите общую опцию транспортов, с тем же именем.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
domains
|
routers‡
|
domain list†
|
незадана
|
|
Если эта опция установлена, роутер пропускается, когда текущий домен не совпадает со списком. Если совпадение произошло путём поиска по файлу, данные возвращщённые поиском для домена, помещаются в
“
$domain_data
”, для использования в раскрытиях строки частных опций драйвера. Смотрите раздел 3.12, для списка в каком порядке оцениваются предварительные условия.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
driver
|
routers
|
string
|
незадана
|
|
Эта опция всегда должна быть установлена. Она определяет, какой из доступных маршрутизаторов должен использоваться.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
errors_to
|
routers
|
string†
|
незадана
|
|
Если роутер успешно обрабатывает адрес, он может назначить адрес на транспорт для доставки, или он может сгенерить дочерний адрес. В обоих случаях, если происходят проблемы доставки в более поздних процессах обработки, результирующее сообщение рикошета посылается по адресу, являющемуся результатом раскрытия этой строки, при условии успешной проверки адреса. Опция
“
errors_to
” раскрывается до
“
headers_add
”,
“
headers_remove
” и
“
transport
”.
Установка
“
errors_to
”, связанная с адресом, может быть перезадана, при последующем прохождении через другие маршрутизаторы, обладающие своими настройками
“
errors_to
”, или если сообщение доставляется транспортом с установкой
“
return_path
”.
Если
“
errors_to
” незадана, или раскрытие принудительно неудачно, или ошибка при проверке результата раскрытия, используется адрес для ошибок связанный со входящим адресом. На верхнем уровне, это - отправитель конверта. Непринудительная ошибка раскрытия вызывает задержку доставки.
Если адрес, для которого установлена
“
errors_to
”, завершается передачей через SMTP, отправитель конверта, для этой доставки, - значение
“
errors_to
”, таким образом, любые рикошеты, сгенерённые другими MTA на маршруте доставки, шлются туда же. Вы можете установить
“
errors_to
” в пустую строку любой из этих установок:
errors_to =
errors_to = ""
|
Элемент раскрытия, приводящий к пустой строке, имеет тот же эффект. Если вы так делаете, локально обнаруженная ошибка доставки для адресов, обработанных этим роутером, не даёт начала рикошету; от ошибки отказываются. Если адрес доставляется на удалённый хост, путь возврата устанавливается в
“<>
”, если это не отменяется опцией
“
return_path
” в транспорте.
Если по каким-то причинам вы хотите отказаться от локальных ошибок, но использовать непустую команду MAIL для удалённой доставки, вы можете сохранить оригинальный обратный путь в
“
$address_data
” роутера, и восстановить его в транспорте, установкой
“
return_path
”.
Самое общее использование
“
errors_to
” - прямой список список рассылки рикошетов к менеджерам списка, как описано в разделе 46.1, или для осуществления VERP (Variable Envelope Return Paths) (смотрите раздел 46.6).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
expn
|
routers‡
|
boolean
|
истина
|
|
Если эта опция выключена, роутер пропускается когда тестируется адрес как результат обработки команды SMTP EXPN. Вы могли бы, например, захотеть включить её на роутере для пользовательских файлов
“
.forward
”, когда оставляете их для файлов системных альясов. Смотрите раздел 3.12, для получения порядка, в котором оцениваются предварительные условия.
Использование команды SMTP EXPN контролирутеся путём ACL (смотрите раздел 39). Когда exim запускается командой EXPN, это подобно проверке адреса с
“
-bt
”. Сравните VRFY, дубликат которой
“
-bv
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
fail_verify
|
routers
|
boolean
|
ложь
|
|
Установка этой опции создаёт эффект установки обоих опций
“
fail_verify_sender
” и
“
fail_verify_recipient
” в тоже значение.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
fail_verify_recipient
|
routers
|
boolean
|
ложь
|
|
Если эта опция установлена в истину, и адрес принимается этим роутером когда проверяется получатель, проверка будет неудачна.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
fail_verify_sender
|
routers
|
string list
|
незадана
|
|
Если эта опция установлена в истину, и адрес принимается этим роутером когда проверяется отправитель, проверка будет неудачна.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
fallback_hosts
|
routers
|
string list
|
незадана
|
|
Раскрытие строки не применяется к этой опции. Аргумент должен быть списком имён хостов, или IP-адресов разделённых двоеточиями. Разделитель списка может быть изменён (смотрите раздел 6.19), и порт может быть задан с каждым именем или адресом. Фактически, формат каждого элемента, точно ткой же, как в списке хостов роутера
“
manualroute
” (смотрите раздел 20.5).
Если роутер стоит в очереди на адрес для удалённого транспорта, этот список хостов ассоциирован с адресом, и используется вместо запасного списка хостов транспорта. Если
“
hosts_randomize
” установлена в транспорте, порядок списка случаен для каждого использования. Смотрите опцию
“
fallback_hosts
” транспорта
“
snmp
”, для дальнейших деталей.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
group
|
routers
|
string†
|
смотрите ниже
|
|
Когда роутер стоит в очереди на адрес для транспорта, и транспорт не определяет группу, используется группа данная тут, когда работает процесс доставки. Нруппа может быть задана в цифровой форме, или по имени. Если раскрытие неудачно, ошибка логгируется, и доставка задерживается. По умолчанию, она не задана, если не установлена
“
check_local_user
”, когда значение по умолчанию берётся из информации о пароле. Также смотрите
“
initgroups
”, и
“
user
”, и обсуждение в главе 23.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers_add
|
routers
|
string†
|
незадана
|
|
Эта опция задаёт строку текста, который ракрывается во время роутинга, и ассоциирован с любым адресом, который принят роутером. Однако, эта опция не имеет никакого эффекта, когда адрес лишь проверяется. Способ, которым используется текст для добавления строк заголовков в транспорте, описан в разделе 43.17. Фактически, новые строки заголовков не добавлены, пока сообщение в процессе транспортировки. Это означает, что ссылки на строки заголовков, в раскрытиях строк, в конфигурации транспорта продолжают
“видеть
” оригинальные заголовки (т.е. не видят добавленные - прим. lissyara).
Опция
“
headers_add
” раскрывается после
“
errors_to
”, но до
“
headers_remove
” и
“
transport
”. Если раскрытая строка пуста, или если раскрытие принудительно неудачно, опция не имеет эффекта. Другие ошибки раскрытия обрабатываются как ошибки конфигурации.
Предупреждение 1: Опция
“
headers_add
” не может использоваться для роутера
“
redirect
”, в котором установлена опция
“
one_time
”.
Предупреждение 2: Если в роутере установлена опция
“
unseen
”, все дополнения заголовков удаляются, при передаче следующему роутеру.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
headers_remove
|
routers
|
string†
|
незадана
|
|
Эта опция задаёт строку текста, который ракрывается во время роутинга, и ассоциирован с любым адресом, который принят роутером. Однако, эта опция не имеет никакого эффекта, когда адрес лишь проверяется. Способ, которым используется текст для удаления строк заголовков в транспорте, описан в разделе 43.17. Фактически, строки заголовков не удалены, пока сообщение в процессе транспортировки. Это означает, что ссылки на строки заголовков, в раскрытиях строк, в конфигурации транспорта продолжают
“видеть
” оригинальные заголовки (т.е. видят удалённые - прим. lissyara).
Опция
“
headers_remove
” раскрывается после
“
errors_to
” и
“
headers_add
”, но до
“
transport
”. Если раскрытие принудительно неудачно, опция не имеет эффекта. Другие ошибки раскрытия обрабатываются как ошибки конфигурации.
Предупреждение 1: Опция
“
headers_remove
” не может использоваться для роутера
“
redirect
”, в котором установлена опция
“
one_time
”.
Предупреждение 2: Если в роутере установлена опция
“
unseen
”, все запросы на удаление заголовков удаляются, при передаче следующему роутеру.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
ignore_target_hosts
|
routers
|
host list†
|
незадана
|
|
Хотя эта опция - список хостов, обычно она содержит IP-адреса, а не имена. Если любой хост, который ищется роутером имеет IP-адрес совпадающий с элементом этого списка, exim ведёт себя так, будто этот IP-адрес несуществует. Эта опция позволяет вам справляться с мошенническими DNS-записями, типа
remote.domain.example. A
127
.
0
.
0
.
1
|
устанавливая
ignore_target_hosts =
127
.
0
.
0
.
1
|
на релевантном роутере. Если все хосты найденные роутером
“
dnslookup
” забракованы таким образом, роутер отклоняется. В обычной конфигурации, попытка отправки почты на такой домен, обычно вызывает ошибку
“unrouteable domain
”, и попытка проверить адрес в домене будет неудачной. Точно также, если в роутере
“
ipliteral
” установлена опция
“
ignore_target_hosts
”, роутер отклоняется если представлен один из перечисленных адресов.
Вы можете использовать эту опцию для отключения использования IPv4 или IPv6 для доставки почты, путём первого или второго параметра настройки, сответственно:
ignore_target_hosts =
0
.
0
.
0
.
0
/
0
ignore_target_hosts = <;
0
::
0
/
0
|
Шаблон в первой строке совпадает со всеми адресами IPv4, тогда как паттерн во второй строке совпадает со всеми адресами IPv6.
Эта опция также может быть полезна для игнорирования локальных связей и локальных сайтов адресов IPv6. Поскольку, как и все списки хостов, значение
“
ignore_target_hosts
” раскрывается до использования в качестве списка, возможно сделать его зависимым от маршрутизируемого домена.
В процессе раскрытия,
“
$host_address
” устанавливается в проверяемый IP-адрес.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
initgroups
|
routers
|
boolean
|
ложь
|
|
Если роутер стоит в очереди на адрес для транспорта, и эта опция истинна, и uid, предоставленный роутером не перезадан транспортом, при работе транспорта вызывается функция
“
initgroups()
” , для гарантии, что установлены любые дополнительные группы ассоциированные с uid. Также смотрите обсуждение
“
group
” и
“
user
” в главе 23.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_part_prefix
|
routers‡
|
string list
|
незадана
|
|
Если эта опция установлена, роутер пропускается, если локальная часть не начинается с одной из заданных строк, или если
“
local_part_prefix_optional
” истинна. Смотрите раздел 3.12 для получения списка в котором оцениваются предварительные условия.
Список сканируется слева направо, и используется первый совпавший преффикс. Доступна ограниченная форма подстановочных знаков; если префикс начинается со звёздочки, он совпадает с самой длинной последовательностью символов в начале локальной части. Поэтому, звёздочка всегда должна сопровождаться каким-то символом, который не встречается в нормальных локальных частях. Подстановочные символы могут использоваться для установки многопользовательских почтовых ящиков, как описано в разделе 46.8.
В процессе тестирования опции
“
local_parts
”, и когда роутер запущен, префикс удаляется из локальной части, и он доступен в переменной раскрытия
“
$local_part_prefix
”. Когда сообщение доставляется, если роутер принимает адрес, это остаётся истинным в процессе последующей доставки транспортом. В частности, локальная часть, передаваемая командой RCPT для доставок LMTP, SMTP, и BSMTP, по умолчанию, удаляет преффикс. Это поведение может быть перезадано путём установки
“
rcpt_include_affixes
” в истину, в соответствующем транспорте.
Когда адрес проверяется,
“
local_part_prefix
” затрагивает лишь поведение роутера. Если используется обратный вызов, это означает, что полный адрес, включая префикс, будет использоваться в обратном вызове.
Преффиксы, обычно, используются для обработки локальных частей вида
“
owner-something
”. Другое частое использование - поддержка локальных частей формы
“
real-username
” для обхода пользовательского файла
“
.forward
” - полезно, когда тяжело сказать пользователю, что его форвардинг кривой - путём помещения роутера типа такого, сразу до роутера, обрабатывающего файлы
“
.forward
”:
real_localuser:
driver = accept
local_part_prefix = real-
check_local_user
transport = local_delivery
|
Если оба
“
local_part_prefix
” и
“
local_part_suffix
” установлены для роутера, оба условия должны быть не дополнительными. Нужно быть осторожным, если подстановочный знак используется в обоих - преффиксе и суффиксе в одном роутере. Должны использоваться различные символы как разделители, для избежания двусмысленности.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_part_prefix_optional
|
routers
|
boolean
|
ложь
|
|
Смотрите выше, опцию
“
local_part_prefix
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_part_suffix
|
routers‡
|
string list
|
незадана
|
|
Эта опция работает точно также как и
“
local_part_prefix
”, за исключением, что локальная часть должна заканчиваться (а не начинаться) данной строкой, опция
“
local_part_suffix_optional
” определяет, какой суффикс обязателен, и подстановочный символ
“*
”, если присутствует, должен быть последним символом суффикса. Это опциональное средство обычно используется для обработки локальных частей формы
“
something-request
”, и многопользовательских почтовых ящиков вида
“
username-foo
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_part_suffix_optional
|
routers
|
boolean
|
ложь
|
|
Смотрите выше, опцию
“
local_part_suffix
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
local_parts
|
routers‡
|
local part list†
|
незадана
|
|
Роутер запускается лишь если локальная часть адреса совпадает с этим списком. Смотрите раздел 3.12, для получения порядка, в котором оцениваются предварительные условия, и раздел 10.20 для обсуждения списков локальных частей. Поскольку строка раскрывается, возможно сделать её зависимой от домена, например:
local_parts = dbm;/usr/local/specials/$domain
|
Если поиском достигнуто соответствие, данные, возвращённые поиском для локальных частей, помещаются в переменную
“
$local_part_data
” для использования в раскрытии частных опций роутера. Вы могли бы использовать эту опцию, например, если у вас много локальных вирутальных доменов, и вы хотите слать всю почту постмастера в одно место, без необходимости установки альяса в каждом виртуальном домене:
postmaster:
driver = redirect
local_parts = postmaster
data = postmaster@real.domain.example
|
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
log_as_local
|
routers
|
boolean
|
смотрите ниже
|
|
Exim имеет два силя логгинга для доставки, с целью более явно отделить локальные доставки от удалённых. В
“локальном
” стиле, адрес получателя даётся так же как и локальная часть, без домена. Использование этого стиля контролируется этой опцией. По умолчанию, она истинна для роутера
“
accept
”, и ложна для всех остальных. Эта опция применяется лишь когда роутер назначает адрес транспорту. Она не оказывает эффекта на роутеры, переадресовывающие адреса.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
more
|
routers
|
boolean†
|
истина
|
|
Результат раскрытия строки, для этой опции, должен быть допутимым булевым значением, т.е. одна из строк
“yes
”,
“no
”,
“true
”, или
“false
”. Любой другой результат вызывает ошибку, и доставка задерживается. Если ракрытие принудительно неудачное, используется дефолтовое значение (истина) опции. Другие ошибки вызывают задержку доставки.
Если эта опция установлена в ложь, и роутер отказывается обрабатывать адрес, дальнейшие маршрутизаторы не проверяются, роутинг неудачен, и сообщение рикошетит (посылается рикошет - прим. lissyara). Однако, если роутер явно передаёт адрес следующему роутеру, путём установки
или иначе, установка
“more
” игнорируется. Кроме того, установка
“
more
” не затрагивает поведение, если одина из предварительных проверок неудачна. В этом случае, адрес всегда передаётся следующему роутеру.
Отметтьте, что
“
address_data
” не является предварительным условием. Если это раскрытие принудительно неудачно, роутер отклоняется, и значение
“
more
” контролирует, что происходит дальше.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
pass_on_timeout
|
routers
|
string
|
незадана
|
|
Если у роутера таймаут в процессе поиска хоста, обычно это вызывает задержку адреса. Если установлена
“
pass_on_timeout
”, адрес передаётся следующему роутеру, отменяя
“
more
”. Это может быть полезным для систем, которые периодически связаны с интернетом, или тем, которые хотят передавать умному хосту любые сообщение, которые не могут быть немедленно доставлены.
Тут могут быть другие случайные временные ошибки, которые могут произойти при поиске в DNS. Они обрабатываются таким же образом как таймауты, и эта опция применяется ко всем ним.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
pass_router
|
routers
|
string
|
незадана
|
|
Когда роутер возвращает
“pass
”, адрес обычно передаётся следующему роутеру в последовательности. Это может быть изменено путём установки
“
pass_router
” в имя другого роутера. Однако (в отличие от
“
redirect_router
”), названный роутер должен быть ниже текущего маршрутизатора, для избежания петель. Отметтьте, что эта опция применяется лишь к специальному случаю
“pass
”. Она не применяется, когда роутер возвращает
“decline
”.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
redirect_router
|
routers
|
string
|
незадана
|
|
Иногда администратор знает, что бессмысленно заново подвергать переработке адреса в том же самом роутере, которые были сгенерены из файлов альясинга или форвардинга. Например, если файл альясов переводит реальные имена в идентификаторы логинов, нет смысла искать по файлу альясов второй раз, особенно если это большой файл.
Опция
“
redirect_router
” может быть установлена в имя любого роутера. Это заставляет маршрутизацию любого сгенерённого адреса начаться с именованного роутера, вместо первого роутера. Эта опция не имеет эффекта, если если роутер, в котором она установлена, не генерирует новые адреса.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
require_files
|
routers‡
|
string list†
|
незадана
|
|
Эта опция предоставляет главный механизм для утверждения работы роутера, на существовании или отсутствии определённых файлов или директорий. До запуска роутера, как одна из предварительных проверок, exim обрабатывает этот способ через список
“
require_files
”, отдельно раскрывая каждый его элемент.
Пскольку список разбивается до ракрытия, любые двоеточия в элементах раскрытия должны быть удвоены, или должно использоваться средство иного разделителя списка. Если какое-то раскрытие принудительно неудачно, этот элемент игнорируется. Другие ошибки раскрытия вызывают задержку роутинга адреса.
Если какая-либо раскрытая строка пуста, она игнорируется. Иначе, кроме как описано ниже, каждая строка должна быть полным путём к файлу, с опционально предшествующим символом
“!
”. Пути передаются на тестирование функции
“
stat()
”, для проверки существования файлов или каталогов. Роутер пропускается, если какой-либо путь, которому не предшествует
“!
”, не существует, или существует любой путь, с предшествующим
“!
”.
Если
“
stat()
” не может определить, существует файл или нет, доставка сообщения задерживается. Это может произойти, если недоступны смонтированные по NFS файловые системы.
Эта опция проверяется после опций
“
domains
”,
“
local_parts
” и
“
senders
”, таким образом, вы не можете её использовать для проверки существования файла, в котором ищется домен, локальная часть адреса, или отправитель. (Смотрите раздел 3.12, для получения порядка, в котором оцениваются предварительные условия.) Однако, поскольку все эти опции раскрыты, вы можете использовать условие раскрытия
“
exists
”, для создания таких проверок. Опция
“
require_files
” предназаначена для проверки файлов, которые маршрутизатор может быть будет использовать внутри себя, или которые необходимы транспорту (например,
“
.procmailrc
”).
В процессе доставки, функция
“
stat()
” выполняется от root`a, но есть средство для некоторых проверок доступности файла от другого пользователя. Это не точная проверка разрешений, а
“грубая
” проверка, работающая следующим образом:
Если элемент в списке
“
require_files
” не содержит символов прямого слэша, он берётся как пользователь (и опциональная группа, отделённая двоеточием) для проверки последующих файлов в списке. Если группа не задана, но пользователь задан символически, используется gid ассоциированный с uid. Например:
require_files = mail:/some/file
require_files = $local_part:$home/.procmailrc
|
Если имя пользователя или группы в
“
require_files
” не существует, условие
“
require_files
” неуспешно. Exim выполняет проверку путём сканирования компонентов пути файла, и проверяя доступ для данных gid и uid. Это проверка на
“x
” для директорий, и
“r
” для финального файла. Отметтьте, это означает, что при поддержке файловых ACL, они игнорируются.
Предупреждение 1: Когда роутер начинает работу по проверке адресов для входящего SMTP-сообщения, exim не работает от root`a, а под своим собственным uid. Это может затронуть результта проверки
“
require_files
”. В частности,
“
stat()
” может привести к ошибке EACCES (
“Permission denied
”). Это означает, что пользователю exim`a не разрешено читать одну из директорий в пути файла.
Предупреждение 2: Даже когда exim выполняется от root`a при доставке сообщения,
“
stat()
” может привести к EACCES для файлов в NFS директории, смонтированной без доступа root`y. В этом случае, если запрошена проверка на доступ специфического пользователя, exim создаёт субпроцесс, который работает от пользователя, и снова пробует проверить в этом процессе.
Дефолтовое действие для обработки EACCES полагает, что это вызвано конфигурационной ошибкой, и роутинг задерживается, поскольку существование или отсутствие файла не может быть определено. Однако, в некоторых обстоятельствах, может быть желательным обработать это условие, как будто файл не существовал. Например:
require_files = +/some/file
|
Если роутер - не основная часть проверки (например, он обрабатывает пользовательские файлы
“
.forward
”), иное решение - установить установить опцию
“
verify
” в ложь, xmk.s роутер был пропущен при проверке.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
retry_use_local_part
|
routers
|
boolean
|
смотрите ниже
|
|
Когда с доставкой присходит временная ошибка роутинга, в базе хинтов exim`a создаётся запись о повторею Для адресов, маршрутизация которых зависит лишь от домена, ключ для записи повтора не должен содержать локальную часть, но для других адресов, обе - доменная и локальная части должны быть включены. Обычно, удалённый роутинг первого вида, и локальный роутинг - последнего.
Эта опция контролирует, используется ли локальная часть для формирования подсказок (хинтов - прим. lissyara) для адресов, которые подверглись временным ошибкам, когда будучи обработанными этим роутером. Дефолтовое значение - истина для лубого роутера, который имеет установленную
“
check_local_user
”, и ложь, в противном случае. Отметтьте, что эта опция не применяется к ключам подсказок для транспортных задержек; они контролируются одноимённой общей транспортной опцией.
Установка опции
“
retry_use_local_part
” применяется лишь к роутеру, в котором она фигурирует. Если роутер генерит дочерний адрес, они роутятся независимо; эта установка не прилагается к ним.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
router_home_directory
|
routers
|
string†
|
незадана
|
|
Эта опция устанавливает домашнюю директорию, для использования при работе роутера. (Сравните
“
transport_home_directory
”, которая устанавливает домашнюю директорию для более поздней транспортировки.) В частности, если используется роутер
“
redirect
”, эта опция устанавливает значение
“
$home
”, когда работает фильтр. Значение раскрывается; принудительная ошибка раскрытия вызывает игнорирование опции - другие ошибки вызывают задержку роутинга.
Раскрытие
“
router_home_directory
” происходит сразу после проверки
“
check_local_user
” (если сконфигурировано), до любых будущих раскрытий. (Смотрите раздел 3.12, для получения порядка, в котором оцениваются предварительные условия.) Когда роутер работает,
“
router_home_directory
” перезадаёт значение
“
$home
”, пришедшее из
“
check_local_user
”.
Когда роутер принимает адрес и назначает его локальному транспорту (включая случаи, когда роутер
“
redirect
” генерит трубу, файл, или доставку автоответа), установка домашней директории для транспорта берётся из первого установленного значения:
Опции
“
home_directory
” в транспорте;
Опции
“
transport_home_directory
” в роутере;
Данных пароля, если опция
“
check_local_user
” установлена в роутере;
Опции
“
router_home_directory
”, в роутере.
Другими словами,
“
router_home_directory
” перезадаёт данные пароля для роутера, но не для транспорта.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
self
|
routers
|
string
|
freeze (замораживание)
|
|
Эта опция применяется к тем роутерам, которые используют адрес получателя для нахождения списка удалённых хостов. В настоящее время, это роутеры
“
dnslookup
”,
“
ipliteral
” и
“
manualroute
”. Определённые конфигурации маршрутизатора
“
queryprogram
” также могут задавать список удалённых хостов. Обычно, такие маршрутизаторы сконфигурированы для посылки сообщения к удалённому хосту через
“
snmp
” транспорт. Опция
“
self
” задаёт, что происходит когда первый хост в списке оказывается локальным хостом. Способ проверки локального хоста exim`ом, описан в разделе 13.8.
Обычно, эта ситуация указывает на ошибку конфигурации в exim`e (например, роутер должен быть сконфигурен не обрабатывать этот домен), или ошибку в DNS (например, MX не должен указывать на этот хост). По этой причине, дефолтовое действие - залоггировать инцидент, задержать адрес, и заморозить сообщение. Следующие альтернативы предоставляются для использования в специальных случаях:
“
defer
”
Сообщение пробуется ещё раз доставить, позднее, но оно не заморожено.
“
reroute:
” <domain>
Домен изменяется на данный домен, и адрес передаётся назад, для обработки роутерами. Перезапись заголовков не производится. По существу, это поведение - переназначение.
“
reroute: rewrite:
” <domain>
Домен изменяется на заданный домен, и адрес возвращется назад, для повторной обработки роутером. Любые заголовки, которые содержат оригинальный домен, перезаписываются.
“
pass
”
Роутер передаёт адрес следующему роутеру, или роутеру, или роутеру названному в опции
“
pass_router
”, если она установлена. Это перезадаёт
“
no_more
”. В течение последующего роутинга и доставки, переменная
“
$self_hostname
” содержит имя локального хоста, с которым столкнулся роутер. Это может использоваться для различения различных случаев, для хостов с несколькими именами. Комбинация
гарантирует, что передаются лишь те адреса, которые роутились к локальному хосту. Без
“
no_more
”, адреса отклонённые по иным причинам, также будут передаваться следующему роутеру.
“
fail
”
Доставка неудачна, и генерится отчёт о ошибке.
“
send
”
Аномалия игнорируется, и адрес ставиться в очередь для транспорта. Эта установка должна использоваться с критическим предостережением. Для транспорта
“
smtp
”, это имеет смысл лишь в случаях, когда программа, слушаяющая SMTP-порт, не эта версия exim`a. Таким образом,это должен быть какой-то иной MTA, или exim с иным конфигурационным файлом, который обрабатывает домен иным способом.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
senders
|
routers‡
|
address list†
|
незадана
|
|
Если эта опция установлена, роутер пропускается, если адрес отправителя сообщения не совпадает с чем-то в списке. Смотрите раздел 3.12, для получения порядка, в котором оцениваются предварительные условия.
Существуют проблемы относительно проверки, когда работа роутеров зависит от отправителя. Когда exim проверяет адрес в установке
“
errors_to
”, он устанавливает отправителя в нулевую (null) строку. Когда для проверки конфигурационного файла используется опция
“
-bt
”, также необходимо использовать опцию
“
-f
”, для установки соответствующего отправителя. Для входящей почты, отправитель не установлен, когда проверяется отправитель, но он доступен, когда проверяется любой получатель. Если включена команда SMTP VRFY, она должна использоваться после MAIL, если имеет значение адрес отправителя.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
translate_ip_address
|
routers
|
string†
|
незадана
|
|
Существует несколько редких сетевых ситуаций (например, пакетная радиосвязь), когда полезна возможность транслировать IP-адрес, сгенерённый нормальными механизмами роутинга, в другие IP-адреса, выполняя свого рода ручную маршрутизацию. Это должно быть сделано, лишь если нормальная IP-маршрутизация TCP/IP стека неадекватна, или не работает. Поскольку это - черезвычайно необычное требование, код для поддержки этой опции не включается в бинарник exim`a, если в
“
Local/Makefile
” не установлена опция SUPPORT_TRANSLATE_IP_ADDRESS=yes.
Строка
“
translate_ip_address
” раскрывается для каждого IP-адреса сгенереённого роутером, с установкой сгенерённого IP-адреса в
“
$host_address
”. Если раскрытие принудительно неудачно, никаких действий не предпринимается. Для любых других ошибок раскрытия, доставка сообщения задерживается. Если результат раскрытия - IP-адрес, он заменяет оригинальный адрес; иначе, предполагается что результат является именем хоста, он ищется используя
“
gethostbyname()
” (или
“
getipnodebyname()
”, когда она доступна) для создания одного и более замещающих IP-адресов. Например, для отмены всех адресов в некоторых сетях, к роутеру может быть добавлено такое:
translate_ip_address = \
${lookup{
${mask:$host_address/26}}lsearch{/some/file}\
{$value}fail}}
|
Файл содержал бы такие строки:
10
.
2
.
3
.
128
/
26
some.host
10
.
8
.
4
.
34
/
26
10
.
44
.
8
.
15
|
Вы не должны использовать это средство, если вы не понимаете, что оно делает.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
transport
|
routers
|
string†
|
незадана
|
|
Эта опция определяет транспорт который будет использован когда роутер принимает адрес, и устанавливает его для доставки. Транспорт никогда не бывает нужен, если роутер используется лишь для проверки. Значение опции раскрывается во время роутинга, после раскрытия
“
errors_to
”,
“
headers_add
” и
“
headers_remove
”, и результта должен быть именем одного из сконфигуренных транспортов. Если это не так, доставка задерживается.
Опция
“
transport
” не используется роутером
“
redirect
”, но он имеет некоторые частные опции которые устанавливают транспорты для трубы (pipe) и доставки в файл (смотрите раздел 22).
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
transport_current_directory
|
routers
|
string†
|
незадана
|
|
Эта опция ассоциирует текущую директорию с любым адресом, который роутится локальным транспортом. Это может происходить потому, что транспорт явно сконфигурирован для роутера, или потому что генерится доставка в файл или трубу. В течение процесса доставки (т.е. в транспортное время), строка этой опции раскрывается и устанавливает текущую директорию, исключая перезадание установкой транспорта. Если раскрытие неудачно по любой причине, включая принудительную неудачу, ошибка логгируется, и доставка задерживается. Смотрите раздел 23, для получения деталей о окружении локальной доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
transport_home_directory
|
routers
|
string†
|
смотрите ниже
|
|
Эта опция ассоциирует домашнюю директорию с любым адресом, который роутится локальным транспортом. Это может происходить потому, что транспорт явно сконфигурирован для роутера, или потому что генерится доставка в файл или трубу. В течение процесса доставки (т.е. в транспортное время), строка этой опции раскрывается и устанавливает домашнюю директорию, исключая перезадание установкой
“
home_directory
” в транспорте. Если раскрытие неудачно по любой причине, включая принудительную неудачу, ошибка логгируется, и доставка задерживается.
Если транспорт не определяет домашнюю директорию, и
“
transport_home_directory
” не установлена для роутера, домашняя директория для транспорта берётся из данных пароля, если для роутера установлена опция
“
check_local_user
”. Иначе, она берётся из
“
router_home_directory
”, если она установлена; если нет - домашняя директория для транспорта не устанавливается.
Смотрите раздел 23, для получения деталей о окружении локальной доставки.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
unseen
|
routers
|
boolean†
|
ложь
|
|
Результат раскрытия строки, для этой опции, должен быьб допустимым булевым значением, т.е. оодной из строк
“yes
”,
“no
”,
“true
”, или
“false
”. Любой другой результат вызывает ошибку, и доставка задерживается. Если раскрытие принудительно неудачно, используется дефолтовое значение этой опции (ложь). Другие ошибки вызывают задержку доставки.
Когда эта опция установленна в истину, маршрутизация не прекращается, если роутер принимает адрес. Вместо этого, копия входящего адреса передаётся следующему роутеру, перезадавая ложную установку опции
“
more
”. Есть небольшая точка, в установке
“
more
” в ложь, если
“
unseen
” всегда истинно, но это может быть полезным в случаях, когда значение
“
unseen
” содержит раскрываемый элемент (поэтому, оно иногда истинно, а иногда ложно).
Опция
“
unseen
” может использоваться для доставки копий сообщений на другой адрес, когда, также, необходимо выполнить нормальную доставку. В действительности, текущий адрес превращается в
“родителя
”, имеющего двух детей - один из которых доставляется как задано в роутере, и клон, продолжающий дальнейший роутинг. Поэтому,
“
unseen
” не может быть объединён с опцией
“
one_time
”, в роутере
“
redirect
”.
Предупреждение: Добавленные к адресу строки заголовков (или определённые для удаления), этим или предыдущим роутерами, затрагивают лишь
“невидимую
” копию сообщения. Клон, который продолжает обрабатываться будущими роутерами, не содержит добавленный или определённых на удаление заголовков. Однако, любые данные, которые были установлены путём опции
“
address_data
” в текущем, или предыдущих роутерах, передаются дальше. Установка опции
“
unseen
” имеет эффект похожий на управляющюю команду
“
unseen
” в файлах фильтров.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
user
|
routers
|
string†
|
смотрите ниже
|
|
Когда роутер стоит в очереди на адрес для транспорта, и транспорт не определяет пользователя, заданный тут пользователь используется при работе процесса доставки. Пользователь может быть задан числом или по имени. Если раскрытие неудачно, ошибка логгируется, и доставка задерживается. Также, этот пользователь используется роутером
“
redirect
”, при работе файла фильтра. По умолчанию она не задана, кроме случаев когда установлена опция
“
check_local_user
”. В этом случае, дефолт берётся из информации пароля. Если пользователь задан по имени, и
“
group
” не задана, группа ассоциируется с используемым пользователем. Смотрите обсуждение
“
initgroups
” и
“
initgroups
” в разделе 23.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
verify
|
routers‡
|
boolean
|
истина
|
|
Установка этой опции имеет эффект установки
“
verify_sender
” и
“
verify_recipient
” в тоже значение.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
verify_only
|
routers
|
routers‡
|
ложь
|
|
Если эта опция установлена, роутер используется лишь для проверки адреса, или тетстирования с опцией
“
-bv
”, не для фактической доставки, тестирования с опцией
“
-bt
”, или запуска команды SMTP EXPN. Далее, она может быть ограничена только проверкойотправителя или получателя, путём
“
verify_sender
” и
“
verify_recipient
”.
Предупреждение: Когда роутер работает проверяя адрес входящего SMTP сообщения, exim не работает от root`a, а под своим собственным uid. Если роутер обращается к каким-то файлам, вы должны удостовериться, что они доступны пользователю или группе exim`a.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
verify_recipient
|
routers‡
|
boolean
|
истина
|
|
Если эта опция ложна, роутер пропускается при проверке адреса получателя, или тестировании проверки получателя, с ипользованием опции
“
-bv
”. Смотрите раздел 3.12, для получения порядка, в котором оцениваются предварительные условия.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
verify_sender
|
routers‡
|
boolean
|
истина
|
|
Если эта опция ложна, роутер пропускается при проверке адреса отправителя, или тестировании проверки отправителя, с ипользованием опции
“
-bvs
”. Смотрите раздел 3.12, для получения порядка, в котором оцениваются предварительные условия.
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200
16. РОУТЕР ACCEPT
Роутер
“Accept
” не имеет собственных специальных опций. За исключением тех случаев, когда этот роутер используется при проверке (см.
“verify_only
”), должен быть определен транспорт при помощи общей опции
“transport
”. Если выполняются предопределенные условия, определенные общими опциями, то роутер принимает адрес и перенаправляет его в очередь данному транспорту. В основном этот роутер используется для доставки сообщений в локальные почтовые ящики. Пример:
localusers:
driver = accept
domains = mydomain.example
check_local_user
transport = local_delivery
|
Условие
“domains
” в этом примере проверяет домен адреса, а
“check_local_user
” проверяет, что локальная часть адреса является логином пользователя на этой машине. В случае если оба предопределенных условия выполнены вызывается роутер
“accept
” и данный адрес направляется в очередь транспорту
“local_delivery
”.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
17. Роуер DNSLOOKUP
Роутер
“dnslookup
” при помощи запросов к DNS ищет узлы, обрабатывающие почту для данного домена. Если не установлена опция
“verify_only
”, то для этого роутера должен быть всегда определен транспорт.
Если в конфигурации есть поддержка SRV (см. опцию
“check_srv
” ниже), Exim сначала ищет SRV-записи. Если они не найдены или поддержка SRV отсутствует, то ищутся MX-записи. Если MX-записей нет, ищутся А-записи. Однако, может быть установлена опция
“mx_domains
” для отключения прямого использования адресных записей.
MX-записи равного приоритета сортируются Exim в случайном порядке. Затем Exim ищет адресные записи имен узлов, полученных из MX- или SRV-записей. Если узел имеет более одного IP-адреса, они сортируются в случайном порядке, за исключением того, что IPv6-адреса всегда сортируются перед IPv4-адресами. Если все найденные IP-адреса отбрасываются общей опцией
“ignore_target_hosts
”, то роутер отклоняется.
Все MX-записи, указывающие на локальный узел или на любое другое имя узла, определенное опцией
“hosts_treat_as_local
”, и имеющие наивысший приоритет (меньшее из значений MX-записей), отбрасываются вместе с другими MX-записями равного или меньшего приоритета.
Если узел, на который указывает MX-запись высшего приоритета или A-запись, является локальным, либо совпадает с указанным опцией
“hosts_treat_as_local
”, то дальнейшее поведение управляется общей опцией
“self
”.
Бывают проблемы с DNS-серверами при поиске записей SRV. Некоторые плохо настроенные (в оригинале - плохо поступающие) серверы возвращают ошибку DNS или не отвечабт вообще (таймаут) при запросе несуществующих записей SRV. Подобные проблемы были зафиксированы и для MX-записей. Глобальная опция
“dns_again_means_nonexist
” может помочь с этой проблемой, но грубо, поскольку это глобальная опция.
Поэтому, есть две опции,
“srv_fail_domains
” и
“mx_fail_domains
” контролирующие происходящее при при поиске в DNS в роутере
“dnslookup
” приводит к ошибке DNS или ответу
“try again
” (попробуйте снова). Если попытка поиска SRV или MX записи приводит к одному из этих результатов, и домен соответствует уместному(?) списку, то exim ведёт себя так, будто доменная система ответила - нет такой записи. В случае поиска SRV-записи это значит, что роутер продолжает искать MX-записи; в случае поиска MX продолжается поиск A или AAAA запись, если домен не совпадает с
“mx_domains
”, в случае ошибки маршрутизации.
Ниже приведен список специфичных опций, которые могут быть использованы для изменения способа обработки поиска в DNS.
check_secondary_mx
|
Use: dnslookup
|
Type: boolean
|
Default: false
|
|
Если установлена эта опция, роутер отклоняется до тех пор пока локальный узел находится в списке узлов, полученном при запросе MX-записей. Она может быть использована для выявления доменов для которых локальный узел является вторичным почтовым сервером. Способ, которым Exim определяет является ли узел локальным узелом, описан в секции 13.8.
check_srv
|
Use: dnslookup
|
Type: string†
|
Default: unset
|
|
Роутер
“dnslookup
” поддерживает использование SRV-записей (см. RFC2782) в дополнение к MX- и A-записям. Поддержка их по умолчанию отключена. Для включения поддержки SRV, нужно определить опцию
“check_srv
” именем нужной службы. К примеру,
ищет SRV-записи, относящиеся к нормальной службе smtp. Опция является вычисляемой, таким образом имя службы может меняться от сообщения к сообщению или от адреса к адресу. Это может быть полезно если SRV-записи используются для службы submission. Если вычисление значения завершается неудачно, опция
“check_srv
” игнорируется и роутер начинает поиск MX-записей обычным способом.
Если вычисление значения завершилось успешно, то роутер сначала ищет SRV-записи для данной службы (подразумевается TCP-протокол). Простая SRV-запись с именем узела
“.
” указывает на отсутствие такой службы для данного домена. В этом случае роутер отклоняется. Если находятся другие типы SRV-записей, то они используются для построения списка узелов для доставки в соответствии с правилами RFC 2782. Поиск MX-записей в этом случае не производится.
Однако, если ни одной SRV-записи не найдено, то производится поиск MX-записей (и A-записей) традиционным способом. Другими словами SRV-записи имеют приоритет над MX-записями, так же как и MX-записи имеют приоритет над A-записями. Стоит заметить, что такое поведение не одобряется RFC2782, хотя предыдущий драфт RFC его определял. Явно утверждается что MX-записей достаточно для нужд электронной почты и что SRV-записи не должны использоваться для этих целей. Однако, SRV-записи имеют дополнительное свойство
“вес
”, которое некоторые люди могут найти полезным, пытаясь распределить SMTP-нагрузку между узлами разной мощности.
Смотрите секцию 17.1 для обсуждений поведения exim`a при ошибках поиска в DNS.
mx_domains
|
Use: dnslookup
|
Type: domain list†
|
Default: unset
|
|
Домен, попадающий в список
“mx_domains
” должен иметь либо MX-запись, либо SRV-запись для того чтобы быть распознанным надлежащим образом. (Имя этой опции может быть усовершенствованно). К примеру, если все почтовые серверы в домене
“fict.example
” имеют MX-записи, за исключением узлов в
“discworld.fict.example
”, то вы можете использовать такую запись:
mx_domains = ! *.discworld.fict.example : *.fict.example
|
Данная запись определяет что сообщения, адресованные домену, попадающему в этот список, но не имеющему MX-записи, должны быть немедленно отклонены вместо маршрутизации их с использованием A-записи.
mx_fail_domains
|
Use: dnslookup
|
Type: domain list†
|
Default: unset
|
|
Если DNS-поиск MX-записи для одного из доменов в этом списке вернул ошибку DNS, exim ведёт себя как будто MX записи вообще не найдены. Смотрите секцию 17.1 для получения подробной информации.
qualify_single
|
Use: dnslookup
|
Type: boolean
|
Default: true
|
|
Когда данная опция истинна, опция
“RES_DEFNAMES
” механизма разрешения имен устанавливается для посылки DNS-запросов. Обычно, но не стандартно, это указывает механизму разрешения имен соотносить простые имена с доменом по умолчанию. К примеру, на машине
“
dictionary.ref.example
” домен
“
thesaurus
” будет изменен на
“
thesaurus.ref.example
” внутри механизма разрешения имен. Для подробного описания того, что на самом деле выполняет ваш механизм разрешения имен, обратитесь к разделам справочного руководства
“
resolver
” и
“
resolv.conf
”.
rewrite_headers
|
Use: dnslookup
|
Type: boolean
|
Default: true
|
|
Если имя домена в обрабатываемом адресе не является полным, оно может быть раскрыто до своей полной формы при помощи DNS-запроса. К примеру, если адрес определен как
“
dormouse@teaparty
”, то домен может быть расширен до teaparty.wonderland.fict.example
”. Раскрытие домена также может быть результатом установки опции
“widen_domains
”. Если
“rewrite_headers
” истинно то все экземпляры сокращенного доменного имени во всех
“
Bcc:
”,
“
Cc:
”,
“
From:
”,
“
Reply-to:
”,
“
Sender:
”, и
“
To:
” строках заголовка сообщения заменяются полным доменным именем.
Эта опция должна быть отключена только тогда, когда точно известно, что никакое сообщение не будет когда-либо отправлено за пределы того окружения, где сокращение имеет смысл.
Если при поиске MX-записи в DNS происходит совпадение по шаблону, серверы имен обычно возвращают запись, содержащую найденное имя, тем самым делая невозможным определение присутствия шаблона. Однако, с недавних пор, некоторые серверы DNS возвращают запись шаблона. Если имя, возвращенное в результате DNS-запроса, начинается с
“*
”, оно не используется для переписывания заголовков.
same_domain_copy_routing
|
Use: dnslookup
|
Type: boolean
|
Default: false
|
|
Адреса с одинаковым именем домена обычно маршрутизируются роутером
“dnslookup
” на один и тот же самый список узлов. Однако, данный факт не может быть доказан, так как опции роутера и предусловия иогут ссылаться на локальную часть адреса. По умолчанию, Exim маршрутизирует каждый адрес независимо друг от друга. DNS-серверы используют кэширование, таким образом повторные DNS-запросы не являются избыточными. В любом случае, личная почта в основном имеет немного получателей.
Если вы обслуживаете списки расылки с большим количеством подписчиков в одном и том же домене, и используете роутер dnslookup, который независим от локальной части, вы можете включить опцию
“same_domain_copy_routing
” чтобы избегать повторяющихся DNS-запросов для идентичных доменов в одном письме. В этом случае, если dnslookup маршрутизирует адрес удаленному транспорту, все остальные адреса в сообщении с тем же самым именем домена получателя автоматически аналогично маршрутизируются без независимой обработки, обеспечивая следующие условия:
Роутер не обрабатывает адреса, определенные опциями
“headers_add
” или
“headers_remove
”.
Роутер не изменяет адреса в любом случае, к примеру, способом
“widening
” домена.
search_parents
|
Use: dnslookup
|
Type: boolean
|
Default: false
|
|
Когда эта опция истинна, опция RES_DNSRCH резолвера устанавливается для выполнения DNS-запросов, что отличается от опции
“qualify_single
”, в которой это применимо к доменам, содержащем точки. Обычно, но не стандартно, это указывает механизму разрешения имен искать имя в текущем и родительском доменах. К примеру, если на машине в домене
“
fict.example
” DNS-запрос
“
teaparty.wonderland
” не разрешился, то резолвер попытается разрешить имя
“
teaparty.wonderland.fict.example
”. Для подробного описания того, что на самом деле выполняет ваш механизм разрешения имен, обратитесь к разделам справочного руководства по
“
resolver
” и
“
resolv.conf
”.
Установка этой опции в значение
“true
” может вызвать проблемы в доменах, имеющих шаблонную MX-запись, потому что любой домен, не имеющий своей собственной MX-записи, совпадает с локальным шаблоном.
srv_fail_domains
|
Use: dnslookup
|
Type: domain list†
|
Default: unset
|
|
Если DNS-поиск SRV-записи для одного из доменов в этом списке вернул ошибку DNS, exim ведёт себя как будто SRV записи вообще не найдены. Смотрите секцию 17.1 для получения подробной информации.
widen_domains
|
Use: dnslookup
|
Type: string list
|
Default: unset
|
|
Если DNS-запрос завершился неудачно и эта опция установлена, то каждая из этих строк по очереди добавляется в конец имени домена, и запрос выполняется снова. К примеру, если
widen_domains = fict.example:ref.example
|
указана и запрос имени
“
klingon.dictionary
” завершился неудачно, запрашивается
“
klingon.dictionary.fict.example
”, а если и он не разрешился, то пробуется
“klingon.dictionary.ref.example
”.Заметьте, что опции
“qualify_single
” и
“search_parents
”, описанные выше, могут дополнить доменное имя, чтобы быть принятыми сервисом DNS.
Когда домен получателя изменяется механизмом разрешения имен в результате применения опций
“qualify_single
” или
“search_parents
”, Exim переписывает соответствующий адрес в строках заголовка письма, если опция
“rewrite_headers
” не установлена в
“false
”. Затем Exim маршрутизирует адрес заново, используя полное доменное имя.
Эти две опции действуют только на DNS-запрос, который выполняется роутером для домена маршрутизируемого адреса. Они не действуют на запросы, выполняемые для записей такого рода:
что может случиться во время обработки предопределенных условий роутера перед входом в него. Для таких запросов расширение никогда не выполняется.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
18. IPLITERAL РОУТЕР
Этот роутер не имеет собственных опций. Если он не используется исключительно для проверки (см. опцию
“verify_only
”), то для него при помощи общей опции
“transport
” должен быть определен необходимый транспорт. Роутер принимает адрес, если его доменная часть соответствует требованиям RFC2822, т.е. имеет
форму IP-адреса, заключенного в квадратные скобки. Например, этот роутер обрабатывает адрес
root@[
192
.
168
.
1
.
1
]
|
путем доставки узлу с этим IP-адресом. Адрес IPv6 похож, но ему (адресу) предшествует
“ipv6:
”.
postmaster@[ipv6:fe80::a00:20ff:fe86:a061.
5678
]
|
Exim позволяет писать
“ipv4:
” перед адресом IPv4 для совместимости, и на том основании, что рано или поздно кто-то попробует так написать.
Если IP-адрес попадает в список IP-адресов, указанных в опции
“ignore_target_hosts", то роутер отклоняется. Если IP в доменной части адреса указывает на локальную машину, то дальнейший исход определяется общей опцией
“self
”.
Документы RFC требуют поддержки domain literals; однако их использование вызывает спорно в современном Интернете. Если вы хотите использовать этот роутер, то вы также должны определить опцию главной конфигурации
“allow_domain_literals
”. В противном случае, Exim не распознает domain literal синтакс в адресах.
begin translation by http://exim.org.ua/mailman/listinfo/exim-doc-translation
edit, verification and complete translation by lissyara
37. Аутентификатор spa
Аутентификатор
“
spa
” предпоставляет поддержку клиента для механизма Microsoft's Secure Password Authentication, также известного как NTLM (NT LanMan). Код для клиентской стороны этого аутентификатора был внесён Marc Prud'hommeaux, и большая его часть взята из проекта Samba (http://www.samba.org). Впоследствии, Tom Kistner внёс код для сервера. Механизм работает следующим образом:
После того, как была принята команда AUTH, клиент посылает аутентификационный запрос SPA, основанный на имени пользователя и, опционально, домене.
Сервер делает обратный вызов.
Клиент строит ответный вызов использующий пользовательский пароль, и шлёт его на сервер, который принимает или отклоняет его.
Для защиты пароля при передаче используется шифрование.
37.1 Использование spa как сервера
Аутентификатор
“
spa
” обладает лишь одной серверной опцией:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
server_password
|
spa
|
string†
|
незадана
|
|
Эта опция раскрывается, и, результатом должен быть пароль в открытом виде для аутентификации пользователя, чьё имя, в данной точке, находиться в
“
$auth1
”. Для совместимости с предыдущими релизами exim`a, имя пользователя, также, помещается в
“
$1
”. Однако, в настоящее время, использование этой переменной для этой цели - не приветствуется, поскольку может привести к недоразумениям в раскрытиях строк, также использующих числовые переменные для иных целей. Например:
spa:
driver = spa
public_name = NTLM
server_password = \
${lookup{
$auth1}lsearch{/etc/exim/spa_clearpass}{$value}fail}
|
Если раскрытие - принудительно неудачно, аутнетификация неуспешна. Любые другие ошибки раскрытия вызывают возврат кода временной ошибки.
37.2 Использование
“spa
” как клиента
Аутентификатор
“
spa
” обладает следующими клиентскими опциями:
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
client_domain
|
spa
|
string†
|
незадана
|
|
Эта опция определяет опциональный домен для аутентификации.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
client_password
|
spa
|
string†
|
незадана
|
|
Эта опция определяет пользовательский пароль, и должны быть задана.
Имя
|
Использование
|
Тип
|
Дефолтовое значение
|
client_username
|
spa
|
string†
|
незадана
|
|
Эта опция определяет имя пользователя, и должна быть задана. Вот - пример конфигурации этого аутентификатора для использования с почтовыми серверами
“
msn.com
”:
msn:
driver = spa
public_name = MSN
client_username = msn/msn_username
client_password = msn_plaintext_password
client_domain = DOMAIN_OR_UNSET
|
=============
Автор перевода: lissyara, оригинал: http://www.lissyara.su/?id=1200