Настройка программы sendmail
Настройка программы sendmail происходит при помощи файла /etc/sendmail/conf.
Этот файл можно разбить на несколько частей:
- Описание особенностей данной машины (local information)
--в данной секции описываются такие параметры, как имя данной машины,
имя UUCP и т.п.
- Описание макроопределений sendmail, отвечающих за работу
в локальной сети, например, имя домена и «официальное имя» машины.
- Описание классов, т.е. групп имен, которые используются
программой для рассылки почты. Например, для рассылки в другие почтовые
службы.
- Номер версии файла конфигурации. Данная переменная
должна изменяться каждый раз, как только в файл конфигурации вносятся
какие-либо изменения.
- Внутренние макроопределения sendmail. В данном разделе
присваиваются значения переменным, которые sendmail использует при взаимодействии
с другими транспортными агентами.
- Опции команды sendmail. Опции определяют режимы работы
программы. Опции можно задавать в виде параметров командной строки,
а можно в виде описаний в файле настройки.
- Определение порядка сообщений программы sendmail (Precedence).
Обычно эта секция не модифицируется администратором.
- Доверенные пользователи. В данной секции описываются
пользователи, которым разрешено переписывать адреса отправителей, т.е.
выступать не под тем адресом, который за ними закреплен.
- Описание формата заголовка почтового сообщения. В данной
секции определяются поля и их формат, которые отображаются в заголовке.
Многие поля заголовка sendmail генерирует на основе информации из конверта
почтового сообщения.
- Правила преобразования адресов. Это самая большая часть
файла конфигурации программы sendmail. Преобразование адресов необходимо
для принятия программой решений о пути рассылки почтовых сообщений,
т.к. это решение принимается на основе полученного в результате преобразований
почтового адреса.
- Описание программ рассылки. В данной секции описываются
имена программ рассылки, пути и параметры командной строки этих программ.
Обычно это программа местной рассылки, рассылка по UUCP, рассылка по
SMTP, рассылка на выполнение.
- Общий набор правил преобразования адресов, который
не меняется от машины к машине и от конфигурации к конфигурации (Rule
Set 0).
- Машинно-зависимая часть общего правила преобразования
адресов. В данной секции содержание определяется способом рассылки почты.
Например, данная секция при рассылке по SMTP будет отличаться от случая
рассылки по UUCP.
В большинстве случаев все изменения, которые приходится внести в файл
конфигурации, касаются только имени машины, домена и машин шлюзов в другие
почтовые службы. Однако, если у организации имеется достаточно продолжительная
и славная история использования электронной почты, тo может оказаться,
что для нормального функционирования придется произвести и ряд более существенных
изменений.
В целом все описанные выше секции решают три основных задачи:
- определение окружения sendmail;
- анализ и преобразование адресов электронной почты;
- рассылка сообщений при помощи программ рассылки.
При редактировании файла следует учитывать некоторые правила, которые
используются при написании файла конфигурации: вся информация локального
характера сосредоточена в начале файла, команды одного типа собраны в
компактные группы, большую часть файла составляют правила преобразования
адресов, в конце файла описаны программы рассылки электронной почты.
Все команды, которые используются в файле настроек sendmail можно представить
в виде следующей таблицы.
|
|
|
|
|
|
|
|
Установить значение класса "c"
|
|
|
Загрузить значение класса из файла
|
|
|
Установить значение опции "о"
|
|
|
Определить доверенных пользователей
|
|
|
Для номера ошибки number установить имя name
|
|
|
Определить программу рассылки почты
|
|
|
Определить формат поля заголовка
|
|
|
Дачать определение набора правил преобразования
адресов
|
|
|
Определить правило преобразования адреса
|
Теперь разберем более подробно некоторые команды и секции файла настроек
sendmail. Лучше всего это сделать на основе реального файла. Начнем с
секции описания локальных параметров:
##################
# local info
##################
Cwlocalhost
СР.
# UUCP relay host
DYucbvax.Berkeley.EDU
CPUUCP
# BITNET relay host
# DBmailhost.Berkeley.EDU
DBrelay.kiae.su
CPBITNET
#"Smart" relay host (may be null)
DSrelay.kiae.su
# who I send unqualified names to (null means
deliver locally)
DR
# who gets all local email traffic ($R has
precedence for unqualified names)
DH
# who I masquerade as (null for no masquerading)
DM
# class L: names that should be delivered locally,
even if we have a relay
# class E: names that should be exposed as from
this host, even if we masquerade
#CLroot
CEroot
ft operators that cannot be in local usernames
(i.e., network indicators)
CO @ % !
# a class with just dot (for identifying canonical
names)
C..
# dequoting map Kdequote dequote
Как видно из этого листинга, в данной секции описаны имя данной машины
(Cwlocalhost), а также класс машин-шлюзов в другие почтовые системы (СР....).
При этом наращивание класса происходит по мере описания шлюза для каждого
из видов почтовых служб. В конце секции описаны символы, которые не могут
использоваться в качестве имен пользователей или доменов.
Следующая секция -- определение макросов send- mail:
##############
# Special macros #
##############
# SMTP initial login message De$j Sendmail $v/$Z ready at $b
# UNIX initial From header format DIFrom $g $d
# my name for error messages DnMAILER-DAEMON
# delimiter (operator) characters
Do.:%§!^/[]
# format of a total name
Dq$?x$x <$g>$|$g$.
# Configuration version number
DZ8.6.6
В данной секции описаны сообщения, которые выдает sendmail при взаимодействии
с другими транспортными агентами. Как видно из этого описания, определение
макроса это не только присваивание значения, но и выполнение определенных
действий. Наиболее интересное предложение из всех предложение, определяющее
значение макроса q:
q$?x$x <$g>$|$g$.
Здесь описана условная подстановка значения. Все предложение можно описать
следующей фразой: «Если значение переменной х установлено,
то: q = значение_х <значение_g>, иначе: q=значение_g».
То же самое можно записать и по-другому:
if(x!=NULL)
{
strcpy(q.x);
strcat(q," <");
strcat(q.g);
strcat(q,">");
{
else
{
strcpy(q.g);
}
To есть, $? соответствует оператору if,
$| -- else, a $. -- конец условного
оператора.
Следующая секция - - это определение опций:
#####################
# Options
#####################
# strip message body to
7 bits on input?
#07False
# Insist that the BIND name server be running to resolve names 01
# deliver MIME-encapsulated
error messages?
OjTrue
B данном случае приведен только фрагмент этой секции. Большинство параметров
общие для всех установок sendmail. Указанные же в листинге параметры являются
принципиальными с точки зрения режимов работы sendmail. Первый параметр
определяет тот факт, что по почте можно пересылать семибитовую информацию.
Согласно RFC-822 информация должна быть семибитовая, но для передачи кириллицы
это значит использовать кодирование, что абсолютно не приемлемо. Поэтому
данный параметр должен быть закоментарен. В системах, где используется
сервер доменных имен, опция I (OI) должна быть установлена, чтобы не было
ошибок при идентификации доменов. Последний параметр не является принципиальным,
но для целей более понятного представления его следует установить. Если
почтовый клиент не поддерживает MIME, то данный параметр следует закоментарить.
Следующие две секции определяют уровень сообщений об ошибках и доверенных
пользователей:
#####################
# Message precedence
#####################
Pfirst-class=0
Pspecial-delivery=100
Plist=-30
Pbulk=-60
Pjunk=-100
#####################
# Trusted users
#####################
Тroot
Tdaemon
Tuucp
а этими двумя секциями следует секция описания полей заголовка почтового
сообщения, который генерируется программой sendmail:
#########################
# Format of headers
#########################
H?P?Return-Path: $g
HReceived: $?sfrom $s
$.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$.
id $i$?u for
$u$. ; $b
H?D?Resent-Date: $a
H?D?Date: $a
H?F?Resent-From: $q
H?F?From: $q
H?x?Full-Name: $x
HSubject:
# HPosted-Date: $a
# H?l?Received-Date:
$b H?M?Resent-Message-Id:
<$t.$i@$j>
H?M?Message-Id: <$t.$i@$j>
Формат команд данной секции определяет какие поля включаются в заголовок,
а какие не включаются. Данная секция тесно связана с секцией определения
программ рассылки почты. Если после Н нет
знака вопроса, то поле включается в заголовок сообщения для любой программы
рассылки, если после Н символ «?»
присутствует, то в строке аргументов программы рассылки данный флаг должен
быть определен для того, чтобы данное поле было включено в заголовок.
Как следует из приведенного выше описания, всегда включаются только поля
Received и Subject.
Все перечисленные поля не являются обязательными полями заголовка.
Следующая секция -- правила преобразования адресов. Но прежде чем обсуждать
ее содержание следует сказать как и когда sendmail эти адреса преобразовывает.
При получении почтового сообщения адреса, указанные в полях То,
From, Cc преобразуются в соответствии с правилами преобразования.
#####################################
#####
##### REWRITING RULES
#####
#####################################
### Rulset 3 - Name Canonicalization
#####################################
S3
# handle null input (translate to <@> special case)
R$@ $@ <a>
# basic textual canonicalization -- note RFC733
heuristic here
R$*<$*>$*<$*>$* $2$3<$4>$5 strip multiple <> <>
R$*<$*<$+>$*>$* <$3>$5 2-level о nesting
R$*<>$* $@ «a> MAIL FROM:<> case
R$*<$+>$* $2 basic RFC821/822 parsing
# handle list:; syntax as special case
R$*:;$* $@ $1 :; «g»
# make sure <@a,@b,@c: user@d> syntax is easy to
parse -- undone later
R@ $+ , $+ @ $1 : $2 change all "," to ":"
# localize and dispose of route-based addresses
R@ $+ : $+ $@ $>96 < @$1 > : $2 handle
<route-addr>
# find focus for list syntax
R $+ : $* @ $+ $@ $>96 $1 : $2 < @ $3 >
list syntax
R $+:$*; $@ $1 : $2; list syntax
# find focus for @ syntax addresses
R$+ @ $+ $: $1 < @ $2 > focus on domain
R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze
right
R$+ < @ $+ > $@ $>96 $1 < @ $2 > already
canonical
# do some sanity checking
R$* < @ $* : $* > $* $1 < @ $2 $3 > $4 nix
colons in addrs
» convert old-style addresses to a domain-based
address
R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp
names
R$+ .$-!$+ $@ $>96 $3 < @ $1 . $2 >
domain uucps
R$+ ! $+ $@ $>96 $2 < @ $*1 .UUCP > uucp subdo-
mains
# if we have X signs, take the rightmost one R$* X $* $1 @ $2 First make
them all @s. R$* @ .$* @ $* $1 X $2 @ $3 Undo all but the last.
R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish
# else we must be a local name
##########################################
### Ruleset 96 - bottom half of ruleset 3
##########################################
# At this point, everything should be in a "local_part<@domain>extra"
format.
S96
# handle special cases for local names
R$* < @ localhost > $* $: $1 < @ $j . > $2
no domain at all
R$* < @ localhost . $m > $* $: $1 < @ $j . >
$2 local domain
R$* < @ localhost . UUCP > $* $: $1 < @ $j . >
$2 .UUCP domain
R$* < @ [$+]>$* $: $1 < @@ [ $2 ] > $3
mark [a.b.c.d]
R$* < @@ $=w > $* $: $1 < @ $j . > $3
self-literal
R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP
addr
# pass UUCP addresses straight through
R$* < @ $+ . UUCP > $* $@ $1 < <s> $2 . UUCP . > $3
# pass to name server to make hostname canonical R$* < @ $* $-p >
$* $: $1 < @ $[ $2 $3 $] > $4
# local host aliases and pseudo-domains are always
canonical
R$* < @ $=w > $* $: $1 < @ $2 . > $3
R$* < @ $* $=p > $* $: $1 < @ $2 $3 . > $4
R$* < @ $*..>$* $1 < @ $2 . > $3
tf if this is the local hostname, make sure we
treat is as canonical
R$* < @ $j > $* $: $1 < § $j . > $2
#############################################
### Ruleset 4 Final Output Post-rewriting ###
#############################################
S4
R$*<@> $@ $1 handle <> and list:;
# strip trailing dot off possibly canonical name R$* < @ $+ . >
$* $1 < @ $2 > $3
# externalize local domain info
R$* <$+>$* $1 $2 $3 defocus R@ $+ : § $+ : $+ @ $1 , @ $2 : $3 <route-addr>
canonical R§ $* $@ @ $1 ...and exit
# UUCP must always be presented in old form R$+ @ $- . UUCP $2!$1 u@h.UUCP
=> h!u
# delete duplicate local names
R$+ % $=w @ $=w $1 @ $j u%host@host =>
u@host
#######################################################
### Ruleset 97 - recanonicalize and call ruleset
### zero (used for recursive calls)
#######################################################
S97
R$* $: $>3 $1
R$* $@ $>0 $1
############################
### Ruleset 0 Parse Address
############################
SO
R<@> $#local $: <> special case error msgs R$* : $* ; $#error
$@ USAGE $: "list:; syntax illegal for recipient addresses"
USAGE $: "user address
USAGE $: "colon illegal
[ $2 ] >
$1 <
$>97 $2 @here:... -> $@ $>97 $1 $2 $3
R<@ $+> $#error $@
required"
R<$* : $* > $«error
in host name part"
# handle numeric address spec
R$* < @ [$+]>$* $: $>98 $1
$3 -numeric internet spec
R$* < @ [$+]>$* $#smtp $@ [$2] $:
[$2] > $3 still numeric: send
# now delete the local info -- note $=0 to find characters that cause
forwarding
R$* < @ > $* $@ $>97 $1 user@ => user R< @ $=w . > :
$* R$* $=0 $* < @ $=w .. .@here -> ...
# handle local hacks R$* $: $>98 $1
# short circuit local delivery so forwarded email works
R$+ < @ $=w . > $: $1 < @ $2 . @ $H > first
try hub
R$+ < $+ @ $+ > $#local $: $1 yep ....
R$+ < $+ @ > $#local $: @ $1 nope, local
address
# resolve remotely connected UUCP links (if any)
# resolve fake top level domains by forwarding to other hosts
R$*<@$+.BITNET.>$* $: $>95 < $8 > $1 <@$2.BITNET.>
$3 user@host.BITNET
# forward non-local UUCP traffic to our UUCP relay R$*<@$*.UUCP.>$*
$: $>95 < $Y > $1 <@$2.UUCP.> $3 uucp mail
# pass names that still have a host to a smarthost (if defined)
R$* <§$*>$* $: $>95 < $S > $1 < @ $2 > $3 glue on
smarthost name
# deal with other remote names
R$* < @$* > $* $#smtp $@ $2 $: $1 < e $2 > $3 user@host. domain
# if this is quoted, strip the quotes and try again
R$+ $: $(dequote $1 $) strip quotes R$+ $=0 $+ $@ $>97 $1 $2 $3 try
again
# handle locally delivered names
R$=L $#local $: @ $1 special local names R$+ $#local $: $1 regular local
names
##################################################
### Ruleset 5 special rewriting after aliases
### have been expanded (new sendmail only)
##################################################
S5
# see if we have a relay or a hub
R$+ $: < $R > $1 try relay
R< > $+ $: < $H > $1 try hub
R< > $+ $@ $1 nope, give up
R< $-:$+> $+ $: $>95 < $1 : $2 > $3 < @
$2 >
R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 >
#######################################################
### Ruleset 95 canonify mailer: host syntax to
### triple
####################################################### S95
R< > $* $@ $1 strip off null relay
R< $-:$+> $* $# $1 $@ $2 $: $3 try quali-
fied mailer
R< $=w > $* $@ $2 delete local host
R< $+ > $* $#relay $@ $1 $: $2 use unqualified
mailer
##########################################
### Ruleset 98 local part of ruleset zero
### (can be null)
###########################################
S98
За секцией преобразования адресов следует секция определения программ
рассылки почты. В ней определяется локальная профамма рассылки (mail),
профамма рассылки для выполнения (sh) и программа рассылки по SMTP.
##########################################
### Local and Program Mailer specification
##########################################
Mlocal, P=/usr/libexec/mail. local, F=lsDFMrmn, S=10, R=20/40,
A=mail -d $u Mprog, P=/bin/sh, F=lsDFMeu, S=10, R=20/40, D=$z:/,
A=sh -c $u S10
R<@> $n errors to mailer-daemon R$+ $: $>40 $1 S20
R$+ < § $* > $: $1 strip host part S40
################################
### SMTP Mailer specification
################################
Msmtp, P=[IPC], F=mDFMuX, 8=11/31, R=21, E=\r\n, L=990, A=IPC $h
Mesmtp, P=[IPC], F=mDFMuXa, 8=11/31, R=21, E=\r\n, L=990, A=IPC $h
Mrelay, P=[IPC], F=mDFMuXa, 8=11/31, R=61, E=\r\n, L=2040, A=IPC $h
Затем идут правила определения локального преобразования адресов для
конкретных программ рассылки, в частности набор правил S11.
### envelope sender and masquerading recipient
### rewriting
811
R$+ $: $>51 $1 sender/recipient common
R$* :; <@> $@ $1:; list:; special case
R$* $@ $>61 $1 qualify unqualed names
В секции программ рассылки мы в нашем примере не указали еще одну важную
возможность -- рассылку по протоколу UUCP:
Muucp, P=/usr/bin/uux, F=DFMhuU, 8=13, R=23,
M=100000,
A=uux -r -z -a$f -gC $h! rmail
Естественно, что правила преобразования адресов S13 и R23 должны быть
описаны в файле настроек send-mail. |