перейти к навигации

Спам: автоматический белый список 30.07.2007

Несмотря на использование SpamAssassin, человеческий фактор иногда берёт своё: некоторые пишут письма без темы, или же тема странным образом закодирована; некоторые присылают коммерческое предложение, оформленное как спам; иногда нужные рассылки оформлены “не так” по мнению SpamAssassin’а.

Я согласен, что можно до посинения настраивать спам-фильтр, чтобы он всё распознавал правильно, но разве можно учесть всё? И есть ли хоть один, который даст 0% false-positive? Данный способ можно использовать для того, чтобы почта от определённого адресата не попала в спам.

Я для начала выбрал такое решение: адреса, по которым отправляют почту “свои” пользователи из внутренней сети, заносятся в белый список. Туда же администратор может внести определённые домены. При этом, если от пользователя исходит подтверждение прочтения спам-письма, то такие письма не берутся во внимание (во всяком случае в Exim у таких bounce-писем поле отправителя пустое, и это служит критерием того, что такого адресата не надо заносить в белый список).

Далее я привожу пример с использованием Exim и реализацию auto-whitelist на PHP с PEAR-DB, а также предполагаю, что читатель знает, как настроить Exim на работу с SQL-сервером, и разбирается в его роутерах и транспортах.

Итак, вот как это работает:

1. Таблица базы данных для хранения информации об адресах:

CREATE TABLE `whitelist` (
  `id` int(11) NOT NULL auto_increment,
  `sender` varchar(64) NOT NULL,
  `origin` varchar(64) NOT NULL,
  `date_add` datetime NOT NULL,
  `type` tinyint(4) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `sender` (`sender`)
);

sender – собственно, адрес или домен отправителя;
origin – от кого (изнутри) исходило письмо, из-за которого данный отправитель попал в базу;
type – если равен 1, то это только домен; если 2 – полный email;

2. Списки адресов и доменов в Exim:

domainlist white_domains = ${lookup mysql{SELECT sender \
   FROM whitelist \
   WHERE type=1 AND sender='${quote_mysql:$sender_address_domain}'}{$value}fail}
addresslist white_senders = ${lookup mysql{SELECT sender \
   FROM whitelist \
   WHERE type=2 AND sender='${quote_mysql:$sender_address}'}{$value}fail}

3. Роутер, который задействуется перед обработкой исходящей почты:

whitener:
  driver = dnslookup
  domains = ! +local_domains
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8
  transport = while_list_parse
  unseen

4. Соответствующий транспорт:

while_list_parse:
  driver = pipe
  command = /usr/local/sbin/white_list.php
  user = exim

5. Теперь один из главных моментов: стадия проверки. Перед проверкой на спам в acl_check_content вставляем следующие правила:

# Accept whitelist domains
accept sender_domains = +white_domains
# Accept whitelist senders
accept senders = +white_senders

6. И окончательный момент – скрипт white_list.php, который добавляет отправителя в базу данных; расположен по этой ссылке.

Готов выслушать замечания, в том числе идеологического характера ;-)

Google Bookmarks Digg Reddit del.icio.us Ma.gnolia Technorati Slashdot Yahoo My Web News2.ru БобрДобр.ru RUmarkz Ваау! Memori.ru rucity.com МоёМесто.ru Mister Wong
Tags: , ,

Комментарии»

1. Янис - 01.08.2007

Вообще – спамасасин это не самый лучший вариант для избавления от спама.
Есть другие хорошие системы для борьбы со спамом (правда не всегда опенсорс). Ну а самый простой и действенный способ – использовать гмайл.

2. MZ-412 - 22.04.2009

А вот никак без внешнего скрипта не обойтись?
Хотелось бы штатными способами решить.

Попробовал вышеописаное, да, в лог пишется что был задействован роутер и транспорт, а в таблице данных не добавляется…

Буду разбирать и переписывать скрипт хоть под perl (в php не силён)…

3. lexore - 27.04.2010

Можно и без внешнего скрипта.
Вместо command = /usr/local/sbin/white_list.php
прописать
condition = ${lookup mysql{REPLACE INTO whitelist … и понеслась}{yes}{no}}

Я бы посоветовал REPLACE вместо INSERT для того, чтобы sql не ругался на дубликаты.

Можно и без отдельного роутера, если прописать эту команду в основной роутер.


ВНИМАНИЕ! Если в вашем комментарии есть хотя бы одна ссылка, он потребует моего подтверждения. Поймите правильно, надоел спам в комментариях.