Версия для печати

Архив документации на OpenNet.ru / Раздел "Настройка почты (sendmail, postfix, qmail)" (Многостраничная версия)

SENDMAIL
INSTALLATION AND OPERATION GUIDE

Eric Allman
eric@Sendmail.ORG

Version 8.317.4.56
For Sendmail Version 8.11

Перевод Плотникова А.С.

Самую последнюю версию этой документации, и не только ее, вы можете найти здесь.


СОДЕРЖАНИЕ

1. ОСНОВНАЯ УСТАНОВКА 1.1. Компиляция Sendmail 1.1.1. Подгонка Build
1.1.2. Создание Файла Конфигурации Узла
1.1.3. Подгонка Makefile
1.1.4. Компиляция и установка
1.2. Файлы Конфигурации
1.3. Подробности Файлов Инсталляции 1.3.1. /usr/sbin/sendmail
1.3.2. /etc/mail/sendmail.cf
1.3.3. /usr/bin/newaliases
1.3.4. /usr/bin/hoststat
1.3.5. /usr/bin/purgestat
1.3.6. /var/spool/mqueue
1.3.7. /var/spool/mqueue/.hoststat
1.3.8. /etc/mail/aliases*
1.3.9. /etc/rc или /etc/init.d/sendmail
1.3.10. /etc/mail/helpfile
1.3.11. /etc/mail/statistics
1.3.12. /usr/bin/mailq
2. НОРМАЛЬНАЯ РАБОТА 2.1. Системный Протокол 2.1.1. Формат
2.1.2. Уровни
2.2. Состояние Сброса
2.3. Почтовая Очередь 2.3.1. Печать Очереди
2.3.2. Ускорение Очереди
2.4. Дисковая Информация о Соединении
2.5. Сервисный Переключатель
2.6. База Данных Псевдонимов 2.6.1. Перестроение Базы Данных Псевдонимов
2.6.2. Потенциальные проблемы
2.6.3. Владельцы Списков
2.7. База Данных Пользовательской Информации
2.8. Пользовательская пересылка (файлы .forward)
2.9. Специальные Строки Заголовка 2.9.1. Errors-To:
2.9.2. Apparently-To:
2.9.3. Precedence
2.10. Поддержка Протокола IDENT
3. АРГУМЕНТЫ 3.1. Интервал Очереди
3.2. Режим Демона
3.3. Ускорение Очереди
3.4. Отладка
3.5. Изменение Значений Опций
3.6. Использование Другого Файла Конфигурации
3.7. Протоколирование Траффика
3.8. Тестирование Файлов Конфигурации
3.9. Существующая Информация о Статусе Хоста
4. Настройка 4.1. Таймауты 4.1.1. Интервал Очереди
4.1.2. Таймауты Чтения
4.1.3. Таймауты Сообщений
4.2. Ветвление во время проходов очереди
4.3. Приоритеты Очереди
4.4. Ограничение Загрузки
4.5. Режим Доставки
4.6. Уровни Протоколирования
4.7. Файловые Режимы 4.7.1. suid или не suid?
4.7.2. Отключение проверок безопасности
4.8. Кэширование Соединения
4.9. Доступ к Серверу Имен
4.10. Перемещение Пользовательских Файлов Перенаправления
4.11. Свободное Пространство
4.12. Максимальный размер сообщения
4.13. Флаги Конфиденциальности
4.14. И Мне Тоже Пришлите
5. Полное Описание Файла Конфигурации 5.1. R и S - Правила Перезаписи 5.1.1. Левосторонняя часть
5.1.2. Правосторонняя часть
5.1.3. Семантика Наборов Правил Перезаписи
5.1.4. Ловушки Наборов Правил 5.1.4.1. check_relay
5.1.4.2. check_mail
5.1.4.3. check_rcpt
5.1.4.4. check_compat
5.1.4.5. check_eoh
5.1.4.6. check_etrn
5.1.4.7. check_expn
5.1.4.8. check_vrfy
5.1.4.9. trust_auth
5.1.4.10. tls_client
5.1.4.11. tls_server
5.1.5. Почтовые Программы IPC
5.2. D - Определение Макроса
5.3. C и F - Определение Класса
5.4. M - Определение Почтовой программы
5.5. H - Определение Заголовка
5.6. O - Опция Назначения
5.7. P - Определение Старшинства
5.8. V - Уровень Версии Конфигурации
5.9. K - Определение Файла Ключей
5.10. Пользовательская База Данных 5.10.1. Структура Пользовательской Базы Данных
5.10.2. Семантика Пользовательской Базы Данных
5.10.3. Создание Базы Данных
6. Другая Конфигурация 6.1. Параметры в devtools/OS/$oscf
6.2. Параметры в sendmail/conf.h
6.3. Конфигурация в sendmail/conf.c 6.3.1. Встроенные Семантики Заголовков
6.3.2. Ограничение использования Email
6.3.3. Классы Преобразований Новой Базы Данных
6.3.4. Функция Организации Очереди
6.3.5. Отвержение Входящих Соединений SMTP
6.3.6. Подсчет Средней Загрузки
6.4. Конфигурация в sendmail/daemon.c
6.5. Сертификаты для STARTTLS
6.6. PRNG для STARTTLS
7. ACKNOWLEDGEMENTS
ПРИЛОЖЕНИЕ A. ФЛАГИ КОМАНДНОЙ СТРОКИ
ПРИЛОЖЕНИЕ B. ФОРМАТЫ ФАЙЛОВ ОЧЕРЕДИ
ПРИЛОЖЕНИЕ C. КРАТКОЕ ОПИСАНИЕ СОПРОВОЖДАЮЩИХ ФАЙЛОВ



╘2001 Александр С. Плотников

ПРИЛОЖЕНИЕ A

ФЛАГИ КОМАНДНОЙ СТРОКИ


Аргументы должны быть представлены с флагами перед адресами. Вот какие бывают флаги:
 
-bx Установить режим работы x. Режимы работы таковы:
m Доставка почты (по умолчанию)
s На входе говорить на SMTP 
a| Режим "Arpanet" (получать информацию о конвертном отправителе из заголовка). 
d Работать в фоне как демон
D Работать как демон, но не в фоне
t Работать в тестовом режиме
v Просто проверять адреса, не собирать и не доставлять
i Инициализировать базу данных псевдонимов
p Распечатать почтовую очередь
h Распечатать базу данных статуса хостов
H Убрать из базы данных статуса хостов значения с истёкшим "сроком годности".
-Btype Указывает тип тела.
-Cfile Использовать другой файл конфигурации. При указании этого флага, sendmail будет работать от запустившего его пользователя (отличного от root).
-dlevel Устанавливает уровень отладки.
-f addr Адрес машины отправителя есть addr.
-Fname Устанавливает полное имя этого пользователя в name.
-G При приёме сообщений через командную строку, указывает, что они предназначены для передачи в релей (шлюз). Если этот флаг выставлен, sendmail может жаловаться о синтаксически неправильных сообщениях, например, неквалифицированные имена хостов, вместо того, чтобы исправлять их. В этом режиме sendmail не производит канонизацию.
-h cnt Устанавливает "счетчик пересылок" равным cnt. Он говорит о том, сколько раз это сообщение было обработано sendmail'ом (в том смысле, что это поддерживается основными сетями). Cnt увеличивается при каждой обработке, и если он достигает значения MAXHOP (в настоящее время 30) sendmail выкидывает сообщение с ошибкой.
-L tag Устанавливает идентификатор, используемый syslog. Этот идентификатор нужно устанавливать как можно раньше. Однако, sendmail может быть использован если проблемы появляются до обработки аргументов командной строки.
-n Не производить псевдонимизации и пересылки.
-N уведомления Отмечает все отправленные адреса как хотящие указанных уведомлений, состоящих из слова "NEVER" или списка, разделенного запятыми из слов "SUCCESS", "FAILURE", и "DELAY" для успешной доставки, неудачи, и сообщения застрявшего где-то в очереди. По умолчанию "FAILURE,DELAY".
-r addr Устарелая форма от -f.
-oxзначение Установить опцию x в указанное значение. Эти опции описаны в Разделе 5.6.
-Oопция=значение Установить для опции указанное значение (для длинных имен опций). Эти опции описаны в Разделе 5.6.
-Mxзначение Установить макрос x в значение.
-pprotocol Установит протокол отправки. Программы поощряют установку этой опции. Поле протокола может быть в виде protocol:host для указания и протокола отправки, и отсылающего хоста. Например, "-pUUCP:uunet" выставляет протокол отправки UUCP и отправляющий хост uunet. (Некоторые существующие программы используют -oM для выставки макросов r и s; это эквивалентно использованию флага -p.)
-qвремя Попробовать обработать почту в очереди. Если задано время, sendmail будет обрабатывать почту в очереди через указанный интервал времени, иначе он запустится только один раз.
-qXстрока Обработать очередь один раз, ограничивая работу теми сообщениями, которые соответствуют Xstring. Ключевая буква X может быть I для ограничений основанных на идентификаторе очереди, R для ограничений основанных на получателе, или S для ограничений основанных на отправителе. Конкретная работа в очереди принимается, если один из соответствующих адресов содержит указанную строку.
-R ret Информация, возвращаемая при срыве доставки сообщения; ret может быть "HDRS" для заголовков, "FULL" - для заголовков и тела; при этом не требуется, чтобы другой конец принимал этот параметр. Если определён "HDRS", то локальные отбои также возвращают только заголовки.
-t Выбрать из заголовка строки "To:", "Cc:", и "Bcc:", и послать всем в этих списках. Строка "Bcc:" перед отправкой будет уничтожена. Любые адреса из вектора аргументов будут удалены из списка отправки.
-U Указывает, что это первичное представление User Agent. В будущих выпусках, если этот влаг установлен, sendmail может жаловаться на синтаксически неправильные сообщения вместо их подправки.
-V envid Указанный envid передается с конвертом сообщения и возвращается при "отскоке" сообщения.
-X logfile Протоколировать весь трафик, входящий в и выходящий из sendmail в указанный logfile при проблемах отладки почтовых программ. При этом быстро выдается большое количество данных, поэтому эта опция должна использоваться умеренно.

Где | означает неодабриваемые значения.

Существует некоторое количество опций, которые могут быть определены как простые флаги. Это опции e, i, m, и v. Также, опция f может быть определена как флаг -s. Опции, относящиеся к DSN - "-N", "-R" и "-V" не работают, если sendmail работает как демон.



╘2001 Александр С. Плотников

ПРИЛОЖЕНИЕ B

ФОРМАТЫ ФАЙЛОВ ОЧЕРЕДИ

Это приложение описывает формат файлов очереди. Эти файлы живут в каталоге, определенном опцией Q sendmail.cf, обычно /var/spool/mqueue или /usr/spool/mqueue. Отделные файлы qf, df и xf  могут сохраняться в отдельных подкаталогах qf/, df/ и xf/, если таковые имеются в каталоге очереди.

Для того, чтобы использовать множество очередей, предоставьте значение, заканчивающееся звёздочкой. Например, /var/spool/mqueue/q* будет использовать каталоги или символические ссылки на каталоги, начинающиеся с "q" в /var/spool/mqueue как каталоги очередей. Новые сообщения будут случайным образом размещаться в одной изэтих очередей. Не изменяйте структуру каталога очереди во время работы sendmail.

Все файлы очереди имеют имена xfYMDhmsNPPPPP, где YMDhmsNPPPPP - идентификатор этого сообщения, а x - его тип.

Значения букв идентификатора:
 
 
Y Закодированный год
M Закодированный месяц
D Закодированный день
h Закодированный час
m Закодированная минута
s Закодированная секунда
N Конвертный номер
PPPPP Как минимум 5 цифр из ID процесса

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

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

Файл qf структурируется как последовательность строк, каждая из которых начинается с кодовой буквы. Существуют следующие строки:
 
V Номер версии формата файла очереди, используется для того, чтобы позволить новым бинарникам sendmail читать файлы очереди, созданные более ранними версиями. По умолчанию ноль. Если есть, то должна быть первой строкой в файле.
A Информация, заданная параметром AUTH= команды "MAIL FROM:" или $f@$j, если sendmail был вызван непосредственно.
H Определение заголовка. Таких строк может быть несколько. Порядок их очень важен: Он представляет собой порядок в конечном сообщении. используется тот же синтаксис, как и для определений заголовков в файле конфигурации.
C Контрольный адрес. Синтаксис "localuser:aliasname". Адрес получателя, следующий за этой строкой будет иметь такие флаги, что доставка будет производиться от localuser (имя пользователя из файла /etc/passwd file); aliasname - это имя псевдонима, расширяющегося на этот адрес (используеися для печати сообщений).
Q "Оригинальный получатель", определяемый полем ORCPT= в транзакции ESMTP. Используется только для Уведомлений о Статусе Доставки. Применяется только сразу после строки "R".
Адрес получателя. Будет по одной строке на каждого получателя. Файлы qf Версии 1 также включают ведущий список флагов, заканчивающийся двоеточием, которые могут быть "S" для возврата сообщения при успешной заключительной доставке, "F" для возврата сообщения при неудаче, "D" для возврата сообщения, если оно отложено, "B" для указания того, что должно быть возвращено тело, "N" для подавления возврата тела, и "P" для декларации этого адреса как "первичного" (primary) (командная строка или сессия SMTP).
S Адрес отправителя. Такая строка может быть только одна.
T Время создания работы. Используется для подсчета истечения таймаута работы.
P Текущий приритет сообщения. Используется для упорядочивания очереди. Более высокие числа означают более низкий приоритет. Во время нахождения сообщения в очереди приоритет изменяется. Изначальный приритет зависит от класса сообщения и его размера.
Сообщение. Эта строка печатается командой mailq, и обычно используется для хранения информации о статусе. Может содержать любой текст.
F Флаговые биты, одна буква на флаг. Определенные флаговые биты: r - показывает, что это ответное сообщение и w - показывает что было послано сообщение с предупреждением о задержке почты.
N Общее количество попыток доставки.
Время последней попытки доставки (в секундах с 1 Января 1970г.).
Идентификационный номер файла данных; может быть использован для восстановления почтовой очереди после катастрофического "падения" диска.
$ Определение макроса. Значения конкретных макросов (во время написания этого документа, только $r и $s) передаваемые во время обработки очереди.
B Тип тела. Конец строки - текстовое описание типа тела. Если это поле отсутствует, тип тела считается "неопределенным" ("undefined") и не производится никакой специальной обработки. Легальные значения "7BIT" и "8BITMIME".
Z Оригинальный конвертный идентификатор (из транзакции ESMTP). Только для Уведомлений о Статусе Доставки.

Например, файл из очереди, посланный к "eric@mammoth.Berkeley.EDU" и "bostic@okeeffe.CS.Berkeley.EDU":

    V4
    T711358135
    K904446490
    N0
    P2100941
    $_eric@localhost
    ${daemon_flags}
    Seric
    Ceric:100:1000:sendmail@vangogh.CS.Berkeley.EDU
    RPFD:eric@mammoth.Berkeley.EDU
    RPFD:bostic@okeeffe.CS.Berkeley.EDU
    H?P?Return-path: <^g>
    H??Received: by vangogh.CS.Berkeley.EDU (5.108/2.7) id AAA06703;
        Fri, 17 Jul 1992 00:28:55 -0700
    H??Received: from mail.CS.Berkeley.EDU by vangogh.CS.Berkeley.EDU (5.108/2.7)
        id AAA06698; Fri, 17 Jul 1992 00:28:54 -0700
    H??Received: from [128.32.31.21] by mail.CS.Berkeley.EDU (5.96/2.5)
        id AA22777; Fri, 17 Jul 1992 03:29:14 -0400
    H??Received: by foo.bar.baz.de (5.57/Ultrix3.0-C)
        id AA22757; Fri, 17 Jul 1992 09:31:25 GMT
    H?F?From: eric@foo.bar.baz.de (Eric Allman)
    H?x?Full-name: Eric Allman
    H??Message-id: <9207170931.AA22757@foo.bar.baz.de>
    H??To: sendmail@vangogh.CS.Berkeley.EDU
    H??Subject: this is an example message
Здесь видно от кого послано это сообщение, время представления сообщения (в секундах с 1 Января1970г.), приоритет сообщения, его класс, получателей, и заголовки для сообщения.

Этовымышленный пример, поэтому он может быть неточен для вашего случая. Главное здесь - понять идею; ничто не заменит вам того, что может выдать вам ваша система.



╘2001 Александр С. Плотников

ПРИЛОЖЕНИЕ C

КРАТКОЕ ОПИСАНИЕ СОПРОВОЖДАЮЩИХ ФАЙЛОВ

Это краткое описание сопровождающих файлов создаваемых или генерируемых sendmail'ом. Большинство из них могут быть изменены редактированием файла sendmail.cf; для того, чтобы найти действительные пути к файлам нужно смотреть именно там.
 
/usr/sbin/sendmail Бинарник sendmail.
/usr/bin/newaliases Ссылка на /usr/sbin/sendmail; заставляет перестраивать базу данных псевдонимов. Запуск этой программы полностью равнозначен заданию sendmail флага -bi.
/usr/bin/mailq Распечатывает спок почтовой очереди. Эта программа эквивалентна изпользованию флага -bp в sendmail.
/etc/mail/sendmail.cf Файл конфигурации в текстовом виде.
/etc/mail/helpfile Файл помощи SMTP.
/etc/mail/statistics Файл статистики; его наличие не необходимо.
/etc/mail/sendmail.pid Создается в режиме демона; содержит идентификатор процесса текущего демона SMTP. Если вы используете его в сценариях, используйте "head -1" для получения только первой строки; поздние версииl sendmail могут добавлять информацию в последующие строки.
/etc/mail/aliases Текстовая версия файла псевдонимов.
/etc/mail/aliases.db Псевдонимы в формате hash(3).
/etc/mail/aliases.{pag,dir} Псевдонимы в формате dbm(3).
/var/spool/mqueue Каталог, содержащий почтовую очередь(и) и временные файлы.
/var/spool/mqueue/qf* Контрольные (для очереди) файлы сообщений.
/var/spool/mqueue/df* Файлы данных.
/var/spool/mqueue/tf* Времменные версии файлов qf, используемые во время перестроения файла очереди.
/var/spool/mqueue/xf* Описание текущей сессии.



╘2001 Александр С. Плотников

SENDMAIL
INSTALLATION AND OPERATION GUIDE

Eric Allman
eric@Sendmail.ORG

Version 8.317.4.56
For Sendmail Version 8.11

Перевод Плотникова А.С.

Самую последнюю версию этой документации, и не только ее, вы можете найти здесь.


СОДЕРЖАНИЕ

1. ОСНОВНАЯ УСТАНОВКА 1.1. Компиляция Sendmail 1.1.1. Подгонка Build
1.1.2. Создание Файла Конфигурации Узла
1.1.3. Подгонка Makefile
1.1.4. Компиляция и установка
1.2. Файлы Конфигурации
1.3. Подробности Файлов Инсталляции 1.3.1. /usr/sbin/sendmail
1.3.2. /etc/mail/sendmail.cf
1.3.3. /usr/bin/newaliases
1.3.4. /usr/bin/hoststat
1.3.5. /usr/bin/purgestat
1.3.6. /var/spool/mqueue
1.3.7. /var/spool/mqueue/.hoststat
1.3.8. /etc/mail/aliases*
1.3.9. /etc/rc или /etc/init.d/sendmail
1.3.10. /etc/mail/helpfile
1.3.11. /etc/mail/statistics
1.3.12. /usr/bin/mailq
2. НОРМАЛЬНАЯ РАБОТА 2.1. Системный Протокол 2.1.1. Формат
2.1.2. Уровни
2.2. Состояние Сброса
2.3. Почтовая Очередь 2.3.1. Печать Очереди
2.3.2. Ускорение Очереди
2.4. Дисковая Информация о Соединении
2.5. Сервисный Переключатель
2.6. База Данных Псевдонимов 2.6.1. Перестроение Базы Данных Псевдонимов
2.6.2. Потенциальные проблемы
2.6.3. Владельцы Списков
2.7. База Данных Пользовательской Информации
2.8. Пользовательская пересылка (файлы .forward)
2.9. Специальные Строки Заголовка 2.9.1. Errors-To:
2.9.2. Apparently-To:
2.9.3. Precedence
2.10. Поддержка Протокола IDENT
3. АРГУМЕНТЫ 3.1. Интервал Очереди
3.2. Режим Демона
3.3. Ускорение Очереди
3.4. Отладка
3.5. Изменение Значений Опций
3.6. Использование Другого Файла Конфигурации
3.7. Протоколирование Траффика
3.8. Тестирование Файлов Конфигурации
3.9. Существующая Информация о Статусе Хоста
4. Настройка 4.1. Таймауты 4.1.1. Интервал Очереди
4.1.2. Таймауты Чтения
4.1.3. Таймауты Сообщений
4.2. Ветвление во время проходов очереди
4.3. Приоритеты Очереди
4.4. Ограничение Загрузки
4.5. Режим Доставки
4.6. Уровни Протоколирования
4.7. Файловые Режимы 4.7.1. suid или не suid?
4.7.2. Отключение проверок безопасности
4.8. Кэширование Соединения
4.9. Доступ к Серверу Имен
4.10. Перемещение Пользовательских Файлов Перенаправления
4.11. Свободное Пространство
4.12. Максимальный размер сообщения
4.13. Флаги Конфиденциальности
4.14. И Мне Тоже Пришлите
5. Полное Описание Файла Конфигурации 5.1. R и S - Правила Перезаписи 5.1.1. Левосторонняя часть
5.1.2. Правосторонняя часть
5.1.3. Семантика Наборов Правил Перезаписи
5.1.4. Ловушки Наборов Правил 5.1.4.1. check_relay
5.1.4.2. check_mail
5.1.4.3. check_rcpt
5.1.4.4. check_compat
5.1.4.5. check_eoh
5.1.4.6. check_etrn
5.1.4.7. check_expn
5.1.4.8. check_vrfy
5.1.4.9. trust_auth
5.1.4.10. tls_client
5.1.4.11. tls_server
5.1.5. Почтовые Программы IPC
5.2. D - Определение Макроса
5.3. C и F - Определение Класса
5.4. M - Определение Почтовой программы
5.5. H - Определение Заголовка
5.6. O - Опция Назначения
5.7. P - Определение Старшинства
5.8. V - Уровень Версии Конфигурации
5.9. K - Определение Файла Ключей
5.10. Пользовательская База Данных 5.10.1. Структура Пользовательской Базы Данных
5.10.2. Семантика Пользовательской Базы Данных
5.10.3. Создание Базы Данных
6. Другая Конфигурация 6.1. Параметры в devtools/OS/$oscf
6.2. Параметры в sendmail/conf.h
6.3. Конфигурация в sendmail/conf.c 6.3.1. Встроенные Семантики Заголовков
6.3.2. Ограничение использования Email
6.3.3. Классы Преобразований Новой Базы Данных
6.3.4. Функция Организации Очереди
6.3.5. Отвержение Входящих Соединений SMTP
6.3.6. Подсчет Средней Загрузки
6.4. Конфигурация в sendmail/daemon.c
6.5. Сертификаты для STARTTLS
6.6. PRNG для STARTTLS
7. ACKNOWLEDGEMENTS
ПРИЛОЖЕНИЕ A. ФЛАГИ КОМАНДНОЙ СТРОКИ
ПРИЛОЖЕНИЕ B. ФОРМАТЫ ФАЙЛОВ ОЧЕРЕДИ
ПРИЛОЖЕНИЕ C. КРАТКОЕ ОПИСАНИЕ СОПРОВОЖДАЮЩИХ ФАЙЛОВ



╘2001 Александр С. Плотников
1. ОСНОВНАЯ УСТАНОВКА

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

Остаток этого раздела описывает установку sendmail в том случае, если вы используете одну из уже существующих конфигураций, и стандартные параметры установки для вас вполне приемлимы. Все пути к файлам и примеры заданы от корня поддерева sendmail, для 4.4BSD обычно /usr/src/usr.sbin/sendmail.

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

1.1. Компиляция Sendmail Все исходные файлы для sendmail находятся в подкаталоге sendmail. Для компиляции sendmail перейдите в его каталог и запустите

./Build

Бинарные файлы будут оставлены в соответствующе названном каталоге, например obj.BSD-OS.2.1.i386. Это сделано для того, чтобы в одном и том же дереве исходных файлов могли быть скомпилированы несколько объектных версий.

1.1.1. Подгонка Build Команде Build можно задавать параметры. Во многих случаях их можно использовать только после создания каталога obj.* . Эти команды включают:
 
-L libdirs Список каталогов для поиска библиотек
-I incdirs Список каталогов для поиска включаемых файлов
-E envar= значение Назначить перед компиляцией переменной окружения указанное значение.
-c Перед запуском создать новое дерево obj.*
-f siteconfig Считать указанный файл конфигурации узла. Если этот параметр не указан, Build включает все файлы из $BUILD-TOOLS/Site/site.$oscf.m4 и $BUILD-TOOLS/Site/site.config.m4 , где $BUILDTOOLS обычно ../devtools , а $oscf - то же имя, что используется в каталоге obj.* . Ниже имеется описание файла конфигурации узла. 
-S Пропустить автоконфигурацию. Build не будет автоматически находить библиотеки. Все библиотеки и определения преобразований должны быть указаны в файле конфигурации узла. 

Все остальные параметры передаются в программу make.

1.1.2 Создание Файла Конфигурации Узла Эта секция еще не готова. Пока что лучше всего смотреть файл devtools/README. Различные флаги компиляции можно посмотреть в sendmail/README. 1 .1.3 Подгонка Makefile Sendmail поддерживает два различных формата для локальных (находящихся на диске) версий баз данных, в особенности базы данных aliases . По крайней мере, один из них должен быть определен, если это вообще возможно.
 
NDBM Формат "new DBM", доступный в настоящее время почти во всех системах. До 4.4BSD это был предпочтительный формат. Он позволяет такие сложные вещи, как множество баз данных и закрытие открытой на этот момент базы данных. 
NEWDB Новый пакет базы данных от Berkeley. Если он у вас есть, то используйте его. Он позволяет длинные записи, множество открытых баз данных, кэширование в памяти и многое другое. Вы можете определить его вместе с NDBM; если вы так сделаете, то старые базы данных будут считываться, но когда будет создаваться новая база данных, то она будет уже в формате NEWDB. В случае, если у вас определены NEWDB, NDBM, и NIS, и имя файла aliases будет содержать подстроку "/yp/", при выполнении команды newalias, sendmail создаст и новую и старую версии файла алиасов. Это требуется из-за того, что система Sun NIS/YP считывает версию DBM файла алиасов. Это ужасно, но работает. 

Если ни одна из них не определена, sendmail при каждом запуске будет считывает файл алиасов в память. Этого нужно избегать, так как это может быть достаточно медленно. Существует также несколько методов доступа к удаленным базам данных:
 
NIS Sun's Network Information Services (бывший YP).
NISPLUS Sun's NIS+ services.
NETINFO NeXT's NetInfo service.
HESIOD Hesiod service (from Athena).

Другие флаги компиляции выставляются в conf.h и должны быть уже предопределены для вас, если только вы не занимаетесь портированием в другую систему.

1.1.4 . Компилляция и установка После описанного выше локального системного конфигурирования, вы должны скомпилировать и установить систему. Во многих системах лучший для этого способ - сценарий "Build ":

./Build

Он использует uname (1) для выбора подходящего для вашей системы Makefile.

Если вы устанавливаете все на стандартные места, то произвести установку можно с помощью

./Build install

Это должно установить бинарный файл в /usr/sbin и создать ссылки /usr/bin/newaliases и /usr/bin/mailq на /usr/sbin/sendmail. В системах 4.4BSD это также сформатирует и установит инструкции (man pages).

1.2. Файлы Конфигурации Sendmail не может работать без файла конфигурации. Конфигурация определяет механизмы доставки почты, понимаемые этим узлом, как их использовать, как перенаправлять почту на удаленные почтовые системы, и многие другие настроечные параметры. Этот файл конфигурации подробнее описан в дальнейших частях этого документа.

Поначалу конфигурация sendmail может напугать и запутать вас. Мир сложен, и почтовая конфигурация - всего лишь его отражение. Комплект поставки включает конфигурационный пакет, основанный на m4, скрывающий большинство из сложностей.

Файлы конфигурации, по сравнению с предыдущими версиями, стали проще, во многом из-за того, что и мир стал проще; в частности, текстовые файлы хостов официально устранены, и теперь нет необходимости "прятать" хосты за зарегистрированным шлюзом в Internet.

Эти файлы также учитывают, что большинство ваших соседей используют UUCP адресацию на основе доменов; что означает, что вместо именования хостов как "host!user" они будут использовать "host.domain!user". Файлы конфигурации могут быть переделаны так, чтобы обходить это, но это намного сложнее.

Наши файлы конфигурации обрабатываются m4 для облегчения внесения локальных изменений; каталог cf в поставке sendmail содержит исходные файлы. Этот каталог содержит несколько подкаталогов:
 
cf Описания хостов. Это могут быть литерные имена хостов (например, "ucbvax.mc"), если хосты являются шлюзами, или более общие описания (типа "generic-solaris2.mc" - как общее описание хостов, соединенных по SMTP под управлением ОС Solaris 2.x. ). Файлы, имена которых заканчиваются на .mc ("Master Configuration") являются входными описаниями; выходные находятся в соответствующих файлах .cf . Общая структура этих файлов описывается ниже. 
domain Зависящие от узла описания поддоменов. Описывают, как ваша организация хочет осуществлять адресацию. Например, domain/ CS.Berkeley.EDU.m4 - это наше описание для хостов в поддомене CS.Berkeley.EDU. На них ссылаются, используя m4 макрос DOMAIN в файле .mc.
feature Определения специфических особенностей, которые могут быть нужны какому-либо определенному хосту в вашем узле. На них ссылаются, используя m4 макрос FEATURE. Например - use_cw_file (говорит sendmail считыватьть при запуске файл /etc/mail/local-host-names, чтобы найти список локальных имен). 
hack Локальные особенности. На него ссылаются, используя m4 макрос HACK. Лучше всего не использовать.
m4 Независимые от узла включаемые m4 (1) файлы, содержащие общую для всех конфигурационных файлов информацию. Этот каталог можно рассматривать как каталог "#include".
mailer Определения почтовых программ, на которые ссылаются используя m4 макрос MAILER. Типы почтовых программ, известных в этой поставке: fax, local, smtp, uucp, и usenet. Например, чтобы включить поддержку почтовых программ основанных на UUCP, используйте "MAILER(uucp)". 
ostype Определения, описывающие окружение различных операционных систем (например, местонахождения вспомогательных файлов). На них ссылаются используя m4 макрос OSTYPE.
sh Файлы оболочки, используемые процессом постройки m4 . С этим у вас не должно быть проблем.
siteconfig Локальная информация о связях UUCP. Этот каталог был замещен mailertable ; все новые конфигурации должны использовать mailertable для маршрутизации UUCP (и всего остального). 

Если вы в новом домене (т.е., компании), вам, возможно, захочется создать файл cf/domain для вашего домена. В основном он состоит из описаний ретрансляторов (relay definitions) и особенностей, которые бы использовались на всех узлах: например, описание домена Berkeley определяет ретрансляторы для BitNET и UUCP. Они очень специфичны для Berkeley и должны быть полностью квалифицированными доменными именами internet. Пожалуйста, проверьте их приемлемость для вашего домена.

Поддомены в Berkeley также представлены в каталоге cf/domain. Например, домен CS.Berkeley.EDU - поддомен Computer Science, EECS.Berkeley.EDU- поддомен Electrical Engineering and Computer Sciences , а S2K.Berkeley.EDU - это поддомен Sequoia 2000. Возможно, вам захочется добавить соответствующие вашему домену файлы.

Вам нужно будет использовать или создать файлы .mc для ваших хостов в подкаталоге cf/cf . Это детально описано в файле cf/README.

1 .3. Подробности Файлов Инсталляции Этот раздел описывает файлы, необходимые для установки sendmail. 1.3.1. /usr/sbin/sendmail Бинарный файл sendmail находится в /usr/sbin1 . Он должен иметь бит смены владельца на пользователя root. В целях безопасности, владельцем каталогов /, /usr, и /usr/sbin должен быть root, а их пермиссии должны быть 7552. 1.3.2. /etc/mail/sendmail.cf Это файл конфигурации для sendmail3. Это единственный небиблиотечный файл, имя которого вкомпилировано в sendmail4.

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

1.3.3. /usr/bin/newaliases Команда newaliases должна быть всего лишь ссылкой на sendmail:

rm -f /usr/bin/newaliases

ln -s /usr/sbin/sendmail /usr/bin/newaliases

Он должен быть создан там, где его найдет системный путь поиска.

1.3.4. /usr/bin/hoststat Команда hoststat также должна быть всего лишь ссылкой на sendmail , таким же образом, что и newaliases . Эта команда выдает статус последней почтовой транзакции со всеми удаленными хостами. Флаг -v не даст обрезать показываемый статус. Он работает только если выставлена опция HostStatusDirectory. 1.3.5. /usr/bin/purgestat Эта команда также является ссылкой на sendmail . Она обнуляет устаревшую информацию (Timeout.hoststatus), сохраненную в дереве HostStatusDirectory. 1.3.6. /var/spool/mqueue Для хранения почтовой очереди должен быть создан каталог /var/spool/mqueue . Этот каталог должен иметь пермиссии 700 и принадлежать пользователю root.
Настоящий путь к этому каталогу определяется оцией Q в файле sendmail.cf. Для того, чтобы использовать множество очередей, назначьте значение, оканчивающееся *. Например, /var/spool/mqueue/qd* будет использовать все каталоги или символические ссылки на каталоги, начинающиеся с "qd" в /var/spool/mqueue как каталоги для очереди. Не изменяйте структуру каталога очереди во время работы программы sendmail.
Если эти каталоги имеют подкаталоги или символические ссылки на каталоги названные "qf", "df" и "xf", то они будут использованы для различных типов файлов очередей. То есть, файлы данных будут сохраняться в подкаталоге "df", файлы транскрипта в "xf", а все остальные - в "qf". 1.3.7. /var/spool/mqueue/.hoststat Это обычное значение опции HostStatusDirectory , содержащей один файл на хост, с которым этот sendmail недавно разговаривал. Обычно это подкаталог в mqueue. 1.3.8. /etc/mail/aliases Системные псевдонимы содержатся в "/etc/mail/aliases". Пример этого файла имеется в "sendmail/aliases", в нем имеются некоторые псевдонимы, которые должны быть определены:

cp lib/aliases /etc/mail/aliases

edit /etc/mail/aliases

Вы должны добавить в этот файл любые псевдонимы, необходимые в вашей системе.

Обычно sendmail смотрит на версии этих файлов в виде баз данных, хранящихся и в "/etc/aliases.dir" и в "/etc/aliases.pag" или "/etc/aliases.db", в зависимости от используемой вами пакета баз данных. Путь к этому файлу определяется опцией AliasFile в файле sendmail.cf.

1.3.9. /etc/rc или /etc/init.d/sendmail При перезагрузке системы необходимо запускать демон sendmail . Этот демон обеспечивает две функции: он слушает сокет SMTP на случай соединений (чтобы получать почту с удаленных систем), а также периодически обрабатывает очередь, чтобы, как только удаленные хосты станут доступны, доставить на них почту.

Добавьте в ваш "/etc/rc" (или "/etc/rc.local" в зависимости от системы) в то место, где он запускает демоны (для систем на основе BSD) , или в один из файлов запуска, обычно это "/etc/init.d/sendmail" ( в системах на основе System-V), следующие строчки:

if [ -f /usr/sbin/sendmail -a -f /etc/sendmail.cf ]; then

(cd /var/spool/mqueue; rm -f [lnx]f*)

/usr/sbin/sendmail -bd -q30m &

echo -n ' sendmail' /dev/console

fi

Команды "cd" и "rm" здесь даются для того, чтобы гарантировать, что все файлы-замки (lock files) были уничтожены; посторонние файлы-замки могут остаться, если система вдруг "упадет" посреди обработки сообщения. Строка, которая на самом деле запускает sendmail , имеет два флага: "-bd" заставляет его слушать на порту SMTP, а "-q30m" заставляет его производить обработку очереди каждые полчаса.

Некоторые используют более сложный сценарий запуска, удаляющий файлы qf нулевой длины, и файлы df, для которых нет ни одного файла qf. Пример сложного сценария запуска представлен на рис.1.
 
 
 
# remove zero length qf files 
for qffile in qf* 
do  if [ -r $qffile ] 
then  if [ ! -s $qffile ] 
then  echo -n " <zero: $qffile" /dev/console 
rm -f $qffile 
fi
fi
done 
# rename tf files to be qf if the qf does not exist 
for tffile in tf* 
do  qffile=`echo $tffile | sed 's/t/q/'` 
if [ -r $tffile -a ! -f $qffile ] 
then  echo -n " <recovering: $tffile" /dev/console 
mv $tffile $qffile 
else  echo -n " <extra: $tffile" /dev/console 
rm -f $tffile 
fi
done 
# remove df files with no corresponding qf files 
for dffile in df* 
do  qffile=`echo $dffile | sed 's/d/q/'` 
if [ -r $dffile -a ! -f $qffile ] 
then  echo -n " <incomplete: $dffile" /dev/console 
mv $dffile `echo $dffile | sed 's/d/D/'` 
fi
done 
# announce files that have been saved during disaster recovery
for xffile in [A-Z]f* 
do  echo -n " <panic: $xffile" /dev/console done

рис.1 - Комплексный сценарий запуска

Если ваша версия UNIX не поддерживает Berkeley TCP/IP, не включайте флаг -bd.

1.3.10. /etc/mail/helpfile

Это файл помощи, используемый командой SMTP HELP . Он должен быть скопирован из "sendmail/helpfile":

cp sendmail/helpfile /etc/mail/helpfile

Настоящий путь к этому файлу определяется опцией HelpFile в файле sendmail.cf.

1.3.11. /etc/mail/statistics Если вы хотите собирать статистику о количестве прошедшей почты, вы должны создать файл "/etc/mail/statistics":

cp /dev/null /etc/mail/statistics
chmod 666 /etc/mail/statistics

Этот файл не увеличивается. Он распечатывается программой "mailstats/mailstats.c." Настоящий путь к этому файлу определяется опцией S в файле sendmail.cf.

1.3.12. /usr/bin/mailq Если sendmail запущен как "mailq," то это будет равнозначно запуску sendmail с флагом -bp (т.е., sendmail распечатает содержание почтовой очереди, см далее). Он должен быть ссылкой на /usr/sbin/sendmail.


1. В 4.4BSD и более новых системах это обычно /usr/sbin; многие системы устанвливают его в /usr/lib. И насколько я понимаю это /usr/ucblib в System V Release 4. [назад]

2. Некоторые поставщики поставляют его так, что его владельцем является bin; это может создать дыру в безопасности, которая не связана напрямую с sendmail. Другие каталоги, которые должны иметь ограничения по владельцу и пермиссиям - это /bin, /usr/bin, /etc, /usr/etc, /lib, и /usr/lib. [назад]

3. На самом деле, пути могут различаться, от системы к системе; /etc - наиболее предпочтительный каталог. Некоторые старые системы устанавливают его в /usr/lib/sendmail.cf, и я также видел его в /usr/ucblib и /etc/mail. Если вы хотите поместить его в другое место, добавьте к передаваемым в компилятор флагам флаг D_PATH_SENDMAIL.CF=\"/file/name\". Перемещать этот файл не рекомендуется: другие программы и сценарии знают об этом местонахождении. [назад]

4. Системные библиотеки могут взаимодействовать с другими файлами; в частности, системные библиотечные подпрограммы, вызываемые sendmail, возможно могут обращаться к /etc/passwd и /etc/resolv.conf. [назад]


╘2001 Александр С. Плотников
 
2. НОРМАЛЬНАЯ РАБОТА 2.1. Системный Протокол Системный протокол поддерживается программой syslogd(8). Все сообщения от sendmail протоколируются посредством LOG_MAIL1. 2.1.1. Формат Каждая строка в системном протоколе состоит из временной отметки, имени машины, создавшей ее (для протоколирования с нескольких машин через локальную сеть), слова "sendmail:", и самого сообщения2 . Большинство сообщений являются последовательностью пар имя=значение.

После обработки сообщения обычно протоколируются две строки. Первая отмечает получение сообщения; на каждое сообщение будет ровно одна такая строка. Некоторые поля могут быть пропущены, если они не содержат интересной информации. Поля такие:
 
from  Конвертный адрес отправителя 
size  Размер сообщения в байтах 
class Класс (т.е. числовой приоритет) сообщения
pri  Начальный приоритет сообщения (используется для сортировки очереди) 
nrcpts  Количество почтовых получателей для этого сообщения (после обработки псевдонимов и перенаправлений) 
msgid  Идентификационный номер сообщения (из заголовка) 
proto  Протокол, использовавшийся при получении этого сообщения (например, ESMTP или UUCP) 
daemon Имя демона из установок DaemonPortOptions
relay  Машина, от которой было получено сообщение 

На каждую попытку доставки сообщения записываетя еще одна строка (так что каждое сообщение таких строк может быть несколько, например, если оно отложено, или если имеется несколько получателей). Поля в этой строке таковы:
 
to Список получателей для этой почтовой программы, разделенный запятыми.
ctladdr "Контрольный пользователь", то есть, имя пользователя, чьи параметры мы используем при доставке.
delay Общее время задержки между получением и доставкой сообщения.
xdelay Время, понадобившееся для попытки доставки (обычно показывает скорость соединения).
mailer Имя почтовой программы, использовавшейся для доставки к данному получателю.
relay Имя хоста, принявшего сообщение для данного получателя (или отказавшего в доставке).
dsn Усовершенствованный код ошибки (RFC 2034), если доступен
stat Статус доставки. 

Не все эти поля присутствуют для всех сообщений; например, для локальных сообщений отсутствует поле relay.

2.1.2. Уровни Если у вас установлен syslogd(8) или его эквивалент, то вы можете производить протоколирование. Имеется большое количество информации, которое можно запротоколировать. Протокол организован как последовательность уровней. На самом нижнем уровне протоколируются только самые странные ситуации. На самом высоком уровне даже самые обычные и неинтересные события записываются для потомства. Согласно соглашению, уровни протоколирования ниже десятого обычно считаются "полезными"; уровни протоколирования выше 64 зарезервированы для целей отладки. Уровни с 11 по 64 зарезервированы для многословной информации, что могут захотеть некоторые узлы.

Полное описание уровней протоколирования дано в разделе 4.6.

2.2. Состояние Сброса Вы можете попросить sendmail сбросить протокол открытых файлов и кэша соединений, послав ему сигнал SIGUSR1. Результаты протоколируются по очередности LOG_DEBUG. 2.3. Почтовая Очередь Время от времени sendmail не может обслужить сообщение немедленно. Например, он может быть перегружен, или вообще "упасть", последствием чего будет отказ от соединений. Тогда посылающий хост должен будет сохранить это сообщение в своей почтовой очереди и попытаться доставить его позже.

При нормальных условиях почтовая очередь будет обрабатываться прозрачно. Однако вы можете обнаружить, что иногда необходимо вмешаться руками. Например, если основной хост долгое время отключен, очередь может засориться. Хотя sendmail должен нормально восстановить все при загрузке хоста, тем временем вы можете найти его производительность неприемлемо низкой.

2.3.1. Печать Очереди Содержимое очереди можно распечатать, используя команду mailq (или указав sendmail флаг -bp): mailq Результатом ее выполнения будет список идентификаторов сообщений, находящихся в очереди, размеров сообщений, даты поступления сообщения в очередь, и отправитель с получателями. 2.3.2. Ускорение Очереди Sendmail должен обрабатывать очередь автоматически через определенный интервал. При использовании множества очередей, для обработки каждой из очередей будет запущен отдельный процесс, если только обработка очереди не инициирована пользователем с флагом подробностей (verbose flag). Алгоритм такой: прочитать и отсортировать очередь, а затем обработать все сообщения по порядку. При попытке запустить работу, sendmail сначала проверяет, не заблокирована ли она. Если блокировка имеется, то он игнорирует эту работу.

Не производится ни одной попытки удостовериться в том, что только один обработчик очереди существует в любое время, поэтому нет никакой гарантии, что работа не будет производиться вечно (однако, sendmail имеет некоторую эвристику, чтобы попытаться прекратить работу, занимающую абсурдно большое количество времени; технологически, это нарушает требования RFC 821, но одобряется в RFC 1123). Согласно алгоритму блокировки, одна работа не может заморозить всю очередь. Однако, недружественный принимающий хост, или программа приема, которая никогда ничего не возвращает, может собрать большое количество процессов в вашей системе. К несчастью, нет никакого общего решения для разрешения подобных проблем.

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

Чтобы это сделать, вполне возможно перенести весь каталог очереди:

cd /var/spool

 mv mqueue omqueue; mkdir mqueue; chmod 700 mqueue

Затем вы должны убить работающий демон (потому что он все еще будет продолжать обрабатывать старый каталог очереди) и создать нового демона.

Чтобы обработать старую очередь, запустите следующую команду:

/usr/sbin/sendmail -oQ/var/spool/omqueue -q Флаг -oQ определит альтернативный каталог очереди, а флаг -q скажет о том, что нужна всего лишь обработка каждого сообщения в очереди. Если у вас имеется тяга к вуайеризму, вы можете использовать флаг -v, чтобы посмотреть, что будет происходить.

Когда в очереди наконец-то не останется ни одного сообщения, вы сможете удалить этот каталог:

rmdir /var/spool/omqueue 2.4. Дисковая Информация о Соединении О каждой удаленной системе, с которой было соединение, sendmail сохраняет в памяти большое количество информации. Теперь стало возможным сохранять некоторую часть этой информации на диске, используя опцию HostStatusDirectory , которая может одновременно использоваться несколькими процессами sendmail. Это позволяет немедленно ставить почту в очередь, или пропустить ее при обработке очереди, если недавно было неудачное соединение с удаленной машиной.

Дополнительно, включение опции SingleThreadDelivery даст дополнительный эффект доставки почты к месту назначения одной цепочкой. Это может очень помочь, если на удаленной машине работает сервер SMTP, который легко нагружается, или может работать только с одним соединением за раз. Она применяется ко всем хостам, поэтому её установка по причине того, что на вашем узле для доставки почты используется одна машина, на которой работает дополнительное программное обеспечение, увеличивающее загрузку машины, может привести к замедлению доставки почты на другие хосты. Если эта опция выставлена, то вам, возможно, захочется выставить опцию MinQueueAge, чтобы ваша очередь обрабатывалась достаточно часто; в результате работы, пропущенные по причине того, что другой процесс sendmail разговаривал с тем же хостом, вскоре будут опробованы снова, а не отложены на долгое время.

Информация о хостах сохраняется на диске в подкаталоге .hoststat3каталога mqueue. Удаление этого каталога с его подкаталогами равносильно команде purgestat и вполне безопасно. Однако, purgestat всего лишь удаляет устаревшие (Timeout.hoststatus) файлы. Информация из этих каталогов может быть просмотрена командой hoststat, которая покажет имя хоста, последний доступ и статус этого доступа. Звездочка в самой левой колонке означает, что процесс sendmail в настоящее время имеет блокировку на доставку почты на этот хост.

В целях оптимизации таймаутов, информация, сохраняемая на диске, обслуживается таким же образом, что и информация, хранимая в памяти. По умолчанию, информация об ошибках хостов действительна в течение 30 минут. Это значение может быть изменено опцией Timeout.hoststatus.

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

Информация о соединении, сохраненная на диске, может быть очищена в любой момент командой purgestat, или запуском sendmail с ключом -bH. Информацию о соединении можно просмотреть командой hoststat, или запуском sendmail с ключом -bh.

2.5. Сервисный Переключатель Реализация конкретных системных сервисов, таких, как определение имени хоста и пользователя управляется сервисным переключателем. Если операционная система хоста поддерживает такой переключатель, и sendmail о ней знает, то sendmail будет использовать родную версию. Ultrix, Solaris, и DEC OSF/1 - примеры таких операционных систем.

Если операционная система не поддерживает сервисный переключатель (например, SunOS 4.x, HP-UX, BSD), то sendmail будет использовать свою фиктивную реализацию. Опция ServiceSwitchFile указывает на имя файла, содержащего определения сервисов. Каждая строка содержит имя сервиса и возможные реализации этого сервиса. Например, файл:

hosts dns files nis
aliases files nis
попросит sendmail просматривать имена хостов сначала в Domain Name System. Если запрошенное имя хоста не найдено, он попробует локальные файлы, если и там не найдет, то попробует NIS. Точно также, при просмтре псевдонимов, сначала он попробует локальные файлы, а затем NIS.

Сервисные переключатели не полностью интегрированы. Например, несмотря на то, что в вышеописанном примере имя хоста необходимо смотреть в NIS, в SunOS этого не произойдет, из-за того, что системная реализация gethostbyname(3) не понимает этого. Если имеется достаточно причин, sendmail может использовать свои реализации gethostbyname(3), gethostbyaddr(3), getpwent(3), и других системных подпрограмм, которые будут необходимы для безглючной работы.

2.6. База Данных Псевдонимов После получения адресов получателей из соединения SMTP или командной строки, они обрабатываются согласно набору правил 0, которые должны определить тройку {mailer, host, address}. Если флаги выбранные mailer'ом включают флаг A (aliasable), часть тройки address рассматривается как ключ (т.е., левосторонняя) в базе данных псевдонимов (aliases). Если имеется совпадение, адрес удаляется из очереди на отсылку, а все адреса с правой стороны псевдонима добавляются вместо найденного псевдонима. Эта операция является рекурсивной, поэтому псевдонимы, найденные в правосторонней части псевдонима обрабатываются таким же образом.

База данных псевдонимов существует в двух видах. Один - текстовая форма, содержащаяся в файле /etc/mail/aliases. Псевдонимы имеют следующий вид

name: name1, name2, ... Только локальные имена могут быть псевдонимизированы; например, eric@prep.ai.MIT.EDU: eric@CS.Berkeley.EDU не возымеет ожидаемого эффекта (если это не на prep.ai.MIT.EDU, но я им точно не нужен)4. Псевдонимы могут быть продолжены любыми строками-продолжениями с пробелами или табуляциями, либо обратным слешем непосредственно до новой строки. Пустые строки и строки, начинающиеся со знака диез ("#") считаются комментариями.

Вторая форма обрабатывается библиотекой ndbm(3)5 или библиотекой Berkley DB. Эта форма находится в файлах /etc/mail/aliases.db (если используется NEWDB) или /etc/mail/aliases.dir и /etc/mail/aliases.pag (если используется NDBM). Это именно та форма, которую использует sendmail при определении псевдонимов. Эта технология используется для увеличения производительности.

Управление порядком поиска выставляется непосредственно сервисным переключателем. По существу, вхождение

O AliasFile=switch:aliases всегда добавляется как первое вхождение псевдонимов; также, первое имя файла псевдонимов без класса (например, без "nis:" вначале) будет использовано как имя файла для вхождения "files" в переключателе псевдонимов. Например, если конфигурация содержит O AliasFile=/etc/mail/aliases, а сервисный переключатель содержит aliases nis files nisplus то псевдонимы будут сначала искаться в базе данных NIS, затем в /etc/mail/aliases, а затем в базе данных NIS+.

Вы также можете использовать файлы псевдонимов на основе NIS. Например, определение:

O AliasFile=/etc/mail/aliases

 O AliasFile=nis:mail.aliases@my.nis.domain

будет сначала искать файл /etc/mail/aliases, а затем преобразование с именем "mail.aliases" в "my.nis.domain". Внимание: если вы строите свой собственный файл псевдонимов на основе NIS, обязательно поставьте флаг -l для makedbm(8) для преобразования заглавных букв в ключах в строчные; иначе псевдонимы с заглавными буквами в именах не будут совпадать с входящими адресами.

Дополнительные флаги могут быть добавлены после двоеточия, точно как строка K; например:

O AliasFile=nis:-N mail.aliases@my.nis.domain будет искать соответствующую карту NIS и всегда иметь ноль байт в ключе. Также O AliasFile=nis:-f mail.aliases@my.nis.domain удержит sendmail от преобразования ключа в символы нижнего регистра перед просмотром псевдонимов. 2.6.1. Перестроение Базы Данных Псевдонимов Версия базы данных в виде hash или dbm может быть перестроена выполнением команды newaliases Это эквивалентно заданию sendmail флага -bi: /usr/sbin/sendmail -bi Если в конфигурации определена опция RebuildAliases (раннее D), sendmail будет перестраивать базу данных псевдонимов автоматически, если она устареет. Автоматическая перестройка может быть опасной на сильно загруженных машинах с большими файлами псевдонимов; если перестроение базы займет больше чем таймаут перестройки базы (опция AliasWait, ранее a, нормальное значение которой равно пяти минутам), то вполне возможно, что будут запущены одновременно несколько процессов перестройки.

Если вы определили несколько баз данных псевдонимов, флаг -bi перестроит все типы баз данных, которые он понимает (например, он может перестраивать базы данных NDBM, но не может базы данных NIS).

2.6.2. Потенциальные проблемы Существует несколько проблем, которые могут случиться с базой данных псевдонимов. Все они происходят из того, что процесс sendmail может начать использовать DBM-версию псевдонимов, когда она будет построена только частично. Это может случиться при двух условиях: один процесс использует базу данных, в то время как второй ее перестраивает, или процесс, занимающийся перестройкой базы данных, умирает (из-за того, что его убили, или система вдруг упала) до полного завершения перестройки.

Sendmail имеет три метода, чтобы попытаться избавиться от этих проблем. Первый - он игнорирует прерывания во время перестройки базы данных; это позволяет избежать случая, когда кто-нибудь прекращает процесс, оставляя частично перестроенную базу данных. Второй - он блокирует исходный файл базы данных во время перестройки - но это может не работать поверх NFS или если файл защищен на запись. Третий - в конце перестройки он добавляет псевдоним в виде

@: @ (что вообще-то нелегально). Перед тем, как sendmail будет использовать базу данных, он произведет проверку на наличие этого вхождения6. 2.6.3. Владельцы Списков Если при посылке на определенный адрес, скажем ,"x", произойдет ошибка, sendmail будет искать псевдоним вида "owner-x" для получения ошибки. Это обычно полезно для списков рассылки, где подписчик сам не управляет поддержкой списка; в этом случае, управляющий списком может быть владельцем списка. Например: unix-wizards: eric@ucbarpa, wnj@monet, nosuchuser, sam@matisse

 owner-unix-wizards: unix-wizards-request

unix-wizards-request: eric@ucbarpa

заставит "eric@ucbarpa" получать ошибки, которые произойдут, когда кто-нибудь посылает в unix-wizards и попадает под вхождение "nosuchuser" в списке.

Владельцы списков также изменяют почтовый адрес отправителя. Используется содержимое псевдонима владельца, если оно указывает на одного пользователя, иначе будет использоваться само имя псевдонима. По этой причине, и в соответствии с соглашениями Internet, адрес "owner-" обычно указывает на адрес "-request"; это позволяет сообщениям следовать типичным соглашениям Internet об использовании "list-request" как обратный адрес.

2.7. База Данных Пользовательской Информации Если вы имеете версию sendmail с вкомпиллированной базой данных пользовательской информации, и определили одну или несколько баз данных используя опцию U, базы данных будут просмотрены в поисках вхождения user:maildrop. Если такое будет найдено, почта будет послана по указанному адресу. 2.8. Пользовательская пересылка (файлы .forward) Как альтернативу базе данных псевдонимов, каждый пользователь может создать в своем домашнем каталоге файл с именем ".forward". Если такой файл существует, sendmail перенаправляет почту для этого пользователя по списку адресов, указанных в файле .forward. Заметьте, что псевдонимы полностью проверяются до использования файлов пересылки. Например, если домашний каталог пользователя "mckusick" содержит файл .forward содержащий: mckusick@ernie

 kirk@calder

то любая почта, поступившая для "mckusick" будет перенаправлена по указанным адресам.

На самом деле, файл конфигурации определяет последовательность проверяемых имен файлов. По умолчанию, это пользовательский файл .forward, но может быть определен по-другому, используя опцию ForwardPath. Если вы ее измените, вы должны будете проинформировать ваших основных пользователей об изменении; .forward очень хорошо вошло в коллективное подсознание.

2.9. Специальные Строки Заголовка Несколько строк заголовка имеют особые толкования, определенные файлом конфигурации. Остальные имеют интерпретации, которые встроены в sendmail и не могут быть изменены без изменения кода. Здесь описаны эти встроенные интерпретации. 2.9.1. Errors-To: Если во время обработки происходит ошибка, этот заголовок заставит отослать сообщение об ошибке по указанному адресу. Это предназначено для списков рассылки.

Заголовок Errors-To: был создан в плохие старые времена, когда UUCP не понимал различий между содержимым и заголовком; Это было встроено для того, чтобы указать, что должно быть теперь пропущено как адрес отправителя сообщения. Это будет убрано, но пока еще используется, если выставлена опция UseErrorsTo.

Заголовок Errors-To: официально уже убран, и в последующих выпусках будет отсутствовать.

2.9.2. Apparently-To: RFC 822 требует в каждом сообщении иметь по крайней мере одно поле получателя (строку To:, Cc:, или Bcc:). Если сообщение приходит без указания какого-либо получателя в сообщении, sendmail добавит заголовок на основе опции "NoRecipientAction". Одним из возможных действий будет добавка в заголовок строки "Apparently-To:" для каждого получателя, о котором он знает.

Заголовок Apparently-To: нестандартен и опротестован.

2.9.3. Precedence Заголовок Precedence: может быть использован как грубое управление приоритетом сообщения. Он перестраивает порядок в очереди и может быть сконфигурирован на изменение значений таймаутов для сообщения. Приоритет письма также контролирует обработку сообщения о статусе доставки (DSN - delivery status notification) для этого письма. 2.10. Поддержка Протокола IDENT Sendmail поддерживает протокол IDENT, определенный в RFC 1413. Нужно отметить, что RFC говорит о том, что клиент должен ждать ответа как минимум 30 секунд. Из-за того, что многие узлы практикуют отбрасывать запросы IDENT, значение Timeout.ident по умолчанию 5 секунд. Это приводит к задержкам в обработке почты. Хотя это улучшает идентификацию автора сообщения в электронной почте посредством производства "обратного звонка" в систему, откуда исходит сообщение, это не идеально; протокол IDENT можно достаточно легко обмануть. Следующее описание было взято из RFC 1413:
 

6. Положения Безопасности

Информации, возвращаемой этим протоколом можно доверять настолько, насколько можно доверять хосту ИЛИ организации, в которой находится этот хост. Например, PC в открытой лаборатории имеет немного, если вообще имеет вообще что-либо запрещающее пользователю указать этому протоколу возвращать любой идентификатор, какой он захочет. Точно так же, если хост был скомпрометирован, возвращаемая им информация может быть полностью ошибочна и неверна.

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

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

Сервер Идентификации может обнаружить информацию о пользователях, сущностях, объектах или процессах, которая обычно может быть рассмотрена как конфиденциальная. Сервер Идентификации обеспечивает сервис, являющийся грубым аналогом сервисов CallerID, обеспечиваемых некоторыми телефонными компаниями, а многие из таких же частных определений и аргументов, применяемых в сервисе CallerID, подходят к Идентификации. Если вы не будете запускать сервер "finger" по причинам сохранения тайны, то вы можете не захотеть использовать этот протокол.

В некоторых случаях ваша система может не работать нормально с поддержкой IDENT из-за ошибки в реализации TCP/IP. Симптомы будут таковы: для некоторых хостов соединение SMTP будет закрываться почти емедленно. Если это действительно так происходит, или вы не хотите использовать IDENT, вы должны установит таймаут IDENT равным нулю; это отключит протокол IDENT.


1. Кроме Ultrix, не поддерживающего в syslog различные средства. [назад]

2. Этот формат может быть немного другим, если ваш поставщик изменил синтаксис. [назад]

3. Это обычное значение опции HostStatusDirectory; конечно же, если вы этого захотите, она может указывать на любое место в вашей файловой системе. [назад]

4. На самом деле, любая почтовая программа, имеющая выставленный почтовый флаг "A" будет позволять псевдонимизирование; обычно это ограничено локальной почтовой программой. [назад]

5. Пакет gdbm не работает. [назад]

6. Для того, чтобы можно было произвести это действие, в файле конфигурации требуется опция AliasWait. Обычно она должна быть определена. [назад]



╘2001 Александр С. Плотников
3. АРГУМЕНТЫ

Полный список аргументов для sendmail детально описан в Приложении A. Некоторые важные аргументы описаны здесь.

3.1. Интервал Очереди Количество времени между разветвлением процесса для обработки очереди определяется флагом -q. Если вы работаете в режиме приема, назначенного i или b, то это значение может быть относительно большим, как и в том случае, если ваш хост долго был отключен. Если вы запускаете sendmail в режиме q, то это значение должно быть относительно небольшим, потому что оно определяет максимальное время нахождения сообщения в очереди. (Смотри также опцию MinQueueAge.)

Секция 5.3.1.1 RFC 1123 говорит, что это значение должно быть как минимум 30 минут (но, если вы работаете в режиме "queue-only", то это не важно).

3.2. Режим Демона Если вы позволяете принимать почту через соединение IPC, у вас должен работать демон. Он должен запускаться из файла /etc/rc с флагом -bd. Флаги -bd и -q могут быть скомбинированы в одном вызове: /usr/sbin/sendmail -bd -q30m В качестве альтернативы можно запускать sendmail из inetd(8) (используя флаг -bs, чтобы сказать sendmail использовать SMTP на его стандартном вводе и выводе). Это будет работать и позволит вам завернуть sendmail в программу обработки TCP, но может быть несколько медленнее из-за того, что файл конфигурации будет перечитываться при получении любого входящего сообщения. Если вы так сделаете, то вам все равно понадобится работающий sendmail для обработки очереди: /usr/sbin/sendmail -q30m

3.3. Ускорение Очереди

В некоторых случаях, вы можете заметить, что по какой-либо причине ваша очередь застряла. Вы можете ускорить очередь, используя флаг -q (без значения). При этом очень интересно использовать флаг -v (verbose), чтобы посмотреть, что будет происходить: /usr/sbin/sendmail -q -v Вы также можете ограничить количество работ с определенным идентификатором очереди, отправителем или получателем, используя один из модификаторов очереди. Например, "-qRberkeley" ограничит работу по обработке очереди только сообщениями со строчкой "berkeley" в любом из адресов получателей. Точно также, "-qSstring" ограничит обработку сообщениями с определенными отправителями, а "-qIstring" ограничит ее конкретными идентификаторами очереди. 3.4. Отладка Существует большое количество втроенных в sendmail флагов отладки. Каждый флаг отладки имеет номер и уровень, где большие уровни означают большее количество выдаваемой информации. Существует соглашение, что уровни выше девятого "абсурдны", то есть, они выдают так много информации, что обычно вы ее даже не захотите увидеть, за исключение отладки конкретного куска кода. Флаги отладки выставляются опцией -d; синтаксис таков:
 
debug-flag:  -d debug-list 
debug-list:  debug-option [ , debug-option ]* 
debug-option:  debug-range [ . debug-level ] 
debug-range:  integer | integer - integer 
debug-level:  integer 

где пробелы используются только для облегчения чтения. Например,
 
-d12  Выставляет флаг 12 на уровень 1 
-d12.3  Выставляет флаг 12 на уровень 3 
-d3-17  Выставляет флаги с 3 по 17 на уровень1 
-d3-17.4  Выставляет флаги с 3 по 17 на уровень 4 

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

3.5. Изменение Значений Опций Опции могут быть преодолены использованием в командной строке флагов -o или -O. Например, /usr/sbin/sendmail -oT2m выставляет опцию T (таймаут) на две минуты только для этого запуска; эквивалентная строка, использующая длинное имя опции такова: /usr/sbin/sendmail -OTimeout.queuereturn=2m Некоторые опции имеют ограничения по безопасности. Sendmail позволяет вам выставить их, но с этого момента убирает свои пермиссии смены uid на root 1. 3.6. Использование Другого Файла Конфигурации Альтернативный файл конфигурации может быть определен флагом -C; например, /usr/sbin/sendmail -Ctest.cf -oQ/tmp/mqueue использует файл конфигурации test.cf вместо обычного /etc/mail/sendmail.cf. Если флаг -C не имеет значения, то по умолчанию он использует файл sendmail.cf в текущем каталоге.

Когда вы используете этот флаг, sendmail не использует пермиссии смены uid на root, поэтому обычно, во время тестирования, для каталога подкачки используют каталог, который открыт всем на запись (типа /tmp) (опция QueueDirectory или Q).

3.7. Протоколирование Траффика Многие реализации SMTP не полностью реализуют протокол. Например, некоторые SMTP для персональных компьютеров не понимают строк-продолжений в кодах возврата. Это может быть очень трудно отследить. Если вы подозреваете такую проблему, вы можете включить протоколирование траффика, используя флаг -X. Например, /usr/sbin/sendmail -X /tmp/traffic -bd будет вести протокол всего траффика в файле /tmp/traffic.

Это протоколирует большое количество данных очень быстро, и при нормальной работе вы НИКОГДА не должны ее использовать. После запуска такого демона, заставьте хост со странной почтовой программой послать сообщение на ваш хост. Весь траффик сообщений из и в sendmail, включая входящий траффик SMTP, будет запротоколирован в этом файле.

3.8. Тестирование Файлов Конфигурации При построениии таблицы конфигурации, вы можете произвести некоторое тестирование, используя "тестовый режим" sendmail. Например, вы можете запустить sendmail так: sendmail -bt -Ctest.cf что заставит sendmail прочитать файл конфигурации "test.cf" и войти в тестовый режим. В этом режиме, вы вводите строки типа: rwset address где rwset - набор правил перезаписи, который вы хотите использовать, а address - это адрес, к которому вы хотите его применить. Тестовый режим покажет вам шаги при обработке, показав в конце окончательно полученный адрес. Вы можете использовать список правил перезаписи, разделенный запятыми, для последовательного применения на входе. Например: 3,1,21,4 monet:bollard сначала применит третий набор правил к адресу "monet:bollard." Затем к полученному после третьего набора правил будет применен набор правил один, затем точно также наборы правил двадцать один и четыре.

Если вам нужна большая детализация, вы можете также использовать флаг "-d21" для включения режима отладки. Например,

sendmail -bt -d21.99 включит невероятное количество информации; адрес из одного слова может выдать в результате несколько страниц нужной информации.

Необходимо предупредить, что внутренне sendmail применяет набор правил 3 ко всем адресам. В тестовом режиме, вы должны делать это вручную. Например, старые версии позволяли вам использовать

0 bruce@broadcast.sony.com Эта версия требует, чтобы вы использовали: 3,0 bruce@broadcast.sony.com Начиная с версии 8.7, в тестовом режиме стали доступны и некоторые другие вещи:
 
+o .Dxзначение  Указывает макросу x иметь указанное значение. Это полезно, когда отлаживаемые правила используют синтаксис $&x. 
+o .Ccзначение  Добавляет указанное значение к классу c. 
+o .Sнабор_правил  Распечатывает содержимое указанного набора правил. 
+o -ddebug-spec  Эквивалентно флагу командной строки. 
3.9. Существующая Информация о Статусе Хоста При включенном HostStatusDirectory, информация о статусе хостов находится на диске, и поэтому может быть использована одновременно несколькими процессами sendmail. Статус последнего соединения с каждым удаленным хостом может быть просмотрен командой: sendmail -bh Эта информация может быть обнулена командой: sendmail -bH Опустошение информации предотвращает ее загрузку новыми процессами sendmail, но не обнуляет уже имеющуюся у запущенных процессов информацию о статусе.

1. То есть, он выставляет свой эффективный uid соответственно настоящему uid; таким образом, если вы запускаете его как root, или из root'овского файла crontab, или во время запуска системы, пермиссии root будут учтены. [назад]



╘2001 Александр С. Плотников
4. Настройка

В зависимости от потребностей вашего узла, вы можете захотеть изменить те или иные конфигурационные параметры. Большинство из них устанавливаются опциями в файле конфигурации. Например, строка "O Timeout.queuereturn=5d" устанавливает опции "Timeout.queuereturn" значение "5d" (пять дней).

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

Все версии sendmail до 8.7 имели имена опций, состоящие из одного символа. С 8.7, опции имеют длинные (состоящие из нескольких символов) имена. Хотя старые короткие имена до сих пор принимаются, многие новые опции не имеют коротких эквивалентов.

Этот раздел описывает только те опции, которые вам, вероятно, захочется изменить; более детальное описание опций дано в разделе 5.

4.1. Таймауты Все временные интервалы устанавливаются с использованием масштабного синтаксиса. Например, "10m" означает десять минут, в то время как "2h30m" означает два с половиной часа. Вот полный набор масштабов:
 
Секунды 
Минуты 
Часы 
Дни 
Недели 
4.1.1. Интервал Очереди Аргумент для флага -q определяет, как часто поддемон будет обрабатывать очередь. Обычно это значение меняется от пятнадцати минут до одного часа. Секция 5.3.1.1 RFC 1123 рекомендует устанавливать его равным как минимум 30 минутам. 4.1.2. Таймауты Чтения Все таймауты имеют имена типа "Timeout.подопция". Все распознаваемые подопции, их значения по умолчанию, и минимальные значения, позволяемые секцией 5.3.2 RFC 1123 таковы:
 
connect  Время ожидания открытия SMTP соединения (системный вызов connect(2)) [0, неопределенное]. Если оно равно нулю, то используется значение из ядра системы. Эта опция ни в каком случае не может иметь значение больше, чем это позволяет ядро, но может быть меньше. Это сделано, чтобы обойти ядра, позволяющие абсурдно длительный таймаут соединения (в некоторых случаях 90 минут). 
iconnect  То же самое, что connect, кроме того, что оно применяется только для первичной попытки соединения с хостом для заданного сообщения [0, неопределенное]. Концепция такова: это значение должно быть очень небольшим (несколько секунд); хосты с хорошим соединением и отвечающие хосты, таким образом, будут обслужены немедленно. Медленные хосты не будут задерживать остальные доставки на стадии начальной попытки доставки. 
initial  Ожидание начального приветственного сообщения 220 [5m, 5m]. 
helo  Ожидание ответа на команду HELO или EHLO [5m, неопределенное]. Это может потребовать просмотра имени хоста, поэтому пять минут, возможно, вполне приемлемый минимум. 
mail|  Время ожидания ответа на команду MAIL [10m, 5m]. 
rcpt|  Время ожидания ответа на команду RCPT [1h, 5m]. Это значение должно быть большим, из-за того, что оно может указывать на список, и его расширение может занять много времени (смотри ниже). 
datainit|  Время ожидания ответа на команду DATA [5m, 2m]. 
datablock|= Ожидание прочтения блока данных (то есть, тела сообщения). [1h, 3m]. Это значение должно быть большим, потому что оно также применяется к программам, которые могут достаточно медленно выводить данные в sendmail. 
datafinal|  Время ожидания ответа на точку, завершающую сообщение. [1h, 10m]. Если это значение короче, чем время, необходимое получателю для получения сообщения, будет сделана повторная передача. Это описывается в RFC 1047.
rset  Время ожидания ответа на команду RSET [5m, неопределенное]. 
quit  Время ожидания ответа на команду QUIT [2m, неопределенное]. 
misc  Время ожидания ответа на различные (но короткие) команды, типа NOOP (нет операции) и VERB (переход в подробный режим). [2m, неопределенное]. 
command|= Для сервера SMTP, время ожидания следующей команды. [1h, 5m]. 
ident= Время ожидания ответа на запрос IDENT [30s1, неопределенное].
fileopen= Таймаут на открытие файлов .forward и :include: [60сек, неопределенное]]
control= Таймаут на завершение полной транзакции управляющего сокета.
hoststatus= Сколько времени информация о хосте (например, о том, что он отключен) будет кэширована, прежде чем она устареет [30m, неопределеное]. 
resolver.retrans Интервал времени (в секундах) между повторами определителя имён [различное]. Устанавливает сразу и Timeout.resolver.retrans.first и Timeout.resolver.retrans.normal.
resolver.retrans.first Интервал времени (в секундах) между повторами определителя имён при первой попытке отправки сообщения [различное].
resolver.retrans.normal Интервал времени (в секундах) между повторами определителя имён для всех попыток отправки сообщения, кроме первой [различное]. 
resolver.retry Количество попыток передачи запроса определителя имен (резолвера). Устанавливает сразу и Timeout.resolver.retry.first и Timeout.resolver.retry.normal.
resolver.retry.first Количество попыток передачи запроса определителя имен для первой попытки доставки сообщения [различное].
resolver.retry.normal Количество попыток передачи запроса определителя имен для всех попыток доставки сообщения, кроме первой [различное].

Для совместимости со старыми файлами конфигурации, если ни одна подопция не определена, таймауты обозначенные знаком | устанавливаются равными указанному значению. Все, кроме обозначенных знаком = применяются к клиентскому SMTP.

Многие из минимальных значений в RFC 1123 слишком малы. Sendmail был разработан для протоколов RFC 822, которые не определяют таймауты чтения; следовательно, версии sendmail до 8.1 не гарантируют быстрого ответа на сообщения. В частности, команда "RCPT" определяющая список рассылки будет расширена и проверит весь список полностью; большой список на медленной системе может запросто занять времени больше, чем пять минут2. Я рекомендую таймаут в один час - так как обрывы соединения во время фазы RCPT достаточно редки, длительный таймаут не обременителен, но может сильно помочь в уменьшении загрузки сети и дубликатов сообщений.

Например, строки:

O Timeout.command=25

 O Timeout.datablock=3h

Устанавливает серверу SMTP таймаут на команды 25 минут и таймаут на ввод блока данных 3 часа. 4.1.3. Таймауты Сообщений Если сообщение будет находиться в очереди несколько дней, то время его обработки закончится. Это делается для того, чтобы быть уверенным, что отправитель, по крайней мере, предупрежден о невозможности доставки сообщения. Обычно таймаут равен пяти дням. Иногда удобно также посылать предупреждение, если сообщение находится в очереди на протяжении нескольких часов (подразумевается, что обычно у вас хорошая связь; если же обычно отсылка ваших сообщений занимает несколько часов, то вам не захочется получать такие сообщения, так как это вполне нормальное событие). Эти таймауты выставляются опциями Timeout.queuereturn и Timeout.queuewarn в файле конфигурации (раньше оба значения выставлялись опцией T).

Если сообщение передано с использованием расширения SMTP NOTIFY, предупредительные сообщения удут посланы только если указано NOTIFY=DELAY. Таймауты queuereturn и queuewarn могут быть далее квалифицированы тегом, основанным на поле Precedence: в сообщении; он может быть одним из "urgent" ("срочно") (ненулевое значение precedence), "normal" (нулевое значение precedence), или "non-urgent" (отрицательное значение precedence). Например, "Timeout.queuewarn.urgent=1h" устанавливает таймаут предупреждения только для срочных сообщений в один час. По умолчанию, если преимущество не указано - указывать таймаут для всех. Для возврата значений немедленно во время прохода очереди (то есть, для отброса сообщений независимо от времени их нахождения в очереди) можно использовать для -O Timeout.queuereturn значение "now".

Так как эти опции глобальны, и вы не знаете заранее, сколько времени хост вне вашего домена будет отключен, рекомендуемый таймаут составляет пять дней. Это позволяет получателю исправить проблему, даже если она случилась в самом начале длительных выходных. Секция 5.3.1.1 RFC 1123 говорит, что этот параметр должен быть "как минимум 4-5 дней".

Значение Timeout.queuewarn может быть вложено в опцию T указанием времени, по истечении которого должно быть послано предупреждение; два таймаута разделяются слешем. Например, строка

OT5d/4h говорит о том, что посылка сообщения должна быть прекращена через пять дней, а предупреждение должно быть послано через четыре часа. Это значение должно быть достаточно большим, чтобы несколько раз попытаться доставить сообщение. 4.2. Ветвление во время проходов очереди Указанием опции ForkEachJob (Y), можно заставить sendmail ветвиться перед каждым отдельным сообщением во время прохода очереди. Это защитит вас от потребления sendmail большого количества памяти, что очень полезно, если у вас не очень много памяти. Однако если опция ForkEachJob не выставлена, sendmail во время прохода очереди будет помнить об отключенных хостах, что может повысить производительность системы.

Если опция ForkEachJob не выставлена, sendmail не может использовать кэшированные соединения.

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

Размер сообщения здесь используется для того, чтобы более большие сообщения обрабатывались после относительно небольших. Класс сообщения позволяет пользователям посылать "высокоприоритетные" сообщения включая поле "Precedence:" в свои сообщения; Значение этого поля просматривается в строках P файла конфигурации. Вследствие того, что количество получателей сообщения может влиять на загрузку, оно также включено в приоритет.

Коэффициенты получателя и класса могут быть установлены в файле конфигурации, используя опции RecipientFactor (y) и ClassFactor (z) соответственно. По умолчанию, они равны: 30000 (для коэффициента получателя) и 1800 (для коэффициента класса). Первичный приоритет таков:

pri = msgsize - (class умноженный на ClassFactor) + (nrcpt умноженное на RecipientFactor)

(Запомните, более высокое значение этого параметра на самом деле означает, что работа будет обработана с низким приоритетом.)

Приоритет работы скорректирован при каждой обработке сообщения (то есть, при каждой попытке его доставки) использованием "рабочего коэффициента времени", установленного опцией RetryFactor (Z). Он добавляется к приоритету, поэтому обычно он уменьшает старшинство работы, на основании того, что работа, не выполненная много раз, вполне может быть не выполнена опять. Опция RetryFactor по умолчанию равна 90000.

4.4. Ограничение Загрузки Sendmail можно попросить принимать и откладывать в очередь (но не доставлять) почту, если средняя загрузка системы становиться слишком большой. Для этого используется опция QueueLA (x). Когда средняя загрузка системы превышает значение опции QueueLA, устанавливается режим q (только очередь), если опция QueueFactor (q) деленная на разность средней загрузки системы и значения опции QueueLA плюс единица, превысит приоритет сообщения - то есть, сообщение откладывается в очередь, если, и только если:

pri > { QueueFactor } / { LA - { QueueLA } + 1 }

По умолчанию опция QueueFactor равна 600000, так что каждая единица средней загрузки стоит 600000 пунктов приоритета (как описано выше).

Для крутых случаев, опция RefuseLA (X) определяет среднюю загрузку, при которой sendmail будет отказываться принимать сетевые соединения. Локально созданная почта (включая входящую почту UUCP) будет приниматься.

4.5. Режим Доставки Существует большое количество режимов доставки, в которых может работать sendmail, указанных конфигурационной опцией DeliveryMode (d). Эти режимы определяют, как быстро почта будет доставлена. Доступные режимы:
 
Интерактивная доставка (синхронная) 
Доставка в фоне (асинхронная) 
Только очередь (не доставлять) 
Отложить попытку доставки (не доставлять) 

Есть и компромиссы. Режим "i" дает отправителю быстрейшую обратную связь, но может замедлить некоторые почтовые программы намного больше необходимого. Режим "b" доставляет быстро, но может наплодить кучу процессов, если ваша почтовая программа тратит много времени на доставку сообщений. Режим "q" минимизирует загрузку вашей машины, но доставка сообщений будет задержана до наступления очередного интервала. Режим "d" идентичен режиму "q", за исключением того, что он также предотвращает работу всех просмотров; он предназначен для узлов "dial on demand", где просмотр DNS может стоить реальные деньги. Некоторые простые сообщения об ошибках (например, host unknown) в этом режиме будут задержаны. По умолчанию обычно используется режим "b".

Если вы запускаете sendmail в режиме "q" (только очередь), "d" (отсрочка), или "b" (доставка в фоне), то он не будет разворачивать псевдонимы и следовать файлам .forward, вплоть до первого получения почты. Это ускоряет ответ на команду RCPT. Режим "i" не может быть использован сервером SMTP.

4.6. Уровни Протоколирования Sendmail'у может быть указан уровень протоколирования. По умолчанию стандартной таблицей конфигурации используется уровень 9. Имеются следующие уровни:
 
Минимальный протокол 
Серьезные системные ошибки и потенциальные проблемы безопасности 
Потери соединений (сетевые проблемы) и ошибки протокола 
Другие серьезные ошибки, неправильные адреса, временные ошибки forward/include, таймауты соединений. 
Несущественные неисправности, устаревание базы данных псевдонимов, отказы соединений из-за проверочных наборов правил (check_rulests)
Статистика сбора сообщений 
Создание сообщений об ошибках, командах VRFY и EXPN. 
Ошибки доставки (хост или пользователь не известен и т.д.) 
Успешные доставки и перестроения базы псевдонимов. 
Отложенные сообщения (из-за того, что хост отключен и т.д.) 
10 
Расширение базы данных (просмотры псевдонимов, перенаправлений и пользователей) 
11
Ошибки NIS и окончание обработок
12 
Протоколирование всех соединений SMTP. 
13
Протоколирование плохих пользовательских оболочек, файлов с несоответствующими пермиссиями, и других спорных ситуаций.
14
Протоколирование всех отказов от соединений
15
Протоколирование всех входящих и исходящих команд SMTP.
20 
Протоколирует попытки обработки заблокированных файлов в очереди. Это не ошибки, но может быть полезно, если ваша очередь становится перегруженной. 
30 
Потерянные блокировки (только если вы используете lockf вместо flock). 

Дополнительно, значения выше 64 зарезервированы для очень болтливого вывода при отладке. Никто в здравом уме не поставит такой уровень.

4.7. Файловые Режимы Режимы, используемые для файлов, зависят от желаемой функциональности и требуемого уровня безопасности. Во многих случаях sendmail производит осторожную проверку режимов доступа к файлам и каталогам, во избежание различных опасных ситуаций; если вам нужно, чтобы группа имела разрешение на запись в поддерживающие файлы, то вам нужно использовать опцию DontBlameSendmail для отключения некоторых из этих проверок. 4.7.1. suid или не suid? Sendmail может вполне безопасно сделан setuid на root. Тогда, когда он собирается запустить с помощью exec(2) почтовую программу, он проверяет, равен ли userid нулю; если равен, то он переустанавливает userid и groupid на значения по умолчанию (выставляемые равенством U= в строке почтовой программы; если это равенство не установлено, используется опция DefaultUser). Это может быть преодолено выставкой флага S у почтовой программы для доверенных почтовых программ, которые могут быть запущены от root. Однако, это заставит обработку почты быть засчитанной sa(8) как потребление пользователем root системных ресурсов, вместо того, чтобы засчитать это пользователю, посылающему почту.

Если вы не делаете sendmail setuid'ным на root, он все равно будет работать, но вы потеряете большиую часть функциональности и конфиденциальности, а так же вам придется открыть всем на запись каталог очереди. Также вы можете сделать sendmail setuid'ным на какого-либо псевдопользователя (например, создав пользователя "sendmail" и сделав sendmail setuid'ным на него) что исправит проблему конфиденциальности, но не вопросы функциональности. В некотоых операционных системах при этом появится проблема выдачи специальных привелегий. Также, это не будет являться гарантией безопасности: например, пользователь root посылает почту, и демон будет часто работать от пользователя root. Однако, нужно заметить, что sendmail  должен работать от пользователя root или от специального пользователя для создания слушающего сокета SMTP.

В качестве компромисса можно сделать sendmail setuid'ным на пользователя root, но выставить опцию RunAsUser. В результате это заставит sendmail стать указанным пользователем сразу же после запуска, требующего привилегии пользователя root (главным образом, открытия порта SMTP). Если вы используете опцию RunAsUser, каталог очереди (обычно /var/spool/mqueue) должен принадлежать этому пользователю, а все файлы и базы данных (включая пользовательские файлы .forward, файлы псевдонимов, файлы :include:, и внешние базы данных) должны быть открыты для этого пользователя на чтение. Так же, так как sendmail не может изменить свой uid, доставка в программы или файлы будут отмечены как небезопасные, то есть недоставляемые в файлах .forward, aliases и :include:. Администраторы могут преодолеть это выставкой опции DontBlameSendmail в NonRootSafeAddr. RunAsUser скорее всего наиболее подходит для конфигурации на брандмауэрах, не имеющих регулярных заходов пользователей.

4.7.2. Отключение Проверок Безопасности Sendmail очень сильно обращает внимание на режимы доступа к файлам, которые он читает и в которые пишет. Например, по умолчанию, он отказывается читать большинство файлов, открытых на запись для группы на основании того, что они могут быть искажены кем-либо из группы, а не владельцем; он даже откажется прочитать файлы в каталогах, открытых на запись для группы.

Если вы совершенно уверены, что ваша конфигурация находится в безопасности, и вы хотите, чтобы sendmail не производил таких проверок, вы можете отключить конкретные проверки, используя опцию DontBlameSendmail. Эта опция берет одно или более имен, для которых проверка отключена. В последующем описании под "небезопасным каталогом" считается каталог, в который может писать кто-либо еще кроме владельца. Значения могут быть такие:
 
Safe Никакой специальной обработки
AssumeSafeChown Считать, что системный вызов chown запрещен пользователю root. Из-за того, что некоторые версии Unix разрешают обычным пользователям отдавать свои файлы другим пользователям на некоторых файловых системах, sendmail часто не может считать, что данный файл был создан владельцем, в частности, если он находится в откытом на запись каталоге. Вы можете выставить этот флаг, если вы знаете, что отдача файлов в вашей системе запрещена.
ClassFileInUnsafeDirPath Во время чтения файлов класса (используя строку F в файле конфигурации), разрешать файлы, находящиеся в небезопасных каталогах.
DontWarnForwardFileInUnsafeDirPath Предотвращает протоколирование предупреждений о небезопасных  путях в каталоги для несуществующих файлов перенаправления.
ErrorHeaderInUnsafeDirPath Разрешить файлу названному в опции ErrorHeader находиться в небезопасном каталоге.
FileDeliveryToHardLink Разрешить доставку в файлы, являющиеся жесткими ссылками.
FileDeliveryToSymLink Разрешить доставку в файлы, являющиеся символическими ссылками.
ForwardFileInGroupWritableDirPath Разрешить файлы .forward в каталогах доступных на запись для группы.
ForwardFileInUnsafeDirPath Разрешить файлы .forward в небезопасных каталогах.
ForwardFileInUnsafeDirPathSafe Разрешить файлам .forward в небезопасных каталогахвключать ссылки на программы и файлы.
GroupWritableAliasFile Разрешить группе доступ по записи к файлу псевдонимов.
GroupWritableDirPathSafe Изменить определение "небезопасного каталога" так, чтобы каталоги, открытые на запись для группы считались безопасными. Каталоги, открытые на запись для всех всегда считаются небезопасными.
GroupWritableForwardFileSafe Разрешить файлы forward открытые на запись для группы.
GroupWritableIncludeFileSafe Разрешить файлы :include: открытые на запись для группы.
HelpFileInUnsafeDirPath Разрешить файлу, названному в опции HelpFile находиться в небезопасном каталоге
IncludeFileInGroupWritableDirPath Разрешить файлы :include: находящиеся в каталогах, открытых на запись для группы.
IncludeFileInUnsafeDirPath Разрешить файлы :include: находящиеся в небезопасных каталогах
IncludeFileInUnsafeDirPathSafe Разрешить файлам :include: находящимся в небезопасных каталогах включать ссылки на программы и файлы.
InsufficientEntropy Пытаться использовать STARTTLS, даже если PRNG для OpenSSL неправильно посеян, несмотря на проблемы безопасности.
LinkedAliasFileInWritableDir Разрешить файл псевдонимов, являющийся ссылкой в каталоге, открытом на запись.
LinkedClassFileInWritableDir Разрешить файлы классов, являющиеся ссылками в каталогах, открытых на запись.
LinkedForwardFileInWritableDir Разрешить файлы .forward, являющиеся ссылками в каталогах, открытых на запись.
LinkedIncludeFileInWritableDir Разрешить файлы :include:, являющиеся ссылками в каталогах, открытых на запись.
LinkedMapInWritableDir Разрешить файлы преобразований, являющиеся ссылками в каталогах, открытых на запись.
LinkedServiceSwitchFileInWritableDir Разрешить файлу сервисного переключателя быть ссылкой, даже если каталог открыт на запись.
MapInUnsafeDirPath Разрешить файлы преобразований (например, файлы hash, btree, и dbm) в небезопасных каталогах.
NonRootSafeAddr Не отмечать доставку в файлы и программы как небезопасные, если sendmail работает не от пользователя root.
RunProgramInUnsafeDirPath Поехали, давайте еще и запускать программы в каталогах, открытых на запись.
RunWritableProgram Ну, давайте еще и запускать те программы, в которые может писать и группа, и вообще кто угодно.
TrustStickyBit Разрешить каталоги, доступные группам и всем остальным на запись, если каталог имеет sticky bit. Не используйте в системах, которые не разрешают sticky bit для каталогов.
WorldWritableAliasFile Принимать файлы псевдонимов, открытые на запись для всех.
WriteMapToHardLink Разрешить запись в преобразования, являющиеся жесткими ссылками.
WriteMapToSymLink Разрешить запись в преобразования, являющиеся символическими ссылками.
WriteStatsToHardLink Разрешить файлу статуса быть жесткой ссылкой.
WriteStatsToSymLink Разрешить файлу статуса быть символической ссылкой.

4.8. Кэширование Соединения При обработке очереди, sendmail будет пытаться держать несколько последних соединений открытыми, во избежание потерь при запуске и остановке. Это применяется только к IPC соединениям.

При попытке открыть соединение, первым проверяется кэш. Если найдено открытое соединение, оно проверяется на предмет активности посылкой команды RSET. Если произойдет ошибка, то соединение будет закрыто и заново открыто.

Кэшем соединений управляют два параметра. Опция ConnectionCacheSize (k) определяет количество позволенных одновременно открытых соединений. Если оно равно нулю, соединения будут закрываться, как только это станет возможным. По умолчанию оно равно одному. Его можно установить такого размера, как вам потребуется; оно будет ограничивать количество системных ресурсов, используемых sendmail при обработке очереди. Никогда не устанавливайте это значение больше 4.

Опция ConnectionCacheTimeout (K) определяет максимальное время бездеятельности любого кэшированного соединения. Когда время простоя превысит это значение, соединение будет закрыто. Это число должно быть небольшим (до 10 минут), чтобы вы не занимали системные ресурсы других машин. Значение по умолчанию пять минут.

4.9. Доступ к Серверу Имен Управление просмотром адресов хостов назначается вхождением сервиса hosts в вашем файле сервисного переключателя. Если ваша система имеет встроенную поддержку сервисного переключателя (например, Ultrix, Solaris, или DEC OSF/1) то вполне вероятно, что ваша система уже нормально сконфигурирована. В ином случае, sendmail проконсультируется с файлом /etc/service.switch, который должен быть создан. Sendmail использует только два вхождения: hosts и aliases, хотя системные программы могут использовать иные сервисы (особенно сервис passwd для просмотра имени пользователя с помощью getpwname).

Однако, некоторые системы (типа SunOS 4.x) будут производить просмотр DNS независимо от установленных значений сервисного переключателя. В частности, системная подпрограмма gethostbyname(3) используется для просмотра имен хостов, а многие версии поставщиков пытаются использовать комбинации DNS, NIS, и просмотр файла /etc/hosts без консультации с сервисным переключателем. Sendmail не пытается обойти эту проблему, и просмотр DNS будет сделан в любом случае. Если же у вас вообще не сконфигурирован сервер имен, например, у вас чисто UUCP узел, sendmail будет получать сообщения "connection refused" при попытке соединения с сервером имен. Если вхождение hosts переключателя имеет перечисленным в любом месте списка сервис "dns", sendmail будет считать это временной неудачей и поставит сообщение в очередь для последующей обработки; другими словами, он игнорирует данные сервера имен.

Такая же технология используется при решении о просмотре MX. Если вы хотите иметь поддержку MX, вы должны иметь "dns" перечисленным как сервис во вхождении hosts переключателя.

Опция ResolverOptions (I) позволяет вам изменять опции сервера имен. Командная строка принимает последовательность флагов, как описано в resolver(3) (с удаленным первым "RES_"). Каждый из них может быть предварен опциональным "+" или "-". Например, строка

O ResolverOptions=+AAONLY -DNSRCH включает опцию AAONLY (принимать только авторитативные сообщения) и выключает опцию DNSRCH (поиск по доменному пути). По умолчанию большинство флагов библиотеки разрешителя отключены, включены только DNSRCH, DEFNAMES, и RECURSE. Вы также можете включить "HasWildcardMX", чтобы указать, что существует масочная запись MX, соответствующая вашему домену; это отключает сопоставление MX при канонификации имен, что может привести к неверной канонификации.

Версия конфигурации уровня 1 выключает DNSRCH и DEFNAMES для просмотров, делаемых при доставке, но оставляет их включенными во всех остальных случаях. Версия 8 sendmail игнорирует их при канонификационных просмотрах (при использовании $[ ... $]), и всегда делает поиск. Если вы не хотите автоматического расширения имен, не вызывайте $[ ... $].

Правила поиска для $[ ... $] - это скорее что-то непохожее, чем необычное. Если просматриваемое имя имеет хотя бы одну точку, оно всегда будет опробовано без изменений. Если это не удастся, будет опробован уменьшенный путь поиска, и в конце концов будет опробовано неизмененное имя (но только для имен без точек, потому что имена с точками уже были опробованы). Это позволяет именам типа "utc.CS" совпадать с узлами в Чехословакии, а не с узлами в вашем местном отделении Computer Science. Они также предпочитают записи типов A и CNAME записям типа MX- поэтому, если находится запись MX, о ней делается заметка, но просмотр продолжается. Таким образом, если вы имеете масочную запись MX, соответствующую вашему домену, то это не будет распознано, как будто все имена совпадают с ней.

Для полного выключения доступа к серверу имен в, системах без поддержки сервисного переключателя (типа SunOS 4.x), вы должны будете перекомпилировать sendmail с -DNAMED_BIND=0 и удалив -lresolv из списка искомых при линковании библиотек.

4.10. Перемещение Пользовательских Файлов Перенаправления Некоторые узлы монтируют домашние каталоги пользователей с локальных дисков их рабочих станций, потому, что локальный доступ быстрее. Однако при этом замедляется просмотр файлов .forward. В некоторых случаях, почта может быть доставлена неправильно, из-за отключения файлового сервера. Быстродействие может быть особенно медленным, если вы используете автоматическое монтирование.

Опция ForwardPath (J) позволяет вам назначить путь к файлам перенаправления. Например, строка файла конфигурации

O ForwardPath=/var/forward/$u:$z/.forward.$w Сначала будет искать файл с именем, совпадающим с именем пользователя в /var/forward; если он не найден, или к нему нет доступа, в домашнем каталоге пользователя будет искаться файл ".forward.machinename". Только узел настоящих извращенцев может также искать по отправителю, используя $r, $s, или $f.

Если вы создаете каталог типа /var/forward, он должен иметь пермиссии 1777 (то есть, должен быть выставлен sticky bit). Пользователи должны создавать файлы с пермиссиями 644. Заметьте, что для разрешения файлов перенаправления в каталоге, открытом всем на запись, вы должны использовать флаги ForwardFileInUnsafeDirPath и ForwardFileInUnsafeDirPathSafe с опцией DontBlameSendmail. Это может быть использовано для атак типа "отказ от обслуживания (DoS) (пользователи могут создавать файлы перенаправления для других пользователей); наилучшим подходом может быть создание каталога /var/forward с доступом 755 и созданием в нём пустых файлов для каждого пользователя, принадлежащих данным пользователям с доступом 644. Если вы сделаете так, то вам не прийдется выставлять опции DontBlameSendmail, как указано выше.

4.11. Свободное Пространство В системах, имеющих один из системных вызовов семейства statfs(2) (включая statvfs и ustat), вы можете указать минимальное количество свободных блоков в файловой системе очереди, используя опцию MinFreeBlocks (b). Если в файловой системе, содержащей очередь, доступно меньше, чем указанное количество блоков, сервер SMTP будет отказываться от почты кодом ошибки 452. Такой отказ приглашает клиентов SMTP попытаться установить соединение позднее.

Не устанавливайте значение этой опции слишком высоким; это может повлечь отказ от почты в тех случаях, когда она может быть спокойно обработана.

4.12. Максимальный размер сообщения Во избежание переполнения вашей системы большим сообщением, может быть выставлена опция MaxMessageSize, указывающая абсолютное ограничение размера любого сообщения. Это будет сообщено в диалоге ESMTP и проверено при передаче сообщения. 4.13. Флаги Конфиденциальности Опция PrivacyOptions (p) позволяет вам установить конкретные "конфиденциальные" флаги. На самом деле, многие из них не дадут вам экстра конфиденциальности, а только лишь настоят на том, чтобы клиентские сервера SMTP использовали команду HELO до использования конкретных команд, или добавлением дополнительных заголовков, для распознания попыток обмана.

Опция принимает последовательности имен флагов; крайняя конфиденциальность - включение всех этих флагов. Например:

O PrivacyOptions=needmailhelo, noexpn Настоит на том, чтобы команда HELO или EHLO была использована до принятия команды MAIL и отключает команду EXPN.

Флаги подробно описаны в разделе 5.6.

4.14. И Мне Тоже Пришлите Начиная с версии 8.10, sendmail по умолчанию включает (конвертного) отправителя в любой список. Например, если "matt" посылает письмо в список, содержащий "matt" как одного из своих членов, то он получит копию своего же сообщения. Если оция MeToo выставлена в FALSE (в файле конфигурации, или в командной строке), то такое поведение изменяется, то есть (конвертный) отправитель исключается из расширенного списка.

1. В некоторых системах по умолчанию нуль, чтобы окончательно отключить протокол. [назад]

2. Эта проверка включает просмотр каждого адреса сервером имен; что добавляет сетевые задержки, но в некоторых случаях может быть приемлемо. [назад]



╘2001 Александр С. Плотников
5. Полное Описание Файла Конфигурации

Этот раздел детально описывает файл конфигурации.

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

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

5.1. R и S - Правила Перезаписи Ядром синтаксического анализа адресов являются правила перезаписи. Они являются упорядоченной системой обработки. Sendmail просматривает набор правил перезаписи, ища совпадения в левосторонней части (LHS) правила. Если правило подходит, адрес замещается правосторонней частью (RHS) правила.

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

Синтаксис этих двух команд такой:

Sn Устанавливает текущий набор правил в n. Если вы начинаете набор правил уже не в первый раз, то это будет добавлено к старому определению. Rlhs rhs comments Поля должны быть разделены как минимум одним символом табуляции; поля могут содержать пробелы. lhs - это шаблон, применяемый на входе. Если он подходит, вывод переписывается на rhs. Комментарии игнорируются.

Макрорасширения в виде $x выполняются при чтении файла конфигурации. Знак $ может быть включён использованием $$.Расширения вида $&x выполняются во время работы, используя какой-либо менее общий алгоритм. Это предназначено только для ссылочных внутренне определенных макросов, типа $h, изменяющихся во время работы.

5.1.1. Левосторонняя часть (LHS) Левосторонняя часть правил перезаписи содержит шаблон. Обычные слова просто напрямую сравниваются. Метасинтаксис вводится использованием знака доллара. Метасимволы это:
 
$*
Совпадение нуля или более лексем 
$+
Совпадение одного или более лексем 
$-
Совпадение ровно одной лексемы
$=x
Совпадение любой фразы класса x
$~x
Совпадение любого слова не входящего в класс x

При любом из этих совпадений, они назначаются символу $n для замены в правосторонней части, где n - индекс в LHS. Например, если LHS:

$-:$+ применена к входу: UCBARPA:eric Правило совпадет, и значения переданные в RHS будут такими: $1 UCBARPA

 $2 eric

Дополнительно, LHS может включать $@ для совпадения нулевыми лексемами. Это не граница $n в RHS, и обычно используется только сама по себе, чтобы соответствовать нулевому входу. 5.1.2. Правосторонняя часть Когда левосторонняя часть правила перезаписи совпадает, входная информация удаляется и замещается правосторонней частью. Лексемы копируются прямо из RHS, если они не начинаются со знака доллара. Метасимволы таковы:
 
$n
Заместить неопределенную лексему n из LHS
$[name$]
Канонизировать имя
$(map key $@arguments $:default $)
Обобщенная ключевая функция преобразования
$>n
"Вызов" набора правил n
$#mailer
Решение в mailer
$@host
Определить host
$:user
Определить user

Синтаксис $n замещает соответствующее значение из $+, $-, $*, $=, или $~ совпадения в LHS. Это может быть использовано везде.

Имя хоста, заключенное между $[ и $] просматривается в базе(ах) данных хостов и заменяется на каноническое имя 1. Например, "$[ftp$]" может стать "ftp.CS.Berkeley.EDU", а "$[[128.32.130.2]$]" может стать "vangogh.CS.Berkeley.EDU.". Sendmail распознает его числовой IP адрес без вызова сервера имен и замещает его своим каноническим именем.

Синтаксис $( ... $) - более общая форма просмотра; он использует названное преобразование вместо неявного. Если ничего не найдено, вставляется указанное умолчание; если умолчание не определено, и ничего не найдено, значение остается без изменений. Аргументы передаются в преобразование для возможного использования.

Синтаксис $>n заставляет остаток строки замещать обычным образом, а затем передать как аргумент в набор правил n. Конечное значение набора правил n затем подставляется в это правило.

Синтаксис $> распространяется на все после имени набора правил и до конца замещаемой строки, а затем передается как первичный вход в набор правил. Позволяются рекурсивные вызовы. Например,

$>0 $>3 $1 расширяет $1, передает его в набор правил 3, а затем передает результат набора правил 3 в набор правил 0.

Синтаксис $# должен быть использован только в наборе правил 0, или подпрограмме набора правил 0. Он приводит к немедленному завершению выполнения набора правил, и сигнализирует sendmail, что адрес полностью разрешен. Полный синтаксис таков:

$#mailer $@host $:user Он определяет тройку {mailer, host, user}, необходимую для почтовой программы. Если почтовая программа локальна, то часть host может быть опущена2. Мailer должен быть одним словом, а host и user могут состоять из нескольких частей. Если mailer является встроенным IPC mailer'ом, host может быть списком хостов, разделенных запятыми, который просматривается в поисках первого работающего адреса (точно как записи типа MX). Позднее user переписывается специфическим для данной почтовой программы набором правил перезаписи, и назначается макросу $u. В особом случае, если определенный mailer имеет ОПРЕДЕЛЕНЫЙ флаг F=@ и первый символ значения $: является "@", "@" обрезается, и выставляется флаг в описании адреса, заставляющий sendmail не применят обработку по набору правил 5.

Обычно, если правило имеет совпадение, то оно применяется снова, поэтому правило идет по кругу до появления ошибки. RHS может быть предварена $@ или $: для изменения такого поведения. Префикс A $@ заставляет набор правил возвращаться с остатком RHS в качестве значения. Префикс $: заставляет немедленно закончить работу правила, но продолжить работу набора правил; это может быть использовано во избежание продолжения применения правила. Префикс перед продолжением обрезается.

Префиксы $@ и $: могут предшествовать описанию $>; например:

R$+ $: $>7 $1 Совпадает со всем, передает это в набор правил семь, и продолжается; $: необходимо во избежание бесконечной петли.

Замещение происходит в описанном порядке, то есть замещаются параметры из LHS, канонизируются имена хостов, вызываются "подпрограммы", и в конце обрабатываются $#, $@, и $:.

5.1.3. Семантика Наборов Правил Перезаписи Существует шесть наборов правил перезаписи, имеющих специфическую семантику. Взаимоотношения пяти из них изображены на Рис.1.

                    +---+
                 -->| 0 |-->resolved address
                /   +---+
               /          +---+   +---+
              /       --->| 1 |-->| S |--
       +---+ / +---+ /    +---+   +---+  \      +---+
addr-->| 3 |-->| D |                      ----->| 4 |-->msg
       +---+   +---+ \    +---+   +---+  /      +---+
                      --->| 2 |-->| R |--
                          +---+   +---+
Рис.1. Семантика набора правил перезаписи
        D - Добавка домена отправителя
        S - Перезапись отправителя в зависимости от почтовой программы
        R - Перезапись получателя в зависимомти от почтовой программы

Набор правил 3 должен превратить адрес в "каноническую форму". Эта форма должна иметь основной синтаксис:

local-part@host-domain-spec Набор правил 3 применяется sendmail'ом до любых изменений в любом адресе.

Если не определено ни одного знака "@", то hostdomain-spec может быть добавлен (квадратик "D" на Рис.1.) из адреса отправителя (если в определениях почтовых программ для соответствующей отсылающей программы выставлен флаг C).

Набор правил 0 применяется после набора правил 3 к адресу, определяющему получателей. Он должен быть разделен на тройку {mailer, host, user}. Mailer должен быть определен в определениях почтовых программ в файле конфигурации. Host определяется макросом $h для использования в расширенном argv указанной почтовой программы.

Правила 1 и 2 применяются ко всем адресам отправителей и получателей соответственно. Они применяются до любого указания в определении почтовой программы. Их никогда не нужно проверять.

Набор правил 4 применяется ко всем адресам в сообщении. Он обычно используется для перевода из внутренней формы во внешнюю.

В добавок, набор правил 5 применяется ко всем локальным адресам (в частности, к тем, которые разрешаются к почтовой программе с выставленным флагом "F=5") не имеющим псевдонимов. Это последняя ловушка для локальных имен.

5.1.4. Ловушки Наборов Правил Несколько дополнительных наборов правил считаются "ловушками", и могут быть определены для некоторых особенностей. Все они являются именованными наборами правил. Все формы "check_*" выдают статус принять/отказать; переход в конец, или нормальный выход означает принять, а определение $#error - отказать. Многие из них могут иметь результатом специальную почтовую программу $#discard; она принимает сообщение, как будто все прошло успешно, но затем выбрасывает его без доставки. Нужно отметить, что эта почтовая программа не может быть выбрана в наборе правил 0. 5.1.4.1. check_relay Набор правил check relay вызывается после того, как демон принял соединение. Он не вызывается при запуске sendmail с опцией -bs. Он проверяет client.host.name $| client.host.address где $| - метасимвол, разделяющий две части. Это правило может отказать в соединении из различных мест. 5.1.4.2. check_mail Набор правил check mail проверяет параметр имени пользователя из команды SMTP MAIL. Может принять или отвергнуть адрес. 5.1.4.3. check_rcpt Набор правил check rcpt проверяет параметр имени пользователя из команды SMTP RCPT. Может принять или отвергнуть адрес. 5.1.4.4. check_compat Набор правил check_compat проверяет sender-address $| recipient-address где $| - метасимвол, разделяющий адреса. Он может принять или отвергнуть передачу почты между этими двумя адресами, что очень похоже на функцию checkcompat(). 5.1.4.5. check_eoh Набор правил check_eoh проверяет number-of-headers $| size-of-headers где $| - метасимвол, разделяющий числа. Эти числа могут быть использованы для сравнения размеров арифметического преобразования. Набор правил запускается после прочтения всех заголовков. Его можно использовать для сопоставления информации, полученной из этих заголовков посредством преобразования макросом хранения (storage macro). Одно из возможных применений - проверка отсутствия заголовка. Например:
                Kstorage macro
                HMessage-Id: $>CheckMessageId

                SCheckMessageId
                # Record the presence of the header
                R$*            $: $(storage {MessageIdCheck} $@ OK $) $1
                R< $+ @ $+ >   $@ OK
                R$*            $#error $: 553 Header Error

                Scheck_eoh
                # Check the macro
                R$*            $: < $&{MessageIdCheck} >
                # Clear the macro for the next message
                R$*            $: $(storage {MessageIdCheck} $) $1
                # Has a Message-Id: header
                R< $+ >        $@ OK
                # Allow missing Message-Id: from local mail
                R$*            $: < $&{client_name} >
                R< >           $@ OK
                R< $=w >       $@ OK
                # Otherwise, reject the mail
                R$*            $#error $: 553 Header Error
Помните, что Message-Id: необязательный заголовок и не гарантирует индикацию нежелательной рассылки (спама). Этот набор правил и его не  обязательно использрвать. 5.1.4.6. check_etrn Набор правил check_etrn проверяет параметр команды SMTP ETRN. Он может принять или отказать в приёме команды. 5.1.4.7. check_expn Набор правил check_expn проверяет параметр имя пользователя команды SMTP EXPN. Он может принять или отказать в приёме адреса. 5.1.4.8. check_vrfy Набор правил check_vrfy проверяет параметр имя пользователя команды SMTP VRFY. Он может принять или отказать в приёме команды. 5.1.4.9. trust_auth Набор правил check_expn проверяет параметр AUTH= команды SMTP MAIL. Используется для определения степени доверия этому параметру. Для вынесения решения, набор правил может использовать различные макросы ${auth_*}. Если результатом будет почтовая программа "error", то параметру AUTH= не доверяют и, следовательно, не передают на следующий ретранслятор (relay). 5.1.4.10. tls_client Набор правил tls_client вызывается, когда sendmail выступает в качестве сервера, после выполнения команды STARTTLS, и из chesk_mail. Параметром является значение ${verify} и STARTTLS или MAIL, соответственно. Если результатом работы набора правил будет почтовая программа "error", клиенту будет возвращён соответствующий код ошибки. 5.1.4.11. tls_server Набор правил tls_server вызывается, когда sendmail выступает в качестве клиента, после выполнения команды STARTTLS. Параметром является значение ${verify}. Если результатом работы набора правил будет почтовая программа "error", соединение обрывается (считается недоставляемым с постоянной или временной ошибкой). 5.1.5. Почтовые Программы IPC Если набор правил 0 определяет почтовую программу IPC (то есть, почтовая программа имеет "[IPC]" перечисленное в качестве Path в строке конфигурации M), происходит некоторая специальная обработка. Имя хоста, переданное после "$@" имеет найденное расширение MX; при этом имя хоста просматривается в DNS в поисках альтернативных узлов для доставки.

Имя хоста также может быть представлено как четыре числа, разделенные точками в квадратных скобках; например:

[128.32.149.78] Это заставит сделать прямое преобразование числового значения в IP адрес хоста.

Имя хоста, прошедшее после "$@" также может быть списком хостов, разделенных запятыми. Для каждого из них находится MX, а результаты складываются в один длинный список MX. Цель всего этого - создать "фальшивые" записи MX, которых нет в DNS для частных внутренних сетей.

Последний специальный случай - имя хоста может быть передано как текстовая строка в квадратных скобках:

[ucbvax.berkeley.edu] Эта форма избегает MX преобразования. Заметь!: Это предназначено только для ситуаций, когда у вас имеется сетевой firewall, или иной хост, производящий специальную обработку всей вашей почты, так что ваша запись MX указывает на шлюзовую машину; затем эта машина производит прямую доставку на машины в вашем локальном домене. Использование этой особенности напрямую нарушает секцию 5.3.5 RFC 1123: это должно использоваться только в случае, если у вас для этого имеется серьезная причина. 5.2. D - Определение Макроса Имена Макросов состоят из одного символа или из слова в фигурных скобках {}. Имена из одного символа могут быть выбраны из всей таблицы ASCII, пользовательские макросы должны быть выбраны только из набора символов верхнего регистра. Буквы нижнего регистра и специальные символы имеют веутреннее использование. Длинные имена, начинающиеся с буквы нижнего регистра или знака пунктуации, зарезервированы для использования sendmail'ом, поэтому длинные пользовательские имена макросов должны начинаться с буквы верхнего регистра.

Синтаксис определения макросов таков:

Dxval Где x - имя макроса (которое может быть одним символом или словом в скобках), а val - значение, которое должен иметь этот макрос. При этом не должно быть пробелов, не принадлежащих содержимому значения макроса.

Макросы интерполируются использованием конструкции $x, где x - имя макроса для интерполяции. Эта интерполяция производится при чтении файла конфигурации, кроме строк M. Специальная конструкция $&x может быть использована в строках R для получения косвенной интерполяции.

Условные зависимости могут быть определены использованием синтаксиса:

$?x text1 $| text2 $. Это интерполирует text1, если назначен макрос $x, и text2 в обратном случае. Оператор "иначе" ($|) может быть опущен.

Имена макросов из маленьких букв зарезервированы для специальной семантики, используемой при проходе информации в или из sendmail, а специальные символы зарезервированы для условий и т.п. Имена из заглавных букв (т.е., от $A до $Z) специально зарезервированы для авторов файла конфигурации.

Следующие макросы определяются и/или внутренне используются sendmail'ом для интерполирования в argv для почтовых программ или других контекстов. Те, которые отмечены знаком | пропускают информацию в sendmail3, отмеченные знаком = пропускают информацию и в и из sendmail, не отмеченные макросы пропускают из sendmail, но внутренне больше никак не используются. Вот эти макросы:
 

$a
Исходящая дата в формате RFC 822. Выделяется из строки Date:.
$b
Текущая дата в формате RFC 822.
$c
Счетчик пересылок. Это счетчик числа строк Received: плюс значение флага командной строки -h.
$d
Текущая дата в формате UNIX (ctime).
$e|
(Устарел; вместо него используйте опцию SmtpGreetingMessage.) Сообщение на входе SMTP. Печатается при запуске SMTP. Первое слово должно быть макросом $j, как определено RFC821. По умолчанию "$j Sendmail $v ready at $b". Обычно переопределяется, чтобы указать номер версии конфигурации, например, "$j Sendmail $v/$Z ready at $b"
$f
Конвертный адрес отправителя (from).
$g
Адрес отправителя по отношению к получателю. 

Например, если $f - "foo", $g будет "host!foo", "foo@host.domain", или что-нибудь другое, соответствующее принимающей почтовой программе.

$h
Хост получателя. Устанавливается в наборе правил 0 из поля $# анализируемого адреса.
$i
Идентификационный номер в очереди, например, "HAA12345".
$j=
"Официальное" доменное имя для этого узла. Оно полностью уточнено, если может быть найдена полная квалификация. Оно должно быть переопределено, чтобы быть полностью уточненным доменным именем, если ваша система не сконфигурирована таким образом, что может найти его автоматически.
$k
Имя узла UUCP (из системного вызова uname).
$l|
(Устарел; вместо него используйте опцию UnixFromLine.) Формат строки UNIX from. До тех пор, пока вы не измените формат почтового ящика UNIX, вы не должны изменять умолчание, которое равно "From $g $d".
$m
Доменная часть значения возвращенного gethostname. 

При нормальных обстоятельствах, $j эквивалентен $w.$m.

$n|
Имя демона (для сообщений об ошибках). По умолчанию "MAILER-DAEMON".
$o|
(Устарел: вместо него используйте опцию OperatorChars.) Набор "операторов" в адресах. Список знаков, которые могут быть рассмотрены как обозначения, и которые будут разделять значения во время анализа. Например, если "@" было в макросе $o, то ввод "a@b" будет просканирован как три обозначения: "a," "@," и "b." По умолчанию ".:@[]", минимально необходимые для анализа по RFC 822; более богатый набор операторов - ".:%@!/[]", добавляющий поддержку для UUCP, %-hack, и адресов X.400.
$p
Идентификационный номер процесса sendmail.
$q|
Формат адреса отправителя по умолчанию. Макрос $q указывает, как должен выглядеть по умолчанию адрес отправителя в сообщении. По умолчанию "<$g>". Обычно переопределяется на "$?x$x <$g>$|$g$." Или "$g$?x ($x)$.", соответствующим двум следующим форматам: 

Eric Allman <eric@CS.Berkeley.EDU> 

eric@CS.Berkeley.EDU (Eric Allman)

Sendmail надлежащим образом квотирует имена, имеющие специальные знаки, если используется первая форма.

$r
Протокол, использовавшийся для получения сообщения. Выставляется из флага командной строки -p или кодом сервера SMTP.
$s
Имя хоста отправителя. Выставляется из флага командной строки -p или кодом сервера SMTP.
$t
Числовое представление текущего времени.
$u
Пользователь-получатель.
$v
Номер версии бинарного файла sendmail.
$w=
Hostname этого узла. Корневое имя для этого хоста (смотри ниже всякие нерулезности).
$x
Полное имя отправителя.
$z
Домашний каталог получателя.
$_
Подтвержденный адрес отправителя.
${auth_authen} Идентификационные удостоверения клиента, как определено идентификацией (выставляются при успешности)
${auth_author} Подлинность авторизации, то есть, параметр AUTH= команды SMTP MAIL (если есть).
${auth_type} Механизм, использующийся для идентификации (выставляется при успешности).
${auth_ssf} Длина ключа (в битах) симметричного алгоритма шифрования, используемого на уровне безопасности механизма SASL.
${bodytype} Тип тела сообщения (7BIT или 8BITMIME), определенный из конверта.
${cert_issuer} DN (отличительное имя) CA (серифицирующего авторитета) подписавшего данный сертификат (выпустившего сертификат).
${cert_subject} DN представленного сертификата (называемое объектом сертификации).
${cipher} Алгоритм шифрования, используемый для соединения, например, EDH-DSS-DES-CBC3-SHA,  EDH-RSA-DES-CBC-SHA, DES-CBC-MD5, DES-CBC3-SHA.
${cipher_bits} Длина ключа (в битах) симметричного алгоритма шифрования, используемый для TLS соединения.
${client_addr} IP адрес клиента SMTP. Определяется только в сервере SMTP.
${client_name} Имя хоста клиента SMTP. Может быть заключённым в квадратные скобки IP-адресом в виде [ nnn.nnn.nnn.nnn ], если клиентский IP-адрес не разрешается, или, если разрешается, но IP-адрес разрешенного имени хоста не соответствует оригинальному IP-адресу. Определяется только в сервере SMTP.
${client_port} Номер порта клиента SMTP. Определяется только в сервере SMTP.
${client_resolve} Содержит результат, разрешенный для ${client_name} : OK, FAIL, FORGED, TEMP. Определяется только в сервере SMTP.
${currHeader} Значение заголовка в виде строки в кавычках (возможно, обрезанная до MAXNAME).
${daemon_addr} IP-адрес  демона, слушающего соединения. До тех пор, пока не назначен, он будет "0.0.0.0".
${daemon_family} Семейство сетевых протоколов, если демон принимает сетевые соединения. Возможные значения включают "inet", "inet6", "iso", "ns", "x.25".
${daemon_flags} Флаги для демона, как определено частью Modifier= из DaemonPortOptions, где флаги разделены пробелами, а флаги в верхнем регистре удваиваются. То есть, Modifier=Ea будет представлен в виде "EE a" в ${daemon_flags}, что требуется для тестирования флагов в наборах правил.
${daemon_info} Некоторая информация о демоне в виде текстовой строки. Например, "SMTP+queueing@00:30:00".
${daemon_name} Имя демона из DaemonPortOptions, подопции Name=. Если эта подопция не выставлена, то используется "Daemon#", где # - номер демона.
${daemon_port} Порт, на котором демон принимает соединения. Пока не установлен DaemonPortOptions, скорее всего будет "25".
${delivery_mode} Текущий режим доставки, используемый sendmail'ом. в начале выставляется в значение опции DeliveryMode.
${envid} Идентификационный номер конверта, переданный в sendmail как часть конверта.
${hdrlen} Длина значения заголовка, сохранённого в ${currHeader} (до возможного обрезания). Если это значение больше или равно MAXNAME, то заголовок был обрезан.
${hdr_name} Имя поля заголовка для которого вызван текущий набор правил проверки заголовка. Это полезно для набора правил проверки заголовка по умолчанию для получения имени заголовка.
${if_addr} IP-адрес интерфейса входящего соединения, если он не в закольцованной? (loopback) сети. (IMHO, если не 127.0.0.1 - Прим. переводчика).
${if_family} Семейство IP на интерфейсе входящего соединения, если он не в закольцованной? (loopback) сети.
${if_name} Имя интерфейса входящего соединения. Этот макрос может быть использования для SmtpGreetingMessage и HReceived для виртуального хостинга. Например:
O SmtpGreetingMessage=$?{if_name}${if_name}$|$j$. MTA
${mail_addr} Адресная часть определённой триады из адеса данного для команды SMTP MAIL. Определяется только в SMTP-сервере.
${mail_host} Хост из  определённой триады из адеса данного для команды SMTP MAIL. Определяется только в SMTP-сервере.
${mail_mailer} Почтовая программа из  определённой триады из адеса данного для команды SMTP MAIL. Определяется только в SMTP-сервере.
${msg_size} Значение параметра SIZE=, то есть, обычно, размер сообщения (в диалоге ESMTP), до того как сообщение было собрано, соответственно размер сообщения как подсчитано sendmail'ом (и может быть использованов check_compat).
${ntries} Количество попыток доставки.
${opMode} Текущий режим работы (из флага -b).
${queue_interval} Интервал прохода очереди заданный флагом -q. Например, -q30m выставит ${queue_interval} в "00:30:00".
${rcpt_addr} Адресная часть определённой триады из адеса данного для команды SMTP RCPT. Определяется только в SMTP-сервере.
${rcpt_host} Хост из  определённой триады из адеса данного для команды SMTP RCPT. Определяется только в SMTP-сервере.
${rcpt_mailer} Почтовая программа из  определённой триады из адеса данного для команды SMTP RCPT. Определяется только в SMTP-сервере.
${server_addr} Адрес сервера текущего исходящего SMTP соединения.
${server_name} Имя сервера текущего исходящего SMTP соединения.
${tls_version} Версия TLS/SSL используемая для соединения, например TLSv1, SSLv3, SSLv2.
${verify} Результат проверки представленного сертификата. Возможные значения:
 
OK Успешная проверка
NO Сертификат не был представлен
FAIL Сертификат представлен, но не может быть проверен, например, отсутствует подписавший CA.
NONE STARTTLS не был выполнен.
TEMP Произошла временная ошибка
PROTOCOL Произошла какая-то ошибка протокола
SOFTWARE STARTTLS обмен был неуспешен, что является фатальной ошибкой для эьой сессии, e-mail будет поставлен в очередь.

Существует три типа дат, которые могут быть использованы. Макросы $a и $b в формате RFC 822; $a - время, выделяемое из строки "Date:" сообщения (если она там есть), а $b - текущая дата и время (используемые для "штемпеля"). Если во входящем сообщении не найдено ни одной строки "Date:", $a также выставляется на текущее время. Макрос $d эквивалентен макросу $b в формате UNIX (ctime).

Макросы $w, $j, и $m выставляются для опознания этого хоста. Sendmail, если это вообще возможно, пытается найти полностью определенное имя хоста; он делает это вызовом gethostname(2) для получения текущего hostname, и затем, передавая его в gethostbyname(3), который, по идее, должен вернуть каноническую версию этого имени хоста4. Если все успешно проходит, $j выставляется в полностью определенное имя и $m выставляется в доменную часть имени (все, что находится после первой точки). Макрос $w выставляется в первое слово (все, что до первой точки) если вы имеете файл конфигурации уровня 5 и выше; иначе, он будет иметь то же значение, что и $j. Если канонификация проваливается, предписывается, чтобы файл конфигурации выставлял $j в полностью определенное доменное имя5.

Макрос $f является изначально определенным идентификатором отправителя; при посылке на специфический хост макрос $g выставляется в адрес отправителя относительно получателя. Например, если я посылаю на "bollard@matisse.CS.Berkeley.EDU" с машины "vangogh.CS.Berkeley.EDU", макрос $f будет "eric", а макрос $g будет macro will be "eric@vangogh.CS.Berkeley.EDU".

Макрос $x выставляется в полное имя отправителя. Оно может быть определено несколькими способами. Оно может быть передано как флаг в sendmail. Оно может быть определено в переменной окружения NAME. В третьих, значение строки "Full-Name:" в заголовке, если она существует. И в четвертых, поле комментария в строке "From:". Если же все это ни к чему не приведет, и если сообщение исходит с этого хоста, полное имя смотрится в файле /etc/passwd.

При отправке, макросы $h, $u, и $z выставляются в host, user, и домашний каталог (если локально) получателя. Первые два берутся из частей $@ и $: правил перезаписи, соответственно.

Макросы $p и $t используются для создания уникальных строк (например, для поля "Message-Id:"). Макрос $i выставляется в идентификатор очереди на этом хосте; При вставке в строку отметки времени, это может быть полезно для отслеживания сообщений. Макрос $v выставляется равным номеру версии sendmail; обычно он помещается в отметку о времени и очень полезен при отладке.

Поле $c получает значение "счетчика пересылок", то есть, то количество раз, которое это сообщение обрабатывалось. Это может быть определено флагом командной строки -h или подсчетом отметок времени в сообщении.

Поля $r и $s соответствуют протоколу, использовавшемуся для соединения с sendmail и имени хоста отправителя. Они оба могут быть назначены, используя флаг командной строки -p, или по раздельности, используя флаги -M или -oM.

Макрос $_ устанавливается в подтвержденное имя хоста отправителя. Если отправитель имеет работающий сервер IDENT, соответствующий RFC 1413, а получатель имеет включенный протокол IDENT, он будет включать имя пользователя на том хосте.

Макросы ${client_name}, ${client_addr}, и ${client_port} выставляются в имя, адрес, и номер порта клиента SMTP вызывающего как сервер sendmail. Они могут быть использованы в наборах правил check * (используя косвенную форму определения $&, конечно же!).

5.3. C и F - Определение Класса Можно определить классы или фразы для соответствия левосторонней части правил перезаписи, где "фраза" - это последовательность символов, не содержащая символов пробела. Например, для предотвращения отправки сообщений самому себе, может быть создан класс всех локальных имен для данного узла. Это может быть определено как в файле конфигурации, так и читаться из другого файла. Классы имеют имена, состоящие из одной буквы или слова в {скобках}. Имена классов, начинающиеся с букв нижнего регистра и специальных символов, зарезервированы для использования системой. Классы, определенные в файлах конфигурации могут быть заданы заглавными буквами для коротких имен, или начинаться с заглавной буквы для длинных имен.

Синтаксис:

Ccphrase1 phrase2...
Fcfile
F|program
Первая форма определяет класс c соответствующим любому из названных слов. Если phrase1 или phrase2 - это другой класс, например $=S, содержимое класса S добавляется к классу c. Можно разбивать на несколько строк; на пример, две формы: CHmonet ucbmonet и CHmonet
CHucbmonet
эквивалентны. Форма "F" читает элементы класса c из названного файла или программы. Каждый элемент дролжен быть перечислен в отдельном файле. Для указания опционального файла, используйте "-o" между именем класса и именем файла, например:. Fc -o /path/to/file Если файл не может быть использован, sendmail не будет жаловаться, а просто проигнорирует это.

Можно получить доступ из правил к элементам классов, используя $= или $~, (сопоставить вхождения не входящие в класс) совпадающие только с отдельным словом; вхождения из нескольких слов в классе, в этом контексте, игнорируются.

Некоторые классы имеют для sendmail внутреннее значение:
 
$=e
Содержит Content-Transfer-Encodings которые могут быть преобразованы 8->7 bit. Предопределено для содержания "7bit", "8bit", и "binary".
$=k
То же самое, что и $k, то есть, имя узла UUCP.
$=m
Устанавливается в набор доменов, знающих об этом хосте, изначально просто $m.
$=n
Может быть установлено в набор типов MIME, которые никогда не перекодируются из восьми бит в семь. По умолчанию "multipart/signed". Типы сообщений "message/*" и "multipart/*" никогда не перекодируются напрямую. Сообщения "multipart" взегда обрабатываются рекурсивно. Обработка сообщений "message/*" контролируется классом $=s.
$=q
Набор Content-Types, которые не могут быть перекодированы как base64 (если они должны быть перекодированы, они будут перекодированы как quoted-printable). Он может иметь первичные типы types (например, "text") или полные типы (типа "text/plain"). Класс инициализируется содержащим только "text/plain".
$=s
Содержит набор подтипов сообщений, с которыми можно обращаться рекурсивно. По умолчанию содержит только "rfc822". Другие типы "message/*" не могут быть перекодированы 8->7 bit. Если сообщение содержит восьмибитные данные, посланные на семибитный хост, и сообщение не может быть перекодировано в семь бит, оно будет обрезано до 7 бит.
$=t
Установлен в набор доверенных пользователей строкой конфигурации T. Если вы хотите считывать список доверенных пользователей из файла, используйте Ft/file/name.
$=w
Выставлен в набор всех имен, о которых знает хост. Может быть использован для совпадений с локальными именами хостов.
$={persistentMacros} Выставляется в макрос, который должен будет сохраняться во время проходов очереди. При добавлении имен макросов в этот класс нужно быть осторожным.

Sendmail может быть скомпилирован с разрешением использовать scanf(3) в строке F. Это позволит вам производить простейший анализ текстовых файлов. Например, чтобы прочитать все имена пользователей из системного файла /etc/passwd в класс, используйте

FL/etc/passwd %[^:] Это будет читать каждую строку до первого двоеточия. 5.4. M - Определение Почтовой программы В этой строке определяются почтовые программы и их интерфейсы. Формат такой: Mname, {field=value}* Где name - имя почтовой программы (используется только внутренне), а пары "field=name" определяют атрибуты почтовой программы. Поля такие:
 
Path Путь к почтовой программе
Flags Специальные флаги для этой почтовой программы
Sender Набор(ы) правил перезаписи для адресов отправителя 
Recipient Набор(ы) правил перезаписи для адреса получателя
Argv Вектор аргументов, передаваемый в почтовую программу
Eol Строка end-of-line для этой почтовой программы
Maxsize Максимальный размер сообщения для этой почтовой программы
maxmessages Максимальное количество доставок сообщений на соединение.
Linelimit Максимальная длина линии в теле сообщения
Directory Рабочий каталог для почтовой программы
Userid Идентификаторы пользователя и группы для запуска
Nice Инкремент nice(2) для почтовой программы
Charset Набор символов по умолчанию для 8-битных символов
Type Информация о типе MTS (используется для сообщений об ошибках)
Wait Максимальное время ожидания почтовой программы.
/ Корневой каталог почтовой программы.

В имени поля проверяется только первый символ.

Нижеописанные флаги могут быть установлены в описании почтовой программы. Любые другие флаги могут свободно использоваться для условных заголовков в сообщениях для определенных почтовых программ. Флаги, отмеченные |,не интерпретируются бинарником sendmail; они обычно используются для корреляции с флагами в строке H. Флаги, отмеченные знаком =, применяются в почтовой программе для адреса отправителя, хотя обычно это делает принимающая почтовая программа.
 
a
Запустить протокол Extended SMTP (ESMTP) (определенный в RFC 1651, 1652, и 1653). Этот флаг по умолчанию включен, если приветственное сообщение SMTP содержит слово "ESMTP". 
A
Просмотреть пользовательскую часть адреса в базе данных псевдонимов. Обычно выставляется только для локальных почтовых программ.
b
Проставить пустую строку в конце сообщения. Это предназначено для работы с некоторыми глупыми версиями /bin/mail, требующими пустую строку, но сами ее не проставляющие. По-нормальному в сетевой почте это не должно применяться.
c
Не включать в адрес комментарии. Это должно использоваться, только если вы должны работать с удаленной почтовой программой, не понимающей комментариев. Обрезает адрес из вида "Phrase <address>" или "address (Comment)" до просто "address".
C=
Если почта получена от почтовой программы с этим флагом, любые адреса в заголовке, не имеющие знака ("@") после перезаписи набором правил три будут иметь окончание "@domain" из адреса отправителя, взятого с конверта. Это позволяет почту с заголовками типа: 

From: usera@hosta>
To: userb@hostb, userc

Автоматически переписывать как:

From: usera@hosta
To: userb@hostb, userc@hosta

Однако это не всегда работает надежно.

d
Не включать угловые скобки вокруг адресов с синтаксисом путевого адреса. Полезно для почтовых программ, передающих адреса в оболочку, которая может интерпретировать угловые скобки как перенаправление ввода/вывода. Однако, это не защитит от других метасимволов программной оболочки. Поэтому передача адресов в оболочку не должно считаться безопасным.
D|
Эта почтовая программа хочет в заголовке строку "Date:".
e
Эта почтовая программа слишком медленна, поэтому лучше избежать этого соединения; любое необходимое соединение произойдет во время обработки очереди. Также см. HoldExpensive.
E
Избегать строки, начинающиеся с "From" в сообщении с знаком ">".
f
Почтовая программа хочет флаг -f from, но только если это операция пересылки в сети (то есть, почтовая программа выдаст ошибку, если выполняющий пользователь не имеет специальных прав).
F|
Эта почтовая программа хочет строку заголовка "From:".
g
Обычно, sendmail посылает внутренне созданную почту (например, сообщения об ошибках) используя нулевой обратный адрес, как это требуется RFC 1123. Однако, некоторые почтовые программы не принимают нулевой обратный адрес. Если это необходимо, вы можете установить флаг g, чтобы sendmail не следовал стандартам; сообщения об ошибках будут посланы от MAILER-DAEMON (на самом деле, значение макроса $n).
h
Символы верхнего регистра в именах хостов ( части $@ триады для почтовой программы, полученной из набора правил 0) для этой почтовой программы должны быть сохранены.
i
Произвести перезапись пользовательской базы данных на конвертный адрес отправителя.
I
Эта почтовая программа будет говорить на SMTP с другим sendmail - поэтому он может использовать некоторые специальные особенности протокола. Эта опция не требуется (т.е.. если эта опция опущена, передача все равно будет работать нормально, хотя не настолько эффективно, как могла бы).
j
Произвести перезапись пользовательской базы данных на получателей и отправителей.
k
Обычно, когда sendmail соединяется с хостом посредством SMTP, он проверяет, не соединился ли он случайно сам с собой, что может случиться, если sendmail имеет неправильную конфигурацию, или если сетевой интерфейс закольцован. Этот флаг выключает проверку петли. Он должен использоваться только в очень необычных случаях.
K
В настоящее время не работает. Зарезервирован для разбиения на куски.
l
Эта почтовая программа локальна (т.е., будет осуществлена последняя доставка).
L
Ограничивает длину строк, как определено в RFC821. 

Эта обесцененная опция должна быть заменена почтовым объявлением L=. По историческим причинам, флаг L также выставляет флаг 7.

m
Эта почтовая программа может разослать нескольким пользователям на одном хосте в одну транзакцию. Когда в argv части определения почтовой программы встречается макрос $u, это поле будет повторено необходимое количество раз для всех подходящих пользователей. Если его убрать, то это может убрать подавление дубликатов на удалённом узле, так как каждый получатель будет послан в отдельной транзакции.
M|
Эта почтовая программа хочет строку заголовка "Message Id:".
n
Не вставлять в начале сообщения "From" в стиле UNIX.
o
Всегда работать как хозяин почтового ящика получателя. Обычно sendmail работает как отправитель для локально генерируемой почты или как "демон" (на самом деле, пользователь определяется в опции u) при получении сетевой почты. Большинству локальных почтовых программ требуется обычное поведение, которое не позволит установить конвертный адрес отправителя, пока почтовая программа работает как демон. Этот флаг игнорируется, если выставлен флаг S.
p
Использовать обратный путь в стиле route-addr в команде SMTP "MAIL FROM:" вместо просто обратного адреса; хотя это и требуется в секции 3.1 RFC821, многие хосты не обрабатывают нормально обратные пути. Обратные пути осуждаются в RFC 1123.
P|
Эта почтовая программа хочет строку "Return-Path:".
q
Когда адрес, разрешаемый в этой почтовой программе, проверен (команда SMTP VRFY), генерировать ответы 250 вместо ответов 252. Это будет означать, что адрес локальный.
r
То же, что и f, но посылает флаг -r.
R
Открыть соединение SMTP на "безопасном" порту. "Безопасные" порты не являются таковыми, за исключением UNIX машин, поэтому не ясно, даст ли это что-нибудь.
s
Обрезать символы квотирования (" и \) у адреса перед вызовом почтовой программы.
S
Не переустанавливать userid перед вызовом почтовой программы. 

Это может быть использовано в безопасной среде, где sendmail запущен от root. Это может быть использовано для избежания поддельных адресов. Если также определено поле U=, это флаг заставит id пользователя всегда быть установленным на этого пользователя и группу (вместо того, чтобы оставить его как у root).

u
Символы верхнего регистра в именах пользователей для этой почтовой программы должны быть сохранены. Стандарты требуют сохранение регистра в локальной части адресов, за исключением тех адресов за которые отвечает ваша система.
U
Эта почтовая программа хочет строки "From" в стиле UUCP с уродливым "remote from <host>" в конце.
w
Пользователь должен иметь действительный бюджет на этой машине, т.е., getpwnam должен быть успешным. Если это не так, почта не будет доставлена. Это требуется для работы ".forward".
x|
Эта почтовая программа хочет строку заголовка "Full-Name:".
X
Эта программа хочет использовать алгоритм скрытых точек, как определено в RFC821; смысл такой: любая строка, начинающаяся с точки, будет иметь предваряющую ее точку (для того, чтобы ее обрезали на другом конце). Это гарантирует, что строки в сообщении, содержащие точку не прекратят сообщение преждевременно.
z
Запустить Протокол Локальной Доставки Почты (Local Mail Transfer Protocol, LMTP) между sendmail и локальной почтовой программой. Это вариант SMTP определенный в RFC 2033, специально разработанный для зоставки в локальный почтовый ящик.
0
Не просматривать записи MX для хостов, посылающих через SMTP.
3
Расширить список символов, преобразованных в =XX запись при преобразовании в Quoted-Printable для того, чтобы не потерять те, которые не преобразуются в чистом виде между ASCII и EBCDIC. Полезно, если в вашем узле имеется мэйнфреймы IBM.
5
Если для этого адреса не найдено псевдонимов, пропустить адрес через набор правил 5 для другого возможного разрешения. Это предназначено для перенаправления почты в другое альтернативное место доставки.
6
Обрезать заголовки до 7-ми бит.
7
Обрезать весь вывод до семи бит. Стоит по умолчанию, если установлен флаг L. Заметьте, что очистка этой опции не достаточна, чтобы через sendmail полностью проходили восьмибитные данные. Если опция 7 выставлена, а она в основном всегда выставлена, то восьмибитные данные на входе будут обрезаться. Нужно отметить, что эта опция затрагивает только сообщения, к которым не применялось MIME преобразование 8->7 бит.
8
Если выставлена, то эта почтовая программа принимает для отсылки восьмибитные данные; обычная попытка MIME преобразования 8->7 бит будет пропущена.
9
Если выставлена, производить ограниченные MIME преобразования 7->8 бит. Эти преобразования ограничены данными типа text/plain.
:
Проверить адреса, не начинаются ли они с ":include:"; если это так, преобразовать их к почтовой программе "*include*".
|
Проверить адреса, не начинаются ли они с "|"; если это так, преобразовать их к почтовой программе "prog".
/
Проверить адреса, не начинаются ли они с "/"; если это так, преобразовать их к почтовой программе "*file*".
@
Просмотреть адреса в пользовательской базе данных.
%
Не пытаться производить первичную доставку или во время прохода очереди получателю сообщения, пока сообщение в очереди не будет выбрано использованием одного из модификаторов прохода очереди -qI/-qR/-qS или запроса ETRN.

Конфигурационные файлы до уровня 6 предполагают опции "A", "w", "5", ":", "|", "/", и "@" в почтовой программе называющейся "local".

Почтовая программа со специальным именем "error" может быть использована для генерации сообщений об ошибках пользователя. Поле хоста (опционально) содержит возвращаемый статус выхода, а поле пользователя - распечатываемое сообщение. Статус выхода может быть числом или одним из значений USAGE, NOUSER, NOHOST, UNAVAILABLE, SOFTWARE, TEMPFAIL, PROTOCOL, или CONFIG, возвращающим соответствующий код выхода EX_, или усовершенствованный код ошибки, описанный в RFC 1893, Enhanced Mail System Status Codes. Например, вхождение:

$#error $@ NOHOST $: Host unknown in this domain в RHS правила вызовет генерацию указанной ошибки, и, если LHS совпадает, будет возвращен статус выхода "Host unknown". Эта почтовая программа работоспособна только в наборах правил 0, 5, или одном из наборов правил check_*.

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

Почтовая программа, называющаяся "local" должна быть определена в каждом файле конфигурации. Она используется для доставки локальной почты, и обслуживается особо несколькими образами. В добавок, три другие почтовые программы, называющиеся "prog", "*file*", и "*include*" могут быть определены для настройки доставки сообщений в программы, файлы и списки :include: соответственно. Их умолчания:

Mprog, P=/bin/sh, F=lsoDq9, T=DNS/RFC822/X-Unix, A=sh -c $u
M*file*, P=[FILE], F=lsDFMPEouq9, T=DNS/RFC822/X-Unix, A=FILE $u
M*include*, P=/dev/null, F=su, A=INCLUDE $u
Наборы перезаписи Sender и Recipient могут быть как просто идентификатором набора правил, так и двумя идентификаторами, разделенными слешем; в этом случае, первый набор перезаписи применяется к конвертным адресам, а второй применяется к заголовкам. Выставка любого значения в нулб отключает соответствующую перезапись, относящуюся к почтовым программам.

Directory - это на самом деле перечисление путей для просмотра с разделителем ":". Например, определение "D=$z:/" сначала опробует выполнение в домашнем каталоге получателя; если он недоступен, то попробует выполнение в корневом каталоге файловой системы. Это предназначено для использования только в почтовой программе "prog", из-за того, что некоторые оболочки (типа csh) отказываются работать, если они не могут прочитать домашний каталог. Вследствие того, что каталог очереди обычно не доступен для чтения непривилегированным пользователям, сценарии csh, как принимающие программы не смогут работать.

Userid определяет идентификатор пользователя и группы по умолчанию для работы, заменяя собой опцию DefaultUser. Если флаг S почтовой программы также определен, то этот пользователь и группа используется для работы при всех обстоятельствах. Это может быть задано как user:group для выставки идентификаторов пользователя и группы одновременно; это могут быть целые числа или символические имена, просматриваемые в файлах passwd и group соответственно. Если определено только символическое имя пользователя, в качестве идентификатора группы используется идентификатор, прописанный для этого пользователя в файле passwd.

Поле Charset используется при преобразовании сообщения в MIME; этот набор символов используется в заголовке Content-Type:. Если он не установлен, используется опция DefaultCharset, если же и она не назначена, используется значение "unknown-8bit". Внимание: это поле применяется к почтовой программе отправителя, а не получателя. Например, конвертный адрес отправителя принадлежит локальной сети, а получателя - внешней, набор символов будет установлен из поля Charset= для локальной сетевой почтовой программы, а не для внешней.

Поле Type= устанавливает тип информации, используемой в сообщениях об ошибках MIME, как определено в RFC 1894. На самом деле это три значения, разделенные слешами: MTAtype (то есть, описание того, как называются хосты), тип адреса (описание адресов электронной почты), и тип диагностики (описание кодов диагностических ошибок). Каждое из них должно быть зарегистрированным значением, или начинаться с "X-". По умолчанию "dns/rfc822/smtp".

Поле m= устанавливает максимальное количество сообщений в попытке доставки в одном соединении SMTP или LMTP.

Поле /= определяет новый корневой каталог для почтовой программы. Путь расширяется макросом и затем передаётся в системный вызов "chroot". Корневой каталог изменяется до принятия во внимание поля Directory или смены идентификатора пользователя.

Поле Wait= определяет максимальное время ожидания ответа почтовой программы после отсылки в неё всех данных. Это применяется к почтовым программам, которые были ответвлены sendmail'ом.

5.5. H - Определение Заголовка Формат строк заголовка, вставляемых sendmail в сообщение, определяется строкой H. Синтаксис этой строки: Hhname: htemplate
H[?mflags?]hname: htemplate
H[?${macro}?]hname: htemplate
Строки-продолжения в этом определении отражаются прямо в выходящее сообщение. Htemplate расширяется макросом до подстановки в сообщение. Если определена mflags (окруженная знаками вопроса), как минимум один из указанных флагов должен иметь место в определении почтовой программы для этого заголовка для автоматического вывода. Если определен ${macro} (окруженный знаками вопроса), заголовок будет автоматически выведен, если установлен макрос. Если один из этих заголовков имеется на входе, он отражается на выход не зависимо от этих флагов или макросов.

Некоторые заголовки имеют специальную семантику, описываемую позднее.

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

HHeader: $>Ruleset
HHeader: $>+Ruleset

Указанный набор правил (Ruleset) вызывается для указанного заголовка Header, и может возвращать $#error для отказа от сообщения, или $#discard для сброса сообщения (как и в остальных наборах правил check_*). Набор правил получает заголовок тело-поля как аргумент, то есть не заголовок имя-поле; см. также ${hdr_name} и ${currHeader}. Заголовок рассматривается как структурированное поле, то есть, комментарии (в кавычках) перед обработкой удаляются, если не используется вторая форма $>+. Только один набор правил может быть ассоциирован с заголовком; sendmail будет тихо игнорировать несколько вхождений.

Например, следующие строки в конфигурации:

HMessage-Id: $>CheckMessageId

SCheckMessageId
R< $+ @ $+ >$@ OK
R$*       $#error $: Illegal Message-Id header

Приведут к отказу от любого сообщения, имеющего заголовок в любой из следующих форм: Message-Id: <>
Message-Id: любой текст
Message-Id: <легальный текст@домен> дополнения
Набор правил по умолчанию, вызываемый для заголовков, не имеющих специально определенного для них набора правил может быть определён так: H*: $>Ruleset или H*: $>+Ruleset 5.6. O - Опция Назначения Существует большое количество глобальных опций, которые могут быть назначены из файла конфигурации. Опции представляются целыми словами; некоторые, для обратной совместимости, можно также представлять в виде отдельных букв. Синтаксис таков: Oопция=значение Это назначает опции опция указанное значение. Заметьте, что между буквой "O" и именем опции должен быть пробел. Раньше это было так: Ooзначение где опция o - один символ. В зависимости от опции, значение может быть строкой, целым числом, булевым (с допустимыми значениями "t", "T", "f", или "F"; по умолчанию TRUE), или интервалом времени.

Поддерживаемые опции (со старыми, однобуквенными именами в квадратных скобках):

AliasFile=spec, spec, ...

[A] Определяет возможный файл(ы) псевдонимов. Каждый spec должен быть в виде "class: info" где class: опционально и по умолчанию равно "implicit". В зависимости от того, как скомпилирован sendmail, возможные классы - это "implicit" (искать в вкомпилированном списке типов файлов псевдонимов, для обратной совместимости), "hash" (если определено NEWDB), "btree" (если определено NEWDB), "dbm" (если определено NDBM), "stab" (внутренняя таблица символов - обычно не используется, кроме случаев, если у вас нет других средств просмотра баз данных), "sequence" (использует последовательность предварительно объявленных преобразований), "ldap" (если определено LDAPMAP), или "nis" (если определено NIS). Если указан список spec'ов, sendmail просматривает их по порядку. AliasWait=timeout [a] Если установлено, при запуске ждать до timeout (мо умолчанию в минутах) появления вхождения "@:@" в базе данных псевдонимов. Если оно не появляется в течение этого интервала, перестроить базу данных (если выставлена опция AutoRebuildAliases) или сделать предупреждение. AllowBogusHELO [нет короткого имени] Если выставлена, позволяется команда HELO SMTP не включающая имени хоста. Выставка этой опции нарушает секцию 5.2.5 RFC 1123, но необходима для работы с некоторыми клиентами SMTP. Если значение имеется, оно все равно проверяется на легитимность. AuthMechanisms [нет короткого имени] Список механизмов удостоверения подлинности для AUTH (разделённый пробелами). Объявленный список механизмов будет логическим умножением этого списка и списка доступных механизмов определённых библиотекой Cyrus SASL. AuthOptions [нет короткого имени] Когда использовать параметр AUTH= для команды MAIL FROM;

        A  Только если проверка подлинности успешна.

По умолчанию пытаться всякий раз, когда доступна SMTP AUTH.

AutoRebuildAliases [D] Если выставлена, при необходимости и возможности перестраивать базу данных псевдонимов. Если эта опция не выставлена, sendmail никогда не будет перестраивать базу данных псевдонимов, пока это не будет явно запрошено использованием -bi. Заметьте: Эта опция открывает потенциальную возможность атаки типа "отказ от обслуживания" (DoS). В будущих версиях эта опция будет убрана. BlankSub=c [B] Устанавливает символ замены пробелов c. Неквотированные пробелы в адресах заменяются этим символом. По умолчанию пробел (т.е. замена не производится). CACERTPath [нет короткого имени] Путь к каталогу с сертификатами для CA. CACERTFile [нет короткого имени] Файл, содержащий сертификат одного CA. CheckAliases [n] Проверять RHS псевдонимов при перестройке базы данных псевдонимов. CheckpointInterval=N [C] Контрольные точки очереди каждые N (по умолчанию 10) посланных адресов. Если ваша система падает во время получения большого списка, это предотвратит повторную передачу на все адреса, кроме последних. ClassFactor=fact [z] Указанный коэффициент (factor) умножается на класс сообщения (определенный полем Precedence: в пользовательском заголовке и строками P в файле конфигурации) и вычитается из приоритета. Таким образом, сообщения с более высоким Priority: будут предпочитаться. По умолчанию 1800. ClientCertFile [нет короткого имени] Файл, содержащий сертификат клиента, то есть, этот сертификат будет использован когда sendmail будет выступать в качестве клиента. ClientPortOptions [O] Устанавливает опции SMTP клиента. Опции представляют собой пары ключ=значение, разделенные запятыми. Известные ключи:
 
Port Имя/Номер исходящего порта соединения (по умолчанию - любой свободный порт)
Addr Маска адреса (по умолчанию - INADDR_ANY)
Family Семейство адресов (по умолчанию - INET)
SndBufSize Размер буфера TCP на отсылку
RcvBufSize Размер буфера TCP на приём
Modifier Опции (флаги) для демона
Маска адреса может быть числовым адресом или доменным именем. Модификатором может быть следующая буква:

h        использовать для команды HELO имя интерфейса.

Если используется модификатор "h", то в команде HELO/EHLO используется имя соответствующего выходного интерфейса (или выбранного через параметр Connection или по-умолчанию).

ClientKeyFile [нет короткого имени] Файл, содержащий частный члюч, принадлежащий сертификату клиента. ColonOkInAddr [нет короткого имени] Если выставлена, в e-mail адресах дозволяются двоеточия (например, "host:user"). Если не выставлена, двоеточия (согласно RFC 822) означают начало конструкции группы ("groupname: member1, member2, ... memberN;"). Всегда принимаются дублированные двоеточия ("nodename::user") и понимается соответствующее вложение routeaddr ("<@relay:user@host>"). Более того, эта опция по умолчанию включена, если версия конфигурации ниже 6 (для обратной совместимости). Однако, для полной совместимости с RFC 822, она должна быть выключена. ConnectionCacheSize=N [k] Максимальное число открытых соединений, которые будут кэшированы одновременно. По умолчанию одно. Это задерживает закрытие текущего соединения, до тех пор, пока этот процесс sendmail не захочет соединиться с другим хостом, или завершится. Установка этого значения в ноль будет означать немедленное закрытие соединения. Из-за потребления файловых дескрипторов, кэш соединений должен быть небольшим: 4 вероятно является практическим максимумом. ConnectionCacheTimeout=timeout [K] Максимальное время бездействия кэшированного соединения. При превышении этого времени, соединение немедленно закрывается. Это значение должно быть небольшим (порядка десяти минут). Перед использованием кэшированного соединения, sendmail всегда посылает команду RSET для проверки соединения; если она проваливается, он заново открывает соединение. Смысл этой опции - быть хорошим соседом по сети и не использовать слишком долго ресурсы другого конца. По умолчанию 5 минут. ConnectOnlyTo=address [нет короткого имени] Может использоваться для настройки адреса соединения (в целях тестирования). ConnectionRateThrottle=N [нет короткого имени] Если установлено положительное значение, позволить более чем N входящих демонов соединений на протяжении одной секунды. Это предназначено для сглаживания пиков и уменьшения средней загрузки. По умолчанию ноль (никаких ограничений). ControlSocketName=name [нет короткого имени] Имя управляющего сокета для управления демоном. Работающий демон sendmail может управляться через именованный сокет. Доступные команды: help, restart, shutdown и status. Команда status возвращает текущее количество порожденных демоном "детей", их максимальное количество, свободное дисковое пространство (в блоках) в каталоге очереди и среднюю загрузку машины, представленную в виде целого числа. Если эта оция не установлена, то управляющий сокет не будет доступен. Пользователи Solaris и ядер до 4.4BSD должны прочитать заметки в sendmail/README. DHParameters Файл с параметрами DH для STARTTLS. Требуется только если используется DSA/DH. DaemonPortOptions=options [O] Устанавливает опции сервера SMTP. Каждое вхождение DaemonPortOptions приводит к дополнительному входящему сокету. Опции - пары ключ=значение. Известные ключи:
Name Имя демона, определяемое пользователем (по умолчанию - "Daemon#")
Port Имя/номер рабочего порта (по умолчанию "smtp")
Addr Адресная маска (по умолчанию INADDR_ANY)
Family Семейство адресов (по умолчанию INET)
Listen Размер очереди прослушивания (по умолчанию 10)
Modifier Опции (флаги) для демона
SndBufSize Размер буфера TCP на отправку
RcvBufSize Размер буфера TCP на прием
Поле Name используется для сообщений об ошибках и протоколирования. Адресная маска может быть числовым адресом в записи с точками или сетевым именем. Ключ Family по умолчанию INET (IPv4). Пользователи IPv6, которые хотят принимать соединения IPv6 должны добавить дополнительную чтрочку в DaemonPortOptions Family=inet6. Модификатор может быть последовательностью (без разделителей) из следующих букв:
 
a всегда требовать идентификацию
b привязываться к интерфейсу, через который была получена почта
c производить канонификацию имени хоста (.cf)
f требовать полностью квалифицированное имя хоста (.cf)
u разрешить неквалифицированные адреса (.cf) 
C не производить канонификацию имени хоста
E запретить ETRN (смотри RFC 2476)
То есть, определение агента почтовой передачи (mail submission agent, MSA), всегда требующего идентификацию будет выглядеть так:

O DaemonPortOptions=Name=MSA, Port=587, M=Ea

Модификаторы, отмеченные ".cf" имеют эффект только в стандартном файле конфигурации, в котором они доступны через ${daemon_flags}. Флаги "c" и "C" могут изменить умолчание для канонификации имени хоста в файле sendmail.cf. Смотри соответствующую документацию для FEATURE(nocanonify). Модификатор "f" запрещает адреса в виде user@host если они не представлены напрямую. Флаг "u" разрешает неквалифицированный адрес отправителя. Флаг "b" заставляет sendmail для исходящих соединений привязываться к интерфейсу, через который была получена почта. Внимание: Используйте "b", только если выходящая почта может быть смаршрутизирована через интерфейс исходящего соединения к её месту назначения. Принеправильной конфигурации этого параметра не будет никаких попыток исправить проблему. Его нужно использовать только для виртуального хостинга, где каждый виртуальный интерфейс может соединиться с любым возможным адресом. Он перебъёт любые возможные установки через ClientPortOptions. Заметьте, sendmail будет слушать на новом сокете при каждом встреченном в конфигурационном файле DaemonPortOptions.
DefaultAuthInfo [нет короткого имени] Имя файла, содержащего идентификационную информацию по умолчани. для исходящих соединений. Этот файл должен содержать ID пользователя, ID авторизации, пароль (в чистом тексте) и область использования в отдельных строках и должен быть открыт на чтение только пользователю root (или доверенному пользователю). Если область не определена, используется $j. DefaultCharSet=charset [нет короткого имени] Когда сообщение, имеющее 8-битные символы, но не в формате MIME, конвертируется в MIME (см. опцию EightBitMode) в заголовок Content-Type: должен быть включен набор символов. Этот набор символов обычно назначается из поля Charset= дескриптора почтовой программы. Если оно не установлено, используется значение этой опции. Если эта опция не установлена, используется значение "unknown-8bit". DataFileBufferSize [нет короткого имени] устанавливает порог, в байтах, при котором файл данных очереди из памяти переходит на диск. По умолчанию 4096 байт. DeadLetterDrop=file [нет короткого имени] Определяет положение общесистемного файла dead.letter, ранее жёстко находящегося в /usr/tmp/dead.letter. Если эта опция не установлена (по умолчанию), sendmail не будет пытаться сохранять общесистемный файл dead.letter в случае, если он не может откинуть почту пользователю или постмастеру. Вместо этого, он переименует qf-файл как это и было раньше, когда файл dead.letter не мог быть открыт. DefaultUser=user:group [u] Выставляет идентификатор пользователя по умолчанию для почтовых программ равным user:group. Если group опущена, а user - имя пользователя (в противоположность числовому идентификатору пользователя), используется группа по умолчанию для этого пользователя из файла /etc/passwd. И user и group могут быть числами. Почтовые программы без флага S в описании почтовой программы будут работать от этого пользователя. По умолчанию 1:1. Значение также может быть задано как символическое имя пользователя6. DeliveryMode=x [d] Производить доставку в режиме x. Легальные режимы:
i Доставлять интерактивно (синхронно)
b Доставлять в фоне (асинхронно)
q Просто класть сообщение в очередь (доставка во время обработки очереди)
d Отложить доставку и все преобразования (доставка во время обработки очереди)
По умолчанию "b", если не определена ни одна опция, и "i" - если определена, но без аргументов (т.е., "Od" эквивалентно "Odi"). Флаг командной строки -v выставляет ее в i. DialDelay=sleeptime [нет короткого имени] Сетевые соединения Dial-on-demand могут видеть таймауты, если соединение открылось до установки звонка. Если этой опцией установлен интервал времени, а время соединения истекает во время первой попытки соединения, sendmail заснет на это время и попробует снова. Это должно дать вашей системе время для установки соединения с вашим поставщиком услуг. По умолчанию измеряется в секундах, поэтому "DialDelay=5" использует пятисекундную задержку. По умолчанию ноль (без повторной передачи). DontBlameSendmail=option,option,... [нет короткого имени] Во избежание возможных попыток взлома, основанных на открытых на запись для группы и всех остальных пользователей файлах и каталогах, sendmail производит параноидальную проверкупри открытии большинства из используемых им файлов. Если, по некоторой причине, вам просто необходимо иметь каталог /etc открытым на запись для группы, то вам нужно отключить эту проверку (за счет снижения уровня безопасности вашей системы и большей ее уязвимости). Аргументами являются отдельные опции, отключающие проверку:

Safe
AssumeSafeChown
ClassFileInUnsafeDirPath
DontWarnForwardFileInUnsafeDirPath
ErrorHeaderInUnsafeDirPath
FileDeliveryToHardLink
FileDeliveryToSymLink
ForwardFileInUnsafeDirPath
ForwardFileInUnsafeDirPathSafe
ForwardFileIngroupWritableDirPath
GroupWritableAliasFile
GroupWritableDirPathSafe
GroupWritableForwardFileSafe
GroupWritableIncludeFileSafe
HelpFileinUnsafeDirPath
IncludeFileInUnsafeDirPath
IncludeFileInUnsafeDirPathSafe
IncludeFileIngroupWritableDirPath
LinkedAliasFileInWritableDir
LinkedClassFileInWritableDir
LinkedForwardFileInWritableDir
LinkedIncludeFileInWritableDir
LinkedMapInWritableDir
LinkedServiceSwitchFileInWritableDir
MapInUnsafeDirPath
NonRootSafeAddr
RunProgramInUnsafeDirPath
RunWritableProgram
TrustStickyBit
WorldWritableAliasFile
WriteMapToHardLink
WriteMapToSymLink
WriteStatsToHardLink
WriteStatsToSymLink

Safe - это умолчание. Выше имеется более подробное описание этих флагов. Использование этой опции не рекомендуется.

DontExpandCnames [нет короткого имени] Стандарты говорят, что адреса хостов, используемые в почтовом сообщении должны быть полностью каноническими. Например, если ваш хост имеет имя "Cruft.Foo.ORG", а также имеет псевдоним "FTP.Foo.ORG", всегда должно использоваться первое имя. Это навязывается во время канонификации имени хоста (просмотрах $[ ... $]). Если эта опция выставлена, протоколы игнорируются, и делаются "неправильные" вещи. Однако, IETF потихоньку продвигается к изменению этого стандарта, поэтому такое поведение может стать приемлемым. Но заметьте, что последующие передающие хосты все еще могут переписать адрес в настоящее каноническое имя. DontInitGroups [нет короткого имени] Если установлена, sendmail будет избегать вызова initgroups(3).Если у вас работает NIS, это вызовет последовательный просмотр карты groups.byname, что может сильно перегрузить ваш сервер NIS в большом домене. Это даст то, что если только группа найденная для пользователей будет их главной группой, что сделает доступ к файлам несколько более ограниченным. Не имеет никакого эффекта, если система не имеет списков групп. DontProbeInterfaces [нет короткого имени] Sendmail при запуске обычно находит имена для всех активных (на вашей машине) интерфейсов и добавляет их имена в класс известных псевдонимов хоста $=w. Если у вас большое количество виртуальных интерфейсов, или если обратный просмотр вашего DNS медленный, то это может занять некоторое время. Эта опция отключает такой просмотр. Однако, вы должны быть уверены, что вы включили все варианты имен в класс $=w с помощью любого другого механизма. DontPruneRoutes [R] Обычно, sendmail пытается избежать любые ненужные явные маршруты при посылке сообщения об ошибке (как обсуждено в секции 5.2.6 RFC 1123). Например, при посылке сообщения об ошибке   <@known1,@known2,@known3:user@unknown> sendmail обрежет "@known1,@known2" для того, чтобы сделать маршрут как можно более прямым. Однако, если выставлена опция R, это будет отключено, и почта будет послана по первому адресу в маршруте, даже если остальные адреса известны. Это может быть полезно, если вы заперты за файерволом. DoubleBounceAddress=error-address [нет короткого имени] Если при посылке сообщения об ошибке происходит ошибка, послать отчет об ошибке по указанному адресу. Адрес расширяется макросом во время доставки. Если не назначено, то по умолчанию это "postmaster". EightBitMode=действие [8] Установить обработку восьмибитных данных. Существует два вида восьмибитных данных: объявленные как таковые использованием ESMTP объявления BODY=8BITMIME или флагом командной строки -B8BITMIME, и необъявленные 8-битные данные, то есть, так уж произошло, что они являются восьмибитными. Существует три основные операции, которые можно произвести: необъявленные 8-битные данные могут быть автоматически преобразованы в 8BITMIME, необъявленные 8-битные данные могут быть пропущены как есть, без преобразования в MIME ("просто послать 8"), и объявленные 8-битные данные могут бытьпреобразованы в 7-битные для передачи в не-8BITMIME почтовую программу. Возможные действия:
s Отвергнуть необъявленные 8-битные данные ("strict")
m Преобразовать необъявленные 8-битные данные в MIME ("mime")
p Пропустить необъявленные 8-битные данные ("pass")
Во всех случаях соответствующе объявленные 8BITMIME данные при необходимости будут преобразованы в 7BIT. ErrorHeader=file-or-message [E] Предварять сообщения об ошибках указанным сообщением. Если эта опция начинается со слеша, то ее значение рассматривается как путь к файлу, содержащему сообщение (это рекомендуемая установка). Иначе, это буквальное сообщение. Файл ошибки может содержать имя, почтовый адрес, и/или телефонный номер ответственного за почту и поддержку конечных пользователей. Если опция отсутствует или нулевая, или указывает на несуществующий или не доступный для чтения файл, не печатается никакого сообщения. ErrorMode=x [e] Разрешать ошибки, используя режим x. Значения для x:
p Печатать сообщения об ошибке (по умолчанию)
q Без сообщений, просто выдавать статус выхода
m Отправлять назад ошибки почтой
w Печатать ошибки (отправлять почтой, если пользователь не находится в системе)
e Отправлять назад ошибки почтой и всегда выдывать нулевой статус выхода

FallbackMXhost=fallbackhost

[V] Если определена, fallbackhost работает как MX с очень низким приоритетом. Предназначена для узлов с плохим сетевым соединением. Сообщения, которые невозможно доставить из-за временных ошибках адреса (например, ошибках DNS) дакже уйдут на FallbackMX хост. ForkEachJob [Y] Если выставлена, запускать каждую работу из очереди как отдельный процесс. Используйте эту опцию, если у вас мало памяти, так как при обработке очереди имеется тенденция к потреблению значительного объема памяти. ForwardPath=path [J] Устанавливает путь для поиска пользовательских файлов .forward. По умолчанию "$z/.forward". Некоторые узлы, использующие автомонтировщик, могут предпочесть изменить это на "/var/forward/$u" для поиска файла с именем, совпадающим с именем пользователя в системном каталоге. Она также может указывать на последовательность путей, разделенных двоеточиями; sendmail останавливается после первого же успешно и безопасно открытого файла. Например, "/var/forward/$u:$z/.forward" сначала будет искать в /var/forward/username, а затем в ~username/.forward (но только если первый файл не существует). HelpFile=file [H] Определяет файл помощи для SMTP. Если никакого имения файла не определено, используется "helpfile". HoldExpensive [c] Если выходная почтовая программа отмечена как слишком дорогостоящая, не соединяться с ней немедленно. Это требует, чтобы организация очереди была вкомпилирована, потому что настоящая посылка почты будет зависеть от процесса обработки очереди HostsFile=path [нет короткого имени] Путь к базе данных хостов, обычно "/etc/hosts". Эта опция нужна только когда sendmail канонифицирует адреса, а затем только когда во вхождении сервисного переключателя "files" имеется "hosts". В частности, этот файл никогда не используется при разрешении адреса хоста; это контролируется системной подпрограммой gethostbyname(3). HostStatusDirectory=path [нет короткого имени] Местонахождение долгосрочной информации статуса хостов. Когда установлена, информация о статусах хостов (например, хост отключен или не принимает соединения) будет общей для всех процессов sendmail; обычно, эта информация сохраняется в течение одного прохода очереди. Эта опция требует для работы кэш соединений, по крайней мере, равный 1. Если опция начинается с ведущего "/", то это абсолютный путь; иначе, он относителен почтовому каталогу очереди. Вероятное значение для узлов, желающих иметь постоянный статус хостов - ".hoststat" (т.е., подкаталог каталога очереди). IgnoreDots [i] Игнорировать точки в входящих сообщениях. Всегда отключена (то есть, точки всегда принимаются) при чтении почты SMTP. LDAPDefaultSpec=spec [нет короткого имени] Устанавливает сецификацию преобразования по умолчанию для LDAP. Значение должно содержать только специфичные для LDAP установки типа "-h host -p port -d bindDN". Значения будут использованы для всех преобразований LDAP, если они не будут перекрыты отдельной спецификацией. Эта опция должна быть определена до любого определения преобразования LDAP. LogLevel=n [L] Установить по умолчанию уровень протоколирования n. По умолчанию 9. Mxзначение [нет короткого имени] Установить значение макроса x. Предназначена только для использования в командной строке. Предпочитается флаг -M. MatchGECOS [G] Разрешить нечеткие совпадения в поле GECOS. Если этот флаг выставлен, и обычный просмотр имени пользователя проваливается (т.е., нет псевдонима с таким именем, и проваливается getpwnam), последовательно искать в файле паролей подходящее вхождение в поле GECOS. Здесь также требуется, чтобы во время компиляции было включено MATCHGECOS. Эта опция не рекомендуется. MaxAliasRecursion [нет короткого имени] Максимальная глубина рекурсии псевдонимов (по умолчанию 10). MaxDaemonChildren=N [нет короткого имени] Если выставлена, sendmail будет отказываться от соединений, если он имеет больше чем N порожденных процессов, обрабатывающих входящую почту. Это не ограничивает количество исходящих соединений. Если не установлена, никаких ограничений нет - то есть, это будет контролироваться средней загрузкой системы. MaxHeaderLength=N [нет короткого имени] Максимальная суммарная длина всех заголовков. Может использоваться для предотвращения атак типа "отказ от обслуживания". По умолчанию ограничения нет. MaxHopCount=N [h] Максимум счетчика пересылок. Сообщения, обработанные более чем N раз, считаются ходящими по кольцу и не принимаются. По умолчанию 25. MaxMessageSize=N [нет короткого имени] указывает максимальный размер сообщения, сообщаемый в ответе ESMTP EHLO. Сообщения больше указанного размера не принимаются. MaxMimeHeaderLength=N[/M] [нет короткого имени] Устанавливает максимальную длину значений конкретных полей заголовка MIME в N символов. Для некоторых таких заголовков с заимствованными параметрами, максимальная длина каждого параметра равна M, если она определена. Если /M не определена, будет использована половина значения N. по умолчанию эти значения равны 0, что означает отсутствие проверки. MaxQueueRunSize=N [нет короткого имени] Максимальное количество работ, обрабатываемых за один проход очереди. Если не установлено, то такого ограничения нет. Если у вас очень большие очереди, или очень маленький интервал прохода очереди, это может быть нестабильно. Однако, так как в каталоге очереди по порядку обрабатываются первые N сообщений, то это число должно быть достаточно большим, во избежание "потерянных работ" случающихся в каталоге очереди. MaxRecipientsPerMessage=N [нет короткого имени] Максимальное количество получателей на одно сообщение, принимаемое в транзакции SMTP. Замечание: слишком низкое значение может помешать отправке почты из групп рассылки , использующих SMTP для начальной транзакции. Если не установлено, то не имеется никаких ограничений по количеству получателей на конверт. MeToo [m] пошлите и мне, даже если я не вхожу в развернутые псевдонимы. Эта опция в следующих версиях будет убрана. MinFreeBlocks=N [b] Перед приемом почты по SMTP требовать в файловой системе, содержащей очередь, по крайней мере N свободных блоков. Если пространства недостаточно, sendmail выдает на команду MAIL ответ 452. Это приглашает отправителя попробовать снова попозже. MinQueueAge=age [нет короткого имени] Не обрабатывать работы в очереди, находящиеся в ней менее указанного интервала времени. Это предназначено для улучшения реакции посредством частых обработок очереди без пожирания системных ресурсов слишком частыми запусками работ. По умолчанию измеряется в минутах. MustQuoteChars=s [нет короткого имени] Устанавливает список символов, которые должны быть квотированы при использовании в полном имени в части фразы синтаксиса "phrase <address>". По умолчанию "'.". Символы "@,;:\()[]" всегда добавляются к этому списку. NoRecipientAction [нет короткого имени] Действие, предпринимаемое при получении сообщения, не имеющего ни одного правильного заголовка получателя (To:, Cc:, Bcc:, или ApparentlyTo: - последнее включено для обратной совместимости со старыми sendmail'ами). Может быть None для пропуска сообщения без изменений, что нарушает протокол, Add-To для добавки заголовка To: с любым получателем, найденным на конверте (что должно разоблачить получателей Bcc:), Add-Apparently-To для добавки заголовок Apparently-To: (только для обратной совместимости и официально убрано), Add-To-Undisclosed для добавки заголовка "To: undisclosed-recipients:;" чтобы сделать заголовок легальным без раскрытия чего-либо, или Add Bcc для добавки пустого заголовка Bcc:. OldStyleHeaders [o] Подразумевает, что заголовки могут быть в старом формате, т.е., имена разграничиваются пробелами. Это включает адаптивный алгоритм: если адрес получателя содержит запятую, скобки, или угловые скобки, то подразумевается, что запятые уже существуют. Если этот флаг не включен, только запятые разграничивают имена. Заголовки всегда выходят с запятыми между именами. По умолчанию отключена. OperatorChars=charlist [макрос $o] список символов, считающихся "операторами", то есть символами, разделяющими лексемы. Все символы операторов сами по себе являются лексемами; последовательности символов не являющихся операторами всегда являются лексемами. Символы пробела разделяют лексемы, но не сами лексемы - например, "AAA.BBB" содержит три лексемы, а "AAA BBB" - две. Если не назначено, то по умолчанию OperatorChars соответствуют ".:@[]"; в добавок, символы "()<>,;" всегда являются операторами. OperatorCars должны быть установлены в кофигурационном файле до любых наборов правил. PidFile=filename [нет короткого имени] Имя файла, содержащего идентификатор процесса (pid). (по умолчанию _PATH_SENDMAILPID). Имя файла расширяется макросом до его открытия. PostmasterCopy=postmaster [P] Если установлено, копии сообщений об ошибках будут посланы названному postmaster'у. Посылается только заголовок сообщения. Так как многие ошибки являются проблемами пользователей, то на больших узлах это, вероятно, будет не очень хорошей идеей, содержащей признаки всех видов нарушения конфиденциальности, но, похоже, популярной у некоторых поставщиков систем. По умолчанию не посылает копии. PrivacyOptions=opt,opt,... [p] Устанавливает опции конфиденциальности. "Конфиденциальность" на самом деле не факт; многие из них - просто способ настоять на более строгом соответствии протоколу SMTP. Опции можно выбрать из:
public Позволить открытый доступ
needmailhelo Требовать команду HELO или EHLO до MAIL
needexpnhelo Требовать команду HELO или EHLO до EXPN
noexpn Полностью запретить EXPN
needvrfyhelo Требовать команду HELO или EHLO до VRFY
novrfy Полностью запретить VRFY
noetrn Полностью запретить ETRN
noverb Полностью запретить VERB
restrictmailq Ограничить команду mailq 
restrictqrun Ограничить флаг командной строки -q 
noreceipts Не возвращать успешные DSN
goaway Запретить все основные запросы статуса SMTP
authwarnings Вкладывать в сообщение заголовок X-Authentication-Warning: 
Псевдофлаг "goaway" выставляет все флаги, кроме "restrictmailq" и "restrictqrun". Если mailq ограничено, только члены группы, которой принадлежит каталог очереди, могут просматривать очередь. Если проходы очереди запрещены, только root и владелец каталога очереди могут запустить очередь. Authentication Warnings и предупреждения о различных условиях могут указать на попытки обмануть почтовую систему, типа использования нестандартного каталога очереди. ProcessTitlePrefix=строка [нет короткого имени] Предварить название процесса в списке "ps" строкой. Строка будет обработана макросом. QueueDirectory=dir [Q] Использовать указанный каталог в качестве каталога очереди. Чтобы использовать несколько очередей, добавьте к значению звёздочку. Например, /var/spool/mqueue/q* будет использовать все каталоги или символические ссылки на каталоги, начинающиеся с q в /var/spool/mqueue как каталоги очереди. Не изменяйте структуру каталогов очередей во время работы sendmail. QueueFactor=коэффициент [q] Использовать коэффициент как множитель функции преобразования для определения, когда просто положить работу в очередь вместо ее запуска. Это значение определяется разностью между текущей средней загрузкой и ограничением средней загрузки (опция QueueLA) для определения максимального приоритета сообщений, которые будут посланы. По умолчанию 600000. QueueLA=LA [x] Когда средная загрузка системы превышает LA, просто откладывать сообщения в очередь (т.е. не пытаться их послать). По умолчанию 8 умноженное на количество рабочих процессоров в системе (если это количество может быть определено). QueueSortOrder=алгоритм [нет короткого имени] Использовать алгоритм для сортировки очереди. Использется только первый символ значения. Легальные значения: "host" (упорядочивать по имени первого хоста первого получателя), "filename" (упорядочивать по имени файла очереди), "time" (упорядочивать по времени отправки), и "priority" (упорядочивать по приоритету). Упорядочивание по хосту улучшает использование кэша соединений, но может привести к обработке сообщений с низким приоритетом, идущим на один хост вместо высокоприоритетных сообщений идущих на несколько хостов; скорее всего не должно использоваться при низкоскоростной сетевой связи. Упорядочивание по имени файла сокращает издержки на чтение всех элементов очереди перед запуском прохода очереди. Упорядочивание по времени всегда не лучший выход, поскольку это позволит отправлять большие, огромные сообщения раньше небольших, персональных сообщений, но может быть приемлемо на некоторых хостах с очень быстрыми сетевыми соединениями. По умолчанию производится упорядочивание по приоритету. QueueTimeout=timeout [T] Синоним для "Timeout.queuereturn". Используйте ту форму вместо формы "QueueTimeout". RandFile [нет короткого имени] Имя файла, содежащего случайные данные или имя сокета UNIX при использовании EGD. (Требуемый) префикс "egd:" или "file:" указывает на тип. Если не выставлен флаг компиляции HASURANDOMDEV, то STARTTLS требует это имя файла (см. sendmail/README). ResolverOptions=options [I] Устанавливает опции разрешителя. Значения могут быть установлены использованием +flag и очищены использованием -flag; флаги могут быть: "debug", "aaonly", "usevc", "primary", "igntc", "recurse", "defnames", "stayopen", или "dnsrch". Может быть определена строка "HasWildcardMX" (без + или -) для выключения сопоставления записей MX при канонификациях имен. Заметь! До версии 8.7, эта опция указывала, что сервер имен должен отвечать при приеме адресов. Это было заменено проверкой пречисления метода "dns" во вхождении сервиса "hosts" в сервисного переключателя. RrtImpliesDsn [R] Если эта опция выставлена, то заголовок "Return-Receipt-To:" вызывает запрос DSN, который согласно RFC1891посылается конвертному отправителю, а не по адресу, данному в заголовке. RunAsUser=user [нет короткого имени] Параметр user может быть именем пользователя (просматривается в /etc/passwd) или числовым идентификатором пользователя; также форма может иметь добавку ":group" (где группа может быть задана числом или символически). Если установлено не нулевое значение (т.е. не root), sendmail перейдет к этому идентификатору пользователя вскоре после запуска7. Это позволяет избежать определенного класса проблем безопасности. Однако, это означает, что все файлы ".forward" и ":include:" должны быть доступны на чтение для указанного пользователя, и все файлы для записи должны быть открыты на запись для этого пользователя. Также все программные доставки будут отмечены небезопасными, пока не будет выставлена опция DontBlameSendmail=NonRootSafeAddr, в этом случае доставка будет выполнена от пользователя. Это также несовместимо с опцией SafeFileEnvironment. Иными словами, это не добавит слишком много безопасности средней системе, а может разрушить ее (потому что пермиссии других файлов будут хуже). Однако, это может быть полезно на файерволах и в других местах, где пользователи не имеют бюджетов, а файлы псевдонимов хорошо содержатся. RecipientFactor=коэффициент [y] Указанный коэффициент добавляется к приоритету (уменьшая, таким образом, приоритет работы) каждого получателя, т.е., это значение "наказывает" работы с большим количеством получателей. По умолчанию 30000. RefuseLA=LA [X] Если средняя загрузка системы превышает LA, не принимать входящие соединения SMTP. По умолчанию 12 умноженное на количество рабочих процессоров в системе (если оно может быть определено). RetryFactor=коэффициент [Z] Коэффициент добавляется к приоритету при каждой обработке работы. Таким образом, при каждом выполнении работы, ее приоритет будет уменьшен на указанное значение. Во многих системах это должно иметь положительный эффект, потому что "упавшие" хосты слишком часто "падают" надолго. По умолчанию 90000. SafeFileEnvironment=каталог [нет короткого имени] Если эта опция установлена, sendmail будет делать вызов chroot(2) в указанный каталог до каких-либо записей в файлы. Если имя файла, указанного пользователем начинается с каталога, эта часть пути будет обрезана до записи, так (например), если переменная SafeFileEnvironment установлена в "/safe", то записи "/safe/logs/file" и "/logs/file" на самом деле указывают на один файл. Вдобавок, если эта опция выставлена, sendmail отказывается производить доставку по символическим связям. SaveFromLine [f] Сохранять строки "From" в стиле Unix в начале заголовков. Обычно они считаются избыточными и отбрасываются. SendMimeErrors [j] Если установлена, посылать сообщения об ошибках в формате MIME (см. RFC2045 и RFC1344). Если отключена, sendmail не будет возвращать в ответ на EHLO ключевое слово DSN и не будет делать обработку Delivery Status Notification, как описано в RFC1891. ServerCertFile [нет короткого имени] Файл, содержащий сертификат сервера, то есть этот сертификат будет использован, когда sendmail будет выступать в качестве сервера. ServiceSwitchFile=filename [нет короткого имени] Если ваша операционная система имеет абстракцию сервисного переключателя (например, /etc/nsswitch.conf в Solaris или /etc/svc.conf в Ultrix и DEC OSF/1), то будет опрашиваться этот сервис, а эта опция игнорироваться. В другом случае, это имя файла, обеспечивающего список методов, используемых для реализации определенных сервисов. Синтаксис - последовательности строк, каждая из которых - последовательность слов. Первое слово - имя сервиса, а последующие - типы сервисов. Сервисы, к которым sendmail обращается напрямую - "aliases" и "hosts". Типы сервисов могут быть "dns", "nis", "nisplus", или "files" (загвоздка лишь в том, что соответствующая поддержка должна быть вкомпилирована до ссылки на сервис). Если ServiceSwitchFile не определен, то по умолчанию это /etc/service.switch. Если этот файл не существует, по умолчанию переключатель:
aliases Files
hosts dns nis files
По умолчанию файл "/etc/service.switch". SevenBitInput [7] Обрезать ввод до семи бит для совместимости со старыми системами. Это не должно быть необходимо. SingleLineFromHeader [нет короткого имени] Если установлена, строки From: имеющие внутри себя новые строки, разворачиваются в одну строку. Это нужно для обхода заплатки в Lotus Notes, которая явно не понимает нормально завернутые заголовки RFC822. SingleThreadDelivery [нет короткого имени] Если установлена, клиентская машина никогда не будет пытаться открыть два соединения SMTP к одному серверу одновременно, даже в различных процессах. То есть, если другой sendmail уже говорит с каким-нибудь хостом, новый sendmail не откроет другого соединения. Это свойство двояко; хотя это уменьшает загрузку на другой машине, это задерживает передачу почты (например, если один sendmail доставляет огромное сообщение, другие sendmail'ы не смогут послать даже маленькие сообщения). Также, это требует файловый дескриптор (для файла блокировки) для каждого соединения, поэтому вам, возможно, придется уменьшить значение опции ConnectionCacheSize во избежание исчерпания файловых дескрипторов на процессы. Требует опцию HostStatusDirectory. SmtpGreetingMessage=сообщение [макрос $e] При запуске сервера SMTP выдается сообщение. По умолчанию "$j Sendmail $v ready at $b". StatusFile=file [S] Протоколировать суммарную статистику в указанном файле. Если не установлена, суммарная статистика не сохраняется. Этот файл не изменяется в размере. Он может быть распечатан программой mailstats(8). SuperSafe [s] Быть супернадежным, т.е. всегда записывать файл в очередь, даже если вы хотите попробовать немедленную доставку. Sendmail всегда организует файл в очереди до возвращения управления клиенту при любых обстоятельствах. На самом деле, это всегда должно быть установлено. TempFileMode=mode [F] Пермиссии для файлов в очереди. По умолчанию в восьмеричном представлении. По умолчанию 0600. Timeout.type=timeout [r; содержит старую опцию T] Выставляет значения таймаутов. Смотри раздел 4.1. TimeZoneSpec=tzinfo [t] Устанавливает информацию о местной временной зоне в tzinfo - например, "PST8PDT". На самом деле, если эта опция не выставлена, переменная окружения TZ очищается (поэтому используется системное умолчание); если установлена, но нулевая, используется пользовательская переменная TZ, если установлена и ненулевая, то переменная TZ выставляется в это значение. TrustedUser=user [нет короткого имени] Параметр user может быть именем пользователя (ищется в /etc/passwd) или числовым идентификатором пользователя (uid). Доверенный пользователь для владения файлами и запуска демона. Если значение установлено, сгенерированная база данных псевдонимов и контрольный сокет (если сконфигурирован) автоматически будут принадлежать этому пользователю. TryNullMXList [w] Если эта система "лучший" (т.е., имеющий самое низкое предпочтение ("preference")) MX для заданного хоста, его правила конфигурации обычно должны обнаружить эту ситуацию, и разрешить эту ситуацию особо, пересылая почту в UUCP, считая ее локальной, или еще как. Однако, в некоторых случаях (типа фаерволов Internet) вы можете захотеть соединиться напрямую с тем хостом, как будто у него вообще нет никакой записи MX. Выставка этой опции заставляет sendmail делать именно это. Плохо то, что ошибки в вашей конфигурации будут диагностироваться как "host unknown" или "message timed out" вместо чего-либо более значимого. Эта опция не рекомендуется. UnixFromLine=fromline [макрос $l] Определяет формат используемый, когда sendmail должен добавить строку From в стиле UNIX (то есть, строку, начинающуюся с "From<пробел>user"). По умолчанию "From $g $d". Не изменяйте это, до тех пор, пока не начнете использовать другой формат почтовых ящиков UNIX (что очень сомнительно). UnsafeGroupWrites [нет короткого имени] Если установлена, файлы :include: и .forward, открытые на запись для группы считаются "небезопасными", то есть, они не могут ссылаться на программы или писать прямо в файлы. Файлы :include: и .forward, открытые на запись для всех также небезопасны. UseErrorsTo [l] Если имеется заголовок "Errors-To:", отсылать сообщения об ошибках по адресу, указанному в нем. Обычно они идут к конвертному отправителю. Использование этой опции заставляет sendmail нарушать RFC 1123. Эта опция не рекомендуется и официально не поддерживается. UserDatabaseSpec=udbspec [U] Определение пользовательской базы данных. Verbose [v] Работать в "болтливом" режиме. Если эта опция установлена, sendmail устанавливает опции HoldExpensive (ранее c) и DeliveryMode (ранее d) так, что вся почта, доставляется полностью за одну работу так, что вы можете видеть полный процесс доставки. Опция Verbose никогда не должна выставляться в файле конфигурации; предназначена только для использования в командной строке. XscriptFileBufferSize=threshold [нет короткого имени] Устанавливает порог, в байтах, когда файл расшифровки? (transcript) из памяти переходит на диск. По умолчанию 4096 байт. Все опции могут быть указаны в командной строке, используя флаг -O или -o, но большинство может заставить sendmail освободиться от своих suid'ных полномочий. Опции, которые этого не причиняют: SevenBitInput [7], EightBitMode [8], MinFreeBlocks [b], CheckpointInterval [C], DeliveryMode [d], ErrorMode [e], IgnoreDots [i], SendMimeErrors [j], LogLevel [L], MeToo [m], OldStyleHeaders [o], PrivacyOptions [p], SuperSafe [s], Verbose [v], QueueSortOrder, MinQueueAge, DefaultCharSet, DialDelay, NoRecipientAction, ColonOkInAddr, MaxQueueRunSize, SingleLineFromHeader и AllowBogusHELO. На самом деле, PrivacyOptions [p], заданная из командной строки добавляется к уже указанным в файле sendmail.cf, то есть они не могут быть переназначены. Также, M (определить макрос) при определении макросов r или s считается "безопасным". 5.7. P - Определение Преимуществ Значения для поля "Precedence:" могут быть определены использованием контрольной строки P. Синтаксис этого поля: Pимя=число Когда имя найдено в поле "Precedence:" класс сообщения выставляется в число. Более высокие числа означают более высокое преимущество. Числа менее нуля имеют специальное назначение - если происходит ошибка во время обработки сообщения, его тело не будет возвращено; это предназначается для "большой" почты, типа проходящей через списки рассылки. По умолчанию преимущество равно нулю. Например, наш список преимуществ состоит из: Pfirst-class=0
Pspecial-delivery=100
Plist=-30
Pbulk=-60
Pjunk=-100
Использование людьми, пишущими обработчики списков рассылки, "Precedence: list" очень приветствуется. Старые версии sendmail (которые отвергали все возвраты ошибок из-за отрицательного старшинства) не распознают это имя, давая ему нулевое старшинство по умолчанию. Это позволяет владельцам списков рассылки видеть возвраты ошибок и в старых, и в новых версиях sendmail. 5.8. V - Уровень Версии Конфигурации Для обеспечения совместимости со старыми файлами конфигурации, была добавлена строка V, определяющая некоторую очень основную семантику конфигурационного файла. Она не предназначена для поддержки длинных обозначений; вместо этого, она описывает особенности совместимости, которые, возможно, будут убраны в будущих выпусках.

Заметь!: эти уровни версий не имеют ничего общего с номерами версий в файлах. Например, при написании файлов конфигурации версии 8 (в особенности, 8.7) использовались конфигурации уровня 6.

"Старые" файлы конфигурации определяются как уровень версии один. Фаулы уровня версии два делают следующие изменения:
 

(1) Канонификация имени хоста ($[ ... $]) добавляет точку, если имя распознано; это дает файлу конфигурации способ определить, совпало ли что-нибудь. (На самом деле, это просто инициализирует преобразование хоста с флагом "-a." - вы можете переустановить это на что угодно явным объявлением преобразования.)
(2) Расширение имени хоста по умолчанию постоянно при всех обработках; конфигурации версий уровня один в некоторых местах обработки выключали доменное расширение (то есть, добавляя имя локального домена). Конфигурации версий уровня два по идее включают последнюю точку для указания того, что это уже каноническое имя.
(3) Локальные имена, не являющиеся псевдонимами проходят через новое выделяющее правило пять; оно может быть использовано для добавления локального ретранслятора. Такое поведение может быть предотвращено посредством разрешения локального имени с начальным "@". То есть, допустим, то, что разрешается на локальную почтовую программу и имя пользователя "vikki" пройдет через набор правил пять, но имя пользователя "@vikki" потеряет "@", не пройдет через набор правил пять, или же будет обработано как в предыдущем примере. Здесь расчет на то, что это может быть использовано для реализации такого поведения, когда почта, посланная к "vikki" будет обработана центральным концентратором, а почта, посланная к "vikki@localhost" будет доставлена напрямую.

Файлы версии уровня три позволяют # начинать комментарии во всех строках. Исключения составляют экранированные обратным слешем знаки # и синтаксис $#.

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

Файлы конфигурации версии уровня пять изменяют определение по умолчанию, что $w является просто первым компонентом имени хоста.

Файлы конфигурации версии уровня шесть переделывают многие опции локальной обработки (типа псевдонимизации и соответствия началу адреса для символов "|") во флаги почтовых программ; это обеспечивает детализированный контроль над специальными локальными обработками. Файлы конфигурации версии уровня шесть также могут включать длинные имена опций. Опция ColonOkInAddr (разрешающая двоеточия в местной части адресов) для конфигурационных файлов более низкого уровня по умолчанию on; Файл конфигурации требует некоторый дополнительный интеллект для правильной обработки структуры группы RFC 822.

Конфигурационные файлы седьмого уровня версии используют новые имена опций для замены старых макросов ($e стало Smtp GreeetingMessage, $l стало UnixFromLine, и $o стало OperatorChars). Также, до седьмой версии, предполагался флаг F=q (использовать возвращаемое значение 250 вместо 252 для команды SMTP VRFY).

Конфигурационные файлы восьмого уровня версии разрешают $# в левосторонней части строк наборов правил.

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

Строка V может опционально иметь /vendor для указания того, что это файл конфигурации использует специфические для частного поставщика изменения8. Вы можете использовать "/Berkeley" для подчеркивания, что этот файл конфигурации использует Berkeley разновидность sendmail.

5.9. K - Определение Файла Ключей Специальные преобразования могут быть определены использованием строки: Kmapname mapclass arguments Где mapname - имя, под которым это преобразование используется в правилах перезаписи; mapclass - имя типа преобразования (эти имена вкомпилированы в sendmail); arguments интерпретируются в зависимости от класса; обычно, используется один аргумент, указывающий на файл, содержащий преобразование.

На преобразования ссылаются, используя синтаксис:

$( ключ преобразования $@ аргументы $: умолчание $) где и аргументы и умолчание могут быть опущены. $@ аргументы могут встречаться много раз. Указанный ключ и аргументы передаются в соответствующую преобразующую функцию. Если она возвращает значение, то оно замещает ввод. Если она не возвращает значение и имеется определенное умолчание, the умолчание заменяет ввод. Иначе ввод не изменяется.

Аргументы передаются в преобразование для произвольного использования. Большинство классов преобразований могут интерполировать эти аргументы в их значения используя для указания соответствующего аргумента синтаксис "%n" (где n - цифра).

Аргумент "%0" обозначает ключ базы данных. Например, правило

R$- ! $+ $: $(uucp $1 $@ $2 $: %1 @ %0 . UUCP $) Просматривает имя UUCP в (определенном пользователем) преобразовании UUCP; если не найдено, превращает его в форму ".UUCP". База данных должна содержать записи типа: decvax %1@%0.DEC.COM

research %1@%0.ATT.COM

Отметьте, что операторы умолчания никогда не делают этого преобразования.

Встроенное преобразование с именем и классом "host" - это просмотр канонизации имени хоста. Таким образом, синтаксис:

$(host hostname$) эквивалентен: $[hostname$] Существует множество определенных классов.
 
dbm  Просмотр базы данных, используя библиотеку ndbm(3). Sendmail должен быть скомпилирован с определенной NDBM.
btree Просмотр базы данных с использованием интерфейса btree к библиотеке Berkeley db(3). Sendmail должен быть скомпилирован с определенной NEWDB.
hash  Просмотр базы данных с использованием хэш-интерфейса к библиотеке Berkeley db(3). Sendmail должен быть скомпилирован с определенной NEWDB.
nis Просмотры NIS. Sendmail должен быть скомпилирован с определенной опцией NIS.
nisplus Просмотры NIS+. Sendmail должен быть скомпилирован с определенной опцией NISPLUS. Аргумент - имя таблицы, используемой для просмотров, а флаги -k и -v могут быть использованы для установки столбцов ключа и значения соответственно.
hesiod Просмотры Hesiod. Sendmail должен быть скомпилирован с определенной опцией HESIOD.
ldap Просмотры каталогов LDAP X500. Sendmail должен быть скомпилирован с определенной опцией LDAPMAP. Преобразование поддерживает большинство стандартных аргументов и большинство аргументов командной строки программы ldapsearch. Заметьте, что по умолчанию, если один запрос соответствует многим значениям, будет возвращено олько первое значение, если не установлен флаг преобразования -z (разделитель значений). Также, флаг преобразования -1 при множестве совпадений даст результат, как будто не было ни одного совпадения.
netinfo Просмотры NeXT NetInfo. Sendmail должен быть скомпилирован с определенной опцией NETINFO.
nsd Преобразование nsd для IRIX 6.5 и старше. Представлено и поддерживается Bob Mende из SGI, mende@sgi.com
text Просмотры текстовых файлов. Формат текстового файла определяется флагами -k (число ключевых полей), -v (число поля значений), и -z (разделитель полей).
ph Преобразование запросов PH. Представлено и поддерживается Mark Roth, roth@uiuc.edu. Дополнительная информация на страничке "http://www-dev.cso.uiuc.edu/sendmail/".
stab Просмотры внутренней таблицы символов. Используется внутри для псевдонимизирования.
implicit По-настоящему должно бы называться "alias" - используется для просмотра файлов псевдонимов по умолчанию, и используется по умолчанию, если не определен класс для файлов псевдонимов.
user Просматривает пользователей, используя getpwnam(3). Для указания имени возвращаемого поля может быть использован флаг -v (хотя обычно используется только для проверки существования пользователя).
host Канонифицирует доменные имена хостов. Получив имя хоста, вызывает сервер имен для поиска канонического имени для этого хоста.
bestmx Возвращает лучшую запись MX для заданного в качестве ключа имени хоста. Всегда предпочитается текущая машина- то есть, текущая машина является одним из хостов, перечисленных в качестве записи MX с самым низким значением предпочтения, следовательно, имеется гарантия его возврата. Это может использоваться для определения, является ли эта машина целью записи MX, и почта может быть принята на этом основании. Если задан флаг -z, то возвращаются все имена MX, разделенные заданным разделителем.
sequence Аргументы в строке "K" - список преобразований; результирующее преобразование просматривает аргументы-преобразования, пока не найдет совпадение для указанного ключа. Например, если определение ключа: 

Kmap1 ...

Kmap2 ...

Kseqmap sequence map1 map2

тогда просмотр "seqmap" сначала производится в map1. Если найдено, то происходит немедленный возврат. Иначе, тот же ключ используется для map2.

syslog Ключ протоколируется через syslogd(8). Просмотр возвращает пустую строку.
switch Прямо как преобразование "sequence", за исключением того, что порядок преобразований определяется сервисным переключателем. Аргумент - имя сервиса для просмотра; значения из сервисного переключателя добавляются к имени преобразования для создания новых имен преобразований. Например, рассмотрим определение ключа: 

Kali switch aliases 

вместе с вхождением сервисного переключателя:

aliases nis files

Это вызовет запрос по преобразованию "ali" для поиска преобразований с именами "ali.nis" и "ali.files" в этом порядке.

dequote Обрезает у имени двойные кавычки ("). Не обрезает обратные слеши, и не будет обрезать кавычки, если результирующая строка будет содержать не возможный для просмотра синтаксис (то есть, основные ошибки типа незакрытых угловых скобок; более сложные ошибки типа неизвестных хостов не проверяются). Предназначается для приема почты из систем типа DECnet, квотирующих странный синтаксис типа 

"49ers::ubell"

Обычное использование - что-то типа:

Kdequote dequote

...

R$- $: $(dequote $1 $)

R$- $+ $: $>3 $1 $2

Для предотвращения неожиданных результатов необходима осторожность; например,

"|someprogram < input > output"

потеряет свои кавычки, но результат, скорее всего, будет отличаться от ожидаемого. К счастью, такие случаи достаточно редки.

Regex Определение преобразования в строке K содержит регулярное выражение. Любой ключевой ввод сравнивается с этим выражением, используя программы регулярных выражений стандарта POSIX regcomp(), regerr(), и regexec(). Если вам нужно узнать больше информации о сравнении регулярных выражений, смотрите документацию на эти программы. Если не определен флаг -m не производится никакой перезаписи ключа. Без него, если ключ отвергнут или использован -s, то он замещается подходящими подстроками,разделенными $| или строкой, определенной флагом -d. Флаги, имеющиеся в преобразовании:

-n не
-f чувствительность к регистру
-b основные регулярные выражения (по умолчанию развернуто)
-s совпадение подстроки
-d устанавливает разделитель, используемый для -s
-a добавить строку к ключу
-m только проверка совпадения, не принимать/отказывать значение
-D не производить просмотр в режиме отложенной доставки

Флаг -s может включать опциональный параметр, который может быть использован для выбора подстроки в результате просмотра. Например,

-s1,3,4

Заметьте, для совпадения $ в строке, нужно использовать \$$. Если шаблон содержит пробелы, они должны быть заменены пустым подстановочным символом, если это не сам пробел.

program Аргументы в строке K являются путями к программам и любые начальные параметры будут пропущены. При вызове преобразования, к начальным параметрам добавляется ключ, а программа запускается с от пользователя и группы по умолчанию. Первая строка стандартного вывода возвращается как значение просмотра. Это все имеет множество потенциальных проблем безопасности, и жутко тормозит, поэтому использоваться должно только тогда, когда действительно необходимо.
macro Устанавливает или очищает значение макроса. Для установки макроса, передайте значение как первый аргумент в просмотр преобразования. Для очистки макроса, не передавайте аргумент. преобразование всегда возвращает пустую строку. Пример типичного использования:

Kstorage macro

...

# set macro ${MyMacro} to the ruleset match
R$+                $: $(storage {MyMacro} $@ $1 $) $1
# set macro ${MyMacro} to the empty string
R$*                $: $(storage {MyMacro} $@  $) $1
# clear macro ${MyMacro}
R$-                $: $(storage {MyMacro}  $) $1

arith Выполняет простые арифметические операции. Операции задаются ключём, в настоящее время поддерживаются +, -, *, /, l (для меньше чем), и =. Два операнда задаются как аргументы. просмотр возвращает результат подсчёта, то есть TRUE или FALSE для сравнений, во всех остальных случаях целые числа. Все возможные опции для преобразований игнорируются. Простой пример:

Kcomp arith

...

Schech_etrn
R$*                $: $(comp l $@ $&{load_avg} $@ 7 $) $1
RFALSE         $# error ...

Большинство из них принимают в качестве аргументов одни и те же опциональные флаги и имя файла (или имя преобразования для NIS; имя файла является корнем пути к базе данных, так что ".db" или какое-либо другое расширение будет добавлено для получения настоящего имени базы данных). Известные флаги:
 
-o Указывает, что это преобразование опционально - то есть, если оно не может быть открыто, не выдается ни какой ошибки, а sendmail будет считать, что преобразование было, но было пустым.
-N, -O Если ни -N, ни -O не указаны, sendmail использует адаптивный алгоритм для определения смотреть или нет нулевые байты в конце ключей. Сначала пробуются оба; если находится ключ с нулевым байтом, он никогда снова не будет опробован без нулевого байта и наоборот. Если указан -N, то никогда не пробуется без нулевого байта, а если указан -O, то никогда не пробуется с нулевым байтом. Указание одного из них может увеличить скоромть совпадений, но никогда не является необходимым. Если указаны оба -N и -O, sendmail никогда не будет пробовать никакие совпадения - то есть, все будет считаться неудачным.
-ax Добавить строку x к успешным совпадениям. Например, преобразование по умолчанию host добавляет точку при успешном совпадении.
-Tx Добавить строку x при временной неудаче. Например, x будет добавлена если просмотр DNS вернёт "server failed" или просмотр NIS не сможет найти сервер. Смотри также флаг -t
-f Не преобразовывать из верхнего в нижний регистр до просмотра ключа.
-m Только прверка совпадения (без замены значения). Если вы беспокоитесь о существовании ключа, а не о значении (например, при поиске преобразования NIS "hosts.byname"), этот флаг удержит преобразование от замены значения. Однако, аргумент -a все еще добавляется при совпадении, и умолчание все еще берется при несовпадении.
-kkeycol Имя ключевого столбца (для NIS+) или номер (для текстовых просмотров). Для преобразований LDAP это строка фильтра LDAP, в которой %s заменяется буквенным содержанием ключа просмотра и %0 заменяется содежимым, полученным из LDAP при просмотре ключа согласно RFC2254.
-vvalcol Имя столбца значения (для NIS+) или номер (для текстовых просмотров). Для преобразований LDAP это имя одного или более возвращаемых атрибутов; множество атрибутов могут быть разделены запятыми. Если не указано, возвращаются все атрибуты найденные при совпадении.
-zdelim Разделитель столбцов (для текстовых просмотров). Может быть одним знаком или одной из специальных строк "\n" или "\t" для указания новой строки или табуляции соответственно. Если полностью опущен, разделителем столбцов считается любая последовательность пробелов. Для преобразований LDAP это знак-разделитель для сбора множества значений в одну возвращаемую строку. Если не установлен, просмотр LDAP будет возвращать только первое совпадение.
-t Обычно, когда преобразование пытается просмотреть имя хоста и сервер ошибочен (то есть, sendmail не может найти ни одного сервера имен; это не то же самое, что вхождение не было найдено в преобразовании), обработанное сообщение ставится в очередь для дальнейшей обработки. Флаг -t отключает такое поведение, позволяя считать, что если происходит временная ошибка (сервер отключен), то это была постоянная ошибка (вхождение не найдено). В частности, это полезно для просмотров DNS, когда чей-то еще неправильно сконфигурированный сервер имен может вызвать проблемы на вашей машине. Однако здесь необходима осторожность, чтобы не откинуть почту, которая могла бы быть разрешена корректно, если бы вы попытались снова. Общая стратегия - перенаправлять такую почту на другой, возможно, имеющий лучшее соединение, почтовый сервер.
-D Не производить просмотр в режиме отложенной доставки. Этот флаг выставлен по умолчанию для преобразования хостов.
-Sspacesub Символ, используемый для замены символов пробела после успешного просмотра преобразования (особенно полезно для регулярных выражений и преобразований syslog.
-sspacesub Только для преобразования dequote, символ, используемый для замены символов пробела после успешного деквотирования.
-q Не удалять кавычки перед просмотром.
-Llevel Только для преобразования syslog. Определяет уровень для использования в вызове syslog.
-A При перестройке файла псевдонимов, флаг -A заставляет соединяться дублированные вхождения в текстовой версии. Например, два вхождения:

list: user1, user2
list: user3

при присутствии флага -A будет считаться за одно вхождение 

list: user1, user2, user3

Следующие добавочные флаги присутствуют только в преобразованиях LDAP:
 
-R Не следовать автоматически по ссылкам(?). Чтобы использовать этот флаг, sendmail должен быть скомпиллирован с -DLDAP_REFERRALS.
-n Только получить имена атрибутов.
-rderef Установить опцию разименования(? - dereference) псевдонимов в never, always, search или find
-sscope Назначить границы поиска - base, one (один уровень), или sub (поддерево).
-hхост Имя сервера LDAP. Некоторые библиотеки LDAP для надёжности позволяют использовать множество имён хостов, разделенных пробелами. В добавок, каждый из перечисленных хостов может заканчиваться двоеточием и номером порта вместо порта LDAP по умолчанию.
-bбаза База поиска LDAP
-pпорт Порт сервиса LDAP
-lвремя Ограничение времени на запросы LDAP.
-Zразмер Ограничение размера (количества совпадений) для запросов LDAP
-dDN уникальное имя, используемое для входа на сервер LDAP
-Mметод метод аутентификации в сервере LDAP. Должен быть одним из LDAP_AUTH_NONE, LDAP_AUTH_SIMPLE, или LDAP_AUTH_KRBV4
-Ppasswordfile Файл, содержащий секретный ключ для метода аутентификации LDAP_AUTH_SIMPLE или имени файла с билетом Kerberos для LDAP_AUTH_KRBV4.
-1 Поиск в LDAP будет успешным, если будет единственное совпадение.

Преобразование dbm добавляет строки ".pag" и ".dir" к заданному имени файла; преобразования hash и btree добавляют ".db". Например, описание преобразования

Kuucp dbm -o -N /usr/lib/uucpmap

Описывает опциональное преобразование класса "dbm" по имени "uucp"; оно всегда имеет нулевые байты в конце каждой строки, и данные находящиеся в /usr/lib/uucpmap.{dir,pag}.

Для постороения преобразований, ориентированных на три базы данных, может быть использована программа makemap(8). Она принимает следующие флаги:
 
-f
Не переделывать верхний регистр в нижний при преобразовании.
-N
Включать нулевые байты в ключах.
-o
Добавить к существующему (старому) файлу.
-r
Позволить замещение существующих ключей; обычно, при ошибке, заново вставляет существующий ключ.
-v
Печатать происходящее.

Демон sendmail не должен перестартовываться для чтения новых преобразований до тех пор, пока вы не замените их на месте; используется блокировка файлов, так что преобразования не будут считаны, пока они не обновлены9.

Новые классы могут быть добавлены в подпрограмму setupmaps в файле conf.c.

5.10. Пользовательская База Данных Если вы имеете версию sendmail с вкомпилированой поддержкой пользовательской базы данных, обработка адресов отправителя и получателя изменена.

Местонахождение это базы данных контролируется опцией UserDatabaseSpec.

5.10.1. Структура Пользовательской Базы Данных База данных является сортированной (основанной на BTree) структурой. Пользовательские записи сохраняются с ключом: user-name:field-name Сортированный формат базы данных гарантирует, что пользовательские записи сгруппированы вместе. Мета-информация всегда сохраняется в ведущем столбце.

Имена полей определяют и синтаксис, и семантику значения. Определенные поля включают:
 
maildrop Адрес доставки для этого пользователя. Эта запись может иметь несколько значений. В частности, списки рассылки будут иметь одну запись maildrop на каждого пользователя в списке.
mailname Выходящее почтовое имя для этого пользователя. Для каждого выходящего имени должна быть соответствующая запись maildrop для этого имени, чтобы разрешить обратную почту. См. также 

:default:mailname.

mailsender Каждое сообщение, посланное на этот адрес, будет иметь указанного конвертного отправителя. Предназначено для списков рассылки, и обычно будет именем соответствующего адреса -request. Очень похоже на owner-list синтаксис в файле псевдонимов.
fullname Полное имя пользователя.
office-address Офисный адрес пользователя.
office-phone Офисный телефон пользователя.
office-fax Офисный факс пользователя.
home-address Домашний адрес пользователя.
home-phone Домашний телефон пользователя.
home-fax Домашний факс пользователя.
project (Краткое) описание проекта, которым занимается указанное лицо. В Университете это часто просто имя научного руководителя.
plan Указатель на файл, откуда может быть взята информация о плане.

Ко времени написания этого документа, только несколько из этих полей на самом деле использовались в sendmail: maildrop и mailname. Запланирована программа finger, использующая остальные поля.

5.10.2. Семантика Пользовательской Базы Данных Когда правила перезаписи передают адрес в локальную почтовую программу, имя пользователя пропускается через файл псевдонимов. Если не найдено ни одного псевдонима (или псевдоним указывает обратно на этот адрес), имя (с добавленным ":maildrop") используется как ключ в пользовательской базе данных. Если не найдено ни одного совпадения (или если maildrop указывает на тот же адрес), пробуется пересылка.

Если первая лексема имени пользователя возвращаемая набором правил 0 - знак "@", просмотр пользовательской базы данных пропускается. Смысл этого в том, чтобы пользовательская база данных представляла собой набор умолчаний для группы (в нашем случае, Computer Science Division); почта, посылаемая на определенную машину должна игнорировать эти умолчания.

При отправке почты, имя отправителя просматривается в базе данных. Если этот пользователь имеет запись "mailname", значение этой записи используется как его выходящее имя. Например, я могу иметь запись:

eric:mailname Eric.Allman@CS.Berkeley.EDU Это приведет к тому, что посланная мной почта будет исходить от Eric.Allman.

Если для пользователя найдена запись "maildrop", но не существует ни одной соответствующей записи "mailname", производится проверка записи ":default:mailname". Если она существует, то это имя считается именем хоста, подставляемого вместо локального хоста. Например, в нашем случае, мы можем установить его в "CS.Berkeley.EDU". в результате, все, кто известен в базе данных будет отправлять почту со штампом "user@CS.Berkeley.EDU", а те, кто в ней не перечислен будут использовать локальное имя хоста.

5.10.3. Создание Базы Данных10 Пользовательская база данных строится из текстового файла, используя утилиту makemap (в поставке в подкаталоге). Текстовый файл представляет собой последовательность строк, соответствующих записям userdb; каждая строка имеет ключ и значение, разделенные пробелом. Ключ всегда имеет формат, описанный выше - например: eric:maildrop Этот файл обычно устанавливается в системном каталоге; например, он может называться /etc/userdb. Для того, чтобы сделать из преобразования базу данных, запустите программу: makemap btree /etc/mail/userdb.db < /etc/mail/userdb Затем создайте файл конфигурации использующий это. Например, используя V8 M4 конфигурацию, включите в ваш файл .mc строку: define(`confUSERDB_SPEC', /etc/mail/userdb.db)

1. На самом деле, это полностью эквивалентно $(host hostname$). В частности, может быть использовано умолчание $:. [назад]

2. Вы можете захотеть использовать это для специальных "пользовательских" расширений. Например, в адресе "jgm+foo@CMU.EDU"; часть "+foo" - это не часть имени пользователя, и передается в локальную почтовую программу для местного использования. [назад]

3. С версии 8.6, все эти макросы имеют разумные умолчания. Предыдущие версии требовали, чтобы они были определены. [назад]

4. Например, в некоторых системах gethostname может возвратить "foo", которое будет преобразовано в "foo.bar.com" посредством gethostbyname. [назад]

5. Старые версии sendmail не предопределяли $j вообще, так что, вплоть до 8.6, файлы конфигурации должны были определять $j. [назад]

6. Старая опция g была комбинирована в опцию DefaultUser. [назад]

7. При запуске в качестве демона, переходит к этому пользователюпосле принятия соединения, но до прочтения любой команды SMTP. [назад]

8. И конечно, поставщики поощряются при включении самих себя в список распознаваемых поставщиков изменением подпрограммы setvendor в conf.c. Для регистрации вашей разновидности пошлите письмо sendmail@Sendmail.ORG. [назад]

9. То есть, не создавайте новые преобразования и не кладите их командой mv(1) на место. Так как преобразования уже открыты, новые преобразования никогда не будут увидены. [назад]

10. Известно, что эти инструкции не полны. Планируется, что будущая версия пользовательской базы данных будет включать вещи типа сервиса finger - и хорошую документацию. [назад]



╘2001 Александр С. Плотников
6. Другая Конфигурация

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

6.1. Параметры в devtools/OS/$oscf

Эти параметры предназначены для описания среды компиляции, а не правил узла, и обычно должны быть определены в конфигурационном файле для данной операционной системы. Вообще-то этот раздел нужно полностью переписать.
 
NDBM Если установлен, то будет использоваться новая версия библиотеки DBM, разрешающая разнообразные базы данных. Если не установлено ни NDBM, ни NEWDB, используется наименее эффективный метод просмотра псевдонимов.
NEWDB Если он указан, использовать новый пакет баз данных от Berkeley (с 4.4BSD). Этот пакет существенно быстрее, чем DBM или NDBM. Если указаны и NEWDB и NDBM, sendmail будет читать файлы DBM, но будет создавать и использовать файлы NEWDB.
NIS Включить поддержку NIS. Если указанно вместе с NEWDB и NDBM, sendmail будет создавать и DBM и NEWDB файлы только в том случае, если файл псевдонимов включает подстроку "/yp/" в имени. Это предназначено для совместимости с программой mkalias от Sun Microsystems, используемой на мастерах YP.
NISPLUS Вкомпилировать поддержку NIS+.
NETINFO Вкомпилировать поддержку NetInfo (рабочие станции NeXT).
LDAPMAP Вкомпилировать поддержку запросов LDAP X500.
Требует libldap и liblber от Umich LDAP 3.2 или 3.3 release или эквивалентные библиотеки для других библиотек LDAP, таких как OpenLDAP.
HESIOD Вкомпилировать поддержку Hesiod.
MAP_NSD Вкомпилировать поддержку для просмотра IRIX NSD.
MAP_REGEX Вкомпилировать поддержку проверки регулярных выражений.
PH_MAP Вкомпилировать поддержку просмотра ph.
SASL Вкомпилировать поддержку для SASL, необходимый компонент для поддержки SMTP Authentication.
STARTTLS Вкомпилировать поддержку для STARTTLS.
EGD Вкомпилировать поддержку для "Entropy Gathering Daemon" для обеспечения лучших случайных данных для TLS.
SFIO Вкомпилировать поддержку для sfio, необходимого для включения шифрования, например, STARTTLS.
TSPWRAPPERS Вкомпилировать поддержку для TCP Wrappers.
_PATH_SENDMAILCF Путь к файлу sendmail.cf.
_PATH_SENDMAILPID Путь к файлу sendmail.pid.

Есть также несколько флагов компиляции для указания среды, например "_AIX3" и "_SCO_unix_". Смотри файл sendmail/READ_ME, содержащий самое свежее описание собрание этих флагов.

6.2. Параметры в sendmail/conf.h

Параметры и опции компиляции определяются в conf.h. Большинство из них обычно не трогают; все общие параметры находятся в sendmail.cf. Однако, размеры конкретных простейших векторов и т.д., включены в этот файл. Числа, стоящие после параметров означают их значения по умолчанию.

Этот документ не лучший источник информации о флагах компиляции в conf.h - лучше смотреть sendmail/READ_ME или сам sendmail/conf.h.
 
MAXLINE [2048] Максимальная длина строки любой входной строки. Если строки в сообщении превышают эту длину, они все равно будут корректно обработаны; однако, строки заголовков, строки файла конфигурации, строки файла псевдонимов и т.д., должны находиться в пределах этого ограничения.
MAXNAME [256] Максимальная длина любого имени, например имени хоста или пользователя.
MAXPV [256] Максимальное количество параметров для любой почтовой программы. Ограничивает количество получателей, передаваемых за одну транзакцию, и может быть равно любому произвольному числу больше 10, так что sendmail при необходимости будет разбивать доставку на более мелкие пакеты. Большие числа могут уменьшить загрузку вашей системы.
MAXATOM [1000] Максимальное количество атомов (лексем) в одном адресе. Например, адрес "eric@CS.Berkeley.EDU" содержит семь атомов.
MAXMAILERS [25] Максимальное количество почтовых программ, определяемых в файле конфигурации.
MAXRWSETS [200] Максимальное количество определяемых наборов правил перезаписи. Первая половина из них зарезервирована для числовой нумерации (например, "S92"), в то время как вторая половина зарезервирована для своей нумерации (например, "Sfoo"). Таким образом, при указании значения 200 попытка использовать "S99" будет успешной, а "S100" - нет.
MAXPRIORITIES [25] Максимальное количество определяемых значений для поля "Precedence:" (используя строку P в sendmail.cf).
MAXUSERENVIRON [100] Максимальное количество переменных окружения пользователя, передаваемых в подчиненные почтовые программы.
MAXMXHOSTS [100] Максимальное количество принимаемых записей MX для любого одиночного хоста.
MAXALIASDB [12] Максимальное количество открываемых баз данных псевдонимов. Заметьте, что также может быть ограничение на количество открытых файлов.
MAXMAPSTACK [12] Максимальное количество преобразований, "кучкуемых" в преобразовании класса sequence.
MAXMIMEARGS [20] Максимальное количество аргументов в заголовке MIME Content-Type:; дополнительные аргументы будут игнорированы.
MAXMIMENESTING [20] Максимальная глубина вложения сообщений MIME (то есть, вложенных документов Message или Multipart; это не ограничивает количество компонент в отдельном документе Multipart).
MAXDAEMONS [10] Максимальное количество сокетов, которые может открыть sendmail для приёма соединений на различных портах.
MAXMACNAMELEN [25] Максимальная длина имени макроса.

Существует множество других опций компиляции. Они определяют включать или нет в компиляцию определенные части кода. Отмеченные знаком | имеют значения 0/1.
 
NETINET| Если установлена, вкомпилируется поддержка сетевого протокола Internet. Предыдущие версии sendmail устанавливали ее опцией DAEMON; это старое использование теперь неправильно. По умолчанию включена; выключите ее, если ваша система не поддерживает протоколы Internet.
NETINET6| Если установлена, вкомпилируется поддержка работы в сети IPv6. Она должна быть дополнительно включена добавлением установок DaemonPortOptions.
NETISO| Если установлена, вкомпилируется поддержка сетевого протокола ISO (она может быть соответственно определена как #define в Makefile вместо conf.h).
NETUNIX| Если установлена, вкомпилируется поддержка доменных сокетов UNIX. Используется для поддержки управляющих сокетов.
LOG Если установлена, то используется программа syslog. Она делает информационные записи в протокол при каждой обработке сообщения, и делает запись в лог более высокого приоритета при внутренних ошибках системы. ОЧЕНЬ РЕКОМЕНДУЕТСЯ - если вам не нужно протоколирование, выключите его в файле конфигурации.
MATCHGECOS| Вкомпилировать код для "нечеткого совпадения " в поле GECOSв /etc/passwd. Также требует, чтобы опция MatchGECOS была включена.
NAMED_BIND| Вкомпилировать код для использования сервера Berkeley Internet Name Domain (BIND) для определения TCP/IP имен хостов.
NOTUNIX Если вы используете почтовый формат, отличный от UNIX, вы можете выставить этот флаг, чтобы отключить специальную обработку строк "From" в стиле UNIX.
QUEUE| Этот флаг должен быть выставлен для включения кода очереди. Если он не установлен, почтовые программы должны принимать почту немедленно, или она будет возвращена отправителю.
SMTP| Если установлен, то будет вкомпилирован код для обработки пользовательского и серверного SMTP. Необходим только в случае, если ваша машина имеет почтовые программы, говорящие на SMTP (то есть большинство машин).
USERDB| Включить экспериментальный пакет Berkeley user Information database. Это добавит новый уровень расширения локальных имен между псевдонимизированием и перенаправлением. Использует пакет NEWDB. Может быть изменено в будущих выпусках.

Следующие опции обычно включаются в описаниях операционных систем в conf.h.
 
IDENTPROTO| Вкомпилировать протокол IDENT определенный в RFC 1413. По умолчанию включена для всех систем, кроме Ultrix, которая, видимо, имеет такую интересную "особенность", что при получении сообщения "host unreachable", она закрывает все открытые соединения к тому хосту. Из-за того, что некоторые файервольные шлюзы посылают этот код ошибки при соединении с неавторизованным портом (типа 113, используемого IDENT), Ultrix не может получать email с таких хостов.
SYSTEM5 Устанавливает все параметры компиляции, подходящие для System V.
HASFLOCK| Использовать для блокировки Berkeley-style flock вместо SystemV lockf. Вследствие очень необычной семантики блокировок между разветвлениями в lockf, эта опция, по возможности, всегда должна быть использована.
HASINITGROUPS Выставьте эту опцию, если ваша система имеет вызов initgroups()(если вы имеете поддержку множественных групп). Используется по умолчанию, если не определена SYSTEM5, или если у вас HPUX.
HASUNAME Установите ее, если у ваша система имеет системный вызов uname(2) (или соответствующую библиотечную подпрограмму). Используется по умолчанию, если определена SYSTEM5.
HASGETDTABLESIZE Установите ее, если вы имеете системный вызов getdtablesize(2).
HASWAITPID Установите ее, если вы имеете системный вызов haswaitpid(2).
SFS_TYPE Механизм, который может быть использован для получения информации об объеме файловой системы. Значение может быть одним из SFS_USTAT (использует системный вызов ustat(2)), SFS_4ARGS (использует системный вызов statfs(2) с четырьмя аргументами), SFS_VFS (использует системный вызов statfs(2) с двумя аргументами, включая <sys/vfs.h>), SFS_MOUNT (использует системный вызов statfs(2) с двумя аргументами, включая <sys/mount.h>), SFS_STATFS (использует системный вызов statfs(2) с двумя аргументами, включая <sys/statfs.h>), SFS_STATVFS (использует системный вызов statfs(2) с двумя аргументами, включая <sys/statvfs.h>), или SFS_NONE (никаким образом нельзя получить эту информацию).
LA_TYPE Тип средней загрузки. Подробности описаны ниже.

Существует несколько встроенных способов подсчета средней загрузки. Sendmail пытается автоматически сконфигурировать их на основе несовершенных догадок; вы можете выбрать один из них используя опцию cc -DLA_TYPE=type, где type - это:
 
LA_INT Ядро хранит среднюю загрузку в ядре как целые числа типа long. Настоящие значения масштабируются коэффициентом FSCALE (по умолчанию 256).
LA_SHORT Ядро хранит среднюю загрузку в ядре как целые числа типа short. Настоящие значения масштабируются коэффициентом FSCALE (по умолчанию 256).
LA_FLOAT Ядро хранит среднюю загрузку в ядре как массив чисел с плавающей точкой двойной точности.
LA_MACH Использовать средние загрузки в стиле MACH.
LA_SUBR Вызывать программу getloadavg для получения средних загрузок в виде массива чисел типа double.
LA_ZERO Всегда в качестве средней загрузки возвращать ноль. Это крайний случай.

Если определен тип LA_INT, LA_SHORT, или LA_FLOAT, вам также может понадобиться определить _PATH_UNIX (путь к вашим системным бинарникам) и LA_AVENRUN (имя переменной, содержащей среднюю загрузку в ядре; обычно "_avenrun" или "avenrun").

6.3. Конфигурация в sendmail/conf.c

В conf.c могут быть сделаны следующие изменения. 6.3.1. Встроенные Семантики Заголовков Не все семантики заголовков определяются в файле конфигурации. Строки заголовков, которые могут быть включены только определенными почтовыми программами (так же как и другие более скрытые семантики) могут быть определены в таблице HdrInfo в conf.c. Эта таблица содержит имя заголовка (которое должно быть в символах нижнего регистра) и набор управляющих флагов заголовка (описанных ниже). Флаги таковы:
 
H_ACHECK Обычно, когда сделана проверка совместимости строки заголовка с почтовой программой, sendmail не удаляет существующую строку. Если этот флаг выставлен, sendmail будет удалять существующие строки заголовка. То есть, если этот бит выставлен, и почтовая программа не имеет установленные биты флагов, пересекающиеся с требуемыми почтовой программой флагами в определении заголовка в sendmail.cf, строка заголовка всегда уничтожается.
H_EOH Если установлено это поле заголовка, обращаться с ним, как с пустой строкой, т.е. оно сигнализирует о конце заголовка и начале текста сообщения
H_FORCE Добавить это вхождение в заголовок, даже если в сообщении такое уже было. Если вхождение заголовка не имеет этот бит выставленным, sendmail не добавит в заголовок еще одну строку, если строка с таким именем уже имеется в заголовке. Это обычно может быть использовано для того, чтобы каждый, кто обрабатывал это сообщение, оставлял в нем отметку.
H_TRACE Если этот флаг установлен, то это поле временной метки (трассировки). Если количество полей трассировки в сообщении превышает предустановленное значение, сообщение возвращается по подозрению в псевдонимной петле.
H_RCPT Если выставлен, то это поле содержит адреса получателей. Это поле используется флагом -t, когда он собирает получателей из сообщения, чтобы определить, кому посылать.
H_FROM Этот флаг указывает, что это поле определяет отправителя. Порядок этих полей в таблице HdrInfo определяет предпочтение sendmail, по какому полю отправлять сообщения об ошибке.
H_ERRORSTO Адреса в этом заголовке должны получить сообщения об ошибке.
H_CTE Этот заголовок является заголовком Content-Transfer-Encoding.
H_CTYPE Этот заголовок является заголовком Content-Type.
H_STRIPVAL Обрезать значение из заголовка (для Bcc:).

Давайте взглянем на пример спецификации HdrInfo:

        struct hdrinfo                          HdrInfo[] =
        {
                /* originator fields, most to least significant */
                "resent-sender",                H_FROM,
                "resent-from",                  H_FROM,
                "sender",                       H_FROM,
                "from",                         H_FROM,
                "full-name",                    H_ACHECK,
                "errors-to",                    H_FROM|H_ERRORSTO,
                /* destination fields */
                "to",                           H_RCPT,
                "resent-to",                    H_RCPT,
                "cc",                           H_RCPT,
                "bcc",                          H_RCPT|H_STRIPVAL,
                /* message identification and control */ 
                "message",                      H_EOH,
                "text",                         H_EOH,
                /* trace fields */
                "received",                     H_TRACE|H_FORCE, 
                /* miscellaneous fields */ 
                "content-transfer-encoding",    H_CTE, 
                "content-type",                 H_CTYPE,
                NULL,                           0,
        };
Эта структура показывает, что поля "To:", "ResentTo:", и "Cc:" - все они определяют адреса получателей. Любое поле "Full-Name:" будет удалено, пока требуемый флаг почтовой программы (указанный в файле конфигурации) не будет определен. Поля "Message:" и "Text:" будут заканчивать заголовок; они используются различными несогласными протестантами в сетевом мире. Поле "Received:" всегда будет добавлено, и может быть использовано для трассировки сообщений.

Здесь имеется большое количество важных точек. Во-первых, поля заголовка не добавляются автоматически просто потому, что они имеются в структуре HdrInfo; для того, чтобы они добавлялись в сообщение, они должны быть определены в файле конфигурации. Ко всем полям, упомянутым в файле конфигурации, но не упомянутым в структуре HdrInfo применяется обработка по умолчанию; то есть, они добавляются, если их еще нет в сообщении. Во-вторых, структура HdrInfo всего лишь определяет банальную обработку; конкретные заголовки обрабатываются отдельно, специальным кодом, вне зависимости от статуса, определенного в HdrInfo. Например, поля "Sender:" и "From:" всегда просматриваются в почте ARPANET для определения отправителя1; это используется для выполнения функции "вернуть отправителю". Поля "From:" и "Full-Name:" используются для определения полного имени отправителя, если это возможно; оно сохраняется в макросе $x и используется во многих случаях.

6.3.2. Ограничение использования Email Если существует необходимость ограничить прохождение почты через ретранслятор (relay), может быть изменена подпрограмма checkcompat. Эта подпрограмма вызывается для каждого адреса получателя. Она возвращает статус выхода, показывающий статус сообщения. Статус EX_OK принимает адрес, EX_TEMPFAIL ставит сообщение в очередь для более поздней попытки, а другие значения (обычно EX_UNAVAILABLE) отвергают сообщение. При отвержении сообщения checkcompat выдается сообщение об ошибке (используя usrerr). Например, checkcompat может быть такой:
        int
        checkcompat(to, e)
                register ADDRESS *to;
                register ENVELOPE *e;
        {
                register STAB *s;

                s = stab("private", ST_MAILER, ST_FIND);
                if (s != NULL && e->e_from.q_mailer != LocalMailer && 
                        to->q_mailer == s->s_mailer)
                {
                        usrerr("No private net mail allowed through this machine"); 
                        return (EX_UNAVAILABLE);
                }
                if (MsgSize > 50000 && bitnset(M_LOCALMAILER, to->q_mailer))
                {
                        usrerr("Message too large for non-local delivery");
                        e->e_flags |= EF_NORETURN;
                        return (EX_UNAVAILABLE);
                }
                return (EX_OK); 
        }
Такая конструкция будет отвергать сообщения размером более 50000 байт, если они не локальны. Для подавления возврата тела сообщения при ошибке, в e->e flags может быть выставлен флаг EF NORETURN. Конкретное использование этой подпрограммы очень зависит от реализации, и должно быть ограниченным. 6.3.3. Классы Преобразований Новой Базы Данных Новые ключевые преобразования могут быть добавлены созданием функции инициализации класса и функции просмотра. Они потом добавляются в подпрограмму setupmaps.

Функция инициализации вызывается так:

xxx map init(MAP *map, char *args)

где map является внутренней структурой данных; args - это указатель на кусок строки файла конфигурации с последующим именем класса преобразования; флаги и имена файлов могут быть взяты из этой строки. Функция инициализации должна возвращать TRUE, если она успешно открыла преобразование, и FALSE в другом случае.

Функция просмотра вызывается так:

xxx map lookup(MAP *map, char buf[], char **av, int *statp)

где map внутренне определяет преобразование; buf имеетв входной ключ; Он может быть (и даже очень часто так оно и есть) использован разрушающе; av - список аргументов, передаваемых внутрь из переписываемой строки. Функция просмотра должна возвращать указатель на новое значение. Если просмотр преобразования не успешен, *statp должен быть выставлен на код статуса выхода; в частности, если была произведена попытка восстановления кодом более высокого уровня, он должен быть выставлен в EX_TEMPFAIL,.

6.3.4. Функция Организации Очереди

Для определения того, должно ли быть сообщение поставлено в очередь, или обработано немедленно, используется подпрограмма shouldqueue. Обычно она сравнивает приоритет сообщения с текущей средней загрузкой. Определение по умолчанию таково:
        bool
        shouldqueue(pri, ctime)
                long pri;
                time_t ctime;
        {
                if (CurrentLA < QueueLA)
                        return (FALSE);
                return (pri > (QueueFactor / (CurrentLA - QueueLA + 1))); 
        }
Если текущая средняя загрузка (глобальная переменная CurrentLA, определяемая до вызова функции) меньше, чем нижний порог средней загрузки (опция x, переменная QueueLA), shouldqueue немедленно возвращает FALSE (то есть, оно не должно быть поставлено в очередь). Если текущая средняя загрузка превышает верхний порог средней загрузки (опция X, переменная RefuseLA), shouldqueue немедленно возвращает TRUE. В других случаях, она подсчитывает функцию основанную на приоритете сообщения, коэффициенте очереди (опция q, глобальная переменная QueueFactor), и текущей и пороговой средней загрузке.

Реализация, которая берет в рассмотрение настоящий возраст сообщения, может также использовать параметр ctime, который является временем первого представления сообщения в sendmail. Заметьте, что параметр pri уже учтен в количестве попыток отсылки сообщения (хотя, со временем это приводит к понижению приоритета сообщения); в ожидании того, что ctime будет использован как "оператор выхода" для гарантии того, что сообщение, в конце концов, обработано.

6.3.5. Отвержение Входящих Соединений SMTP

Если входящее соединение SMTP должно быть отвергнуто, функция refuseconnections возвращает TRUE. Текущая реализация основана исключительно на текущей средней загрузке и опции средней загрузки отказа (опция X, глобальная переменная RefuseLA):
        bool
        refuseconnections()
        {
                return (RefuseLA > 0 && CurrentLA >= RefuseLA);
Более умная реализация должна смотреть на большее количество системных ресурсов.

6.3.6. Подсчет Средней Загрузки

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

6.4. Конфигурация в sendmail/daemon.c

Файл src/daemon.c содержит большое количество подпрограмм, зависящих от локальной сетевой среды. Поставляемая версия подразумевает, что вы имеете сокеты в стиле BSD.

В предыдущих выпусках, если вы хотели обобщить просмотры $[ ... $], мы рекомендовали вам изменить подпрограмму maphostname. Теперь, вместо этого, мы рекомендуем вам создавать новое ключевое преобразование.

6.5. Сертификаты для STARTTLS

В этом разделе мы подразумеваем, что sendmail был скомпилирован с поддержкой STARTTLS. Когда sendmail выступает в качестве сервера, он требует от сертификатов X.509 поддержку STARTTLS: сертификат для сервера (ServerCertFile), как минимум один корневой CA (CACERTFile), то есть сертификат, используемый для подписи других сертификатов, и путь к каталогу, содержащему остальные  CA (CACERTPath). Файл, указанный CACERTFile может содержать несколько сертификатов различных CA. DN этих сертификатов посылаются клиенту вов время рукопожатия TLS (как  часть CertificateRequest) как список приемлимых CA. Для идентификации в режиме клиента также требуется сертификат X.509 (ClientCertFile), однако sendmail всегда будет использовать STARTTLS, если это будет предложено сервером. Сертификаты могут быть получены от сертификационного авторитета или созданы с помощью OpenSSL. Требуемый формат для сертификатов и частных ключей - PEM. Чтобы sendmail мог стартовать автоматически, частные ключи (ServerCertFile, ClientCertFile) должны храниться в незашифрованом виде. Ключи защищаются на уровне прав доступа файловой системы. Никогда не давайте частные ключи посторонним лицам.

6.6. PRNG для STARTTLS

STARTTLS для нормальной работы требует мощный генератор псевдо-случайных чисел (PRNG). В зависимости от используемой вами библиотеки TLS, может потребоваться явно инициализировать PRNG случайными данными. OpenSSL по возможности использует /dev/random(4) (соответствует флагу компиляции HASURANDOMDEV). В системах с отсутствием этой поддержки, в файле sendmail.cf опцией RandFile должен быть указан случайный файл. В таких системах для получения полезных случайных данных очень советуется использовать "Enttropy Gathering Daemon" EGD от Brian Warner.В этом случае sendmail должен быть скомпилирован с флагом EGD, а опция RandFile должна указывать на сокет EGD. Если ни /dev/urandom(4), ни EGD не доступны, вы должны удостовериться, что полезные случайные данные всё время доступны в RandFile. Если файл не модифицировался последние 10 минут до использования его sendmail'ом, его содержимое считается устаревшим. Один из методов создания этого файла:

        openssl rand -out /etc/mail/randfile -rand /path/to/file:...256

Для получения расширенной информации смотрите документацию на OpenSSL. В данном случае PRNG для TLS загружается другими случайными данными, только если установлена опция DontBlameSendmail InsufficientTntropy. Скорее всего этого будет недостаточно для некоторых конкретных операций, например для создания (временных) ключей.
Для получения дополнительной информации о сертификатах, их создании и использовании, важности хорошего PRNG и других аспектах TLS читайте документацию OpenSSL.


1. На самом деле, в SMTP такого больше нет; эта информация содержится на конверте. Старые протоколы ARPANET не полностью отличали заголовок от конверта. [назад]

2. Если вы это сделаете, пожалуйста, присылайте изменения по адресу sendmail@Sendmail.ORG. [назад]



╘2001 Александр С. Плотников
7. ACKNOWLEDGEMENTS

I've worked on sendmail for  many  years, and many employers  have  been remarkably patient about letting me work on a large project that was not part of my official job. This includes  time on the INGRES Project at the University of California at Berkeley, at Britton Lee, and again on the Mammoth and Titan Projects at Berkeley.
Much of the second wave of improvements resulting in version 8.1 should be credited to Bryan Costales of  the International  Computer  Science Institute. As he passed me drafts of his book on sendmail I was inspired to start working  on things again.  Bryan was also available to bounce ideas off of.
Gregory Neil Shapiro of Worcester Polytechnic Institute  has  become  instrumental in all phases of sendmail support and development, and was largely responsible  for getting versions 8.8 and 8.9 out the door.
Many,  many  people  contributed  chunks of code and ideas to sendmail.  It has proven to be a  group  network effort.   Version  8  in  particular was a group project. The following people and organizations made notable contributions:

       Claus Assmann
       John Beck, Hewlett-Packard & Sun Microsystems
       Keith Bostic, CSRG, University of California, Berkeley
       Andrew Cheng, Sun Microsystems
       Michael J. Corrigan, University of California, San Diego
       Bryan Costales, International Computer Science Institute & InfoBeat
       P.r (Pell) Emanuelsson
       Craig Everhart, Transarc Corporation
       Per Hedeland, Ericsson
       Tom Ivar Helbekkmo, Norwegian School of Economics
       Kari Hurtta, Finnish Meteorological Institute
       Allan E. Johannesen, WPI
       Jonathan Kamens, OpenVision Technologies, Inc.
       Takahiro Kanbe, Fuji Xerox Information Systems Co., Ltd.
       Brian Kantor, University of California, San Diego
       John Kennedy, Cal State University, Chico
       Murray S. Kucherawy, HookUp Communication Corp.
       Bruce Lilly, Sony U.S.
       Karl London
       Motonori Nakamura, Ritsumeikan University & Kyoto University
       John Gardiner Myers, Carnegie Mellon University
       Neil Rickert, Northern Illinois University
       Gregory Neil Shapiro, WPI
       Eric Schnoebelen, Convex Computer Corp.
       Eric Wassenaar, National Institute for Nuclear and High Energy Physics, Amsterdam
       Randall Winchester, University of Maryland
       Christophe Wolfhugel, Pasteur Institute & Herve Schauer Consultants (Paris)
       Exactis.com, Inc.

I apologize for anyone I have omitted, misspelled, misattributed, or otherwise missed.  At this point, I  suspect that at least a hundred people have contributed code, and many more have contributed ideas, comments, and  encouragement.  I've tried to list them in the RELEASE_NOTES in the distribution directory. I appreciate their contribution as well.
Special thanks are reserved for Michael Corrigan and Christophe Wolfhugel, who besides being wonderful  guinea pigs  and contributors have also consented to be added to the ``sendmail@Sendmail.ORG'' list and, by answering  the bulk of the questions sent to that list, have freed me up to do other work.