Быстрое решение задачи копирования исходящей почты sendmail linux

Прислал B0BKA
2006.08.09

Не мое, но мне пригодилось, проверил, работает.

Итак есть необходимость читать исходящую почту проходящую через smtp сервер выстроенный на sendmail linux от конкретных пользователей.

сначала читаем /usr/share/doc/sendmail/README.libmilter

На этом этапе можно заканчивать. т.к. тот кто сможет прочитать и осмыслить пример внизу этого README- может смело внедрять его в жизнь. и радоваться результатам. Кому читать и понимать лень, делают следующее:

1) Идут сюда:
http://freeunix.unicor.ru/content.php?page=%CF%EE%F7%F2%E0&a mp;id=344
или сюда ftp://10.54.56.15/pub/setup/Linux/sendmail/cpmail/
 
в #define copy_to_addr указаваем адрес на который отсылать копию (если
таких адресов два или более пишем их через точку с запятой
(addr1@domain.ru;addr2@domain.ru)

2) Немножно исправим строку компиляции чтобы получилось в нужном месте и с нужными библиотеками компиляции (т.к. судя по ошибкам libmilter.a- во FreeBSD, для которой написана статья, эта библиотека несколько другая)
gcc -Wall -o /usr/bin/cpmail cpmail.c /usr/lib/libmilter.a /usr/lib/libsmutil.a -pthread

3) Для того что бы это дело заработало необходимо в sendmail.mc внести следующие
изменения и пересобрать sendmail.cf:
  
INPUT_MAIL_FILTER(`copy_mail_filter', `S=inet:999@localhost')
define(`confINPUT_MAIL_FILTERS', `copy_mail_filter')

4)Как видно из текста прог-мы, записи в sm_copy_users должны стоять каждый адрес на отдельной строке,
без знаков препинания.

5)Чтобы запускать как демон пишем файл /etc/init.d/cpmaild
или забираем его от сюда ftp://10.54.56.15/pub/setup/Linux/sendmail/cpmail/cpmaild
  
#!/bin/sh
#
# chkconfig: - 69 39
# description: cpmail is sendmail filter for copy esmtp mail (outgoing mail from domain users)
# processname: /usr/bin/cpmail
# copy userlist: /etc/mail/sm_copy_users
  
# Source function library.
. /etc/init.d/functions
  
start() {
if [ -n "`/sbin/pidof cpmail`" ]; then
echo -n $"cpmail is already running..."
return 1
fi
echo -n $"Starting up cpmail filter: "
cpmail &
RETVAL=$?
if [ -z "`/sbin/pidof cpmail`" ]; then
RETVAL=1
fi
[ $RETVAL -ne 0 ] && failure $"cpmail startup"
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/cpmail && success $"cpmail startup"
echo
return $RETVAL
}
  
stop() {
echo -n $"Shutting down cpmail filter: "
killproc cpmail
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/cpmail
echo
return $RETVAL
}
  
restart() {
stop
[ $RETVAL -eq 0 ] && start
}
  
cpstatus() {
cpm_pid=`/sbin/pidof cpmail`
if [ -z "$cpm_pid" ]; then
echo "... cpmail not started"
else
echo "cpmail started with pid=$cpm_pid ..."
fi
echo
}
  
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
cpstatus
;;
restart)
restart
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
exit 1
esac
  
exit $RETVAL
 
 
затем пишем
chkconfig --add cpmaild
 
После этого c ним можно работать как с обычным service- запускать, перезапускать, останавливать (не забывая делать это каждый раз после внесения изменений в список пользователей sm_copy_users)
 
При свзяке sendmail+dr.web+spamassassin фильтр копирования почты должен быть указан первым в sendmail.mc иначе sendmail не передает письмо на проверку spamassassin`у
т.е. sendmail.mc должен выглядить примерно так:
<code>...
INPUT_MAIL_FILTER(`copy_mail_filter', `S=inet:999@localhost')
define(`confINPUT_MAIL_FILTERS', `copy_mail_filter')
INPUT_MAIL_FILTER(`spamassassin', `S=local:/var/run/spamass-milter, F=T, T=C:15m;S:4m;R:4m;E:10m')dnl
INPUT_MAIL_FILTER(`drweb-filter', `S=inet:3001@127.0.0.1, F=T, T=C:1m;S:5m;R:5m;E:1h')
define(`confMILTER_MACROS_CONNECT',`b, j, _, {daemon_name}, {if_name}, {if_addr}')dnl
define(`confMILTER_LOG_LEVEL',`6')<code>