###########
# Макросы #
###########
# Версия конфигурации sendmail. В данном случае
# Copyright (C) 1992-2007 Сергей Вакуленко, <vak@cronyx.ru>.
DVvak/3.0
V10
# Ссылки на макросы имеют вид $X. Макросы a-z используются системой,
# A-Z оставлены для пользователя.
# Следующие макросы определены внутри sendmail:
# a - дата сообщения в формате RFC 822
# b - текущая дата в формате RFC 822
# c - счетчик зацикливания (hop count)
# d - текущая дата в формате Unix
# f - адрес отправителя (from)
# g - адрес отправителя относительно получателя
# h - хост получателя
# i - идентификатор очереди
# j - полное имя данного хоста (hostname), обычно $j = $w.$m
# k - UUCP-шное имя данного хоста
# m - доменная часть имени данного хоста (hostname после первой точки)
# p - номер процесса sendmail
# r - используемый протокол
# s - хост отправителя
# t - численное представление текущего времени
# u - имя пользователя получателя
# v - номер версии sendmail
# w - короткое имя данного хоста (hostname до точки)
# x - полное имя отправителя
# y - имя управляющего терминала данного процесса (basename)
# z - домашний каталог получателя
# Не все из них могут быть определены, для проверки
# используется условное выражение вида "$?X текст1 $| текст2 $.".
# Приглашение для SMTP.
De$j $v$?V/$V$. Sendmail is ready at $b
# "Официальное" имя домена для данной машины.
# Определяется автоматически.
#Dj$w - начиная с версии sendmail 8.6 это делается автоматически
# Формат строки "From_".
DlFrom $g $d
# Имя почтового демона для возврата ошибок маршрутизации.
DnMAILER-DAEMON
# Список "операторов" в адресах.
Do.:%@!^=/[]?()
# Формат адреса отправителя.
Dq$g$?x ($x)$.
###############
# Классы имен #
###############
# Имеют вид:
# CXимя1 имя2...
# FXфайл
# В этом файле находится список всех доменных имен данной машины.
Fw/etc/mail/myhostnames
# Список доменных имен клиентских машин.
# Для них будет разрешена пересылка (relaying).
FC/etc/mail/myclients
# Класс разделителей, запрещенных в имени домена.
CB! % @ : ^
# Суффикс для антивируса.
C{CHECKED}checked
#########################
# Составление заголовка #
#########################
# Заголовки (в соответствии с RFC 822) должны идти
# в следующем порядке: "Return-Path", "Received",
# "Date", "From", "Subject", "Sender", "To", "Cc".
#
# Формат поля Received:
# ["from" domain] ; кто передал
# ["by" domain] ; кто принял
# ["via" atom] ; среда передачи
# *("with" atom) ; протокол связи
# ["id" msg-id] ; receiver msg id
# ["for" addr-spec] ; initial form
# ";" date-time ; time received
#
# Некоторые поля заголовка имеет смысл добавлять только для
# определенных мэйлеров, управляя соответствующими флагами мэйлера,
# пример: P - добавить поле Return-Path, H?P?Return-Path: <$g>
# Поля "Date", "From", "Message-Id" добавляем принудительно, если их нет.
HReceived: $?sfrom $s $.$?_($?s$|from $.$_) $.
by $j ($v$?V/$V$.)$?r with $r$. id $i$?u
for $u$.; $b$?g
(envelope-from $g)$.
HDate: $a
HFrom: $q
HMessage-Id: <$t.$i@$j>
################################
# "Благонадежные" пользователи #
################################
# Следующим господам мы верим и разрешаем
# подменять адрес From: посредством флага -f.
Troot daemon uucp
###########################
# Определение старшинства #
###########################
# Письма со следующими значениями поля Precedence:
# будут доставляться тем быстрее, чем больше соответствующее
# значение станшинства. Если старшинство меньше 0,
# сообщений об ошибках не будет.
# По умолчанию письма имеют старшинство 0.
#Pbulk=-60
#Pfirst-class=0
#Pjunk=-100
#Pspecial-delivery=100
####################
# Установка флагов #
####################
#O CheckAliases=False
O OperatorChars=.:%@!^=/[]?()
# Флаг 'r' - время ожидания ввода при работе по SMTP.
# Дело в том, что при работе по SMTP в глобальной сети
# бывают довольно большие задержки.
# Обычно - два часа, хотя это и противоречит
# традиционным протоколам.
# По умолчанию не ограничено.
Or2h
# Флаг 'T' - время ожидания доставки, обычно три дня.
# После этого письмо возвращается назад.
OT3d
# Флаг 'Y' - нужно ли ветвиться (fork) перед обработкой
# очередного письма из очереди. При этом можно сэкономить
# на оперативной памяти, т.к. родительский процесс не будет
# расти по мере обработки очереди. Зато теряется возможность
# отслеживать недостижимые хосты.
# По умолчанию выключено (не ветвиться).
#OY
# Флаги 'y', 'z' и 'Z' - управление приоритетом сообщений.
# Приоритет вычисляется по формуле:
# приоритет = объем - (класс * z) + (тираж * y) + (попытка * Z)
# Здесь 'объем' - размер сообжения в байтах,
# 'класс' - класс сообщения (см. команды 'P'),
# 'тираж' - количество адресатов- получателей сообщения,
# 'попытка' - номер попытки установления связи (0, 1...).
# Чем ниже приоритет, тем быстрее будет доставлено сообщение.
# По умолчанию y=1000, z=1800, Z=9000.
#Oy1000
#Oz1800
#OZ9000
# Флаги 'x', 'q' и 'X' - ограничение загрузки процессора.
# Сообщение не обрабатывается, а остается в очереди,
# в случае, если загрузка процессора превышает x и
# выполняется следующее условие:
# q
# приоритет > ----------------
# загрузка - x + 1
# Если загрузка процессора превышает X, sendmail
# перестает обрабатывать входящие SMTP-соединения.
# По умолчанию x=8, q=10000, X=12.
#Ox8
#Oq10000
#OX12
# Флаг 'd' - режим обработки сообщения.
# Варианты: interactive - синхронная доставка (по умолчанию),
# background - асинхронная доставка (фоновым процессом),
# queue - отложенная доставка (занесение в очередь).
Odbackground
# Флаг 'L' - уровень диагностики, по умолчанию 9.
#OL9
# Флаги 'u' и 'g' - идентификаторы пользователя и группы,
# от имени которых происходит запуск мэйлеров.
# По умолчанию u=1, g=1.
#Ou1
#Og1
# Флаг 'D' - перестраивать базу данных aliases.{pag,dir}
# автоматически по мере обновления файла aliases.
# По умолчанию выключено.
#OD
# Флаг 'A' - имя базы данных синонимов.
# По умолчанию - ./aliases.
OA/etc/mail/aliases
# Флаг 'Q' - имя каталога очереди сообщений.
# По умолчанию - ./mqueue.
OQ/var/spool/mqueue
# Флаг 'H' - имя help-файла для SMTP.
# По умолчанию - ./sendmail.hf.
OH/usr/share/misc/sendmail.hf
# Флаг 'S' - имя файла для записи статистики.
# По умолчанию - ./sendmail.st.
OS/var/log/sendmail.st
# Флаг 'B' - символ для заполнения пустых полей в адресах.
# Все незащищенные пробелы в адресах заменяются этим символом.
# По умолчанию - пробел.
#OB.
# Флаг 'F' - режим доступа для создаваемых файлов.
# По умолчанию - 0644.
OF0600
# Флаг 'a' - время ожидания готовности базы aliases.{pag,dir}
# в минутах (поиск записи @:@).
# По умолчанию - не проверять готовность базы.
# Обычно ставят 5 минут.
Oa5
# Флаг 'o' - обрабатывать заголовки в "старом" формате,
# т.е. адреса разделяются пробелами. В исходящих заголовках
# адреса всегда разделяются запятыми.
# По умолчанию выключено.
Oo
# Флаг 's' - "супернадежность", сохранять письмо в очереди
# даже в случае немедленной (синхронной) доставки.
# По умолчанию выключено.
Os
# Флаг 'I' - всегда опрашивать name-сервер (BIND), не доверять файлу /etc/hosts.
# Необходимо, если /etc/hosts заведомо неполон или требуется обрабатывать
# MX-записи. Если выключить, то сначала будет опрашиваться name-сервер,
# а при отлупе будем жить по /etc/hosts.
# По умолчанию выключено.
#OI
# Флаг 'c' - если мэйлер помечен как медленный (expensive),
# не вызывать его немедленно, а отложить задание в очередь.
# По умолчанию выключено.
Oc
# Флаг 'e' - режим обработки ошибок. Возможные варианты:
# print - печать сообщений об ошибках (по умолчанию),
# quiet - никаких сообщений, только код ответа,
# mail - вернуть письмо с сообщением,
# write - печать сообщения на терминал пользователя или письмом,
# если пользователя нет в данный момент,
# exit - вернуть письмо с сообщением и нулевой код ответа.
#Oeprint
# Флаг 'f' - сохранять строки "From_". По умолчанию выключено.
Of
# Флаг 'i' - игнорировать строки, содержащие только точку.
# По умолчанию выключено.
#Oi
# Флаг 'm' - "себе тоже". Слать письма автору сообщения,
# если его адрес присутствует в списках рассылки.
# По умолчанию выключено.
Om
# Флаг 'v' - режим трассировки. По умолчанию выключен.
#Ov
# Флаг 'K' - загрузка дополнительной базы данных.
# Формат: KXfile. База данных file открывается под именем X.
# База aliases всегда открыта с именем @.
# Загружаем базу маршрутизации под именем R.
# Для IDA sendmail:
#OKR/etc/mail/routes
# Для sendmail 8.5:
#KR hash /etc/mail/routes
# Встроенная база для удаления кавычек.
Kdequote dequote
###########
# Мэйлеры #
###########
# Синтаксис определения мэйлера:
# Mимя, Path=путь, Argv=аргументы, Eol=конец-строки, Maxsize=макс-размер,
# Flags=флаги, Sender=правило-отпр, Recipient=правило-получ,
# Linelimit=макс-длина-строки
# Path задает полный путь команды, например, /bin/mail,
# или один из частных случаев:
# [IPC] или [TCP] - SMTP сеанс с удаленным мэйлером,
# [LPC] (local person communication) - SMTP на стандартный ввод/вывод,
# для отладки. Не для чайников. :-)
# Предопределенные флаги:
# a - использовать Extended SMTP протокол
# A - пропускать через aliases, только для локальных мэйлеров
# b - добавлять пустую строку в конце сообщения, для тупых мэйлеров
# c - убирать комментарии из адресов
# C - если в адресах получателей нет '@', приписывать им домен отправителя
# d - убирать скобки <> вокруг адресов
# D - требуется поле Date:
# E - преобразовывать строки From_ в >From
# e - "медленный" мэйлер, вызывать только при обработке очереди (асинхронно)
# f - нужно добавлять флаг "-f from", если от root
# F - требуется поле From:
# g - слать сообщения об ошибках от имени MAILER-DAEMON (макро $n)
# h - не преобразовывать домен в маленькие буквы
# i - преобразовывать адрес отправителя на конверте через User Database
# I - этот мэйлер - SMTP соединение с другим sendmail
# j - преобразовывать адрес получателя на конверте через User Database
# k - отменить проверку loopback connection (не рекомендуется)
# K - не реализовано, зарезервировано
# l - локальный мэйлер (доставка конечному адресату)
# L - ограничивать длину строки в соответствии с RFC821 (не рекомендуется)
# m - возможна посылка нескольким адресатам за один вызов
# M - добавлять поле Message-Id:
# n - не нужно добавлять строку "From_" в начало сообщения
# o - выполнять от имени владельца ящика получателя
# p - указывать обратный путь в MAIL FROM:
# P - требуется поле Return-Path:
# q - отвечать 250 (local address), а не 252, при верификации адреса (SMTP VRFY)
# r - то же, что и -f, но -r
# R - открывать SMTP-соединения от secure TCP ports (не имеет большого смысла)
# s - удалять кавычки " из адресов
# S - можно запускать мэйлер от root
# u - не преобразовывать в имени пользователя большие буквы в маленькие
# U - выдавать строку "From_" с добавкой "remote from <host>" в конце
# w - юзер должен иметь учетную запись на локальной машине
# x - требуется поле Full-Name:
# X - к каждой строке, начинающейся с точки, приписывать еще одну точку
# z - для локального мэйлера использовать протокол LMTP
# Z - применять DialDelay
# 0 - не следовать MX-записям (для SMTP)
# 1 - убирать символы \0
# 2 - запретить ESMTP
# 3 - преобразовывать не-ABCDIC символы в =XX
# 5 - если aliases не найдены, применить правило 5 (альтернативная доставка)
# 6 - обрезать заголовок до 7-ми бит
# 7 - обрезать все сообщение до 7-ми бит
# 8 - можно слать 8-битные данные (отменяет преобразование 8->7 mime)
# 9 - выполнять преобразование 7->8 mime (только для text/plain)
# : - если в адресах есть :include:, преобразовать к мэйлеру *include*
# | - если адрес начинается с |, преобразовать к мэйлеру prog
# / - если адрес начинается с /, преобразовать к мэйлеру *file*
# @ - искать адрес в базе пользователей User Database
# % - запрет непосредственной доставки до спец. вызова -qI/-qR/-qS
# Локальная доставка пользователям на данной машине.
Mlocal, Path=/usr/libexec/mail.local, Argv=mail -r $g $u,
Flags=lsmn89AwS, Sender=11/10, Recipient=12
# Выполнение программ на локальной машине (для фильтров).
Mprog, Path=/bin/sh, Argv=sh -c $u,
Flags=lse89, Sender=11/10, Recipient=12
Mrun, Path=/bin/sh, Argv=sh -c $u,
Flags=lse89, Sender=11/10, Recipient=12
# Доставка по SMTP.
Mtcp, Path=[IPC], Argv=TCP $h, Eol=\r\n,
Flags=umeXC89, Linelimit=990, Sender=10, Recipient=12
# Для ClamAV: -c/var/virus/clamd.sock
# Касперский: -a/var/run/aveserver
Mscreener, Path=/usr/local/sbin/mailscreener,
Argv=mailscreener -c/var/virus/clamd.sock -a/var/run/aveserver -fantivirus-notify -rantivirus-notify $u $f $_,
Flags=DFMSPAnu89e, Sender=11/10, Recipient=12,
Type=DNS/RFC822/X-Unix
#
# Фильтры
#
Xregex, S=local:/var/run/regex.sock, F=T, T=S:4m;R:4m
O InputMailFilters=regex
O PrivacyOptions=goaway
#O DaemonPortOptions= Port=smtp, Name=MTA
#O DaemonPortOptions= Port=smtps, Name=TLSMTA, M=s
##########################
# Правила преобразования #
##########################
# Имеется пять основных (зарезервированных) правил:
# 1 - обработка адреса отправителя,
# 2 - обработка адреса получателя,
# 3 - предварительная обработка,
# 4 - заключительная обработка,
# 0 - маршрутизация.
# Адрес локального отправителя (пользователя) обрабатывается
# по схеме 3 -> 1 -> 4.
# Адрес удаленного отправителя обрабатывается по схеме 3 -> 1 -> X -> 4,
# где X - номер правила, указанный в поле Sender соответствующего мэйлера.
# Адрес получателя обрабатывается по схеме 3 -> 2 -> Y -> 4,
# где Y - номер правила, указанный в поле Recipient соответствующего мэйлера.
# Выбор мэйлера происходит по схеме 3 -> 0.
# Если определен флаг '/', то при обработке адресов заголовков
# (в отличие от конвертов) будут вместо правил 1 и 2 применяться
# правила 5 и 6 соответственно.
# Команда S# задает номер набора правил, в диапазоне 0..29.
# Команда R определяет очередное правило:
# Rлевая-часть правая-часть комментарий
# Левая и правая части разделяются табуляциями.
# В левой части допустимы следующие символы:
# $* - ноль и более термов
# $+ - один и более терм
# $- - ровно один терм
# $=x - непустая последовательность термов из класса X
# $~x - непустая последовательность термов, не принадлежащих классу X
# $%D - непустая последовательность термов-ключей из DBM-файла D
# $^D - непустая последовательность термов, не входящих в DBM-файл D
# Метасимволы правой части:
# $1 $2 $2 и т.д. - строки, соответствующие метасимволам левой части
# $&X - текущее содержимое макро X
# $[ имя $: умолч $] - канонизация имени (запрос к name-серверу, BIND)
# $(D ключ $@ арг $: умолч $) - поиск в DBM-файле
# $>7 - запуск набора правил
# $#мэйлер - выбор мэйлера, только для набора 0
# $@хост - выбор хоста, только для набора 0
# $:адрес - выбор адреса, только для набора 0
# В начале правой части метасимвол $@ означает возврат из текущего
# набора правил (аналог return), метасимвол $: означает
# переход к следующему правилу (аналог break).
# Правила 1, 2, 5, 6 - пустые, чтобы не было проблем с sendmail версии 5.
#------------------------------
# Правилo 3: канонизация адреса
#------------------------------
S3
# Обрабатываем пустой адрес как вырожденный случай.
R$*<>$* $@@ некий спецсимвол
# Вытаскиваем адрес из угловых скобок. Дважды и даже трижды. Зачем это все?
R$*<$*<$*<$+>$*>$*>$* $4 тройной уровень <<<>>>
R$*<$*<$+>$*>$* $3 двойной уровень <<>>
R$*<$+>$* $2 нормальный адрес RFC821/822
# Все ^ заменяем на !.
R$*^$* $1!$2 давно устарело
# RFC 1123 не рекомендует выполнять маршрутизацию вида <@a,@b,@c:user@d>.
# Перепишем как @a,@b,@c:user<@d>. В правиле 0 отбросим все, что
# до двоеточия. Но оно может пригодиться для "From_".
R$*@$*@$* $1^$2@$3 заменим левые @ на ^
# Обычный адрес в стиле internet.
R$+@$+ $:$1<@$2> домен заключаем в <скобки>
R$*^$* $1@$2 обратно ^ => @
R$+<$+@$+> $1$2<@$3> a<b@c> => ab<@c>
# Приведение синонимов к полным именам. Обращение к BIND.
R$*<@$-> $:$1<@$[$2$:$2$]> ищем записи типа CNAME
# Канонический вид готов.
R$+<@$+> $@$1<@$2> получилось ab<@c>
# UUCP-переадресация через себя
R$=w!$* $2 myname!addr => addr
# UUCP-адрес в доменной адресации, преобразуем в internet.
R$*.$~B!$* $@$3<@$1.$2> ab.c!de => de<@ab.c>
# Адрес вида user%host, приведем к виду a%b%c@d.
R$*%$* $1@$2 все @ заменим на %
R$*@$*@$* $1%$2@$3 последний % на @
R$*@$* $@$1<@$2> поставим скобки
# Просто user. Дописываем свой домен.
R$* $@$1<@$j> добавляем свой домен
#-------------------------------------------
# Правилo 4: преобразование во внешнюю форму
#-------------------------------------------
S4
R@ $@ пустой <> адрес
# Преобразование адреса вида 1.2.3.4 в имя домена. Обращение к BIND.
R$*<@[$+]> $:$1<@$[[$2]$]> приведение численного адреса
# Еще одно обращение к BIND. Приведение синонимов к полным именам.
# В принципе, можно этого не делать, если relay сделает это за нас,
# но при этом письмо может пойти по весьма странному пути.
R$*<@$-> $:$1<@$[$2$:$2$]> ищем записи типа CNAME
# Убираем угловые скобки.
R$*<$+> $1$2 приводим в человеческий вид
# Удаляем повторяющиеся домены.
R$+%$=w@$=w $1@$j u%host@host => u@host
#-----------------------------------
# Правилo 8: повторная маршрутизация
#-----------------------------------
#
S8
R$* $:$>3$1 канонизация
R$* $:$>0$1 маршрутизация
#-------------------------
# Правилo 0: маршрутизация
#-------------------------
S0
# RFC 1123 не рекомендует выполнять маршрутизацию вида @a,@b,@c:user<@d>.
# Шлем сразу на user@d.
R@$+:$+ $2 так гораздо проще
R$*<@[$+]> $#error$:$2
# Антивирус.
R$*<@$+.$~{CHECKED}> $#screener$@$2.$3.checked$:$1@$2.$3.checked
R$*<@$*.checked> $1<@$2> убираем .checked
# Маршрутизация через нас.
R$*<@$=w> $:$1<@$j> "свой" домен - к стандарту
# Локальная доставка.
R$*!$*<@$j> $#error$:550 Relaying Denied
R$*%$*<@$j> $#error$:550 Relaying Denied
R$*<@$j> $#local$:$1
R$*<@> $#local$:$1
R@ $#local$:MAILER-DAEMON
# Поехали по SMTP.
R$*<@$*> $#tcp$@$2$:$1@$2
R$+ $#error$:Invalid address: $1
#-------------------
# Правилo 10: пустое
#-------------------
S10
#------------------------------------
# Правилo 11: отправитель на конверте
#------------------------------------
# Перевод адресов From_ в банговую нотацию
# для отслеживания маршрута статистикой.
S11
# Из множеств "имен собственных" выбираем стандартное.
R$*<@$=w> $:$1<@$j> "свой" домен - к стандарту
# Маршрут вида @a,@b,@c:user<@d>.
R$*@$*,@$*:$*<$*> $1$2!@$3:$4<$5> @a,@b:u<@h> -> a!@b:u<@h>
R$*@$*:$*<$*> $1$2:$3<$4> a!@b:u<@h> -> a!b!u<@h>
# Теперь разберем обычную форму
R$*@$*<@$*> $1%$2<@$3> лишние @ на %
R$*:$*<@$*> $1!$3!$2 убрали все @ и :
R$*<@$*> $2!$1 убрали все @
# Ставим маркер ^ и передвигаем его на имя пользователя.
R$* $:^$1^ поставили ^
R$*^$*!$* $1$2!^$3 двигаем вправо
# Маршрут вида u%a%b%c.
R$*^$*%$*^$* $1^$3^!$2$4 a%b%c -> c!b!a
R$*^$* $1$2 убираем ^
# Убираем свое имя из пути.
R$=w!$* $2 убираем свое имя
Rlocalhost!$* $1 отрезаем localhost
# Добавляем свое имя.
R$* $:$j!$1
#-----------------------------------
# Правилo 12: получатель на конверте
#-----------------------------------
S12
# RFC 1123 не рекомендует выполнять маршрутизацию вида @a,@b,@c:user<@d>.
# Шлем сразу на user@d.
R@$+:$+ $2 жить стало веселей
#-------------------------------------------------------
# Разрешение использовать символ $|
#-------------------------------------------------------
SStart
R$* $$| $* $: $1 $| $2 fake for -bt mode, remove for real version
#-------------------------------------------------------
# Проверка получателя - запрещаем открытую пересылку (open relay)
#-------------------------------------------------------
Scheck_rcpt
R< $+ @ $* $=w > $@ OK к локальным юзерам - можно
R< $+ @ $* $=C > $@ OK
R$* $: $(dequote "" $&{client_name} $)
R$*$=w $@ OK от локальных юзеров - можно
R$*$=C $@ OK
R$@ $@ OK
R$* $#error$:550 Relaying Denied for $1
#---Конец конфигурации---