|
|
Использование Milter API в sendmail для дублирования исходящей почты
Введение Во многих форумах встречаются треды с вопросом: "Как настроить систему копирования почты?" Одним из вариантов реализации такой системы - это использование sendmail в связке с Procmail, второй это использование дополнительного мэйлера на базе самого sendmail. Не один из этих методов нельзя однозначно назвать хорошим, так же как и метод который будет описан в этой статье (мнение автора). Данная статья не претендует на оригинальность и данный метод не является "ноу-хау", но все же подробные описания двух перечисленных выше методов имеются, а вот использование Milter API как то позабыли. Подробнее о Milter API можно почитать на http://www.milter.org Итак приступим: При тестировании использовалась система FreeBSD 5.1-Relese и sendmail 8.12.9. Для реализации фильтра использовался язык Си, ниже приведен код фильтра: ----cpmail.c---- #includeитак есть необходимость читать исходящую почту проходящую через 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 файлы в include #include <stdlib.h> #include <stdio.h> #include <string.h> #include <errno.h> #include "libmilter/mfapi.h" 2) немножно исправим строку компиляции чтобы получилось в нужном месте и с нужными библиотеками компиляции (т.к. судя по ошибкам libmilter.a- во FreeBSD, для которой написана статья [1], эта библиотека несколько другая) gcc -Wall -o /usr/bin/cpmail cpmail.c /usr/lib/libmilter.a /usr/lib/libsmutils.a -pthread NB: по поводу редактирования Sendmail.mc- Если у вас несколько фильтров в sendmail то в строке define они пишутся через запятую define(`confINPUT_MAIL_FILTERS', `drweb-filter,copy_mail_filter')dnl 3) как видно из текста прог-мы, записи в sm_copy_users должны стоять каждый адрес на отдельной строке, без знаков препинания. 4) чтобы запускать как демон пишем файл /etc/init.d/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) // для тех, кому интересно как выглядит хедер письма - нигде , ни в копии письма , ни в оригинале у истинного получателя - не будет никаких следов. не будет лишних заголовочных пометок и пр. т.е. с чисто эстетической точки зрения перлюстрация письма нигде в письме не отражается, что в определенной ситуации- "некрасиво". поэтому немного подработав код программы можно заставить ее вставлять в хедер строки типа "X-CopiedMail: this mail was auto copied to user@domain.ru" Удачи. |