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>



