Версия 8.11.6 выпущена 20 августа 2001 (Red Hat 7.2).
Версия 8.12.2 выпущена 13 января 2002 и пока (14 марта 2002) ни в одном
дистрибутиве не поставляется. Основные отличия 8.12 от 8.11:
sendmail больше не suid root
ускорен ввод/вывод
уменьшено количество порождаемых процессов (fork)
очередь разбита на несколько очередей с различной политикой
DBMDEF= -DNEWDB (нужно иметь пакет db.1.85, можно
определять классы hash и btree)
INCDIRS=-I/usr/local/include
LIBDIRS=-L/usr/local/lib
LIBS= -lresolv -lsocket -lnsl -lelf -lkstat -ldb
BINDIR= ${DESTDIR}/usr/local/lib
STDIR= ${DESTDIR}/usr/local/etc/mail
HFDIR= ${DESTDIR}/usr/local/etc/mail
src/conf.h трогать не надо
правим src/pathnames.h (#define _PATH_SENDMAILCF
"/usr/local/etc/mail/sendmail.cf"), чтобы файл
конфигурации не надо было задавать ключом.
правим src/conf.c(checkcompat), чтобы запретить чужим
использовать наш почтовый сервер как mailrelay и
никого при этом не обидеть (сообщения об ошибках и return-receipt-to
должны возвращаться). Если это удастся, то будет know-how: нигде я не видел
аккуратной реализации (напоминаю, что речь идет о 8.8.7 - 1997 год ;).
заходим в директорию sendmail-8.8.7/cf/cf,
копируем generic-solaris2.mc ═в deol.mc и
правим:
OSTYPE(solaris2-deol)dnl (в
директории ostype
скопировать solaris2.ml.m4 в solaris2-deol.m4 и
поправить - перенести все файлы из /etc/mail в /usr/local/etc/mail)
DOMAIN(deol)dnl
(скопировать domain/generic.m4 в domain/deol.m4)
FEATURE(use_cw_file)dnl
FEATURE(use_ct_file)dnl
FEATURE(redirect)dnl
FEATURE(always_add_domain)dnl
FEATURE(allmasquerade)dnl
FEATURE(masquerade_entire_domain)dnl
═пока не надо FEATURE(genericstable, `hash -o
/usr/local/etc/mail/genericstable')dnl -
изготовляется так: makemap hash /usr/local/etc/mail/genericstable
пока не надо FEATURE(virtusertable, `hash -o
/usr/local/etc/mail/virtusertable')dnl -
обратите внимание на прямые и
обратные апострофы
Djdeol.deol.ru - иначе откуда-то
вставляется точка после ru (знаем мы откуда: из /etc/resolv.conf,
лучше там поправить)
# domain list for which look up pop users list
(что-то у меня не работает)
C{POP} deol.ru zyxel.ru variant.msk.su
# POP users list
Kpopusers hash -o -m
-a<@POP.> /usr/local/etc/mail/popusers
(простое имя
пользователя ключ,
шифрованный пароль - данные)
создаются они так:
makemap -or hash /usr/local/etc/mail/popusers.db и на
стандартный вход имена и
шифрованные пароли
(изменение БД, но с заменой данных)
в самое начало правила 0: "личный"
обратный адрес; отлов и
преобразование имен
пользователей, которым надо
сбрасывать почту на Cyrus
Rмой-любимый-обратный-адрес $* $#lesmtp $@ deolws.deol.ru $:
он-же $2
туда же обработку pop-клиентов (можно убрать, т.к. все
местные считаются
pop-клиентами)
R$* < @ $=M. > $* $: $(popusers $1 $: $1
< @ deol.ru. > $2 $)
в конце Parse1 (последняя часть набора 0)
вместо вызова POP ставим
R$+ < @ POP. > $#cyrus $: $1 user@POP
и еще ближе к концу набора 0 перед
вызовом агента esmtp ставим
пересылку почты на ББС (временно до
запуска своего POP-сервера)
R$* < @ $=M. > $* $#esmtpbbs $@ deol.deol.ru $: $1
< @ deol.ru > $2
а после запуска своего агента
R$* < @ $=M . > $* $#cyrus $: $1
R$* < @ $j. > $* $#cyrus $: $1
добавляем описание агента для
пересылки почты на BBS (уже можно
выкинуть)
Mesmtpbbs, P=[IPC], F=mDFMuXa, S=11/31, R=21/31, E=\r\n, L=990,
T=DNS/RFC822/SMTP,
A=IPC $h 24
добавляем описание агента для
пересылку почты на Cyrus
Mcyrus, P=/usr/local/cyrus/bin/deliver, F=lsDFMnPqA5@, S=10, R=20/40,
T=DNS/RFC822/X-Unix, U=bog:mail, A=deliver -e $u
для обхода
собственной защиты от
спаммеров добавляем опсание агента lesmtp (то же
самое, что и esmtp, но с правами на relay, чтобы
можно было сделать forward)
forward
текстовый файл /usr/local/etc/mail/forward.txt (два поля:
локальное имя и куда
перенаправить)
старый /usr/lib/sendmail
переименовываем и делаем линк под этим именем на
новый
если
предполагается вместо обычного sh
использовать smrsh, то
зайти в
поддиректорию smrsh
оттранслировать его
gcc -o smrsh smrsh.c
запихнуть, например, в /usr/local/etc
(определяется строкой Mprog в
конфигурационном файле)
создать директорию /usr/adm/sm.bin и зайти в нее
насоздавать там линки на
программы и командные файлы, которые только и будут
использоваться в качестве адреса
программы (начинется с
вертикальной черты).
Теория (эх, старая у меня книжка... - про
версию 8.6)
MX-записи не
рекурсивны.
MX-запись должна
показывать на A-запись (sendmail
разрешает также и CNAME, но другие MTA
не используйте команду F для чтения файла,
который не открыт на чтение для всех
любой файл, в который sendmail пишет, должен быть
открыт на запись только для root (и весь путь тоже)
как запретить создавать файл
(например .forward) в
директории доступной для всех
rm -f .forward
mkdir .forward
touch .forward/file
chown root .forward .forward/file
chmod 000 .forward .forward/file
chmod +t .
chown root .
прочитав файл
конфигурации, sendmail делает chdir в
директорию с почтовой очередью
Структура очереди
обычное имя
директории, в которой хранится очередь: /var/spool/mqueue
права к ней д.б. root 700
Структура имени файла:
первая буква - тип файла
d - тело письма
l - замок (только в старых версиях)
n - для генерации
идентификатора (только в старых
версиях)
t - временный вариант файла q
x -
транспортный файл (сюда
собираются тексты сообщений об ошибках для
обратной посылки
отправителю)
q - управление очередью и
заголовок
Строчно-ориентированный файл. Первая буква - тип
строки, далее полезная
информация. Порядок строк важен.
B - тип тела ═письма (не больше одного): 8BITMIME или 7BIT
C - управляющий
пользователь (макс. 1 на каждого
получателя) - при отправке по адресам из .forward и :include:, sendmail
работает с правами не root, а
владельца .forward или :include:
D - имя файла с данными (ровно одно) - не нашел
E - на кого посылать ошибки
F - флаги (w - EF_WARNING, r - EF_RESPONSE, 8 - ?, b - ?)
H - строка заголовка (или шаблон строки
заголовка)
I -
K -
M - причина помещения в очередь (макс. 1)
N -
P - текущий приоритет (макс. 1), чем меньше число, тем
приоритетнее. Поначалу priority = nbytes - (class * Option_z) + (recepients
* Option_y). При каждом чтении
приоритет
увеличивается на Option_Z.
R - адрес получателя из конверта
S - адрес
отправителя (ровно один)
T - время создания (ровно одно)
V -
$ - содержимое макро (r -
протокол получения письма, s - полное
каноническое имя пославшей машины как она
представилась, _ - имя или IP-адрес
реальной пославшей машины)
пробел или табуляция -
продолжение
предыдущей строки
вторая буква - f
дальнейшие буквы
представляют собой
уникальный
идентификатор письма
одна буква,
соответствующая часу (0 часов - A, 1 час ночи - B и т.д.)
AA при первой попытке, AB - при второй и т.д.
pid инкарнации sendmail,
создающего файл
Печать очереди
производится командой mailq (sendmail -bp) в том
порядке, в котором письма будут
обрабатываться.
Сообщения об ошибках (не все)
bad address - неверный формат адреса в правой части alias
buildaddr - rule set 0 выдал не все
компоненты тройки (агент, хост,
пользователь)
cannot dup -
необходимо увеличить макс. число
дескрипторов фалов на процесс
cannot resolve - rule set 0 выдал не все
компоненты тройки (агент, хост,
пользователь)
deliver: pv overflow - при
описании агента указан какой-то текст за $u
rewrite: expansion too long -
результат применения правила не
помещается в буфер
rewrite: ruleset номер: replacement out of bounds -
слишком большой номер
позиционного параметра в правой части
правила
savemail: HELP!!! - не удалось вернуть
ошибочное письмо
Aliases
Формат файла алиасов
(строчноориентированный):
строки,
начинающиеся с # и пустые
являются
комментариями
строки,
начинающиеся с пробела или
табуляции являются
продолжением
формат строки
local: alias
local - исходное имя (д.б.
локальным:
производится
нормализация, имя
приводится к строчным буквам и
применяются наборы правил 3 и 0, чтобы
проверить, что
вызывается агент
alias - список
заменяющих имен,
разделенных запятыми (м.б. с
пробелами). М.б.
почтовые имена
локальные
локальные с обратной косой чертой -
дальнейший алиасинг
подавляется (включая ~/.forward)
удаленные
имена файлов (локальный адрес,
начинающийся с косой черты) -
добавление к файлу. Если файл не
существовал, то его права
делаются 0666. Если файл
существовал и имел хотя бы один бит
исполнения, то письмо не
отправляется. Если есть
управляющий
пользователь, то sgid и suid биты
сбрасываются. sendmail меняет свой gid: если
остался sgid у файла, то на группу файла, иначе если есть
управляющий
пользователь, то на его gid, иначе на gid,
указанный опцией g. sendmail меняет свой uid по тем же
правилам. Трансляция
регулируется флагами агента prog.
имена программ (адрес,
начинающийся с
вертикальной черты).
Используется агент prog. Имя
программы (полный путь!) вместе с
параметрами м.б. заключено в кавычки. Если флаг F=S
отсутствует (что д.б.), euid и egid
изменяются. Если есть
управляющий
пользователь, то на него (если он не root), иначе в
соответствии с опциями u и g. Не
забывайте про удаление дублей
получателей!
местное_имя: :include:/путь
на каждой строке файла м.б. один или более
получателей (почтовые имена, имена файлов,
программ, другие :include:),
разделенных запятыми
(комментарии
обозначаются #). Если есть алиас для
owner-местное_имя, то его правая часть
рассматривается как имя
владельца списка (на это имя
посылаются сообщения об ошибках).
Неплохо иметь
супервладельца (owner-owner: postmaster).
Производится
транзитивная
подстановка алиасов.
~/.forward - если файл не
безопасен (разрешен доступ кому-то кроме
владельца), то он
игнорируется. Формат и
поведение аналогично :include:. Может
включать почтовые имена, имена файлов,
программ, другие :include:.
Программы, специально
предназначенные для
использования в ~/.forward:
deliver
procmail (сортировка по файлам, фильтры и др.
предобработка, запуск программ,
избирательное
переназначение)
1 - серьезные системные сбои и
проблемы
безопасности: LOG_CRIT и LOG_ALERT
2 - сбои соединения: LOG_CRIT
3 -
неправильные адреса: LOG_NOTICE
4 -
неправильные имена qf-файлов: LOG_NOTICE
5 - запись каждого
принятого письма: LOG_INFO
6 - попытки VRFY и письма
возвращенные
отправителю: LOG_INFO
7 - ошибки отправки, за
исключением помещения в очередь по
причине временного
отсутствия ресурса: LOG_INFO
8 - успешная отправка: LOG_INFO
9 - отложенная отправка: LOG_INFO
10- каждый ключ, найденный в БД: LOG_INFO
11-98 - отладочная
информация: LOG_DEBUG
Статистика
sendmail.st - в этом файле (его имя
задается опцией S) для каждого агента
суммируется
═количество переданых и
полученных сообщений и байт. Чтобы
статистика
собиралась, файл должен
существовать и быть открытым на запись
(кому?).
Получение статистики
производится
программой mailstat [-C config-file] [-f stat-file]
(можно собирать и обнулять ее
ежедневно)
информация,
извлекаемая из syslog. Есть уже готовые
скрипты на perl
ssl - подсчет для каждого
пользователя числа
отправленных и
полученных сообщений и байт, надо
сделать что-то полезное из этого (ну и
времени он жрет!)
syslog-stat.pl -
суммирование для всех
Запуск
Конфигурационный файл
Обычно называется sendmail.cf и лежит в /etc/sendmail.cf (в Solaris -
/etc/mail/sendmail.cf, у меня - /usr/local/etc/mail/sendmail.cf).
Общий синтаксис:
строчно-ориентирован, одна команда на строке, тип
команды
определяется первой буквой. #
означает
комментарий, также как и
ПОЛНОСТЬЮ пустая строка, пробел или
табуляция (иногда
ВЫГЛЯДЯЩИЕ как пустые строки) -
продолжение строки (перевод строки и
пробелы с
табуляциями НЕ УДАЛЯЮТСЯ из слитой строки). Если в
строке есть #, то он, все что справа от него и
предшествующие пробелы и
табуляции
рассматриваются как
комментарии. Если нужно включить # сам по себе, то надо
ставить перед ним обратную косую черту (за
исключением оператора $#).
C - определить макро класс в
конфигурационном файле
определение класса
(поименованного массива) строк
Cимя список
где имя - один символ ASCII или имя в
фигурных скобках, элементы списка
разделяются пробелами или
табуляциями (isspace(3)). Не стоит
пытаться закавычить слова с
пробелами внутри.
Сдублированные слова
молчаливо
выкидываются.
Можно
использовать только в левой части
правила ($=имя или $~имя, где имя д.б. в
фигурных скобках, если оно длинное), в правой части надо
использовать
соответствующий $цифра,
сопоставляется только один атом
(устарело?).
Прописные и строчные буквы не
отличаются. При повторном
определении класса новые элементы списка
добавляются к классу. Удалить нельзя. Если
размер класса очень велик
(несколько тысяч), то надо
подстраивать алгоритм
хеширования (STABSIZE в stab.c). Класс w
определяется sendmail - все
известные алиасы для
локального хоста
(посмотреть список можно запустив sendmail с
ключом -d0.4 под
заголовком a.k.a.: .
D - определить макро
Dимязначение
где имя - один символ
(пользователя лучше
ограничиться
прописными латинскими буквами), в
значение могут входить
управляющие символы:
\b
\f
\n
\r
\\
кавычки удаляются или длинное имя в
фигурных скобках.
Макросы
определяются в следующие моменты:
при запуске sendmail (можно
переопределять ключами запуска или в файле
конфигурации)
b - дата в формате RFC822
k - имя узла UUCP
m - имя домена DNS (NIS для SunOS)
v - версия sendmail
w -
каноническое имя хоста (без
доменной части)
при обработке ключей запуска
(-oMимя-макро) -
происходит до чтения
конфигурационного файла, при этом sendmail
теряет свои
полномочия
суперпользователя
при чтении
конфигурационного файла
при получении и посылке письма
Обязательные макросы:
e -
SMTP-приветствие
j - официальное
каноническое имя хоста
l - формат UNIX-строки "From "
n - имя,
используемое для сообщений об ошибках
o -
символы-разделители атомов адресов и правил
q - формат по умолчанию адреса
отправилтеля
Использование макро. Простое
использование: доллар, за которым
следует
односимвольное имя макро или имя макро в
фигурных скобках.
Подстановка
осуществляется
рекурсивно, по одному макро за раз, слева
направо.
Подстановки в правилах
осуществляются в момент чтения
конфигурационного файла (можно
отложить, если поставить
амперсенд перед именем макро, но
разбиение на атомы
производиться не будет), во всех других
местах
откладывается до самого
последнего момента. Условный
оператор
(проверяется
определенность макроса): $?имятекст1 $| текст2 $.
else-часть м.б. опущена. Условия м.б.
вложены.
Макросы со
специальным значением:
_ - имя и хост реального
отправителя (по IP-адресу и
протоколу IDENT (RFC1413))
a - исходная дата в формате RFC822
при
инициализации
устанавливается текущее время
при создании конверта
устанавливается текущее время, если макро пусто
при сборке информации из
заголовка ищется строка Posted-Date: и из нее
берется дата, если такой строки нет, то
ищется строка Date: и дата берется из нее
(проверки на
соответствие формата RFC822 не
делается)
если
обнаруживается ошибка, то берется
значение макроса b
b - текущая дата в формате RFC822
(регулярно
обновляется)
c - число хопов
(промежуточных станций).
Определяется по числу строк
заголовка Received:, Via:, Mail-From:
d - текущая дата в формате ctime(3)
e - приветствие SMTP
(определяется в
конфигурационном файле, должно
начинаться с полного имени хоста, без
последней точки)
f - адрес
отправителя
(преобразуется наборами правил 3, 1, 4)
SMTP команда MAIL
доверенные
пользователи могут
использовать ключ -f sendmail
при обработке сообщения из очереди
берется значение строки S из файла qf
при ответе на
отражаемое письмо берется из $n
uid вызывающей программы
g - адрес
отправителя
относительно
получателя: берется $f, еще раз
обрабатывается наборами 3,1, S=, 4
h - имя хоста
получателя
(возвращается набором 0 после $@)
i -
идентификатор очереди
j - наше
официальное
каноническое имя (полное, без
конечной точки)
k - наше имя узла UUCP
l - определяет формат строки "From " (UUCP
требует следующего формата: From
отправительдата remote from
хост
m - доменная часть имени хоста
(извлекается из $w)
n - от имени кого делаются
сообщения об ошибках (д.б.
доступен)
o - список
разделителей атомов адресов и правил (в
дополнение к
встроенным) - см. описание правил.
p - sendmail pid
q - формат адреса
отправителя по умолчанию
r - протокол, с помощью которого
сообщение было получено (SMTP, ESMTP, NULL) -
сохраняется в qf
s - имя хоста
отправителя
(ближайшего соседа) -
сохраняется в qf
t - текущее дата и время в
секундах
u - имя получателя,
возвращаевмое набором 0 после $: и
обработанное наборами 2, R=, 4. Если агент local, то
результат
пропускается через
процедуру алиасинга (если замены не
произошло, то
обрабатывается набором 5, м.б. выбирая нового
агента и повторяя процесс) -
по-моему, в $u
все-таки
оказывается то имя, которое было до
алиасинга. Если агент local, то
делается попытка извлечь
инфрмацию о
пользователе используя getpwent(3) и
домашняя директория
записывается в $z, для
дальнейшего поиска ~/.forward и dead.letter
v - версия sendmail
(определяется при запуске, м.б.
переопределена в файле
конфигурации)
w -
каноническое имя хоста (без
доменной части) -
определяется при запуске, м.б.
переопределена в файле
конфигурации
y - basename(1)
управляющего терминала процесса sendmail
z - домашняя
директория получателя (только для агента local)
E - определить
переменную окружения
F - определить макро класс из файла или
программы
определение класса
(поименованного массива) строк
Fимя имя-файла шаблон
или
Fимя |программа -
?убрано
где имя - один символ ASCII или имя в
фигурных скобках. Каждая строка текста
сканируется scanf(3) (шаблон по
умолчанию - ═%s) и
разбивается на слова.
Обработка происходит в момент чтения файла
конфигурации. При ошибке остаток файла молча
игнорируется.
Все остальное
аналогично команде C.
H - определить
заголовок: H[?флаги?]имя:шаблон
В именах м.б. только печатные символы, кроме
пробела и двоеточия. Макросы в шаблоне
расширяются в момент отправки письма или
постановки в очередь.
Комментарии
заключаются в круглые скобки (м.б.
вложенными). Флаги
соответствуют флагам в описании агента: если в
описании агента
установлены все═флаги, что и в
описании строки заголовка, то sendmail
добавляет строку заголовка.
Официальные имена
(прописные и строчные буквы═не
различаются):
apparently-from - строка
автоматически
генерируется, если не найдена ни одна строка с
именем
отправителя (берется из
конверта);
apparently-to (H_RCPT) - строка
автоматически
генерируется, если не найдена ни одна строка с
именем получателя (берется из
конверта);
bcc (H_RCPT|H_BCC) - blind carbon copy: копия
посылается так, что ни основной
получатель, ни другие
получатели из bcc: не знают об этом; можно
определять в
конфигурационном файле, но только с
флагами;
cc (H_RCPT) - carbon copy:
трактуется аналогично строке To:
comments (H_FORCE|H_ENCODABLE) - м.б.
описана в файле
конфигурации, в этом случае
добавляется к заголовку;
content-length (H_ACHECK) -
приблизительный размер тела письма (байт)
content-transfer-encoding (H_CTE)
content-type (H_CTYPE) - природа тела письма (RFC1049),
например, text;
date - дата отправки письма, д.б. в каждом
письме,
соответственно д.
присутствовать в
конфигурационном файле;
encrypted - тело письма
преобразовано, в качестве тела строки
указывается имя программы и ключ;
errors-to (H_FROM|H_ERRORSTO) - куда
перенаправлять сообщение об ошибке (обычно
отправителю из конверта, как и
требуется в RFC1193)
from (H_FROM) - адрес
отправителя
адрес
адрес в угловых скобках
полное имя, затем адрес в угловых
скобках
адрес, затем
комментарий в круглых скобках
full-name (H_ACHECK)
in-reply-to -
идентификатор письма, на которое данное
письмо является ответом (обычно Message-Id в
угловых скобках);
keywords
mail-from (H_TRACE|H_FORCE) -
устаревший синоним для received:
message (H_EOH) - конец
загловока
message-id -
уникальный
идентификатор письма, д.б.
определен в
конфигурационном файле; любое
выражение в угловых скобках;
mime-version - признак того, что
сообщение об ошибке в MIME-формате, см. опцию j и RFC1341, RFC1344, RFC1426,
RFC1428 и RFC1437; в
настоящее время содержит
значение: 1.0
posted-date - время раздачи в USENET или
почтовый список
precedence символьное имя
приоритетного класса (см. команду P)
received (H_TRACE|H_FORCE) -
трассировка почтового маршрута; самая
верхняя - самая свежая; Received: [from host] by host [via atom] [with
atom] id string [for addr]; date
где
from - полное
каноническое имя
пославшего хоста
by - полное
каноническое имя
принявшего хоста
via - физическая сеть (Internet, JANET...)
with - протокол (SMTP)
id - уникальный
идентификатор письма на местном хосте
for -
непреобразованный адрес
получателя
;date - дата получения письма
Д.б. определен в
конфигурационном файле и без всяких флагов.
references -Message-Id
исходного(ых) письма(ем)
reply-to (H_FROM) - адрес, на который пойдет ответ
(обычно
отправителю)
resent-bcc (H_RCPT|H_BCC|H_RESENT)
resent-cc (H_RCPT|H_RESENT)
resent-date (H_RESENT)
resent-from (H_FROM|H_RESENT)
resent-message-id (H_RESENT)
resent-reply-to (H_FROM|H_RESENT)
resent-sender (H_FROM|H_RESENT)
resent-to (H_RCPT|H_RESENT)
return-path (H_FORCE|H_ACHECK) - адрес
отправителя из конверта;
вставляется узлом последней
отправки;
return-receipt-to (H_RECEIPTTO) - адрес, по
которому отправлять
подтвержение о приеме письма
(отправляется, если агент имеет флаг l)
sender (H_FROM) - аналог From:, но более
"настоящий" (например,
указывает на лицо из группы, имеющей общий
почтовый адрес);
subject (H_ENCODABLE) - тема письма
text (H_EOH) - синоним для Message:
to (H_RCPT) - основной
получатель
via (H_TRACE|H_FORCE) -
неофициальная строка
заголовка
трассировки (Received:);
x400-received (H_TRACE|H_FORCE) - для
подсчета
промежуточных узлов
x-... - клиентские
заголовки, должны
пропускаться "как есть"
Значение типов заголовка:
H_ACHECK - удалять строку
заголовка, если ее флаги не
соответствуют флагам в описании агента;
H_BCC
H_CHECK - вставлять
заголовок только, если один из флагов
заголовка
соответствует флагу в описании агента; тип не
должен
встречаться в conf.c - он
устанавливается
автоматически когда читается
описание строки заголовка с флагами;
H_CTE
H_CTYPE
H_DEFAULT -
автоматически
приписывается всем
заголовкам, описанным в файле
конфигурации;
допускается только одна строка в
заголовке; типы H_FORCE и H_TRACE
отменяют действие;
H_ENCODABLE
H_EOH - трактовать
последующие строки
заголовка как тело письма;
H_ERRORSTO
H_FORCE - вставлять строку
заголовка даже если такая уже
существует;
H_FROM - эта строка содержит адрес
отправителя;
H_RCPT - в этой строке
заголовка содержатся адреса
получателей (они
переписываются, но для реальной
отправки
используется адрес из конверта);
H_RECEIPTTO
H_RESENT - если строк такого типа нет в
заголовке, то все строки, имя которых
начинается с resent-
удаляются из заголовка
H_TRACE| - эта строка будет
учитываться при подсчете числа хопов;
K - создать ключевой вход (keyed map entry):
доступ к внешней базе данных. В отличие от
класса чтение базы данных
происходит в момент поиска, а не в момент
чтения файла
конфигурации.
Создание базы данных: makemap ключиклассфайл-базы-данных
где ключи:
-f - ключ и данные
преобразуются к строчным буквам, если не
указан этот ключ (должен
соответствовать команде K)
-N - добавлять нуль в конце каждого ключа
(должен
соответствовать команде K)
-o - добавить к БД, а не заменять
-r - разрешить замену данных, если
идентичный ключ уже
существовал
-v -
болтливость
класс - это dbm (для ndbm(3) - как у меня?), hash или btree для db(3)
.pag и .dir
добавляются к имени файла базы данных
автоматически
данные читаются со
стандартного ввода: строки,
начинающиеся с #, являются
комментариями; на каждой строке д.б. ключ и
значение,
разделенные пробелами или
табуляциями; ключ может состоять из
нескольких атомов
Описание БД: Kимяклассключифайл-или-карта-NIS
где имя -
символическое имя, для
использования в
конфигурационном файле;
класс - тип БД: dbm, btree, hash, nis, host, dequote;
файл-или-карта-NIS -
абсолютное имя без
суффиксов,
открывается в момент
обработки
конфигурационного файла
ключи:
-a - дальнейший текст до пробела
добавляется к значению,
найденному по ключу
-d - NIS-домен
-f - не
преобразовывать ключ к
маленьким буквам перед поиском в БД
-m - обычно удачный поиск в БД
вызывает замену ключа на
соответствующие данные, данный ключ
блокирует замену (но -a и $:
продолжают
действовать)
-N - если БД была создана с ключом -N
-O - если нет ключей -N и -O, то sendmail будет
пытаться сделать поиск по ключу дважды с
завершающим нулем и без оного.
-o - не ругаться при
отсутствии БД
Использование БД: в правой части
правила: $(имяключ $@текст1 $@текст2 ... $:default $)
Если ключ найден в БД, то его
значение заменяет всю
конструкцию (может
добавляться суффикс,
определенный ключом -a), иначе текст ключа (если
указан $:, то default)
заменяет всю
конструкцию. Если в значении,
извлеченном из БД
встречается %0, то он
заменяется на текст ключа, если %1, то - на текст1, если %2, то - на
текст2 и т.д. $@ и $: м.б. опущены.
Класс host
используется для
модификации действия $[ и $]:
добавляется строка Khost host -a.
на самом деле $[ foo $] является
синонимом для $(host foo $)
Класс dequote
используется для удаления кавычек вокруг
атомов (если они после этого
остаются
правильными адресами): Kunquote dequote
выражение $(unquote ""
$амперсендX $)
используется также, чтобы разбить на атомы
отложенное значение макро X
M - определить агента
Mимя-агента,
P=имя-программы,
[D=директория-для-исполнения,]
[E=конец-строки,]
[L=макс-длина-строки,]
[M=макс-размер-письма,] [F=флаги,]
[S=правила-отправителя,]
[R=правила-получателя,]
A=командная-строка
Предопределенные агенты:
═ ═M*file*, P=[FILE] S=0/0 R=0/0 M=0 U=0:0 F=9DEFMPloqsu L=0 E=\n
T=DNS/RFC822/X-Unix A=FILE $u
═ ═M=*include*, P=/dev/null S=0/0 R=0/0 M=0 U=0:0 F=su L=0 E=\n
T=<undefined>/<undefined>/< A=INCLUDE
$u
Обязательно д.б.
определены агенты: local и prog.
Командная строка д.б.
последней. Макросы
подставляются в момент вызова.
Параметры:
Argv=
Если в командной строке не
присутствует $u (имя
получателя), то sendmail считает, что
используется протокол SMTP.
Встроенный агент посылки почты по
Интернет по протоколу SMTP: P=[IPC], A=IPC хост[порт]
где хост - м.б. списком хостов через
двоеточие (будут
пробоваться по очереди слева направо,
сначала ищется MX-запись, если нет, то
A-запись в DNS). Если $u
присутствует и есть флаг m, to
значение $u
подставляется столько раз, сколько
получателей.
Charset=
Directory=
в этой директории будет
выполняться программа через агента prog (по
умолчанию в очереди писем), на самом деле это
список директорий через
двоеточии, sendmail по очереди пробует
сделать chdir в них (слева направо).
Eol=
чем будет
заканчиваться строка при передаче и приеме,
обычно \r\n (TCP) или \n (UUCP)
Flags=
Влияют на:
поведение sendmail
условную генерацию строк
заголовка (H?P?Return-Path:
означает, что этот
заголовок надо
генерировать только, если указан флаг P при
описании агента)
Перечень флагов:
7 - обрезать старший бит
a -
использовать ESMTP (RFC1425)
A - устарел
b - добавлять пустую строку в конце письма, если ее нет в
самом письме
B - не проверять ответ SMTP (только для
отладки)
C - добавлять домен
отправителя к адресу
получателя, который не имеет
доменной части
D - условная генерация строк
заголовка, включающих дату (Date:, Resent-Date:)
e - агент является "дорогим", м.б.
отложить посылку (опция c)
E - если есть несколько строк "From ", то в
начало всех, кроме первой,
вставлять знак "больше"
f - если sendmail запущен с ключом -f, то при
запуске агента в начало его
командной строки
добавляется "-f $g"
F - условная генерация строк From
заголовка (From:, Resent-From:)
g - заменить пустой адрес (пустые
угловые скобки) на $n@your.domain
h - не
преобразовывать хост-часть адреса
получателя к строчным буквам
H - для DECnet почты
I -
оптимизация, если знаешь что на той
стороне SMTP тоже работает sendmail
l - агент
осуществляет конечную отправку:
включается механизм Return-Receipt-To;
игнорируется хост-часть тройки,
возвращаемой набором правил 0
L - разбивать слишком длинные строки,
?обнуляет 8-й бит в
заголовках (по умолчанию 990
символов)
m - агент позволяет
отправить письма сразу
нескольком
получателям (сам проверяет, чтобы их было не
больше, чем макс. число
параметров argv)
M - условная генерация строк
заголовка, включающих
идентификатор сообщения (Message-ID:, Resent-Message-ID:)
n - не добавлять строку "From ", если ее не было; этот
флаг должен быть для SMTP агента (а у меня нет!)
N - DECnet (позволяет
обрабатывать несколько строк ответа)
p - более аккуратная
обработка обратного адреса: обычно в
качестве
отправителя
используется адрес из конверта, если
указаны ключи p и l, то адрес из
конверта
трансформируется: @hub:name@domain
преобразуется в @ourhost,@hub:name@domain name@domain
преобразуется в @ourhost:name@domain
P - условная генерация строк
заголовка, включающих Return-Path
r- если sendmail запущен с ключом -f, то при
запуске агента в начало его
командной строки
добавляется "-r $g" (не спутай с флагом r ;)
R -
использовать для SMTP
соединения резервный порт
s - удалить кавычки из адреса (local и prog
обычно требуют этого, TCP не должен делать это)
S - если этот флаг не указан, то sendmail
меняет uid и gid из root в
следующих случаях:
в ~/.forward файле стоит указание
отправить письмо в файл или через агента prog (на
права владельца ~/.forward)
письмо
отправляется через :include: в aliases(5) в файл или
через агента prog (на права
владельца include-файла)
если
отправитель местный и агент prog или в файл (если
отправитель не root, то на права
отправителя, иначе
определяются опциями u и g)
если агент prog или в файл (права
определяются опциями u и g)
u - не
преобразовывать имя
получателя к строчным буквам (полезно для
агента prog)
U - добавлять строку "From ", если ее не было;
добавлять текст "remote from хост" и
преобразовывать $g в UUCP-шную форму
(требуется, если соседский UUCP-хост
использует старый или SysV rmail)
V -
преобразовать заголовок в UUCP-форму (адреса
относительно
принимающего хоста), обычно это
делается с помощью набора правил
x - условная генерация строк
заголовка, включающих Full-Name:
X - удваивать точку в начале строки (только при SMTP,
позволяет избежать
интерпретации одинокой точки, как конца
сообщения)
Linelimit=
разбивать строки, более длинные чем
указано
(вставляется
восклицательный знак и конец строки -
определяется E=)
Maxsize=
ограничить длину письма
(заголовок и тело вместе)
Nice=
Path=
имя программы, которую надо
запустить в качестве агента. Список
аргументов задается в A=.
Окружение обрезается за
исключением TZ и AGENT.
Специальное имя: [IPC] (или [TCP]) -
осуществить
соединение по сети с
использованием SMTP.
Специальное имя: [LPC] -
интерактивное общение с
пользователем вместо SMTP-сервера (для
отладки).
Recipient=
задает номера наборов правил
обработки имен
получателей в форме:
набор-для-конверта/набор-для-заголовка (To:, Cc:, Bcc:)
сначала
обрабатывается адрес
получателя с конверта (аргумент
командной строки, команда RCPT, строка
заголовка To:) - S3; S0
(имяпользовательская часть
кладется в $u); $u
обрабатывается S2; R=; S4. Затем
обрабатываются адреса из
заголовка: S3; если знак @
отсутствует и задан флаг F=C, то
доменная часть адреса
отправителя с конверта
добавляется к адресу
получателя и заново
пропускается через набор S3; S2; R=; S4.
Sender=
задает номера наборов правил
обработки имени
отправителя в форме:
набор-для-конверта (ключ -f, команда ═MAIL to:,
заголовок)/набор-для-заголовка (From:, Sender:)
адреса
отправителя с конверта и из
заголовка
обрабатываются одинаково: S3; S1; S=; S4.
Type=
Userid=
O - опция задаются:
в командной строке (только здесь имеют смысл d, e, i, M, v);
безопасными опциями являются
(позволяют sendmail работать с правами root): 7, b, d, C, e, E, i, j, L,
m, o, p, r, s, v;
в
конфигурационном файле (меньший
приоритет):
Oодносимвольное-имя значение
O
длинное-имя=значение
Последующее
определение опции забивает
предыдущее.
Тип опции:
булевый: если аргумент
начинается с буквы t, T, Y, y или
отсутствует, то истина, иначе ложь.
символ: - один ASCII символ
число: для
преобразования
используется atoi(3)
строка: кавычки не
удаляются
восьмеричный (видимо, только права к файлу)
время: s - секунды, m - минуты, h - часы, d -дни, w -
недели (можно смешивать: 1h30m; по
умолчанию - дни)
Перечень опций (в
квадратных скобках
односимвольное имя, если есть):
[A] AliasFile=spec, spec, ... - где spec в
формате: class:file, где class - это implicit (по
умолчанию, встроенный список типов), hash (NEWDB), dbm (NDBM), stab
(внутренняя таблица символов), nis.
[a] AliasWait=timeout - ждать
указанное время пока внешняя
программа завершит
построение БД алиасов, если нет, то
построить самим или выдать
сообщение
AllowBogusHELO -
разрешать команды SMTP HELO, не
включающие имя хоста
[D] AutoRebuildAliases -
пересоздавать БД алиасов при
необходимости═(не
рекомендуется)
[B] BlankSub=char - на что
заменять
неквотированные пробелы в адресах (по
умолчанию на пробел)
[n] CheckAliases -
проверять правую часть алиасов при
пересборке БД алиасов
[C] CheckpointInterval=число -
делать
контрольную точку очереди каждые число
адресов (по умолчанию 10)
ChownIsAlwaysSafe - ?
[z] ClassFactor=число - число
умножается на класс
сообщения
(определеляется полем Precedence: и
командой P) и
вычитается из
приоритета (по умолчанию, 1800)
ColonOkInAddr - если нет, то
двоеточие
воспринимается как начало
групповой
конструкции (RFC822), что и
рекомендуется
[k] ConnectionCacheSize=число - макс. число
удерживаемых открытых
соединений (по умолчанию 1 -
закрытие текущего
соединению
откладывается до тех пор пока не
понадобится
дескриптор файла). Если 0, то
закрывается
немедленно. Не
рекомендуется больше 4.
[K] ConnectionCacheTimeout=время - по
умолчанию 5 минут
ConnectionRateThrottle=число - если
число
положительное, то оно
ограничивает число входный
соединений в секунду. По
умолчанию - 0 (нет
ограничений).
[O] DaemonPortOptions=опции, где опции имеют вид:
ключ=значение.
Распознаются ключи:
Port - имя/номер
прослушиваемого порта (по
умолчанию - smtp)
Addr - маска адреса (по
умолчанию - INADDR_ANY)
Family - семейство адресов (по
умолчанию - INET)
Listen - размер очереди
прослушивания (по умолчанию - 10)
SndBufSize - размер буфера посылки TCP
RcvBufSize - размер буфера приема TCP
DeadLetterDrop - ?
DefaultCharSet=имя-набора-кодов когда
8-битное сообщение,
пришедшее не в MIME-формате,
конвертируется в MIME (см. опцию EightBitMode), то имя
набора кодов д.б. вставлено в строку
заголовка Content-Type: Обычно берется из поля Charset
описания агента. Если его там нет, то
берется отсюда. У нас, видимо, д.б. koi8-r.
[u] ═DefaultUser=uid:gid - по
умолчанию 1:1
[d] DeliveryMode=mode, где mode:
i - отправлять в
интерактивном режиме
(синхронном), по умолчанию, если опция
задана, но режим не указан
b - в фоновом режиме
(асинхронно), по умолчанию, если опция не
задана
q - только стаавить в очередь
(отправлять при обработке очереди)
d - задерживать отправку и
просмотр карт
?(отправлять при
обработке очереди)
DialDelay=sleeptime при работе с
сетевым
соединением типа "дозвон по запросу" первое
соединение может быть
задержано, в этом случае sendmail делает паузу sleeptime. По
умолчанию 0 (не повторять).
DontExpandCnames - по
стандарту положено, чтобы все адреса хостов в
письме были
каноническими, что
обеспечивается во время
канонификации ($[...$]). Данная опция
позволяет
использовать
неканонические имена
(определенные в CNAME).
DontInitGroups -
единственной группой, к которой
принадлежит
пользователь, будет его главная группа (из /etc/passwd), что
ограничивает права доступа
DontLockFilesForRead - ?
DontProbeInterfaces- ?
[R] DontPruneRoutes - обычно sendmail
пытается убрать лишние части явного
маршрута, когда посылает
сообщение об ошибке (RFC1123 5.2.6) (@known1,@known2,@known3:user@unknown
превращается в @known3:user@unknown).
DoubleBounceAddress=error-address кому
посылать сообщения об ошибке, если при
попытке послать сообщение об ошибке
происходит ошибка. По
умолчанию - postmaster.
[8] EightBitMode=mode -
действует на
недекларированные 8-битные данные
(декларация: указание BODY=8BITMIME в ESMTP или флаг
командной строки -B8BITMIME),
═Правильно
декларированные 8-битные данные всегда будут
конвертированы в 7-битные при
необходимости. Режимы
обработки
недекларированных 8-битных данных:
s - обрезать 8-й бит
m -
конвертировать в MIME
p - передавать как есть
[E] ErrorHeader=file-or-message -
предварять сообщение об ошибке (из xf-файла)
указанным сообщением (если
начинается с косой черты, то
считается именем файла, иначе
литералом), можно
использовать макросы
[e] ErrorMode=mode - режим
обработки ошибок:
p - печатать сообщение об ошибке (по
умолчанию и
рекомендуется) - локальный
отправитель получает
сообщение об ошибке,
удаленный - письмо
q - никаких сообщений, только код
возврата
m - сообщение об ошибке всегда
посылать почтой
w - писать сообщение об ошибке на
терминал
пользователя, если он работает, иначе
посылать почтой
e - то же, что w, но всегда код
возврата 0
[V] FallbackMXhost=host -
рассматривается как очень
низкоприоритетный MX для любого хоста.
[Y] ForkEachJob -
порождать новый процесс при
обработке каждого письма из очереди
(экономит память)
[J] ForwardPath=path - путь для
поиска файлов .forward (по
умолчанию - $z/.forward)
[H] HelpFile=file
[c] HoldExpensive - если агент
отмечен как дорогой, то не
соединяться
немедленно, а класть в очередь
HostsFile=path - по
умолчанию /etc/hosts
HostStatusDirectory=path -
хранить состояние хостов долго, а не только на
протяжении одной обработки очереди (д.б.
установлен кэш
соединения хотя бы в 1).
Рекомендуемое значение : .hoststat
(поддиректория в очереди).
[i] IgnoreDots - при работе через SMTP не
принимается во внимание.
[L] LogLevel=n -
установить уровень
журнализации (по умолчанию 9)
[G] ═MatchGECOS - если
получатель не найден, то пытаться ли инайти его по полю GECOS из
файла паролей, не
рекомендуется
MaxDaemonChildren=N -
максимальное число входных
соединений
[h] MaxHopCount=N - макс. число
передаточных станций, если
превышено, то считается, что
зациуклились. По умолчанию - 25
MaxMessageSize=N -
выдается в ESMTP EHLO ответе
MaxQueueRunSize=N -
максимальное
количество заданий,
обрабатываемых как один просмотр
очереди
MaxRecipientPerMessage=N - накс. число
получателей (надо
перекомпилировать)
[m] MeToo - пысылать себе даже если мой
адрес образуется при
расширении алиаса
[b] MinFreeBlocks=N -
принимать почту по SMTP, только если есть N
свободных блоков в файловой системе,
держащей очередь
MinQueueAge=age - не
обрабатывать задания, которые
находятся в очереди меньше
указанного времени
MustQuoteChars=string - список
символов, которые надо
квотировать, если они
встретились в
комментарийной части адреса. По
умолчанию точка и апостроф. Всегда
квотируются: at sign, запятая, точка с
запятой, двоеточие, обратная косая черта,
круглые скобки,
квадратные скобки.
NoRecipientAction=mode - что делать, если нет
имени получателя (To:, Cc:, Bcc:, Apparantly-To:)
None - передать, не меняя
(куда?), что
нарушает протокол;
Add-To - добавить
заголовок To: с любым адресом из
конверта (что может открыть имя Bcc:
получателя);
Add-Apparently-To -
добавить заголовок Apparently-To (только для
совместимости со старыми
версиями)
Add-To-Undisclosed -
добавить заголовок To:, но не
вставлять туда реального имени
Add-Bcc - добавить пустой Bcc:
заголовок
[o] OldStyleHeaders -
предполагать, что заголовок м.б. в старом
формате (имена
разделяются пробелами, а не
запятыми). По умолчанию -
выключен.
OperatorChars=string - то же, что макро o
PidFile - ?
[P] PostmasterCopy=имя - если
установлено, то копия
сообщения об ошибке будет послана на этот адрес
(только заголовок исходного письма), не
рекомендуется
[p] PrivacyOptions=opt,opt,... -
требовать более жесткую форму SMTP
протокола
public - открытый доступ (по
умолчанию)
needmailhelo -
требовать команду HELO или EHLO перед MAIL
needexpnhelo -
требовать команду HELO или EHLO перед EXPN
noexpn - запретить EXPN
needvrfyhelo -
требовать команду HELO или EHLO перед VRFY
novrfy - запретить VRFY
restrictmailq -
ограничить команду mailq
restrictqrun -
ограничить
возможность вызова команды с флагом -q
noreceipts - не
возвращать успешный DSN
goaway - запретить все запросы о
статусе SMTP (все флаги, кроме public, restrictmailq, restrictqrun)
authwarnings - если needmailhelo не
указан, то в заголовок
добавляется строка:
X-Authentication-Warning: мы: Host они didn't use HELO protocol
nobodyreturn - в сообщениях об ошибках оставлять только заголовок
исходного письма, а тело выкидывать
[Q] QueueDirectory=dir - имя
директории, в которой лежит очередь
[q] QueueFactor=factor - на это число
делится разница между текущей средней
загрузкой и QueueLA, чтобы
определить
максимальный приоритет писем, которые будут
отсылаться (остальные кладутся в
очередь до лучших времен). По
умолчанию - 6000000.
[x] QueueLA=число - когда
средняя загрузка системы превысит это число, не
посылать письма, а только
складировать их. По
умолчанию - 8.
QueueSortOrder=алгоритм
h - сортировать по имени первого хоста
первого получателя
t - по времени
отправления
p - по приоритету (по
умолчанию)
[T] QueueTimeout=timeout -
синоним для Timeout.queuereturn
[y] RecipientFactor=factor -
умножается на
количество
получателей и
добавляется к
приоритету. По умолчанию 30000.
[X] RefuseLA=число - если
средняя загрузка превышает это число, то
отвергать входящие SMTP
соединения. По умолчанию - 12.
[I] ResolverOptions=options -
установить: +flag,;очистить: -flag (по
умолчанию: DNSRCH, DEFNAMES, RECURSE - см. resolver(3)).
Строка HasWildcardMX (без + или -)
отключает сравнение с записью MX при
канонификации имен:
debug
aaonly
usevc
primary
igntc
recurse
defnames
stayopen
dnsrch
[Z] RetryFactor=factor -
добавляется к
приоритету каждый при попытке послать данное
письмо (понижая приоритет
задержавшевося письма). По
умолчанию - 90000.
RrtImpliesDsn - ?
RunAsUser=uid:gid -
работает с указанными правами (к порту
привязывается все-таки как root).
Применять только на firewall.
SafeFileEnvironment=dir - сюда sendmail
будет делать chroot(2) перед записью в файл.
Интересная мысль.
[f] SaveFromLine -
сохранять строку "From " перед
заголовком (по умолчанию -
удаляется).
[j] SendMimeErrors - если
установлено, то посылать
сообщения об ошибке в MIME-формате (RFC1521 и RFC1344),
иначе sendmail не
возвращает ключевое слово DSN (Delivery Status Notification) в
ответ на EHLO и не
осуществляют обработку DSN в
соответствии с RFC1891
ServiceSwitchFile=filename - если ОС не
имеет абстракции
переключателя
сервисов(например /etc/nsswitch.conf), то этот файл
служит вместо нее. Состоит из серии строк,
каждая из которых состоит из слов. Первое слово в
строке - имя сервиса,
остальные - тип. sendmail
рассматривает сервисы типа aliases и hosts. Тип
сервиса м.б. dns, nis, nisplus или files. По
умолчанию имя файла - /etc/service.switch. Если файл не
существует, то
принимается:
aliases files
hosts dns nis files
[7] SevenBitInput -
обнулять старший бит.
SingleLineFromHeader - если строка From:
имеет
продолжение, то
сворачивать в одну строку.
SingleThreadDelivery - не более одного
соединения
одновременно с каждым хостом.
Требуется опция HostStatusDirectory.
SmtpGreetingMessage=message -
сининим для макро $e. По
умолчанию:
$j Sendmail $v ready at $b
[S] ═StatusFile=file - имя файла для
суммарной статистики. Не растет. Если нет, то
статистика не
собирается.
[s] ═SuperSafe - всегда
помещать письмо в очередь, даже если
собираемся отправлять
немедленно. Очень
рекомендуется.
[F] TempFileMode=mode - права
доступа к файлам в очереди. По
умолчанию - 0600.
[r] Timeout.type=timeout - в
скобках даются значению по
умолчанию и
минимальное
datafinal - ответ на
завершающую точку в данных [1h, 10m]
rset - ответ на RSET [5m, none]
quit - ответ на QUIT [2m, none]
misc - ответ на NOOP, VERB [2m, none]
ident - [30s, none]
fileopen - открытие .forward или :include: [60s, none]
command - чтение команды [1h, 5m]
queuereturn - макс. время в очереди [5d, 5d]
queuewarn - время
нахождения в очереди после
которого посылается
предупреждение [none, none]
hoststatus - в течении этого времени
информация о состоянии хоста
считается
достоверной [30m, none]
[t] ═TimeZoneSpec=tzinfo - по
умолчанию
используется системная
[w] TryNullMXList - не
рекомендуется (обход хитрого правила борьбы с
зацикливанием MX)
UnixFromLine=fromline - синоним макро $l
UnsafeGroupWrites -
трактовать .foeward и :include: файлы с
правами для группы на запись как
небезопасные (т.е. в них не может быть ссылки на файл или
программу).
[l] UseErrorsToесли есть
заголовок Error-To: то
сообщение об ошибке посылать на этот адрес. Не
рекомендуется т.к. RFC1123 требует
посылки на
отправителя из конверта.
[U] ═UserDatabaseSpec=udbspec -
извлекать информации из БД о
пользователях UDB. Нет ее у меня.
[v] Verbose -
выполнить в "болтливом" режиме.
Использовать только из
командной строки.
WritableDirectoriesAreFatal - ?
P - приоритеты (макросы не
подставляются!)
Класс письма задается строкой
заголовка Precedence:. Тело строки должно
соответствовать команде:
Pимя-класса=значение-класса
начальный приоритет = рамер письма -
(значение класса * опция z) +
(количество
получателей * опция y)
Общепринятые имена классов:
special-delivery ═-
отправлять немедленно
first-class
list
junk
bulk - массовая рассылка
При ответе на ошибочное письмо с
отрицательным значением класса sendmail
опускает тело письма.
R - правило
преобразования. Левая часть (до
табуляции) являевтся шаблоном,
сопоставляемым с
содержимым рабочего поля. Шаблон и
рабочее поле разбиты на атомы (tokens).
Разделители атомов
определяются макросом o (обычно: точка,
двоеточие, процент,
восклицательный знак, каррет, равно, косая черта, at sign,
квадратные скобки) и
внутренним списком (круглые скобки,
угловые скобки, запятая, точка с
запятой, обратная косая черта, кавычка,
перевод строки, возврат каретки.
Кавычки маскируют действие
разделителей между ними. Оператор в
правилах (например,
звездочка вслед за долларом)
образуют отдельные атомы. Пробел
разделяет атомы, но атомом не
является. При обратной сборке атомов в текст атомы
просто
конкатенируются, но если рядом стоют две
простые текстовые строки, то между ними
вставляется точка (точнее
значение макроса B). Макросы
подставляются в момент чтения файла
конфигурации. Убираются
RFC822-комментарии (текст в
немаркированных круглых скобках).
═Проверяется баланс кавычек, круглых и
угловых скобок. Обратная косая черта
отменяет
специальное значение
следующего за ней символа. Адрес
разбивается на атомы и
помещается в рабочее поле.
Делается попытка
сопоставить левую часть первого правила
набора с рабочим полем. При
сравнении прописные и строчные буквы не
различаются. Действует обычное правило
минимального
сопоставления. Если попытка не удалась, то
переходим к
следующему правилу. Если удалась, то
записываем новое
содержимое рабочего поля,
определяемое правой частью и
попторяем процесс с ТЕМ ЖЕ
правилом.
Специальные операторы левой части
(сопоставление):
$* - ноль или более атомов
$+ - один или более атомов
$- - ровно один атом
$@ - ровно ноль атомов
$= - атом в рабочем поле должен
совпадать с одним или многими атомами в
указанном классе макро
$~ - должен не совпадать
Специальные операторы правой части
(подставляется):
$цифра - копировать ═атом из
рабочего поля,
соответствующий оператору левой части с
указанным номером (учтите, что макросы не
являются
операторами!) от 1 до 9;
$: - применять правило только раз
(префикс);
$@ - применять правило только раз и
вернуться из набора правил (префикс);
$>номер_набора -
использовать набор правил как
подпрограмму (рабочее поле
переписывается правой частью
текущего правила,
затем═вызывается указанный набор), вызов может быть
только один и должен стоять в начале правой части (м.б.
после префикса) - явно
неправда -
вызываются справа налево?;
дальнейший текст должен быть отделен от
номера_набора_правил пробелом;
$# - указать имя агента, должен стоять в
начале правой части (м.б. после
префикса); также
прекращает работу набора правил;
$[ и $] -
канонизировать имя хоста,
указанное между ними (м.б. IP адрес в
квадратных скобках) - полная
каноническая форма имени, включая
завершающую точку; если имя найти не
удалось, то исходный текст просто
копируется,
отбрасывая операторы; между
операторами может стоять $:
имя_по_умолчанию
Правила
канонизации:
если в имени есть хоть одна точка, то поиск
производится как есть;
если неудача, то к имени
добавляется домен по
умолчанию (из /etc/resolv.conf) и
производится поиск;
если неудача, то самая левая часть домена по
умолчанию
отбрасывается и
производится поиск;
если исходное имя не
содержало точки, то поиск
производится как есть.
$( и $) - просмотр базы данных;
${ и $} - просмотр карты NIS.
S - начало набора правил (rule set).
Параметр - номер набора (по
умолчанию или при ошибке - 0) или
символическое имя. Все
дальнейшие правила до
следующей команды S попадают в этот набор.
Порядок наборов
произволен. Можно даже
перемешивать наборы или другие команды. Все
правила до первой S-команды
попадают в набор 0.
Максимальное
количество наборов
определяется MAXRWSETS в conf.h (200).
focus - поместить угловые скобки вокруг имени
хоста, включая at sign.
Порядок применения наборов (наборы R= и S=
могут
различаться для заголовка и
конверта):
используется набор 3 для адреса
получателя, затем набор 0 для
определения агента, если агент local, то
используется alias и ~/.forward, если адрес не
изменился после alias, то
используется набор 5 (может вызвать нового
агента) - необходим в случае firewall
адрес
отправителя
обрабатывается набором 3, набором 1, затем
набором указанным ключом S= в
описании агента, затем набором 4
адрес получателя
обрабатывается набором 3, набором 2, затем
набором, указанным ключом R= в
описании агента, затем набором 4
Специальные операторы правой части в наборе
правил 0. Набор правил 0
вызывается один раз для каждого адреса
получателя и должен
преобразовать этот адрес в тройку: имя
агента, хостовая часть адреса,
пользовательская часть адреса (все три части
должны
присутствовать за
исключением случая, когда агент имеет
установленым флаг l - тогда можно не
указывать хост). Если адрес пройдет сквозь набор не
выбрав агента, то письмо не будет
доставлено:
$# - говорит, что дальше идет имя агента
(должен идти первым в тройке), служит также
признаком завершения работы набора 0
$@ - дальше идет имя хоста
получателя (должен идти вторым)
$: - дальше идет имя
получателя (должен идти
последним), для всех агентов, кроме local, может
содержать и хостовую часть;
заносится в макрос u;
обрабатывается наборами 2, R= и 4;
подается в качестве
параметра при запуске агента или RCPT to: при
общении по SMTP.
T - доверенные
пользователи
позволено не иметь
достойного shell'а в /etc/passwd
не вставляется
предупреждение при
использовании ключа -f (отправка письма от имени
другого
пользователя)
не вставляется
предупреждение, если имя
отправителя (на локальной машине) не
совпадает с именем,
определенным по номеру процесса
T user1 user2 ...
Ct user1 user2 ...
V - версия файла
конфигурации: параметр - уровень от 0 до 5
0 или 1 заставляет sendmail вести себя как
старая версия (удаляется 8й бит);
2
добавляет -a. к карте "host host", если она не
описана в файле
конфигурации;
включаются RES_DEFNAMES и RES_DNSRCH при
просмотре записей MX;
разрешается набор правил 5;
═автоматически
устанавливается опция l;
3 или 4 -
используются
комментарии нового стиля (внутри строки);
5 - макро $w
устанавливается равным
короткому имени хоста вместо полного ($j
по-прежнему содержит полное имя, а $m -
локальный домен).
Руководство по установке и использованию sendmail (в файле doc/op/op.ps в tar.gz)
O'Reilly and Associates, Inc.
sendmail, 2nd Edition
By Bryan Costales & Eric Allman
2nd Edition January 1997
1-56592-222-0, Order Number: 2220
1050 pages, $39.95