Сервер в кармане, или просто о сложном!

главная - Статьи - Почта - Sendmail

SENDMAIL: Копирование исходящей почты со всех компьютеров локальной сети, за исключением явно указанных компьютеров, копирование исходящей почты которых не должно производиться.

Теги: sendmail Защита почты Почтовый сервер

Задача: необходимо копировать всю исходящую почту со всех компьютеров локальной сети, за исключением явно указанных компьютеров, копирование исходящей почты которых не должно производиться (например, это компьютер директора).

Имеем: FreeBSD 6.0, sendmail 8.13.6

Решение:

Проверить версию sendmail можно так:
в командной строке вводим (как root):

# sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> $v
8.13.6
>

Версию FreeBSD проверить можно так (как root): # uname –a

Не думаю, что необходимы именно такие (или не ниже) версии, но на всякий случай.

Итак, собственно решение.

Первое.

Создаем файл

# ee /usr/share/sendmail/cf/mailer/copymail.m4

в который пишем:

PUSHDIVERT(-1)

ifdef(`COPYMAIL_MAILBOX',,
	`define(`COPYMAIL_MAILBOX', `postmaster')')dnl

ifdef(`NOCOPY_USERS',,
	`define(`NOCOPY_USERS', `-o /etc/mail/nocopy-users')')dnl

ifdef(`NOCOPY_CONFIG',,
	`errprint(`*** You must define NOCOPY_CONFIG for copymail mailer!!! ***')')dnl

POPDIVERT
#########################################
###   COPYMAIL Mailer specification   ###
#########################################

VERSIONID(`$Id: cpsendmail.html,v 1.2 2002/06/14 18:39:10 freeman Exp $')dnl

LOCAL_CONFIG
F{NOCOPY}NOCOPY_USERS

LOCAL_RULE_0
# Send all mail (except $={NOCOPY}) to copymail mailer
R$* < @ $+ . > $*			$: $1 < @ $2 . > $3 $| $1 @ $2
R$* < @ $+ . > $* $| $={NOCOPY}		$@ $1 <@ $2 . > $3
R$* < @ $+ . > $* $| $*			$: $1 <@ $2 . > $3 $| $&{client_addr}
R$* < @ $+ . > $* $| $={NOCOPY}		$@ $1 <@ $2 . > $3
R$* < @ $+ . > $* $| $*			$: $1 <@ $2 . > $3 $| $&f
R$* < @ $+ . > $* $| <$*>		$: $1 <@ $2 . > $3 $| $4
R$* < @ $+ . > $* $| $={NOCOPY}		$@ $1 <@ $2 . > $3
R$* < @ $+ . > $* $| $*			$#copymail $@ localhost $: $1 < @ $2 . > $3

# Send message to original recipient + additional mailbox: COPYMAIL_MAILBOX
Mcopymail, P=/usr/sbin/sendmail, F=fmSDFMu, S=0, R=0,
	A=sendmail -N never -C NOCOPY_CONFIG COPYMAIL_MAILBOX $u

2. Редактируем sendmail.copy.mc

Скопируйте ваш sendmail.mc (конфигурационный файл) как sendmail.copy.mc

# cp /etc/mail/sendmail.mc /etc/mail/sendmail.copy.mc

В конец нового файла sendmail.copy.mc добавте следующие строки:

define(`COPYMAIL_MAILBOX',`user@domen')
define(`NOCOPY_CONFIG',`/etc/mail/sendmail.cf')
MAILER(copymail)

В итоге мой файл sendmail.copy.mc (точнее, его конец) стал вот такого вида:

define(`COPYMAIL_MAILBOX',`user@localhost')
define(`NOCOPY_CONFIG',`/etc/mail/sendmail.cf')
MAILER(local)
MAILER(copymail)
MAILER(smtp)

где user@localhost – адрес локального пользователя, на который будут приходить копии отправленных писем.

3. Компилируем cf

Необходимо скомпилировать этот самый sendmail.copy.mc в sendmail.copy.cf

Для этого делаем следующее:

# m4 /usr/share/sendmail/cf/m4/cf.m4 /etc/mail/sendmail.copy.mc > /etc/mail/sendmail.copy.cf

(это если у вас FreeBSD. Подробнее о компиляции .cf файлов для sendmail смотри здесь: http://www.sendmail.org/m4/intro.html)

Теперь у вас появился файл sendmail.copy.cf по адресу:

/etc/mail/sendmail.copy.cf

4. Кому не копируем почту

Создаем собственно файл, в котором будут указаны те пользователи, почту которых копировать не надо. Будьте внимательны!

# touch /etc/mail/nocopy-users

Следует поместить почтовые адреса (в виде user@FQDN-domen ) или IP адреса (в форме X.X.X.X) в этот файл. Почтовые сообщения приходящие на почтовые адреса¹, перечисленные в /etc/mail/nocopy-users или отправлямые от почтового адреса² или с IP адреса, перечисленных в /etc/mail/nocopy-users, не будут копироваться.

5. Проверяем

Собственно, все готово для тестирования того, что мы сделали.

# killall sendmail
# /usr/sbin/sendmail -bd -C /etc/mail/sendmail.copy.cf
# /usr/sbin/sendmail -q30m -C /etc/mail/sendmail.cf

Такой запуск sendmail необходим для того, что бы письмо, находящееся в очереди не копировалось каждые N минут, при каждой попытке доставки. Первая копия (-bd) работает как SMTP daemon, принимая письма (и копируя их). Вторая копия (-q30) работает обработчиком (queueing) очереди, доставляя письма находящиеся в очереди (и не копируя их, так как перед тем как попасть в очередь письма уже были скопированы).

Можете проверять систему. С клиентской машины отправляете письмо (естественно, рассылка писем до наших экспериментов должна быть настроена), и проверяете, получил ли локальный пользователь user письмо. Проверить можно, например, так:

# less /var/mail/user

Удачи!

Данный вопрос также рассмотрен в статье по адресу: http://www.vnc.org.ua/copymail/cpsendmail.html

Вышеизложенный материал не претендует на полноту, четкость, ясность или достоверность изложения и предоставляется автором "КАК ЕСТЬ". Автор не несет никакой отвественности за любое использование данного материала. Любое использование, копирование, цитирование, полностью или частично должно включать данный текст, ссылку на данный ресурс, а так же следующию строку без изменений: 2001-2002, O. Koreshkov .

Авторизуйтесь для добавления комментариев!


    забыли пароль?    новый пользователь?