и exim самособранный. надоело, поставил из пакетов:
Код: Выделить всё
mail# pkg info | grep exim
exim-ldap2-4.94_2 High performance MTA for Unix systems on the Internet
mail#
для начала добавляем в транспорты
Код: Выделить всё
# Доставка на удалённые хосты - по SMTP
remote_smtp:
driver = smtp
#connection_max_messages = 1
transport_filter = /usr/local/etc/exim/scripts/transport.save.to.sh $sender_address $domain $local_part
Код: Выделить всё
mail# cat /usr/local/etc/exim/scripts/transport.save.to.sh
#!/bin/sh
from=`echo -n $1 | tr "[:upper:]" "[:lower:]"`
user=`echo -n $3 | tr "[:upper:]" "[:lower:]"`
domain=`echo -n $2 | tr "[:upper:]" "[:lower:]"`
base_dir=/var/spool/exim/spam.check.db
# рикошеты, пропускаем
if [ "x$from" = "x" ]
then
# письмо пришло на STDIN, надо на STDOUT отдать
cat
exit 0;
fi
# то что идёт снаружи нашим юзерам - пропускаем
if [ $domain = "my-current-work.ru" -o $domain = "backup1.my-current-work.local" ]
then
# письмо пришло на STDIN, надо на STDOUT отдать
cat
exit 0;
fi
# создаём директорию - кому отпарвлено было
dir=$base_dir/$domain/$user@$domain
mkdir -p $dir
# создаём файл со счётчиками - от кого, еси файл есть - докидываем счётчик на 1
count=1
if test -s $dir/$from.txt
then
# считываем текущий счётчик
count=`cat $dir/$from.txt`
# докидываем счётчик
echo `expr $count + 1` > $dir/$from.txt
else
echo $count > $dir/$from.txt
fi
echo "`date +%Y-%m-%d\ %H:%M:%S` $from -> $user@$domain, count = $count" >> /tmp/`basename $0`.txt
# письмо пришло на STDIN, надо на STDOUT отдать
cat
mail#
Код: Выделить всё
chmod 755 /usr/local/etc/exim/scripts/transport.save.to.sh
сразу же пишем скрипт очистки:
Код: Выделить всё
mail# cat /usr/local/etc/exim/scripts/clean.db.sh
#!/bin/sh
days=60
base_dir=/var/spool/exim/spam.check.db
find $base_dir -mtime +${days}d -type f -print -delete >>/tmp/`basename $0`.`date +%Y-%m-%d`.txt 2>&1
find $base_dir -type d -exec rmdir "{}" \; >/dev/null 2>&1
mail#
также, рисуем скрипт по высасываюнию домено высшего уровня, он у меня тоже используется для проверки:
Код: Выделить всё
mail# cat /usr/local/etc/exim/scripts/fetch.top.levels.domains.sh
#!/bin/sh
cd /tmp || exit 1;
out=/usr/local/etc/exim/db/tlds.list.txt
fetch -o /tmp/$$ https://data.iana.org/TLD/tlds-alpha-by-domain.txt >/dev/null 2>&1
if test -s /tmp/$$
then
# удаляем файл
rm -f $out
# обнуляем файл
echo "# auto created `date +%Y-%m-%d`" > $out
# перебираем зоны, составляем файл
cat /tmp/$$ | tr "[:upper:]" "[:lower:]" |
{
while read zone
do
if [ "`echo $zone | cut -c 1`" != "#" ]
then
echo '*.'$zone >> $out
else
echo $zone >> $out
fi
done
}
fi
rm -f /tmp/$$
mail#
Код: Выделить всё
chown mailnull /usr/local/etc/exim/db
в acl_check_rcpt меняем места где была база на файлы
Код: Выделить всё
# Проверяем существование зоны из HELO (на этом правиле огребают очков все
# уродцы с HELO типа 'friends' или 'localhost.localdomain')
warn condition = ${lookup{$sender_helo_name}wildlsearch{/usr/local/etc/exim/db/tlds.list.txt}{no}{yes}}
add_header = X-spam-stage: non-existence domain in HELO ($sender_helo_name)
set acl_m0 = ${eval:$acl_m0+150}
logwrite = non-existent gTLD domain in HELO: '$sender_helo_name' setting acl_m0 = $acl_m0
Код: Выделить всё
# Вводим acl_m2 с нулевым значением
warn set acl_m2 = 0
# Проверяем - не было ли писем НА домен отправителя от наших юзеров за
# последние два месяца (оптимальное, на мой взгляд, число)
# Если были - то потом, в фильтре, обнулим количество насчитанных очков.
warn condition = ${run{/usr/local/etc/exim/scripts/acl.check.rcpt.sh $sender_address_domain $sender_address_local_part $domain $local_part}{yes}{no}}
set acl_m2 = 1
logwrite = STAGE12: $sender_address ==> $local_part@$domain; setting acl_m2 = $acl_m2; WHITELIST for this addresses
# Переменная изменилась лишь если это были те же самые получатели,что и общались
# при внесении данных в транспорте. Для остальных этот домен так и остался
# без изменений. Соответственно надо сделать его и для остальных белым.
warn condition = ${if exists{/var/spool/exim/spam.check.db/$sender_address_domain/whitelited.txt}{yes}{no}}
set acl_m2 = 1
logwrite = STAGE13: $sender_address ==> $local_part@$domain; setting acl_m2 = $acl_m2; WHITELIST for ALL domains
Код: Выделить всё
mail# cat /usr/local/etc/exim/scripts/acl.check.rcpt.sh
#!/bin/sh
sender_address_domain=`echo -n $1 | tr "[:upper:]" "[:lower:]"`
sender_address_local_part=`echo -n $2 | tr "[:upper:]" "[:lower:]"`
domain=`echo -n $3 | tr "[:upper:]" "[:lower:]"`
user=`echo -n $4 | tr "[:upper:]" "[:lower:]"`
base_dir=/var/spool/exim/spam.check.db
# проверяем, писали ли на такой адрес наши юзеры
if test -d $base_dir/$sender_address_domain/$sender_address_local_part@$sender_address_domain
then
echo "`date +%Y-%m-%d\ %H:%M:%S` $sender_address_local_part@$sender_address_domain -> $user@$domain, была отправка с нашего адреса на этот" >> /tmp/`basename $0`.txt
echo "`date +%Y-%m-%d\ %H:%M:%S` $sender_address_local_part@$sender_address_domain -> $user@$domain" >> $base_dir/$sender_address_domain/whitelited.txt
else
echo "`date +%Y-%m-%d\ %H:%M:%S` $sender_address_local_part@$sender_address_domain -> $user@$domain, НЕ было отправок с нашего адреса на этот" >> /tmp/`basename $0`.txt
exit 1;
fi
mail#
Код: Выделить всё
mail# crontab -l -u mailnull
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin
MAILTO=root
@daily /usr/local/etc/exim/scripts/clean.db.sh
@daily /usr/local/etc/exim/scripts/fetch.top.levels.domains.sh
mail#
Код: Выделить всё
chmod 755 /usr/local/etc/exim/scripts/*
ну как-то так... пока тестирую, сегодня написал
как вариант - базу в tmpfs расположить, но тогда на ребуте будет теряться. если аптаймы большие - то это не особо критично