Postfix
Postfix - агент передачи почты (MTA — mail transfer agent).
Архитектура
Базовые настройки
Настройки внешних фильтров для Postfix
Сам Postfix занимается лишь одной задачей - передачей почты. Установка всевозможных фильтров в систему реализуется через управление потоками данных между компонентами (демонами), входящих в Postfix, и внешними приложениями.
Пример простого фильтра содержимого почты (ClamAV & SpamAssassin), основанного на pipe.
http://www.postfix.org/FILTER_README.html#simple_filter)
Сценарий обработки почты таков: smtpd, слушающий tcp/25, принимает почту из сети. smtpd запущен с выставленным параметров content_filter. После проверки содержимого на корректность демоном cleanup оно передаётся фильтру, выполненному в виде процесса pipe, вызывающего внешнюю программу. После соответствующей обработки программа должна с помощью sendmail отправить письмо в очередь сообщений.
В файле master.cf сделайте правку записи сервера smtpd (это можно сделать и в main.cf):
smtp inet n - - - - smtpd -o content_filter=mailfilter:dummy
... и определите программу-фильтр:
mailfilter unix - n n - - pipe flags=R user=filter argv=/usr/local/bin/mailfilter -f ${sender} -- ${recipient}
Не забудьте создать пользователя, указанного в параметре user.
Теперь нам осталось побеспокоиться о конечной программе (подразумевается, что ClamAV & Spamassassin уже установлены и настроены). У меня сей скрипт появился откуда-то из недр Интернета и был немного мной подредактирован. Мой дистрибутив - Debian lenny.
#!/bin/sh MYDOMAIN=example.org INSPECT_DIR=/tmp #Не забываем создать директорию карантина QUARANTINE_DIR=/var/lib/mailfilter/quarantine SENDMAIL="/usr/sbin/sendmail -i" SPAMC="/usr/bin/spamc" FILTER_SPAMC="$SPAMC -u postfix -U /var/run/spamd.sock" CLAMSCAN="/usr/bin/clamscan" ORIG_MESS="$INSPECT_DIR/orig.$$" AV_OUT="$INSPECT_DIR/av_out.$$" SA_OUT="$INSPECT_DIR/sa_out.$$" TOADMIN_MESS="$INSPECT_DIR/to_admin.$$" VIRUSADMIN="postmaster@$MYDOMAIN" EX_TEMPFAIL=75 EX_UNAVAILABLE=69 trap "rm -f $ORIG_MESS $TOADMIN_MESS $SA_OUT $AV_OUT" 0 1 2 3 15 cat > $ORIG_MESS || { echo Cannot save mail to file; exit $EX_TEMPFAIL; } $CLAMSCAN --no-summary --stdout $ORIG_MESS > $AV_OUT AV_RESULT=$? case "$AV_RESULT" in 0) $FILTER_SPAMC < $ORIG_MESS > $SA_OUT || { echo Cannot save mail to file; exit $EX_TEMPFAIL; } $SENDMAIL "$@" < $SA_OUT exit 0 ;; 1) QUARANTINE_FILENAME=`date +%Y%m%d`_$$ cp $ORIG_MESS $QUARANTINE_DIR/virus/$QUARANTINE_FILENAME echo "Subject: VIRUS FOUND" >> $TOADMIN_MESS echo >> $TOADMIN_MESS echo >> $TOADMIN_MESS grep Received $ORIG_MESS >> $TOADMIN_MESS echo "From: $2 (unverified)" >> $TOADMIN_MESS echo "To: $4" >> $TOADMIN_MESS grep Subject $ORIG_MESS >> $TOADMIN_MESS echo >> $TOADMIN_MESS cat $AV_OUT | awk '{print $2 " " $3}' >> $TOADMIN_MESS echo >> $TOADMIN_MESS echo "Saved as $QUARANTINE_DIR/virus/$QUARANTINE_FILENAME" >> $TOADMIN_MESS echo >> $TOADMIN_MESS $SENDMAIL -f $VIRUSADMIN -r $VIRUSADMIN -F "Antivirus" $VIRUSADMIN < $TOADMIN_MESS exit 0 ;; *) echo "Subject: ANTIVIRUS FAILED" >> $TOADMIN_MESS echo >> $TOADMIN_MESS echo "Antivirus Failed with next problem:" >> $TOADMIN_MESS echo >> $TOADMIN_MESS case "$AV_RESULT" in 40) echo "Unknown option passed." >> $TOADMIN_MESS ;; 50) echo "Database initialization error." >> $TOADMIN_MESS ;; 52) echo "Not supported file type." >> $TOADMIN_MESS ;; 53) echo "Can't open directory." >> $TOADMIN_MESS ;; 54) echo "Can't open file. (ofm)" >> $TOADMIN_MESS ;; 55) echo "Error reading file. (ofm)" >> $TOADMIN_MESS ;; 56) echo "Can't stat input file / directory." >> $TOADMIN_MESS ;; 57) echo "Can't get absolute path name of current" >> $TOADMIN_MESS echo "working directory." >> $TOADMIN_MESS ;; 58) echo "I/O error, please check your filesystem." >> $TOADMIN_MESS ;; 59) echo "Can't get information about current user" >> $TOADMIN_MESS echo "from /etc/passwd." >> $TOADMIN_MESS ;; 60) echo "Can't get information about user" >> $TOADMIN_MESS echo "clamav (default name) from /etc/passwd." >> $TOADMIN_MESS ;; 61) echo "Can't fork." >> $TOADMIN_MESS ;; 63) echo "Can't create temporary files/directories" >> $TOADMIN_MESS echo "(check permissions)." >> $TOADMIN_MESS ;; 64) echo "Can't write to temporary directory (please" >> $TOADMIN_MESS echo "specify another one)." >> $TOADMIN_MESS ;; 70) echo "Can't allocate and clear memory (calloc)." >> $TOADMIN_MESS ;; 71) echo "Can't allocate memory (malloc)." >> $TOADMIN_MESS ;; *) echo "Unknown error $AV_RESULT" >> $TOADMIN_MESS ;; esac echo "************************************************" >> $TOADMIN_MESS $SENDMAIL -f $VIRADMIN -r $VIRADMIN -F "Antivirus" "$VIRADMIN" < $TOADMIN_MESS exit $EX_TEMPFAIL ;; esac exit 0
Данный вариант фильтра подходит для не очень загруженных почтовых серверов (таких - большинство).