Online Documentation Server
 ПОИСК
ods.com.ua Web
 КАТЕГОРИИ
Home
Programming
Net technology
Unixes
Security
RFC, HOWTO
Web technology
Data bases
Other docs

 

 ПОДПИСКА

 О КОПИРАЙТАХ
Вся предоставленная на этом сервере информация собрана нами из разных источников. Если Вам кажется, что публикация каких-то документов нарушает чьи-либо авторские права, сообщите нам об этом.




Sendmail 8.8.7 (есть уже 8.9.3!)

Источники:

Установка (Solaris 2.5):

  1. взять источник (sendmail.8.8.7.tar.gz)
  2. развернуть
  3. отредактировать файл sendmail-8.8.7/src/Makefiles/Makefile.SunOS.5.5:
    • 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
  4. src/conf.h трогать не надо
  5. правим src/pathnames.h (#define _PATH_SENDMAILCF "/usr/local/etc/mail/sendmail.cf"), чтобы файл конфигурации не надо было задавать ключом.
  6. правим src/conf.c(checkcompat), чтобы запретить чужим использовать наш почтовый сервер как mailrelay и никого при этом не обидеть (сообщения об ошибках и return-receipt-to должны возвращаться). Если это удастся, то будет know-how: нигде я не видел аккуратной реализации.
  7. cd src and then ./makesendmail
  8. makesendmail install
    • /usr/ucb/install -o root -g sys -m 6555 sendmail /usr/local/lib
    • ln -s /usr/local/lib/sendmail /usr/local/bin/newaliases
    • ln -s /usr/local/lib/sendmail /usr/local/bin/mailq
    • ln -s /usr/local/lib/sendmail /usr/local/bin/hoststat
    • ln -s /usr/local/lib/sendmail /usr/local/bin/purgestat
    • /usr/ucb/install -c -o root -g sys -m 644 /dev/null /usr/local/etc/mail/sendmail.st
    • /usr/ucb/install -c -o root -g sys -m 444 sendmail.hf /usr/local/etc/mail
  9. конфигурируем
    • заходим в директорию 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 - обратите внимание на прямые и обратные апострофы
      • FEATURE(smrsh)dnl
      • MASQUERADE_AS(deol.ru)dnl
      • MASQUERADE_DOMAIN(deol.ru variant.msk.su)dnl
      • Dmdeol.ru
      • define('confDOMAIN_NAME', '$w.$m')dnl
      • MAILER(local)dnl
      • MAILER(smtp)dnl
      • MAILER(uucp)dnl
      • MAILER(usenet)dnl
      • MAILER(pop)dnl
      • MAILER(procmail)dnl
      • MAILER(cyrus)dnl
    • запускаем макропроцессор
      m4 ../m4/cf.m4 deol.mc > deol.cf
  10. и пробуем - да уж...
    придется все делать вручную
    • настройка опций - мое любимое занятие
    • 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 (два поля: локальное имя и куда перенаправить)
      • изготовление БД: makemap hash forward меньше forward.txt
      • в Parse1 перед обработкой локальной почты (ну и бред!)
        R$* меньше @ $=M. > $* $: $(forward
         $1 $: $1 меньше @ $2 . > $3 $)
        R$* .forward. $: .forward. $>3 $1
        R.forward. $- $1 меньше @ $j. >
        R.forward. $* меньше @ $* > $* $#lesmtp
         $@ $2 $: $1 меньше @ $2 >
        R.forward. $* $#error $@ 5.1.2 $: "invalid
         forward address"
        
        
  11. /etc/rc2.d/S88sendmail надо поправить
  12. права на /var/spool/mqueue ставим 750
  13. создаем makemap:
    1. ручками правим Makefile.dist
      1. убираем -DNDBM
      2. LIBDIRS=-L/usr/local/lib
      3. из LIBS убираем -ldbm
      4. BINDIR=/usr/local/sbin
    2. make -f Makefile.dist
    3. make -f Makefile.dist install (под root)
  14. старый /usr/lib/sendmail переименовываем и делаем линк под этим именем на новый
  15. если предполагается вместо обычного sh использовать smrsh, то
    1. зайти в поддиректорию smrsh
    2. оттранслировать его
      gcc -o smrsh smrsh.c
    3. запихнуть, например, в /usr/local/etc (определяется строкой Mprog в конфигурационном файле)
    4. создать директорию /usr/adm/sm.bin и зайти в нее
    5. насоздавать там линки на программы и командные файлы, которые только и будут использоваться в качестве адреса программы (начинется с вертикальной черты).

Теория (эх, старая у меня книжка... - про версию 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

Структура имени файла:

  1. первая буква - тип файла
    • 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-адрес реальной пославшей машины)
      • пробел или табуляция - продолжение предыдущей строки
  2. вторая буква - f
  3. дальнейшие буквы представляют собой уникальный идентификатор письма
    • одна буква, соответствующая часу (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).

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

Программы обслуживания списков рассылки:

  • majordomo (автоматическое добавление и удаление пользователей из списка, удаленное управление списком)
  • almanac (позволяет также передавать файлы)
  • listprocessor (listserv)

~/.forward - если файл не безопасен (разрешен доступ кому-то кроме владельца), то он игнорируется. Формат и поведение аналогично :include:. Может включать почтовые имена, имена файлов, программ, другие :include:. Программы, специально предназначенные для использования в ~/.forward:

  • deliver
  • procmail (сортировка по файлам, фильтры и др. предобработка, запуск программ, избирательное переназначение)
  • slocal

Журнал

facility: LOG_MAIL ("mail")

Уровни (опция LogLevel):

  • 0 - нет
  • 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

Статистика

  1. sendmail.st - в этом файле (его имя задается опцией S) для каждого агента суммируется ═количество переданых и полученных сообщений и байт. Чтобы статистика собиралась, файл должен существовать и быть открытым на запись (кому?). Получение статистики производится программой
    mailstat [-C config-file] [-f stat-file]
    (можно собирать и обнулять ее ежедневно)
  2. информация, извлекаемая из 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 в следующих случаях:
        1. в ~/.forward файле стоит указание отправить письмо в файл или через агента prog (на права владельца ~/.forward)
        2. письмо отправляется через :include: в aliases(5) в файл или через агента prog (на права владельца include-файла)
        3. если отправитель местный и агент prog или в файл (если отправитель не root, то на права отправителя, иначе определяются опциями u и g)
        4. если агент 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
    • [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 - в скобках даются значению по умолчанию и минимальное
      • connect
      • iconnect
      • initial - ожидание начального приветствия [5m, 5m]
      • helo - ответ на HELO или EHLO [5m, none]
      • mail - ответ на MAIL [10m, 5m]
      • rcpt - ответ на RCPT [1h, 5m]
      • datainit - ответ на DATA [5m, 2m]
      • datablock - чтение блока данных [1h, 3m]
      • datafinal - ответ на завершающую точку в данных [1h, 10m]
      • rset - ответ на RSET [5m, none]
      • quit - ответ на QUIT [2m, none]
      • misc - ответ на NOOP, VERB [2m, none]
      • ident - [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 - локальный домен).


With any suggestions or questions please feel free to contact us