5. Полное Описание Файла Конфигурации
Этот раздел детально описывает файл конфигурации.
Есть одна вещь, которую вам нужно уяснить сразу: синтаксис файла конфигурации разработан так, чтобы его можно было достаточно легко анализировать, так как синтаксический анализ производится при каждом запуске sendmail, а не для того, чтобы людям было легко его читать или писать. В списке "будущих разработок" имеется компилятор файла конфигурации.
Файл конфигурации организован как последовательность строк, каждая из которых начинается с одного символа, определяющего семантику всей остальной строки. Строки, начинающиеся с пробела или символа табуляции, являются строками-продолжениями (хотя во многих местах семантика не особенно хорошо определена). Пустые строки и строки, начинающиеся с символа "#" являются комментариями.
Ядром синтаксического анализа адресов являются правила перезаписи. Они являются упорядоченной системой обработки. Sendmail просматривает набор правил перезаписи, ища совпадения в левосторонней части (LHS) правила. Если правило подходит, адрес замещается правосторонней частью (RHS) правила.
Имеется несколько наборов правил перезаписи. Некоторые из наборов используются внутренне, и должны иметь специфическую семантику. Другие наборы не имеют специальной семантики, и могут быть использованы определениями почтовых программ или другими наборами перезаписи.
Синтаксис этих двух команд такой:
Устанавливает текущий набор правил в n. Если вы начинаете набор не в первый раз, это добавляет к старому определению.
Поля должны быть разделены как минимум одним символом табуляции; поля могут содержать пробелы. lhs - это шаблон, применяемый на входе. Если он подходит, вывод переписывается на rhs. Комментарии игнорируются.
Макрорасширения в виде $x выполняются при чтении файла конфигурации. Расширения вида $&x выполняются во время работы, используя какой-либо менее общий алгоритм. Это предназначено только для ссылочных внутренне определенных макросов, типа $h, изменяющихся во время работы.
Левосторонняя часть правил перезаписи содержит шаблон. Обычные слова просто напрямую сравниваются. Метасинтаксис вводится использованием знака доллара. Метасимволы это:
$* |
Совпадение нуля или более лексем |
$+ |
Совпадение одного или более лексем |
$- |
Совпадение ровно одной лексемы |
$=x |
Совпадение любой фразы класса x |
$~x |
Совпадение любого слова не входящего в класс x |
При любом из этих совпадений, они назначаются символу $n для замены в правосторонней части, где n - индекс в LHS. Например, если LHS:
применена к входу:
Правило совпадет, и значения переданные в RHS будут такими:
$2 eric
Дополнительно, LHS может включать $@ для совпадения нулевыми лексемами. Это не граница $n в RHS, и обычно используется только в одиночестве, чтобы соответствовать нулевому входу.
Когда левосторонняя часть правила перезаписи совпадает, входная информация удаляется и замещается правосторонней частью. Лексемы копируются прямо из 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 затем подставляется в это правило.
Синтаксис $> распространяется на все после имени набора правил и до конца замещаемой строки, а затем передается как первичный вход в набор правил. Позволяются рекурсивные вызовы. Например,
расширяет $1, передает его в набор правил 3, а затем передает результат набора правил 3 в набор правил 0.
Синтаксис $# должен быть использован только в наборе правил 0, или подпрограмме набора правил 0. Он приводит к немедленному завершению выполнения набора правил, и сигнализирует sendmail, что адрес полностью разрешен. Полный синтаксис таков:
Он определяет тройку {mailer, host, user}, необходимую для почтовой программы. Если почтовая программа локальна, то часть host может быть опущена2. Мailer должен быть одним словом, а host и user могут состоять из нескольких частей. Если mailer является встроенным IPC mailer'ом, host может быть списком хостов, разделенных запятыми, который просматривается в поисках первого работающего адреса (точно как записи типа MX). Позднее user переписывается специфическим для данной почтовой программы набором правил перезаписи, и назначается макросу $u. В особом случае, если определенный mailer имеет ОПРЕДЕЛЕНЫЙ флаг F=@ и первый символ значения $: является "@", "@" обрезается, и выставляется флаг в описании адреса, заставляющий sendmail не применят обработку по набору правил 5.
Обычно, подходящее правило применяется снова, поэтому правило идет по кругу до появления ошибки. RHS может быть предварена $@ или $: для изменения такого поведения. Префикс A $@ заставляет набор правил возвращаться с остатком RHS в качестве значения. Префикс $: заставляет немедленно закончить работу правила, но продолжить работу набора правил; это может быть использовано во избежание продолжения применения правила. Префикс перед продолжением обрезается.
Префиксы $@ и $: могут предшествовать описанию $>; например:
Совпадает со всем, передает это в набор правил семь, и продолжается; $: необходимо во избежание бесконечной петли.
Замещение происходит в описанном порядке, то есть замещаются параметры из LHS, канонизируются имена хостов, вызываются "подпрограммы", и в конце обрабатываются $#, $@, и $:.
Существует пять наборов правил перезаписи, имеющих специфическую семантику. Взаимоотношения четырех из них изображены на Рис.1.
+---+
-->| 0 |-->resolved address
/ +---+
/ +---+ +---+
/ --->| 1 |-->| S |--
+---+ / +---+ / +---+ +---+ \ +---+
addr-->| 3 |-->| D | ----->| 4 |-->msg
+---+ +---+ \ +---+ +---+ / +---+
--->| 2 |-->| R |--
+---+ +---+
Рис.1. Семантика набора перезаписи
D - Добавка домена отправителя
S - Перезапись отправителя в зависимости от почтовой программы
R - Перезапись получателя в зависимомти от почтовой программы
Набор правил 3 должен превратить адрес в "каноническую форму". Эта форма должна иметь основной синтаксис:
Набор правил 3 применяется sendmail'ом до любых изменений в любом адресе.
Если не определено ни одного знака "@", то hostdomain-spec может быть добавлен (квадратик "D" на Рис.1.) из адреса отправителя (если в определениях почтовых программ для соответствующей отсылающей программы выставлен флаг C).
Набор правил 0 применяется после набора правил 3 к адресу, определяющему получателей. Он должен быть разделен на тройку {mailer, host, user}. Mailer должен быть определен в определениях почтовых программ в файле конфигурации. Host определяется макросом $h для использования в расширенном argv указанной почтовой программы.
Правила 1 и 2 применяются ко всем адресам отправителей и получателей соответственно. Они применяются до любого указания в определении почтовой программы. Их никогда не нужно проверять.
Набор правил 4 применяется ко всем адресам в сообщении. Он обычно используется для перевода из внутренней формы во внешнюю.
В добавок, набор правил 5 применяется ко всем локальным адресам (в частности, к тем, которые разрешаются в почтовой программе с выставленным флагом "F=5") не имеющим псевдонимов. Это последняя ловушка для локальных имен.
Несколько дополнительных наборов правил считаются "ловушками", и могут быть определены для некоторых особенностей. Все они являются именованными наборами правил. Все формы "check_*" выдают статус принять/отказать; переход в конец, или нормальный выход означает принять, а определение $#error - отказать. Многие из них могут иметь результатом специальную почтовую программу $#discard; она принимает сообщение, как будто все прошло успешно, но затем выбрасывает его без доставки.
Набор правил check relay вызывается после приема соединения. Он проверяет
где $| - метасимвол, разделяющий две части. Это правило может отказать в соединении из различных мест.
Набор правил check mail проверяет параметр имени пользователя из команды SMTP MAIL. Может принять или отвергнуть адрес.
Набор правил check rcpt проверяет параметр имени пользователя из команды SMTP RCPT. Может принять или отвергнуть адрес.
Набор правил check compat проверяет
где $| - метасимвол, разделяющий адреса. Он может принять или отвергнуть передачу почты между этими двумя адресами, что очень похоже на функцию checkcompat().
Если набор правил 0 определяет почтовую программу IPC (то есть, почтовая программа имеет "[IPC]" перечисленное в качестве Path в строке конфигурации M), происходит некоторая специальная обработка. Имя хоста, переданное после "$@" имеет найденное расширение MX; при этом имя хоста просматривается в DNS в поисках альтернативных узлов для доставки.
Имя хоста также может быть представлено как четыре числа, разделенные точками в квадратных скобках; например:
Это заставит сделать прямое преобразование числового значения в IP адрес хоста.
Имя хоста, прошедшее после "$@" также может быть списком хостов, разделенных запятыми. Для каждого из них находится MX, а результаты складываются в один длинный список MX. Цель всего этого - создать "фальшивые" записи MX, которых нет в DNS для частных внутренних сетей.
Последний специальный случай - имя хоста может быть передано как текстовая строка в квадратных скобках:
Эта форма избегает MX преобразования. Заметь!: Это предназначено только для ситуаций, когда у вас имеется сетевой firewall, или иной хост, производящий специальную обработку всей вашей почты, так что ваша запись MX указывает на шлюзовую машину; затем эта машина производит прямую доставку на машины в вашем локальном домене. Использование этой особенности напрямую нарушает секцию 5.3.5 RFC 1123: это должно использоваться только в случае, если у вас для этого имеется серьезная причина.
Имена Макросов состоят из одного символа или из слова в фигурных скобках {}. Имена из одного символа могут быть выбраны из всей таблицы ASCII, пользовательские макросы должны быть выбраны только из набора символов верхнего регистра. Буквы нижнего регистра и специальные символы имеют веутреннее использование. Длинные имена, начинающиеся с буквы нижнего регистра или знака пунктуации, зарезервированы для использования sendmail'ом, поэтому длинные пользовательские имена макросов должны начинаться с буквы верхнего регистра.
Синтаксис определения макросов таков:
Где x - имя макроса (которое может быть одним символом или словом в скобках), а val - значение, которое должен иметь этот макрос. При этом не должно быть пробелов, не принадлежащих содержимому значения макроса.
Макросы интерполируются использованием конструкции $x, где x - имя макроса для интерполяции. Эта интерполяция производится при чтении файла конфигурации, кроме строк M. Специальная конструкция $&x может быть использована в строках R для получения косвенной интерполяции.
Условные зависимости могут быть определены использованием синтаксиса:
Это интерполирует 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 |
Домашний каталог получателя. |
$_ |
Подтвержденный адрес отправителя. |
${bodytype} |
Тип тела сообщения (7BIT или 8BITMIME), определенный из конверта. |
${client_addr} |
IP адрес клиента SMTP. Определяется только в сервере SMTP. |
${client_name} |
Имя хоста клиента SMTP |
${client_port} |
Номер порта клиента SMTP. Определяется только в сервере SMTP. |
${envid} |
Идентификационный номер конверта, переданный в sendmail как часть конверта. |
${opMode} |
Текущий режим работы (из флага -b). |
Существует три типа дат, которые могут быть использованы. Макросы $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 * (конечно же, используя косвенную форму определения $&!).
Можно определить классы или фразы для соответствия левосторонней части правил перезаписи, где "фраза" - это последовательность символов, не содержащая символов пробела. Например, для предотвращения отправки сообщений самому себе, может быть создан класс всех локальных имен для данного узла. Это может быть определено как в файле конфигурации, так и читаться из другого файла. Классы имеют имена, состоящие из одной буквы или слова в {скобках}. Имена классов, начинающиеся с букв нижнего регистра и специальных символов, зарезервированы для использования системой. Классы, определенные в файлах конфигурации могут быть заданы заглавными буквами для коротких имен, или начинаться с заглавной буквы для длинных имен.
Синтаксис:
Fcfile
Первая форма определяет класс c соответствующим любому из названных слов. Ее можно разбивать на несколько строк; на пример, две формы:
и
CHucbmonet
эквивалентны. Форма "F" читает элементы класса c из названного file.
Можно получить доступ из правил к элементам классов, используя $= или $~, (сопоставить вхождения не входящие в класс) совпадающие только с отдельным словом; вхождения из нескольких слов в классе, в этом контексте, игнорируются.
Некоторые классы имеют для 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 |
Выставлен в набор всех имен, о которых знает хост. Может быть использован для совпадений с локальными именами хостов. |
Sendmail может быть скомпилирован с разрешением использовать scanf(3) в строке F. Это позволит вам производить простейший анализ текстовых файлов. Например, чтобы прочитать все имена пользователей из системного файла /etc/passwd в класс, используйте
Это будет читать каждую строку до первого двоеточия.
В этой строке определяются почтовые программы и их интерфейсы. Формат такой:
Где name - имя почтовой программы (используется только внутренне), а пары "field=name" определяют атрибуты почтовой программы. Поля такие:
Path | Путь к почтовой программе |
Flags | Специальные флаги для этой почтовой программы |
Sender | Набор(ы) правил перезаписи для адресов отправителя |
Recipient | Набор(ы) правил перезаписи для адреса получателя |
Argv | Вектор аргументов, передаваемый в почтовую программу |
Eol | Строка end-of-line для этой почтовой программы |
Maxsize | Максимальный размер сообщения для этой почтовой программы |
Linelimit | Максимальная длина линии в теле сообщения |
Directory | Рабочий каталог для почтовой программы |
Userid | Идентификаторы пользователя и группы для запуска |
Nice | Инкремент nice(2) для почтовой программы |
Charset | Набор символов по умолчанию для 8-битных символов |
Type | Информация о типе MTS (используется для сообщений об ошибках) |
В имени поля проверяется только первый символ.
Нижеописанные флаги могут быть установлены в описании почтовой программы. Любые другие флаги могут свободно использоваться для условных заголовков в сообщениях для определенных почтовых программ. Флаги, отмеченные |,не интерпретируются бинарником 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> Автоматически переписывать как: From: usera@hosta Однако это не всегда работает надежно. |
d |
Не включать угловые скобки вокруг адресов с синтаксисом путевого адреса. Полезно для почтовых программ, передающих адреса в оболочку, которая может интерпретировать угловые скобки как перенаправление ввода/вывода. |
D |
Эта почтовая программа хочет в заголовке строку "Date:". |
e |
Эта почтовая программа слишком медленна, поэтому попробуй избежать нормального соединения; любое необходимое соединение произойдет во время обработки очереди. |
E |
Избегать строки, начинающиеся с "From" в сообщении с знаком ">". |
f |
Почтовая программа хочет флаг -f from, но только если это операция пересылки в сети (то есть, почтовая программа выдаст ошибку, если выполняющий пользователь не имеет специальных прав). |
F| |
Эта почтовая программа хочет строку заголовка "From:". |
g |
Обычно, sendmail посылает внутренне созданную почту (например, сообщения об ошибках) используя нулевой обратный адрес, как это требуется RFC 1123. Однако, некоторые почтовые программы не принимают нулевой обратный адрес. Если это необходимо, вы можете установить флаг g, чтобы sendmail не следовал стандартам; сообщения об ошибках будут посланы от MAILER-DAEMON (на самом деле, значение макроса $n). |
h |
Символы верхнего регистра в именах хостов для этой почтовой программы должны быть сохранены. |
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 для другого возможного разрешения. Это предназначено для перенаправления почты в другое альтернативное место доставки. |
7 |
Обрезать весь вывод до семи бит. Стоит по умолчанию, если установлен флаг L. Заметьте, что очистка этой опции не достаточна, чтобы через sendmail полностью проходили восьмибитные данные. Если опция 7 выставлена, а она в основном всегда выставлена, то восьмибитные данные на входе будут обрезаться. Нужно отметить, что эта опция затрагивает только сообщения, которые не имеют примененного MIME преобразования 8->7 бит. |
8 |
Если выставлена, то эта почтовая программа принимает для отсылки восьмибитные данные; обычная попытка MIME преобразования 8->7 бит будет пропущена. |
9 |
Если выставлена, производить ограниченные MIME преобразования 7->8 бит. Эти преобразования ограничены данными типа text/plain. |
: |
Проверить адреса, не начинаются ли они с ":include:"; если это так, обратить их к почтовой программе "*include*". |
| |
Проверить адреса, не начинаются ли они с "|"; "prog". |
/ |
Проверить адреса, не начинаются ли они с "/"; если это так, обратить их к почтовой программе "*file*". |
@ |
Просмотреть адреса в пользовательской базе данных. |
Конфигурационные файлы до уровня 6 предполагают опции "A", "w", "5", ":", "|", "/", и "@" в почтовой программе называющейся "local".
Почтовая программа со специальным именем "error" может быть использована для генерации сообщений об ошибках пользователя. Поле хоста (опционально) содержит возвращаемый статус выхода, а поле пользователя - распечатываемое сообщение. Статус выхода может быть числом или одним из значений USAGE, NOUSER, NOHOST, UNAVAILABLE, SOFTWARE, TEMPFAIL, PROTOCOL, или CONFIG, возвращающим соответствующий код выхода EX_, или усовершенствованный код ошибки, описанный в RFC 1893, Enhanced Mail System Status Codes. Например, вхождение:
в RHS правила вызовет генерацию указанной ошибки, и, если LHS совпадает, будет возвращен статус выхода "Host unknown". Эта почтовая программа работоспособна только в наборах правил 0, 5, или одном из наборов правил check_*.
Почтовая программа со специальным именем "discard" заставляет выкидывать любую почту, посланную к ней, но в то же время считать, что она была успешно доставлена.
Почтовая программа, называющаяся "local" должна быть определена в каждом файле конфигурации. Она используется для доставки локальной почты, и обслуживается особо несколькими образами. В добавок, три другие почтовые программы, называющиеся "prog", "*file*", и "*include*" могут быть определены для настройки доставки сообщений в программы, файлы и списки :include: соответственно. Их умолчания:
M*file*, P=/dev/null, F=lsDFMPEu, A=FILE
M*include*, P=/dev/null, F=su, A=INCLUDE
Наборы перезаписи 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".
Формат строк заголовка, вставляемых sendmail в сообщение, определяется строкой H. Синтаксис этой строки:
Строки-продолжения в этом определении отражаются прямо в выходящее сообщение. Макрос htemplate раскрывается до подстановки в сообщение. Если определена mflags (окруженная знаками вопроса), как минимум один из указанных флагов должен иметь место в определении почтовой программы для этого заголовка для автоматического вывода. Если один из этих заголовков имеется на входе, он отражается на выход не зависимо от этих флагов.
Некоторые заголовки имеют специальную семантику, описываемую позднее.
Вторичный синтаксис позволяет производить проверку заголовков в том виде, как они были считаны. Для включения проверки, используйте:
HHeader: $>Ruleset
Указанный набор правил (Ruleset) вызывается для указанного заголовка Header, и может возвращать $#error для отказа от сообщения, или $#discard для сброса сообщения (как и в остальных наборах правил check_*). Заголовок рассматривается как структурированное поле, то есть, комментарии (в кавычках) перед обработкой удаляются.
Например, следующие строки в конфигурации:
R< $+ @ $+ >$@ OK R$* $#error $: Illegal Message-Id header
Приведут к отказу от любого сообщения, имеющего заголовок в любой из следующих форм:
Message-Id: любой текст
Message-Id: <легальный текст@домен> дополнения
Существует большое количество глобальных опций, которые могут быть назначены из файла конфигурации. Опции представляются целыми словами; некоторые, для обратной совместимости, можно также представлять в виде отдельных букв. Синтаксис таков:
Это назначает опции опция указанное значение. Заметьте, что между буквой "O" и именем опции должен быть пробел. Раньше это было так:
где опция o - один символ. В зависимости от опции, значение может быть строкой, целым числом, булевым (с допустимыми значениями "t", "T", "f", или "F"; по умолчанию TRUE), или интервалом времени.
Поддерживаемые опции (со старыми, однобуквенными именами в квадратных скобках):
AliasFile=spec, spec, ...
AliasWait=timeout
AllowBogusHELO
AutoRebuildAliases
BlankSub=c
CheckAliases
CheckpointInterval=N
ClassFactor=fact
ColonOkInAddr
ConnectionCacheSize=N
ConnectionCacheTimeout=timeout
ConnectionRateThrottle=N
DaemonPortOptions=options
Port | Имя/номер рабочего порта (по умолчанию "smtp") |
Addr | Адресная маска (по умолчанию INADDR_ANY) |
Family | Семейство адресов (по умолчанию INET) |
Listen | Размер очереди прослушивания (по умолчанию 10) |
SndBufSize | Размер буфера TCP на отправку |
RcvBufSize | Размер буфера TCP на прием |
DefaultCharSet=charset
DefaultUser=user:group
DeliveryMode=x
i | Доставлять интерактивно (синхронно) |
b | Доставлять в фоне (асинхронно) |
q | Просто класть сообщение в очередь (доставка во время обработки очереди) |
d | Отложить доставку и все преобразования (доставка во время обработки очереди) |
DialDelay=sleeptime
DontBlameSendmail=option,option,...
Safe
AssumeSafeChown
ClassFileInUnsafeDirPath
ErrorHeaderInUnsafeDirPath
FileDeliveryToHardLink
FileDeliveryToSymLink
ForwardFileInUnsafeDirPath
ForwardFileInUnsafeDirPathSafe
ForwardFileIngroupWritableDirPath
GroupWritableAliasFile
GroupWritableDirPathSafe
GroupWritableForwardFileSafe
GroupWritableIncludeFileSafe
HelpFileinUnsafeDirPath
IncludeFileInUnsafeDirPath
IncludeFileInUnsafeDirPathSafe
IncludeFileIngroupWritableDirPath
LinkedAliasFileInWritableDir
LinkedClassFileInWritableDir
LinkedForwardFileInWritableDir
LinkedIncludeFileInWritableDir
LinkedMapInWritableDir
LinkedServiceSwitchFileInWritableDir
MapInUnsafeDirPath
RunProgramInUnsafeDirPath
RunWritableProgram
WorldWritableAliasFile
WriteMapToHardLink
WriteMapToSymLink
WriteStatsToHardLink
WriteStatsToSymLink
Safe - это умолчание. Выше имеется более подробное описание этих флагов. Использование этой опции не рекомендуется.
DontExpandCnames
DontInitGroups
DontProbeInterfaces
DontPruneRoutes
sendmail обрежет "@known1,@known2" для того, чтобы сделать маршрут как можно более прямым. Однако, если выставлена опция R, это будет отключено, и почта будет послана по первому адресу в маршруте, даже если остальные адреса известны. Это может быть полезно, если вы заперты за файерволом.
DoubleBounceAddress=error-address
EightBitMode= действие
s | Отвергнуть необъявленные 8-битные данные ("strict") |
m | Преобразовать необъявленные 8-битные данные в MIME ("mime") |
p | Пропустить необъявленные 8-битные данные ("pass") |
ErrorHeader=file-or-message
ErrorMode=x
p | Печатать сообщения об ошибке (по умолчанию) |
q | Без сообщений, просто выдавать статус выхода |
m | Отправлять назад ошибки почтой |
w | Печатать ошибки (отправлять почтой, если пользователь не находится в системе) |
e | Отправлять назад ошибки почтой и всегда выдывать нулевой статус выхода |
FallbackMXhost=fallbackhost
ForkEachJob
ForwardPath=path
HelpFile=file
HoldExpensive
HostsFile=path
HostStatusDirectory=path
IgnoreDots
LogLevel=n
Mxзначение
MatchGECOS
MaxDaemonChildren=N
MaxHopCount=N
MaxHostStatAge=age
MaxMessageSize=N
MaxQueueRunSize=N
MaxRecipientsPerMessage=N
MeToo
MinFreeBlocks=N
MinQueueAge=age
MustQuoteChars=s
NoRecipientAction
OldStyleHeaders
OperatorChars=charlist
PostmasterCopy=postmaster
PrivacyOptions=opt,opt,...
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: |
QueueDirectory=dir
QueueFactor=коэффициент
QueueLA=LA
QueueSortOrder=алгоритм
QueueTimeout=timeout
ResolverOptions=options
RunAsUser=user
RecipientFactor=коэффициент
RefuseLA=LA
RetryFactor=коэффициент
SafeFileEnvironment=каталог
SaveFromLine
SendMIMEErrors
ServiceSwitchFile=filename
aliases | Files |
hosts | dns nis files |
SevenBitInput
SingleLineFromHeader
SingleThreadDelivery
SmtpGreetingMessage=сообщение
StatusFile=file
SuperSafe
TempFileMode=mode
Timeout.type=timeout
initial | Ожидание начального приветствия [5m, 5m] |
helo | Ответ на команду HELO или EHLO [5m, none] |
Ответ на команду MAIL [10m, 5m] | |
rcpt | Ответ на команду RCPT [1h, 5m] |
datainit | Ответ на команду DATA [5m, 2m] |
datablock | Чтение блока данных [1h, 3m] |
datafinal | Ответ на завершающую "." в данных [1h, 10m] |
rset | Ответ на команду RSET [5m, none] |
quit | Ответ на команду QUIT [2m, none] |
misc | Ответ на команды NOOP и VERB [2m, none] |
ident | Таймаут протокола IDENT [30s, none] |
fileopen| | Таймаут открытия файлов .forward и :include: [60s, none] |
command| | Чтение команды [1h, 5m] |
queuereturn| | Время до возврата сообщения [5d, 5d] |
queuewarn| | Время до посылки предупреждения [none, none] |
hoststatus| | Время "устаревания" статуса хоста [30m, none] |
TimeZoneSpec=tzinfo
TryNullMXList
UnixFromLine=fromline
UnsafeGroupWrites
UseErrorsTo
UserDatabaseSpec=udbspec
UserSubmission
Verbose
Все опции могут быть указаны в командной строке, используя флаг -O или -o, но большинство может заставить sendmail освободиться от своих suid'ных полномочий. Опции, которые этого не причиняют: MinFreeBlocks [b], DeliveryMode [d], ErrorMode [e], IgnoreDots [i], LogLevel [L], MeToo [m], OldStyleHeaders [o], PrivacyOptions [p], Timeouts [r], SuperSafe [s], Verbose [v], CheckpointInterval [C], и SevenBitInput [7]. Также, M (определить макрос) при определении макросов r или s считается "безопасным".
Значения для поля "Precedence:" могут быть определены использованием контрольной строки P. Синтаксис этого поля:
Когда имя найдено в поле "Precedence:" класс сообщения выставляется в число. Более высокие числа означают более высокое старшинство. Числа менее нуля имеют специальное назначение - если происходит ошибка во время обработки сообщения, его тело не будет возвращено; это предназначается для "большой" почты, типа проходящей через списки рассылки. По умолчанию старшинство равно нулю. Например, наш список старшинств состоит из:
Pspecial-delivery=100
Plist=-30
Pbulk=-60
Pjunk=-100
Использование людьми, пишущие обработчики списков рассылки "Precedence: list" очень приветствуется. Старые версии sendmail (которые отвергали все возвраты ошибок из-за отрицательного старшинства) не распознают это имя, давая ему нулевое старшинство по умолчанию. Это позволяет владельцам списков рассылки видеть возвраты ошибок и в старых, и в новых версиях sendmail.
Для обеспечения совместимости со старыми файлами конфигурации, была добавлена строка 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.
Специальные преобразования могут быть определены использованием строки:
Где mapname - имя, под которым это преобразование используется в правилах перезаписи; mapclass - имя типа преобразования (эти имена вкомпилированы в sendmail); arguments интерпретируются в зависимости от класса; обычно, используется один аргумент, указывающий на файл, содержащий преобразование.
На преобразования ссылаются, используя синтаксис:
где и аргументы и умолчание могут быть опущены. $@ аргументы могут встречаться много раз. Указанный ключ и аргументы передаются в соответствующую преобразующую функцию. Если она возвращает значение, то оно замещает ввод. Если она не возвращает значение и имеется определенное умолчание, the умолчание заменяет ввод. Иначе ввод не изменяется.
Аргументы передаются в преобразование для произвольного использования. Большинство классов преобразований могут интерполировать эти аргументы в их значения используя для указания соответствующего аргумента синтаксис "%n" (где n - цифра).
Аргумент "%0" обозначает ключ базы данных. Например, правило
Просматривает имя UUCP в (определенном пользователем) преобразовании UUCP; если не найдено, превращает его в форму ".UUCP". База данных должна содержать записи типа:
research %1@%0.ATT.COM
Отметьте, что операторы умолчания никогда не делают этого преобразования.
Встроенное преобразование с именем и классом "host" - это просмотр канонизации имени хоста. Таким образом, синтаксис:
эквивалентен:
Существует множество определенных классов.
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. |
ldapx | Просмотры каталогов LDAP X500. Sendmail должен быть скомпилирован с определенной опцией LDAPMAP. Преобразование поддерживает большинство стандартных аргументов и большинство аргументов командной строки программы ldapsearch. |
netinfo | Просмотры NeXT NetInfo. Sendmail должен быть скомпилирован с определенной опцией NETINFO. |
text | Просмотры текстовых файлов. Формат текстового файла определяется флагами -k (число ключевых полей), -v (число поля значений), и -z (разделитель полей). |
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. |
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 не Флаг -sflag выбыирает подстроки в результате просмотра. Например, -s1,3,4 |
program | Аргументы в строке K являются путями к программам и любые начальные параметры будут пропущены. При вызове преобразования, к начальным параметрам добавляется ключ, а программа запускается с от пользователя и группы по умолчанию. Первая строка стандартного вывода возвращается как значение просмотра. Это все имеет множество потенциальных проблем безопасности, и жутко тормозит, поэтому использоваться должно только тогда, когда действительно необходимо. |
Большинство из них принимают в качестве аргументов одни и те же опциональные флаги и имя файла (или имя преобразования для NIS; имя файла является корнем пути к базе данных, так что ".db" или какое-либо другое расширение будет добавлено для получения настоящего имени базы данных). Известные флаги:
-o | Указывает, что это преобразование опционально - то есть, если оно не может быть открыто, не выдается ни какой ошибки, а sendmail будет считать, что преобразование было, но было пустым. |
-N, -O | Если ни -N, ни -O не указаны, sendmail использует адаптивный алгоритм для определения смотреть или нет нулевые байты в конце ключей. Сначала пробуются оба; если находится ключ с нулевым байтом, он никогда снова не будет опробован без нулевого байта и наоборот. Если указан -N, то никогда не пробуется без нулевого байта, а если указан -O, то никогда не пробуется с нулевым байтом. Указание одного из них может увеличить скоромть совпадений, но никогда не является необходимым. Если указаны оба -N и -O, sendmail никогда не будет пробовать никакие совпадения - то есть, все будет считаться неудачным. |
-ax | Добавить строку x к успешным совпадениям. Например, преобразование по умолчанию host добавляет точку при успешном совпадении. |
-Tx | Добавить строку x при временной неудаче. |
-f | Не преобразовывать из верхнего в нижний регистр до просмотра ключа. |
-m | Только прверка совпадения (без замены значения). Если вы беспокоитесь о существовании ключа, а не о значении (например, при поиске преобразования NIS "hosts.byname"), этот флаг удержит преобразование от замены значения. Однако, аргумент -a все еще добавляется при совпадении, и умолчание все еще берется при несовпадении. |
-kkeycol | Имя ключевого столбца (для NIS+) или номер (для текстовых просмотров). Для преобразований LDAP это фильтрует строку, проходящую на printf с %s, где вставляется строка для "преобразования". |
-vvalcol | Имя столбца значения (для NIS+) или номер (для текстовых просмотров). Для преобразований LDAP это имя возвращаемого атрибута. |
-zdelim | Разделитель столбцов (для текстовых просмотров). Может быть одним знаком или одной из специальных строк "\n" или "\t" для указания новой строки или табуляции соответственно. Если полностью опущен, разделителем столбцов считается любая последовательность пробелов. |
-t | Обычно, когда преобразование пытается просмотреть имя хоста и сервер ошибочен (то есть, sendmail не может найти ни одного сервера имен; это не то же самое, что вхождение не было найдено в преобразовании), обработанное сообщение ставится в очередь для дальнейшей обработки. Флаг -t отключает такое поведение, позволяя считать, что если происходит временная ошибка (сервер отключен), то это была постоянная ошибка (вхождение не найдено). В частности, это полезно для просмотров DNS, когда чей-то еще неправильно сконфигурированный сервер имен может вызвать проблемы на вашей машине. Однако здесь необходима осторожность, чтобы не откинуть почту, которая могла бы быть разрешена корректно, если бы вы попытались снова. Общая стратегия - перенаправлять такую почту на другой, возможно, имеющий лучшее соединение, почтовый сервер. |
-sspacesub | Только для преобразования dequote, символ, используемый для замены символов пробела после успешного деквотирования. |
-q | Не удалять кавычки перед просмотром. |
-A | При
перестройке файла псевдонимов,
флаг -A заставляет
соединяться дублированные
вхождения в текстовой версии.
Например, два вхождения: list:
user1, user2 при присутствии флага -A будет считаться за одно вхождение list: user1, user2, user3 |
Преобразование 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.
Если вы имеете версию sendmail с вкомпилированой поддержкой пользовательской базы данных, обработка адресов отправителя и получателя изменена.
Местонахождение это базы данных контролируется опцией UserDatabaseSpec.
База данных является сортированной (основанной на BTree) структурой. Пользовательские записи сохраняются с ключом:
Сортированный формат базы данных гарантирует, что пользовательские записи сгруппированы вместе. Мета-информация всегда сохраняется в ведущем столбце.
Имена полей определяют и синтаксис, и семантику значения. Определенные поля включают:
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, использующая остальные поля.
Когда правила перезаписи передают адрес в локальную почтовую программу, имя пользователя пропускается через файл псевдонимов. Если не найдено ни одного псевдонима (или псевдоним указывает обратно на этот адрес), имя (с добавленным ":maildrop") используется как ключ в пользовательской базе данных. Если не найдено ни одного совпадения (или если maildrop указывает на тот же адрес), пробуется пересылка.
Если первая лексема имени пользователя возвращаемая набором правил - знак "@", просмотр пользовательской базы данных пропускается. Смысл этого в том, чтобы пользовательская база данных представляла собой набор умолчаний для группы (в нашем случае, Computer Science Division); почта, посылаемая на определенную машину должна игнорировать эти умолчания.
При отправке почты, имя отправителя просматривается в базе данных. Если этот пользователь имеет запись "mailname", значение этой записи используется как его выходящее имя. Например, я могу иметь запись:
Это приведет к тому, что посланная мной почта будет исходить от Eric.Allman.
Если для пользователя найдена запись "maildrop", но не существует ни одной соответствующей записи "mailname", производится проверка записи ":default:mailname". Если она существует, то это имя считается именем хоста, подставляемого вместо локального хоста. Например, в нашем случае, мы можем установить его в "CS.Berkeley.EDU". в результате, все, кто известен в базе данных будет отправлять почту со штампом "user@CS.Berkeley.EDU", а те, кто в ней не перечислен будут использовать локальное имя хоста.
Пользовательская база данных строится из текстового файла, используя утилиту makemap (в поставке в подкаталоге). Текстовый файл представляет собой последовательность строк, соответствующих записям userdb; каждая строка имеет ключ и значение, разделенные пробелом. Ключ всегда имеет формат, описанный выше - например:
Этот файл обычно устанавливается в системном каталоге; например, он может называться /etc/userdb. Для того, чтобы сделать из преобразования базу данных, запустите программу:
Затем создайте файл конфигурации использующий это. Например, используя V8 M4 конфигурацию, включите в ваш файл .mc строку:
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 - и хорошую документацию. [назад]