SENDMAIL
INSTALLATION AND OPERATION GUIDE
Eric Allman
eric@Sendmail.ORG
Version 8.317.4.56
For Sendmail Version 8.11
Перевод Плотникова А.С.
Самую последнюю версию этой документации, и не только ее, вы можете найти здесь.
ПРИЛОЖЕНИЕ 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 работает как демон.
ПРИЛОЖЕНИЕ 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 | Файл данных. Тело сообщения (исключая заголовок) хранится в этом файле. |
q | Контрольный файл очереди. Этот файл содержит информацию, необходимую для обработки. |
t | Временный файл. Это имидж файла qf во время его перестройки. Он должен очень быстро переименоваться в файл qf . |
x | Файл переписки, существует во время сессии, показывая все, что случается во время этой сессии. |
Файл qf структурируется как последовательность строк, каждая
из которых начинается с кодовой буквы. Существуют следующие строки:
V | Номер версии формата файла очереди, используется для того, чтобы позволить новым бинарникам sendmail читать файлы очереди, созданные более ранними версиями. По умолчанию ноль. Если есть, то должна быть первой строкой в файле. |
A | Информация, заданная параметром AUTH= команды "MAIL FROM:" или $f@$j, если sendmail был вызван непосредственно. |
H | Определение заголовка. Таких строк может быть несколько. Порядок их очень важен: Он представляет собой порядок в конечном сообщении. используется тот же синтаксис, как и для определений заголовков в файле конфигурации. |
C | Контрольный адрес. Синтаксис "localuser:aliasname". Адрес получателя, следующий за этой строкой будет иметь такие флаги, что доставка будет производиться от localuser (имя пользователя из файла /etc/passwd file); aliasname - это имя псевдонима, расширяющегося на этот адрес (используеися для печати сообщений). |
Q | "Оригинальный получатель", определяемый полем ORCPT= в транзакции ESMTP. Используется только для Уведомлений о Статусе Доставки. Применяется только сразу после строки "R". |
R | Адрес получателя. Будет по одной строке на каждого получателя. Файлы qf Версии 1 также включают ведущий список флагов, заканчивающийся двоеточием, которые могут быть "S" для возврата сообщения при успешной заключительной доставке, "F" для возврата сообщения при неудаче, "D" для возврата сообщения, если оно отложено, "B" для указания того, что должно быть возвращено тело, "N" для подавления возврата тела, и "P" для декларации этого адреса как "первичного" (primary) (командная строка или сессия SMTP). |
S | Адрес отправителя. Такая строка может быть только одна. |
T | Время создания работы. Используется для подсчета истечения таймаута работы. |
P | Текущий приритет сообщения. Используется для упорядочивания очереди. Более высокие числа означают более низкий приоритет. Во время нахождения сообщения в очереди приоритет изменяется. Изначальный приритет зависит от класса сообщения и его размера. |
M | Сообщение. Эта строка печатается командой mailq, и обычно используется для хранения информации о статусе. Может содержать любой текст. |
F | Флаговые биты, одна буква на флаг. Определенные флаговые биты: r - показывает, что это ответное сообщение и w - показывает что было послано сообщение с предупреждением о задержке почты. |
N | Общее количество попыток доставки. |
K | Время последней попытки доставки (в секундах с 1 Января 1970г.). |
I | Идентификационный номер файла данных; может быть использован для восстановления почтовой очереди после катастрофического "падения" диска. |
$ | Определение макроса. Значения конкретных макросов (во время написания этого документа, только $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г.), приоритет сообщения, его класс, получателей, и заголовки для сообщения.
Этовымышленный пример, поэтому он может быть неточен для вашего случая. Главное здесь - понять идею; ничто не заменит вам того, что может выдать вам ваша система.
ПРИЛОЖЕНИЕ 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* | Описание текущей сессии. |
SENDMAIL
INSTALLATION AND OPERATION GUIDE
Eric Allman
eric@Sendmail.ORG
Version 8.317.4.56
For Sendmail Version 8.11
Перевод Плотникова А.С.
Самую последнюю версию этой документации, и не только ее, вы можете найти здесь.
Существует два основных шага при установке sendmail. Во-первых, вы должны скомпилировать и установить бинарные файлы. Это будет достаточно просто, если sendmail уже перенесен в вашу операционную систему. Во-вторых, вы должны сделать рабочий файл конфигурации. Этот файл считывается sendmail при запуске и описывает все известные ему почтовые программы, правила анализа адресов, переписи заголовков сообщений, а также настройки различных опций. Хотя файл конфигурации достаточно сложен, обычно конфигурацию можно построить используя основанный на M4 язык конфигурации.
Остаток этого раздела описывает установку sendmail в том случае, если вы используете одну из уже существующих конфигураций, и стандартные параметры установки для вас вполне приемлимы. Все пути к файлам и примеры заданы от корня поддерева sendmail, для 4.4BSD обычно /usr/src/usr.sbin/sendmail.
Если вы загружаете его с ленты, продолжайте со следующего раздела. Если в вашей системе уже имеется работающий бинарный файл, то вы вполне можете сразу переходить к разделу 1.2.
./Build
Бинарные файлы будут оставлены в соответствующе названном каталоге, например obj.BSD-OS.2.1.i386. Это сделано для того, чтобы в одном и том же дереве исходных файлов могли быть скомпилированы несколько объектных версий.
-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.
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 и должны быть уже предопределены для вас, если только вы не занимаетесь портированием в другую систему.
./Build
Он использует uname (1) для выбора подходящего для вашей системы Makefile.
Если вы устанавливаете все на стандартные места, то произвести установку можно с помощью
./Build install
Это должно установить бинарный файл в /usr/sbin и создать ссылки /usr/bin/newaliases и /usr/bin/mailq на /usr/sbin/sendmail. В системах 4.4BSD это также сформатирует и установит инструкции (man pages).
Поначалу конфигурация 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.
Файл конфигурации обычно создается с использованием описанных выше файлов из поставки. Если у вас необычная конфигурация системы, то, возможно, вам понадобиться создать специальную версию. Формат этого файла более подробно описан в последующих разделах этого документа.
rm -f /usr/bin/newaliases
ln -s /usr/sbin/sendmail /usr/bin/newaliases
Он должен быть создан там, где его найдет системный путь поиска.
cp lib/aliases /etc/mail/aliases
edit /etc/mail/aliases
Вы должны добавить в этот файл любые псевдонимы, необходимые в вашей системе.
Обычно sendmail смотрит на версии этих файлов в виде баз данных, хранящихся и в "/etc/aliases.dir" и в "/etc/aliases.pag" или "/etc/aliases.db", в зависимости от используемой вами пакета баз данных. Путь к этому файлу определяется опцией AliasFile в файле sendmail.cf.
Добавьте в ваш "/etc/rc" (или "/etc/rc.local" в зависимости от системы) в то место, где он запускает демоны (для систем на основе BSD) , или в один из файлов запуска, обычно это "/etc/init.d/sendmail" ( в системах на основе System-V), следующие строчки:
if [ -f /usr/sbin/sendmail -a -f /etc/sendmail.cf ]; then
/usr/sbin/sendmail -bd -q30m &
echo -n ' sendmail' /dev/console
Команды "cd" и "rm" здесь даются для того, чтобы гарантировать, что все файлы-замки (lock files) были уничтожены; посторонние файлы-замки могут остаться, если система вдруг "упадет" посреди обработки сообщения. Строка, которая на самом деле запускает sendmail , имеет два флага: "-bd" заставляет его слушать на порту SMTP, а "-q30m" заставляет его производить обработку очереди каждые полчаса.
Некоторые используют более сложный сценарий запуска, удаляющий файлы
qf нулевой длины, и файлы df, для которых нет ни одного файла qf. Пример
сложного сценария запуска представлен на рис.1.
# remove zero length qf files
for qffile in qf* do then then rm -f $qffile # rename tf files to be qf if the qf does not exist for tffile in tf* do if [ -r $tffile -a ! -f $qffile ] then mv $tffile $qffile rm -f $tffile # remove df files with no corresponding qf files for dffile in df* do if [ -r $dffile -a ! -f $qffile ] then mv $dffile `echo $dffile | sed 's/d/D/'` # announce files that have been saved during disaster recovery for xffile in [A-Z]f* do |
рис.1 - Комплексный сценарий запуска
Если ваша версия UNIX не поддерживает Berkeley TCP/IP, не включайте флаг -bd.
1.3.10. /etc/mail/helpfile
cp sendmail/helpfile /etc/mail/helpfile
Настоящий путь к этому файлу определяется опцией HelpFile в файле sendmail.cf.
cp /dev/null /etc/mail/statistics
chmod 666 /etc/mail/statistics
Этот файл не увеличивается. Он распечатывается программой "mailstats/mailstats.c." Настоящий путь к этому файлу определяется опцией S в файле sendmail.cf.
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. [назад]
После обработки сообщения обычно протоколируются две строки. Первая
отмечает получение сообщения; на каждое сообщение будет ровно одна такая
строка. Некоторые поля могут быть пропущены, если они не содержат интересной
информации. Поля такие:
from | Конвертный адрес отправителя |
size | Размер сообщения в байтах |
class | Класс (т.е. числовой приоритет) сообщения |
pri | Начальный приоритет сообщения (используется для сортировки очереди) |
nrcpts | Количество почтовых получателей для этого сообщения (после обработки псевдонимов и перенаправлений) |
msgid | Идентификационный номер сообщения (из заголовка) |
proto | Протокол, использовавшийся при получении этого сообщения (например, ESMTP или UUCP) |
daemon | Имя демона из установок DaemonPortOptions |
relay | Машина, от которой было получено сообщение |
На каждую попытку доставки сообщения записываетя еще одна строка (так
что каждое сообщение таких строк может быть несколько, например, если оно
отложено, или если имеется несколько получателей). Поля в этой строке таковы:
to | Список получателей для этой почтовой программы, разделенный запятыми. |
ctladdr | "Контрольный пользователь", то есть, имя пользователя, чьи параметры мы используем при доставке. |
delay | Общее время задержки между получением и доставкой сообщения. |
xdelay | Время, понадобившееся для попытки доставки (обычно показывает скорость соединения). |
mailer | Имя почтовой программы, использовавшейся для доставки к данному получателю. |
relay | Имя хоста, принявшего сообщение для данного получателя (или отказавшего в доставке). |
dsn | Усовершенствованный код ошибки (RFC 2034), если доступен |
stat | Статус доставки. |
Не все эти поля присутствуют для всех сообщений; например, для локальных сообщений отсутствует поле relay.
Полное описание уровней протоколирования дано в разделе 4.6.
При нормальных условиях почтовая очередь будет обрабатываться прозрачно. Однако вы можете обнаружить, что иногда необходимо вмешаться руками. Например, если основной хост долгое время отключен, очередь может засориться. Хотя sendmail должен нормально восстановить все при загрузке хоста, тем временем вы можете найти его производительность неприемлемо низкой.
Не производится ни одной попытки удостовериться в том, что только один обработчик очереди существует в любое время, поэтому нет никакой гарантии, что работа не будет производиться вечно (однако, sendmail имеет некоторую эвристику, чтобы попытаться прекратить работу, занимающую абсурдно большое количество времени; технологически, это нарушает требования RFC 821, но одобряется в RFC 1123). Согласно алгоритму блокировки, одна работа не может заморозить всю очередь. Однако, недружественный принимающий хост, или программа приема, которая никогда ничего не возвращает, может собрать большое количество процессов в вашей системе. К несчастью, нет никакого общего решения для разрешения подобных проблем.
В некоторых случаях, вы можете заметить, что основной хост второй день как упал, и у вас накопилась невероятно большая очередь. В результате sendmail большую часть времени будет проводить, сортируя эту очередь. Эта ситуация может быть исправлена, если вы уберете очередь в какое-то временное место и создадите новую очередь. Старую очередь можно будет обработать позже, когда хост-нарушитель опять начнет работать.
Чтобы это сделать, вполне возможно перенести весь каталог очереди:
mv mqueue omqueue; mkdir mqueue; chmod 700 mqueue
Чтобы обработать старую очередь, запустите следующую команду:
Когда в очереди наконец-то не останется ни одного сообщения, вы сможете удалить этот каталог:
Дополнительно, включение опции SingleThreadDelivery даст дополнительный эффект доставки почты к месту назначения одной цепочкой. Это может очень помочь, если на удаленной машине работает сервер SMTP, который легко нагружается, или может работать только с одним соединением за раз. Она применяется ко всем хостам, поэтому её установка по причине того, что на вашем узле для доставки почты используется одна машина, на которой работает дополнительное программное обеспечение, увеличивающее загрузку машины, может привести к замедлению доставки почты на другие хосты. Если эта опция выставлена, то вам, возможно, захочется выставить опцию MinQueueAge, чтобы ваша очередь обрабатывалась достаточно часто; в результате работы, пропущенные по причине того, что другой процесс sendmail разговаривал с тем же хостом, вскоре будут опробованы снова, а не отложены на долгое время.
Информация о хостах сохраняется на диске в подкаталоге .hoststat3каталога mqueue. Удаление этого каталога с его подкаталогами равносильно команде purgestat и вполне безопасно. Однако, purgestat всего лишь удаляет устаревшие (Timeout.hoststatus) файлы. Информация из этих каталогов может быть просмотрена командой hoststat, которая покажет имя хоста, последний доступ и статус этого доступа. Звездочка в самой левой колонке означает, что процесс sendmail в настоящее время имеет блокировку на доставку почты на этот хост.
В целях оптимизации таймаутов, информация, сохраняемая на диске, обслуживается таким же образом, что и информация, хранимая в памяти. По умолчанию, информация об ошибках хостов действительна в течение 30 минут. Это значение может быть изменено опцией Timeout.hoststatus.
С дисковой информацией о соединениях в отношении таймаутов обращаются так же, как и с той, что находится в памяти. По умолчанию, информация о неудачах с хостами считается действительной в течение 30 минут. Это значение может быть изменено опцией Timeout.hoststatus.
Информация о соединении, сохраненная на диске, может быть очищена в любой момент командой purgestat, или запуском sendmail с ключом -bH. Информацию о соединении можно просмотреть командой hoststat, или запуском sendmail с ключом -bh.
Если операционная система не поддерживает сервисный переключатель (например, SunOS 4.x, HP-UX, BSD), то sendmail будет использовать свою фиктивную реализацию. Опция ServiceSwitchFile указывает на имя файла, содержащего определения сервисов. Каждая строка содержит имя сервиса и возможные реализации этого сервиса. Например, файл:
Сервисные переключатели не полностью интегрированы. Например, несмотря на то, что в вышеописанном примере имя хоста необходимо смотреть в NIS, в SunOS этого не произойдет, из-за того, что системная реализация gethostbyname(3) не понимает этого. Если имеется достаточно причин, sendmail может использовать свои реализации gethostbyname(3), gethostbyaddr(3), getpwent(3), и других системных подпрограмм, которые будут необходимы для безглючной работы.
База данных псевдонимов существует в двух видах. Один - текстовая форма, содержащаяся в файле /etc/mail/aliases. Псевдонимы имеют следующий вид
Вторая форма обрабатывается библиотекой ndbm(3)5 или библиотекой Berkley DB. Эта форма находится в файлах /etc/mail/aliases.db (если используется NEWDB) или /etc/mail/aliases.dir и /etc/mail/aliases.pag (если используется NDBM). Это именно та форма, которую использует sendmail при определении псевдонимов. Эта технология используется для увеличения производительности.
Управление порядком поиска выставляется непосредственно сервисным переключателем. По существу, вхождение
Вы также можете использовать файлы псевдонимов на основе NIS. Например, определение:
O AliasFile=nis:mail.aliases@my.nis.domain
Дополнительные флаги могут быть добавлены после двоеточия, точно как строка K; например:
Если вы определили несколько баз данных псевдонимов, флаг -bi перестроит все типы баз данных, которые он понимает (например, он может перестраивать базы данных NDBM, но не может базы данных NIS).
Sendmail имеет три метода, чтобы попытаться избавиться от этих проблем. Первый - он игнорирует прерывания во время перестройки базы данных; это позволяет избежать случая, когда кто-нибудь прекращает процесс, оставляя частично перестроенную базу данных. Второй - он блокирует исходный файл базы данных во время перестройки - но это может не работать поверх NFS или если файл защищен на запись. Третий - в конце перестройки он добавляет псевдоним в виде
owner-unix-wizards: unix-wizards-request
unix-wizards-request: eric@ucbarpa
Владельцы списков также изменяют почтовый адрес отправителя. Используется содержимое псевдонима владельца, если оно указывает на одного пользователя, иначе будет использоваться само имя псевдонима. По этой причине, и в соответствии с соглашениями Internet, адрес "owner-" обычно указывает на адрес "-request"; это позволяет сообщениям следовать типичным соглашениям Internet об использовании "list-request" как обратный адрес.
kirk@calder
На самом деле, файл конфигурации определяет последовательность проверяемых имен файлов. По умолчанию, это пользовательский файл .forward, но может быть определен по-другому, используя опцию ForwardPath. Если вы ее измените, вы должны будете проинформировать ваших основных пользователей об изменении; .forward очень хорошо вошло в коллективное подсознание.
Заголовок Errors-To: был создан в плохие старые времена, когда UUCP не понимал различий между содержимым и заголовком; Это было встроено для того, чтобы указать, что должно быть теперь пропущено как адрес отправителя сообщения. Это будет убрано, но пока еще используется, если выставлена опция UseErrorsTo.
Заголовок Errors-To: официально уже убран, и в последующих выпусках будет отсутствовать.
Заголовок Apparently-To: нестандартен и опротестован.
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. Обычно она должна быть определена. [назад]
Полный список аргументов для sendmail детально описан в Приложении A. Некоторые важные аргументы описаны здесь.
Секция 5.3.1.1 RFC 1123 говорит, что это значение должно быть как минимум 30 минут (но, если вы работаете в режиме "queue-only", то это не важно).
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 |
Для полного списка доступных отладочных флагов, вы должны посмотреть в исходный код (они слишком динамичны, чтобы быть отраженными в этой документации).
Когда вы используете этот флаг, sendmail не использует пермиссии смены uid на root, поэтому обычно, во время тестирования, для каталога подкачки используют каталог, который открыт всем на запись (типа /tmp) (опция QueueDirectory или Q).
Это протоколирует большое количество данных очень быстро, и при нормальной работе вы НИКОГДА не должны ее использовать. После запуска такого демона, заставьте хост со странной почтовой программой послать сообщение на ваш хост. Весь траффик сообщений из и в sendmail, включая входящий траффик SMTP, будет запротоколирован в этом файле.
Если вам нужна большая детализация, вы можете также использовать флаг "-d21" для включения режима отладки. Например,
Необходимо предупредить, что внутренне sendmail применяет набор правил 3 ко всем адресам. В тестовом режиме, вы должны делать это вручную. Например, старые версии позволяли вам использовать
+o .Dxзначение | Указывает макросу x иметь указанное значение. Это полезно, когда отлаживаемые правила используют синтаксис $&x. |
+o .Ccзначение | Добавляет указанное значение к классу c. |
+o .Sнабор_правил | Распечатывает содержимое указанного набора правил. |
+o -ddebug-spec | Эквивалентно флагу командной строки. |
1. То есть, он выставляет свой эффективный uid соответственно
настоящему uid; таким образом, если вы запускаете его как root, или из
root'овского файла crontab, или во время запуска системы, пермиссии root
будут учтены. [назад]
В зависимости от потребностей вашего узла, вы можете захотеть изменить те или иные конфигурационные параметры. Большинство из них устанавливаются опциями в файле конфигурации. Например, строка "O Timeout.queuereturn=5d" устанавливает опции "Timeout.queuereturn" значение "5d" (пять дней).
Многие из этих опций имеют подходящие для большинства узлов значения по умолчанию. Однако, на узлах с большой почтовой нагрузкой может понадобиться некоторая соответствующая настройка под их почтовую загрузку. В частности, на узлах, через которые проходит большое количество небольших почтовых сообщений, доставляемых многим получателям, может понадобиться подправить параметры, связанные с приоритетами очереди.
Все версии sendmail до 8.7 имели имена опций, состоящие из одного символа. С 8.7, опции имеют длинные (состоящие из нескольких символов) имена. Хотя старые короткие имена до сих пор принимаются, многие новые опции не имеют коротких эквивалентов.
Этот раздел описывает только те опции, которые вам, вероятно, захочется изменить; более детальное описание опций дано в разделе 5.
|
Секунды |
|
Минуты |
|
Часы |
|
Дни |
|
Недели |
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.datablock=3h
Если сообщение передано с использованием расширения 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 указанием времени, по истечении которого должно быть послано предупреждение; два таймаута разделяются слешем. Например, строка
Если опция ForkEachJob не выставлена, sendmail не может использовать кэшированные соединения.
Размер сообщения здесь используется для того, чтобы более большие сообщения обрабатывались после относительно небольших. Класс сообщения позволяет пользователям посылать "высокоприоритетные" сообщения включая поле "Precedence:" в свои сообщения; Значение этого поля просматривается в строках P файла конфигурации. Вследствие того, что количество получателей сообщения может влиять на загрузку, оно также включено в приоритет.
Коэффициенты получателя и класса могут быть установлены в файле конфигурации, используя опции RecipientFactor (y) и ClassFactor (z) соответственно. По умолчанию, они равны: 30000 (для коэффициента получателя) и 1800 (для коэффициента класса). Первичный приоритет таков:
pri = msgsize - (class умноженный на ClassFactor) + (nrcpt умноженное на RecipientFactor)
(Запомните, более высокое значение этого параметра на самом деле означает, что работа будет обработана с низким приоритетом.)
Приоритет работы скорректирован при каждой обработке сообщения (то есть, при каждой попытке его доставки) использованием "рабочего коэффициента времени", установленного опцией RetryFactor (Z). Он добавляется к приоритету, поэтому обычно он уменьшает старшинство работы, на основании того, что работа, не выполненная много раз, вполне может быть не выполнена опять. Опция RetryFactor по умолчанию равна 90000.
pri > { QueueFactor } / { LA - { QueueLA } + 1 }
По умолчанию опция QueueFactor равна 600000, так что каждая единица средней загрузки стоит 600000 пунктов приоритета (как описано выше).
Для крутых случаев, опция RefuseLA (X) определяет среднюю загрузку, при которой sendmail будет отказываться принимать сетевые соединения. Локально созданная почта (включая входящую почту UUCP) будет приниматься.
|
Интерактивная доставка (синхронная) |
|
Доставка в фоне (асинхронная) |
|
Только очередь (не доставлять) |
|
Отложить попытку доставки (не доставлять) |
Есть и компромиссы. Режим "i" дает отправителю быстрейшую обратную связь, но может замедлить некоторые почтовые программы намного больше необходимого. Режим "b" доставляет быстро, но может наплодить кучу процессов, если ваша почтовая программа тратит много времени на доставку сообщений. Режим "q" минимизирует загрузку вашей машины, но доставка сообщений будет задержана до наступления очередного интервала. Режим "d" идентичен режиму "q", за исключением того, что он также предотвращает работу всех просмотров; он предназначен для узлов "dial on demand", где просмотр DNS может стоить реальные деньги. Некоторые простые сообщения об ошибках (например, host unknown) в этом режиме будут задержаны. По умолчанию обычно используется режим "b".
Если вы запускаете sendmail в режиме "q" (только очередь), "d" (отсрочка), или "b" (доставка в фоне), то он не будет разворачивать псевдонимы и следовать файлам .forward, вплоть до первого получения почты. Это ускоряет ответ на команду RCPT. Режим "i" не может быть использован сервером SMTP.
|
Минимальный протокол |
|
Серьезные системные ошибки и потенциальные проблемы безопасности |
|
Потери соединений (сетевые проблемы) и ошибки протокола |
|
Другие серьезные ошибки, неправильные адреса, временные ошибки forward/include, таймауты соединений. |
|
Несущественные неисправности, устаревание базы данных псевдонимов, отказы соединений из-за проверочных наборов правил (check_rulests) |
|
Статистика сбора сообщений |
|
Создание сообщений об ошибках, командах VRFY и EXPN. |
|
Ошибки доставки (хост или пользователь не известен и т.д.) |
|
Успешные доставки и перестроения базы псевдонимов. |
|
Отложенные сообщения (из-за того, что хост отключен и т.д.) |
|
Расширение базы данных (просмотры псевдонимов, перенаправлений и пользователей) |
|
Ошибки NIS и окончание обработок |
|
Протоколирование всех соединений SMTP. |
|
Протоколирование плохих пользовательских оболочек, файлов с несоответствующими пермиссиями, и других спорных ситуаций. |
|
Протоколирование всех отказов от соединений |
|
Протоколирование всех входящих и исходящих команд SMTP. |
|
Протоколирует попытки обработки заблокированных файлов в очереди. Это не ошибки, но может быть полезно, если ваша очередь становится перегруженной. |
|
Потерянные блокировки (только если вы используете lockf вместо flock). |
Дополнительно, значения выше 64 зарезервированы для очень болтливого вывода при отладке. Никто в здравом уме не поставит такой уровень.
Если вы не делаете 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 скорее всего наиболее подходит для конфигурации на брандмауэрах, не имеющих регулярных заходов пользователей.
Если вы совершенно уверены, что ваша конфигурация находится в безопасности,
и вы хотите, чтобы 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 | Разрешить файлу статуса быть символической ссылкой. |
При попытке открыть соединение, первым проверяется кэш. Если найдено открытое соединение, оно проверяется на предмет активности посылкой команды RSET. Если произойдет ошибка, то соединение будет закрыто и заново открыто.
Кэшем соединений управляют два параметра. Опция ConnectionCacheSize (k) определяет количество позволенных одновременно открытых соединений. Если оно равно нулю, соединения будут закрываться, как только это станет возможным. По умолчанию оно равно одному. Его можно установить такого размера, как вам потребуется; оно будет ограничивать количество системных ресурсов, используемых sendmail при обработке очереди. Никогда не устанавливайте это значение больше 4.
Опция ConnectionCacheTimeout (K) определяет максимальное время бездеятельности любого кэшированного соединения. Когда время простоя превысит это значение, соединение будет закрыто. Это число должно быть небольшим (до 10 минут), чтобы вы не занимали системные ресурсы других машин. Значение по умолчанию пять минут.
Однако, некоторые системы (типа 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_"). Каждый из них может быть предварен опциональным "+" или "-". Например, строка
Версия конфигурации уровня 1 выключает DNSRCH и DEFNAMES для просмотров, делаемых при доставке, но оставляет их включенными во всех остальных случаях. Версия 8 sendmail игнорирует их при канонификационных просмотрах (при использовании $[ ... $]), и всегда делает поиск. Если вы не хотите автоматического расширения имен, не вызывайте $[ ... $].
Правила поиска для $[ ... $] - это скорее что-то непохожее, чем необычное. Если просматриваемое имя имеет хотя бы одну точку, оно всегда будет опробовано без изменений. Если это не удастся, будет опробован уменьшенный путь поиска, и в конце концов будет опробовано неизмененное имя (но только для имен без точек, потому что имена с точками уже были опробованы). Это позволяет именам типа "utc.CS" совпадать с узлами в Чехословакии, а не с узлами в вашем местном отделении Computer Science. Они также предпочитают записи типов A и CNAME записям типа MX- поэтому, если находится запись MX, о ней делается заметка, но просмотр продолжается. Таким образом, если вы имеете масочную запись MX, соответствующую вашему домену, то это не будет распознано, как будто все имена совпадают с ней.
Для полного выключения доступа к серверу имен в, системах без поддержки сервисного переключателя (типа SunOS 4.x), вы должны будете перекомпилировать sendmail с -DNAMED_BIND=0 и удалив -lresolv из списка искомых при линковании библиотек.
Опция ForwardPath (J) позволяет вам назначить путь к файлам перенаправления. Например, строка файла конфигурации
Если вы создаете каталог типа /var/forward, он должен иметь пермиссии 1777 (то есть, должен быть выставлен sticky bit). Пользователи должны создавать файлы с пермиссиями 644. Заметьте, что для разрешения файлов перенаправления в каталоге, открытом всем на запись, вы должны использовать флаги ForwardFileInUnsafeDirPath и ForwardFileInUnsafeDirPathSafe с опцией DontBlameSendmail. Это может быть использовано для атак типа "отказ от обслуживания (DoS) (пользователи могут создавать файлы перенаправления для других пользователей); наилучшим подходом может быть создание каталога /var/forward с доступом 755 и созданием в нём пустых файлов для каждого пользователя, принадлежащих данным пользователям с доступом 644. Если вы сделаете так, то вам не прийдется выставлять опции DontBlameSendmail, как указано выше.
Не устанавливайте значение этой опции слишком высоким; это может повлечь отказ от почты в тех случаях, когда она может быть спокойно обработана.
Опция принимает последовательности имен флагов; крайняя конфиденциальность - включение всех этих флагов. Например:
Флаги подробно описаны в разделе 5.6.
1. В некоторых системах по умолчанию нуль, чтобы окончательно отключить протокол. [назад]
2. Эта проверка включает просмотр каждого адреса сервером имен; что добавляет сетевые задержки, но в некоторых случаях может быть приемлемо. [назад]
Этот раздел детально описывает файл конфигурации.
Есть одна вещь, которую вам нужно уяснить сразу: синтаксис файла конфигурации разработан так, чтобы его можно было достаточно легко анализировать, так как синтаксический анализ производится при каждом запуске sendmail, а не для того, чтобы людям было легко его читать или писать. В списке "будущих разработок" имеется компилятор файла конфигурации.
Файл конфигурации организован как последовательность строк, каждая из которых начинается с одного символа, определяющего семантику всей остальной строки. Строки, начинающиеся с пробела или символа табуляции, являются строками-продолжениями (хотя во многих местах семантика не особенно хорошо определена). Пустые строки и строки, начинающиеся с символа "#" являются комментариями.
Имеется несколько наборов правил перезаписи. Некоторые из наборов используются внутренне, и должны иметь специфическую семантику. Другие наборы не имеют специальной семантики, и могут быть использованы определениями почтовых программ или другими наборами перезаписи.
Синтаксис этих двух команд такой:
Макрорасширения в виде $x выполняются при чтении файла конфигурации. Знак $ может быть включён использованием $$.Расширения вида $&x выполняются во время работы, используя какой-либо менее общий алгоритм. Это предназначено только для ссылочных внутренне определенных макросов, типа $h, изменяющихся во время работы.
|
Совпадение нуля или более лексем |
|
Совпадение одного или более лексем |
|
Совпадение ровно одной лексемы |
|
Совпадение любой фразы класса x |
|
Совпадение любого слова не входящего в класс x |
При любом из этих совпадений, они назначаются символу $n для замены в правосторонней части, где n - индекс в LHS. Например, если LHS:
$2 eric
|
Заместить неопределенную лексему n из LHS |
|
Канонизировать имя |
|
Обобщенная ключевая функция преобразования |
|
"Вызов" набора правил n |
|
Решение в mailer |
|
Определить host |
|
Определить user |
Синтаксис $n замещает соответствующее значение из $+, $-, $*, $=, или $~ совпадения в LHS. Это может быть использовано везде.
Имя хоста, заключенное между $[ и $] просматривается в базе(ах) данных хостов и заменяется на каноническое имя 1. Например, "$[ftp$]" может стать "ftp.CS.Berkeley.EDU", а "$[[128.32.130.2]$]" может стать "vangogh.CS.Berkeley.EDU.". Sendmail распознает его числовой IP адрес без вызова сервера имен и замещает его своим каноническим именем.
Синтаксис $( ... $) - более общая форма просмотра; он использует названное преобразование вместо неявного. Если ничего не найдено, вставляется указанное умолчание; если умолчание не определено, и ничего не найдено, значение остается без изменений. Аргументы передаются в преобразование для возможного использования.
Синтаксис $>n заставляет остаток строки замещать обычным образом, а затем передать как аргумент в набор правил n. Конечное значение набора правил n затем подставляется в это правило.
Синтаксис $> распространяется на все после имени набора правил и до конца замещаемой строки, а затем передается как первичный вход в набор правил. Позволяются рекурсивные вызовы. Например,
Синтаксис $# должен быть использован только в наборе правил 0, или подпрограмме набора правил 0. Он приводит к немедленному завершению выполнения набора правил, и сигнализирует sendmail, что адрес полностью разрешен. Полный синтаксис таков:
Обычно, если правило имеет совпадение, то оно применяется снова, поэтому правило идет по кругу до появления ошибки. RHS может быть предварена $@ или $: для изменения такого поведения. Префикс A $@ заставляет набор правил возвращаться с остатком RHS в качестве значения. Префикс $: заставляет немедленно закончить работу правила, но продолжить работу набора правил; это может быть использовано во избежание продолжения применения правила. Префикс перед продолжением обрезается.
Префиксы $@ и $: могут предшествовать описанию $>; например:
Замещение происходит в описанном порядке, то есть замещаются параметры из LHS, канонизируются имена хостов, вызываются "подпрограммы", и в конце обрабатываются $#, $@, и $:.
+---+ -->| 0 |-->resolved address / +---+ / +---+ +---+ / --->| 1 |-->| S |-- +---+ / +---+ / +---+ +---+ \ +---+ addr-->| 3 |-->| D | ----->| 4 |-->msg +---+ +---+ \ +---+ +---+ / +---+ --->| 2 |-->| R |-- +---+ +---+
Набор правил 3 должен превратить адрес в "каноническую форму". Эта форма должна иметь основной синтаксис:
Если не определено ни одного знака "@", то hostdomain-spec может быть добавлен (квадратик "D" на Рис.1.) из адреса отправителя (если в определениях почтовых программ для соответствующей отсылающей программы выставлен флаг C).
Набор правил 0 применяется после набора правил 3 к адресу, определяющему получателей. Он должен быть разделен на тройку {mailer, host, user}. Mailer должен быть определен в определениях почтовых программ в файле конфигурации. Host определяется макросом $h для использования в расширенном argv указанной почтовой программы.
Правила 1 и 2 применяются ко всем адресам отправителей и получателей соответственно. Они применяются до любого указания в определении почтовой программы. Их никогда не нужно проверять.
Набор правил 4 применяется ко всем адресам в сообщении. Он обычно используется для перевода из внутренней формы во внешнюю.
В добавок, набор правил 5 применяется ко всем локальным адресам (в частности, к тем, которые разрешаются к почтовой программе с выставленным флагом "F=5") не имеющим псевдонимов. Это последняя ловушка для локальных имен.
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: необязательный заголовок и не гарантирует индикацию нежелательной рассылки (спама). Этот набор правил и его не обязательно использрвать.
Имя хоста также может быть представлено как четыре числа, разделенные точками в квадратных скобках; например:
Имя хоста, прошедшее после "$@" также может быть списком хостов, разделенных запятыми. Для каждого из них находится MX, а результаты складываются в один длинный список MX. Цель всего этого - создать "фальшивые" записи MX, которых нет в DNS для частных внутренних сетей.
Последний специальный случай - имя хоста может быть передано как текстовая строка в квадратных скобках:
Синтаксис определения макросов таков:
Макросы интерполируются использованием конструкции $x, где x - имя макроса для интерполяции. Эта интерполяция производится при чтении файла конфигурации, кроме строк M. Специальная конструкция $&x может быть использована в строках R для получения косвенной интерполяции.
Условные зависимости могут быть определены использованием синтаксиса:
Имена макросов из маленьких букв зарезервированы для специальной семантики, используемой при проходе информации в или из sendmail, а специальные символы зарезервированы для условий и т.п. Имена из заглавных букв (т.е., от $A до $Z) специально зарезервированы для авторов файла конфигурации.
Следующие макросы определяются и/или внутренне используются sendmail'ом
для интерполирования в argv для почтовых программ или других контекстов.
Те, которые отмечены знаком | пропускают информацию в sendmail3,
отмеченные знаком = пропускают информацию и в и из sendmail, не отмеченные
макросы пропускают из sendmail, но внутренне больше никак не используются.
Вот эти макросы:
|
Исходящая дата в формате RFC 822. Выделяется из строки Date:. | ||||||||||||||
|
Текущая дата в формате RFC 822. | ||||||||||||||
|
Счетчик пересылок. Это счетчик числа строк Received: плюс значение флага командной строки -h. | ||||||||||||||
|
Текущая дата в формате UNIX (ctime). | ||||||||||||||
|
(Устарел; вместо него используйте опцию SmtpGreetingMessage.) Сообщение на входе SMTP. Печатается при запуске SMTP. Первое слово должно быть макросом $j, как определено RFC821. По умолчанию "$j Sendmail $v ready at $b". Обычно переопределяется, чтобы указать номер версии конфигурации, например, "$j Sendmail $v/$Z ready at $b" | ||||||||||||||
|
Конвертный адрес отправителя (from). | ||||||||||||||
|
Адрес отправителя по отношению к получателю.
Например, если $f - "foo", $g будет "host!foo", "foo@host.domain", или что-нибудь другое, соответствующее принимающей почтовой программе. |
||||||||||||||
|
Хост получателя. Устанавливается в наборе правил 0 из поля $# анализируемого адреса. | ||||||||||||||
|
Идентификационный номер в очереди, например, "HAA12345". | ||||||||||||||
|
"Официальное" доменное имя для этого узла. Оно полностью уточнено, если может быть найдена полная квалификация. Оно должно быть переопределено, чтобы быть полностью уточненным доменным именем, если ваша система не сконфигурирована таким образом, что может найти его автоматически. | ||||||||||||||
|
Имя узла UUCP (из системного вызова uname). | ||||||||||||||
|
(Устарел; вместо него используйте опцию UnixFromLine.) Формат строки UNIX from. До тех пор, пока вы не измените формат почтового ящика UNIX, вы не должны изменять умолчание, которое равно "From $g $d". | ||||||||||||||
|
Доменная часть значения возвращенного gethostname.
При нормальных обстоятельствах, $j эквивалентен $w.$m. |
||||||||||||||
|
Имя демона (для сообщений об ошибках). По умолчанию "MAILER-DAEMON". | ||||||||||||||
|
(Устарел: вместо него используйте опцию OperatorChars.) Набор "операторов" в адресах. Список знаков, которые могут быть рассмотрены как обозначения, и которые будут разделять значения во время анализа. Например, если "@" было в макросе $o, то ввод "a@b" будет просканирован как три обозначения: "a," "@," и "b." По умолчанию ".:@[]", минимально необходимые для анализа по RFC 822; более богатый набор операторов - ".:%@!/[]", добавляющий поддержку для UUCP, %-hack, и адресов X.400. | ||||||||||||||
|
Идентификационный номер процесса sendmail. | ||||||||||||||
|
Формат адреса отправителя по умолчанию. Макрос
$q
указывает, как должен выглядеть по умолчанию адрес отправителя в сообщении.
По умолчанию "<$g>". Обычно переопределяется на "$?x$x <$g>$|$g$."
Или "$g$?x ($x)$.", соответствующим двум следующим форматам:
Eric Allman <eric@CS.Berkeley.EDU> eric@CS.Berkeley.EDU (Eric Allman) Sendmail надлежащим образом квотирует имена, имеющие специальные знаки, если используется первая форма. |
||||||||||||||
|
Протокол, использовавшийся для получения сообщения. Выставляется из флага командной строки -p или кодом сервера SMTP. | ||||||||||||||
|
Имя хоста отправителя. Выставляется из флага командной строки -p или кодом сервера SMTP. | ||||||||||||||
|
Числовое представление текущего времени. | ||||||||||||||
|
Пользователь-получатель. | ||||||||||||||
|
Номер версии бинарного файла sendmail. | ||||||||||||||
|
Hostname этого узла. Корневое имя для этого хоста (смотри ниже всякие нерулезности). | ||||||||||||||
|
Полное имя отправителя. | ||||||||||||||
|
Домашний каталог получателя. | ||||||||||||||
|
Подтвержденный адрес отправителя. | ||||||||||||||
${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} | Результат проверки представленного сертификата. Возможные значения:
|
Существует три типа дат, которые могут быть использованы. Макросы $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 * (используя косвенную форму определения $&, конечно же!).
Синтаксис:
Можно получить доступ из правил к элементам классов, используя $= или $~, (сопоставить вхождения не входящие в класс) совпадающие только с отдельным словом; вхождения из нескольких слов в классе, в этом контексте, игнорируются.
Некоторые классы имеют для sendmail внутреннее значение:
|
Содержит Content-Transfer-Encodings которые могут быть преобразованы 8->7 bit. Предопределено для содержания "7bit", "8bit", и "binary". |
|
То же самое, что и $k, то есть, имя узла UUCP. |
|
Устанавливается в набор доменов, знающих об этом хосте, изначально просто $m. |
|
Может быть установлено в набор типов MIME, которые никогда не перекодируются из восьми бит в семь. По умолчанию "multipart/signed". Типы сообщений "message/*" и "multipart/*" никогда не перекодируются напрямую. Сообщения "multipart" взегда обрабатываются рекурсивно. Обработка сообщений "message/*" контролируется классом $=s. |
|
Набор Content-Types, которые не могут быть перекодированы как base64 (если они должны быть перекодированы, они будут перекодированы как quoted-printable). Он может иметь первичные типы types (например, "text") или полные типы (типа "text/plain"). Класс инициализируется содержащим только "text/plain". |
|
Содержит набор подтипов сообщений, с которыми можно обращаться рекурсивно. По умолчанию содержит только "rfc822". Другие типы "message/*" не могут быть перекодированы 8->7 bit. Если сообщение содержит восьмибитные данные, посланные на семибитный хост, и сообщение не может быть перекодировано в семь бит, оно будет обрезано до 7 бит. |
|
Установлен в набор доверенных пользователей строкой конфигурации T. Если вы хотите считывать список доверенных пользователей из файла, используйте Ft/file/name. |
|
Выставлен в набор всех имен, о которых знает хост. Может быть использован для совпадений с локальными именами хостов. |
$={persistentMacros} | Выставляется в макрос, который должен будет сохраняться во время проходов очереди. При добавлении имен макросов в этот класс нужно быть осторожным. |
Sendmail может быть скомпилирован с разрешением использовать scanf(3) в строке F. Это позволит вам производить простейший анализ текстовых файлов. Например, чтобы прочитать все имена пользователей из системного файла /etc/passwd в класс, используйте
Path | Путь к почтовой программе |
Flags | Специальные флаги для этой почтовой программы |
Sender | Набор(ы) правил перезаписи для адресов отправителя |
Recipient | Набор(ы) правил перезаписи для адреса получателя |
Argv | Вектор аргументов, передаваемый в почтовую программу |
Eol | Строка end-of-line для этой почтовой программы |
Maxsize | Максимальный размер сообщения для этой почтовой программы |
maxmessages | Максимальное количество доставок сообщений на соединение. |
Linelimit | Максимальная длина линии в теле сообщения |
Directory | Рабочий каталог для почтовой программы |
Userid | Идентификаторы пользователя и группы для запуска |
Nice | Инкремент nice(2) для почтовой программы |
Charset | Набор символов по умолчанию для 8-битных символов |
Type | Информация о типе MTS (используется для сообщений об ошибках) |
Wait | Максимальное время ожидания почтовой программы. |
/ | Корневой каталог почтовой программы. |
В имени поля проверяется только первый символ.
Нижеописанные флаги могут быть установлены в описании почтовой программы.
Любые другие флаги могут свободно использоваться для условных заголовков
в сообщениях для определенных почтовых программ. Флаги, отмеченные |,не
интерпретируются бинарником sendmail; они обычно используются для корреляции
с флагами в строке H. Флаги, отмеченные знаком =, применяются в почтовой
программе для адреса отправителя, хотя обычно это делает принимающая почтовая
программа.
|
Запустить протокол Extended SMTP (ESMTP) (определенный в RFC 1651, 1652, и 1653). Этот флаг по умолчанию включен, если приветственное сообщение SMTP содержит слово "ESMTP". |
|
Просмотреть пользовательскую часть адреса в базе данных псевдонимов. Обычно выставляется только для локальных почтовых программ. |
|
Проставить пустую строку в конце сообщения. Это предназначено для работы с некоторыми глупыми версиями /bin/mail, требующими пустую строку, но сами ее не проставляющие. По-нормальному в сетевой почте это не должно применяться. |
|
Не включать в адрес комментарии. Это должно использоваться, только если вы должны работать с удаленной почтовой программой, не понимающей комментариев. Обрезает адрес из вида "Phrase <address>" или "address (Comment)" до просто "address". |
|
Если почта получена от почтовой программы
с этим флагом, любые адреса в заголовке, не имеющие знака ("@") после перезаписи
набором правил три будут иметь окончание "@domain" из адреса отправителя,
взятого с конверта. Это позволяет почту с заголовками типа:
From: usera@hosta>
Автоматически переписывать как: From: usera@hosta
Однако это не всегда работает надежно. |
|
Не включать угловые скобки вокруг адресов с синтаксисом путевого адреса. Полезно для почтовых программ, передающих адреса в оболочку, которая может интерпретировать угловые скобки как перенаправление ввода/вывода. Однако, это не защитит от других метасимволов программной оболочки. Поэтому передача адресов в оболочку не должно считаться безопасным. |
|
Эта почтовая программа хочет в заголовке строку "Date:". |
|
Эта почтовая программа слишком медленна, поэтому лучше избежать этого соединения; любое необходимое соединение произойдет во время обработки очереди. Также см. HoldExpensive. |
|
Избегать строки, начинающиеся с "From" в сообщении с знаком ">". |
|
Почтовая программа хочет флаг -f from, но только если это операция пересылки в сети (то есть, почтовая программа выдаст ошибку, если выполняющий пользователь не имеет специальных прав). |
|
Эта почтовая программа хочет строку заголовка "From:". |
|
Обычно, sendmail посылает внутренне созданную почту (например, сообщения об ошибках) используя нулевой обратный адрес, как это требуется RFC 1123. Однако, некоторые почтовые программы не принимают нулевой обратный адрес. Если это необходимо, вы можете установить флаг g, чтобы sendmail не следовал стандартам; сообщения об ошибках будут посланы от MAILER-DAEMON (на самом деле, значение макроса $n). |
|
Символы верхнего регистра в именах хостов ( части $@ триады для почтовой программы, полученной из набора правил 0) для этой почтовой программы должны быть сохранены. |
|
Произвести перезапись пользовательской базы данных на конвертный адрес отправителя. |
|
Эта почтовая программа будет говорить на SMTP с другим sendmail - поэтому он может использовать некоторые специальные особенности протокола. Эта опция не требуется (т.е.. если эта опция опущена, передача все равно будет работать нормально, хотя не настолько эффективно, как могла бы). |
|
Произвести перезапись пользовательской базы данных на получателей и отправителей. |
|
Обычно, когда sendmail соединяется с хостом посредством SMTP, он проверяет, не соединился ли он случайно сам с собой, что может случиться, если sendmail имеет неправильную конфигурацию, или если сетевой интерфейс закольцован. Этот флаг выключает проверку петли. Он должен использоваться только в очень необычных случаях. |
|
В настоящее время не работает. Зарезервирован для разбиения на куски. |
|
Эта почтовая программа локальна (т.е., будет осуществлена последняя доставка). |
|
Ограничивает длину строк, как определено в RFC821.
Эта обесцененная опция должна быть заменена почтовым объявлением L=. По историческим причинам, флаг L также выставляет флаг 7. |
|
Эта почтовая программа может разослать нескольким пользователям на одном хосте в одну транзакцию. Когда в argv части определения почтовой программы встречается макрос $u, это поле будет повторено необходимое количество раз для всех подходящих пользователей. Если его убрать, то это может убрать подавление дубликатов на удалённом узле, так как каждый получатель будет послан в отдельной транзакции. |
|
Эта почтовая программа хочет строку заголовка "Message Id:". |
|
Не вставлять в начале сообщения "From" в стиле UNIX. |
|
Всегда работать как хозяин почтового ящика получателя. Обычно sendmail работает как отправитель для локально генерируемой почты или как "демон" (на самом деле, пользователь определяется в опции u) при получении сетевой почты. Большинству локальных почтовых программ требуется обычное поведение, которое не позволит установить конвертный адрес отправителя, пока почтовая программа работает как демон. Этот флаг игнорируется, если выставлен флаг S. |
|
Использовать обратный путь в стиле route-addr в команде SMTP "MAIL FROM:" вместо просто обратного адреса; хотя это и требуется в секции 3.1 RFC821, многие хосты не обрабатывают нормально обратные пути. Обратные пути осуждаются в RFC 1123. |
|
Эта почтовая программа хочет строку "Return-Path:". |
|
Когда адрес, разрешаемый в этой почтовой программе, проверен (команда SMTP VRFY), генерировать ответы 250 вместо ответов 252. Это будет означать, что адрес локальный. |
|
То же, что и f, но посылает флаг -r. |
|
Открыть соединение SMTP на "безопасном" порту. "Безопасные" порты не являются таковыми, за исключением UNIX машин, поэтому не ясно, даст ли это что-нибудь. |
|
Обрезать символы квотирования (" и \) у адреса перед вызовом почтовой программы. |
|
Не переустанавливать userid перед вызовом почтовой
программы.
Это может быть использовано в безопасной среде, где sendmail запущен от root. Это может быть использовано для избежания поддельных адресов. Если также определено поле U=, это флаг заставит id пользователя всегда быть установленным на этого пользователя и группу (вместо того, чтобы оставить его как у root). |
|
Символы верхнего регистра в именах пользователей для этой почтовой программы должны быть сохранены. Стандарты требуют сохранение регистра в локальной части адресов, за исключением тех адресов за которые отвечает ваша система. |
|
Эта почтовая программа хочет строки "From" в стиле UUCP с уродливым "remote from <host>" в конце. |
|
Пользователь должен иметь действительный бюджет на этой машине, т.е., getpwnam должен быть успешным. Если это не так, почта не будет доставлена. Это требуется для работы ".forward". |
|
Эта почтовая программа хочет строку заголовка "Full-Name:". |
|
Эта программа хочет использовать алгоритм скрытых точек, как определено в RFC821; смысл такой: любая строка, начинающаяся с точки, будет иметь предваряющую ее точку (для того, чтобы ее обрезали на другом конце). Это гарантирует, что строки в сообщении, содержащие точку не прекратят сообщение преждевременно. |
|
Запустить Протокол Локальной Доставки Почты (Local Mail Transfer Protocol, LMTP) между sendmail и локальной почтовой программой. Это вариант SMTP определенный в RFC 2033, специально разработанный для зоставки в локальный почтовый ящик. |
|
Не просматривать записи MX для хостов, посылающих через SMTP. |
|
Расширить список символов, преобразованных в =XX запись при преобразовании в Quoted-Printable для того, чтобы не потерять те, которые не преобразуются в чистом виде между ASCII и EBCDIC. Полезно, если в вашем узле имеется мэйнфреймы IBM. |
|
Если для этого адреса не найдено псевдонимов, пропустить адрес через набор правил 5 для другого возможного разрешения. Это предназначено для перенаправления почты в другое альтернативное место доставки. |
|
Обрезать заголовки до 7-ми бит. |
|
Обрезать весь вывод до семи бит. Стоит по умолчанию, если установлен флаг L. Заметьте, что очистка этой опции не достаточна, чтобы через sendmail полностью проходили восьмибитные данные. Если опция 7 выставлена, а она в основном всегда выставлена, то восьмибитные данные на входе будут обрезаться. Нужно отметить, что эта опция затрагивает только сообщения, к которым не применялось MIME преобразование 8->7 бит. |
|
Если выставлена, то эта почтовая программа принимает для отсылки восьмибитные данные; обычная попытка MIME преобразования 8->7 бит будет пропущена. |
|
Если выставлена, производить ограниченные 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. Например, вхождение:
Почтовая программа со специальным именем "discard" заставляет выкидывать любую почту, посланную к ней, но в то же время считать, что она была успешно доставлена. Эта почтовая программа не может быть использована в наборе правил 0, а только в различных наборах правил, проверяющих адрес.
Почтовая программа, называющаяся "local" должна быть определена в каждом файле конфигурации. Она используется для доставки локальной почты, и обслуживается особо несколькими образами. В добавок, три другие почтовые программы, называющиеся "prog", "*file*", и "*include*" могут быть определены для настройки доставки сообщений в программы, файлы и списки :include: соответственно. Их умолчания:
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'ом.
Некоторые заголовки имеют специальную семантику, описываемую позднее.
Вторичный синтаксис позволяет производить проверку заголовков в том виде, как они были считаны. Для включения проверки, используйте:
HHeader: $>Ruleset
HHeader: $>+Ruleset
Указанный набор правил (Ruleset) вызывается для указанного заголовка Header, и может возвращать $#error для отказа от сообщения, или $#discard для сброса сообщения (как и в остальных наборах правил check_*). Набор правил получает заголовок тело-поля как аргумент, то есть не заголовок имя-поле; см. также ${hdr_name} и ${currHeader}. Заголовок рассматривается как структурированное поле, то есть, комментарии (в кавычках) перед обработкой удаляются, если не используется вторая форма $>+. Только один набор правил может быть ассоциирован с заголовком; sendmail будет тихо игнорировать несколько вхождений.
Например, следующие строки в конфигурации:
SCheckMessageId
R< $+ @ $+ >$@ OK
R$* $#error
$: Illegal Message-Id header
Поддерживаемые опции (со старыми, однобуквенными именами в квадратных скобках):
AliasFile=spec, spec, ...
A Только если проверка подлинности успешна.
По умолчанию пытаться всякий раз, когда доступна SMTP AUTH.
Port | Имя/Номер исходящего порта соединения (по умолчанию - любой свободный порт) |
Addr | Маска адреса (по умолчанию - INADDR_ANY) |
Family | Семейство адресов (по умолчанию - INET) |
SndBufSize | Размер буфера TCP на отсылку |
RcvBufSize | Размер буфера TCP на приём |
Modifier | Опции (флаги) для демона |
h использовать для команды HELO имя интерфейса.
Если используется модификатор "h", то в команде HELO/EHLO используется имя соответствующего выходного интерфейса (или выбранного через параметр Connection или по-умолчанию).
Name | Имя демона, определяемое пользователем (по умолчанию - "Daemon#") |
Port | Имя/номер рабочего порта (по умолчанию "smtp") |
Addr | Адресная маска (по умолчанию INADDR_ANY) |
Family | Семейство адресов (по умолчанию INET) |
Listen | Размер очереди прослушивания (по умолчанию 10) |
Modifier | Опции (флаги) для демона |
SndBufSize | Размер буфера TCP на отправку |
RcvBufSize | Размер буфера TCP на прием |
a | всегда требовать идентификацию |
b | привязываться к интерфейсу, через который была получена почта |
c | производить канонификацию имени хоста (.cf) |
f | требовать полностью квалифицированное имя хоста (.cf) |
u | разрешить неквалифицированные адреса (.cf) |
C | не производить канонификацию имени хоста |
E | запретить ETRN (смотри RFC 2476) |
O DaemonPortOptions=Name=MSA, Port=587, M=Ea
i | Доставлять интерактивно (синхронно) |
b | Доставлять в фоне (асинхронно) |
q | Просто класть сообщение в очередь (доставка во время обработки очереди) |
d | Отложить доставку и все преобразования (доставка во время обработки очереди) |
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 - это умолчание. Выше имеется более подробное описание этих флагов. Использование этой опции не рекомендуется.
s | Отвергнуть необъявленные 8-битные данные ("strict") |
m | Преобразовать необъявленные 8-битные данные в MIME ("mime") |
p | Пропустить необъявленные 8-битные данные ("pass") |
p | Печатать сообщения об ошибке (по умолчанию) |
q | Без сообщений, просто выдавать статус выхода |
m | Отправлять назад ошибки почтой |
w | Печатать ошибки (отправлять почтой, если пользователь не находится в системе) |
e | Отправлять назад ошибки почтой и всегда выдывать нулевой статус выхода |
FallbackMXhost=fallbackhost
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: |
aliases | Files |
hosts | dns nis files |
Заметь!: эти уровни версий не имеют ничего общего с номерами версий в файлах. Например, при написании файлов конфигурации версии 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.
На преобразования ссылаются, используя синтаксис:
Аргументы передаются в преобразование для произвольного использования. Большинство классов преобразований могут интерполировать эти аргументы в их значения используя для указания соответствующего аргумента синтаксис "%n" (где n - цифра).
Аргумент "%0" обозначает ключ базы данных. Например, правило
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. |
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 не
Флаг -s может включать опциональный параметр, который может быть использован для выбора подстроки в результате просмотра. Например, -s1,3,4 Заметьте, для совпадения $ в строке, нужно использовать \$$. Если шаблон содержит пробелы, они должны быть заменены пустым подстановочным символом, если это не сам пробел. |
program | Аргументы в строке K являются путями к программам и любые начальные параметры будут пропущены. При вызове преобразования, к начальным параметрам добавляется ключ, а программа запускается с от пользователя и группы по умолчанию. Первая строка стандартного вывода возвращается как значение просмотра. Это все имеет множество потенциальных проблем безопасности, и жутко тормозит, поэтому использоваться должно только тогда, когда действительно необходимо. |
macro | Устанавливает или очищает значение макроса. Для установки макроса,
передайте значение как первый аргумент в просмотр преобразования. Для очистки
макроса, не передавайте аргумент. преобразование всегда возвращает пустую
строку. Пример типичного использования:
Kstorage macro ... # set macro ${MyMacro} to the ruleset match
|
arith | Выполняет простые арифметические операции. Операции задаются ключём,
в настоящее время поддерживаются +, -, *, /, l (для меньше чем), и =. Два
операнда задаются как аргументы. просмотр возвращает результат подсчёта,
то есть TRUE или FALSE для сравнений, во всех остальных случаях целые числа.
Все возможные опции для преобразований игнорируются. Простой пример:
Kcomp arith ... Schech_etrn
|
Большинство из них принимают в качестве аргументов одни и те же опциональные
флаги и имя файла (или имя преобразования для 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
при присутствии флага -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). Она принимает следующие флаги:
|
Не переделывать верхний регистр в нижний при преобразовании. |
|
Включать нулевые байты в ключах. |
|
Добавить к существующему (старому) файлу. |
|
Позволить замещение существующих ключей; обычно, при ошибке, заново вставляет существующий ключ. |
|
Печатать происходящее. |
Демон sendmail не должен перестартовываться для чтения новых преобразований до тех пор, пока вы не замените их на месте; используется блокировка файлов, так что преобразования не будут считаны, пока они не обновлены9.
Новые классы могут быть добавлены в подпрограмму setupmaps в файле conf.c.
Местонахождение это базы данных контролируется опцией UserDatabaseSpec.
Имена полей определяют и синтаксис, и семантику значения. Определенные
поля включают:
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, использующая остальные поля.
Если первая лексема имени пользователя возвращаемая набором правил 0 - знак "@", просмотр пользовательской базы данных пропускается. Смысл этого в том, чтобы пользовательская база данных представляла собой набор умолчаний для группы (в нашем случае, Computer Science Division); почта, посылаемая на определенную машину должна игнорировать эти умолчания.
При отправке почты, имя отправителя просматривается в базе данных. Если этот пользователь имеет запись "mailname", значение этой записи используется как его выходящее имя. Например, я могу иметь запись:
Если для пользователя найдена запись "maildrop", но не существует ни одной соответствующей записи "mailname", производится проверка записи ":default:mailname". Если она существует, то это имя считается именем хоста, подставляемого вместо локального хоста. Например, в нашем случае, мы можем установить его в "CS.Berkeley.EDU". в результате, все, кто известен в базе данных будет отправлять почту со штампом "user@CS.Berkeley.EDU", а те, кто в ней не перечислен будут использовать локальное имя хоста.
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 - и хорошую документацию. [назад]
При перекомпилировании 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/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
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 и используется во многих случаях.
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. Конкретное использование этой подпрограммы очень зависит от реализации, и должно быть ограниченным.
Функция инициализации вызывается так:
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. Функция Организации Очереди
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
bool refuseconnections() { return (RefuseLA > 0 && CurrentLA >= RefuseLA);Более умная реализация должна смотреть на большее количество системных ресурсов.
6.3.6. Подсчет Средней Загрузки
6.4. Конфигурация в sendmail/daemon.c
В предыдущих выпусках, если вы хотели обобщить просмотры $[ ... $], мы рекомендовали вам изменить подпрограмму maphostname. Теперь, вместо этого, мы рекомендуем вам создавать новое ключевое преобразование.
6.5. Сертификаты для STARTTLS
6.6. PRNG для STARTTLS
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. [назад]
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.