Спам: автоматический белый список 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, который добавляет отправителя в базу данных; расположен по этой ссылке.
Готов выслушать замечания, в том числе идеологического характера
Комментарии»
Вообще – спамасасин это не самый лучший вариант для избавления от спама.
Есть другие хорошие системы для борьбы со спамом (правда не всегда опенсорс). Ну а самый простой и действенный способ – использовать гмайл.
А вот никак без внешнего скрипта не обойтись?
Хотелось бы штатными способами решить.
Попробовал вышеописаное, да, в лог пишется что был задействован роутер и транспорт, а в таблице данных не добавляется…
Буду разбирать и переписывать скрипт хоть под perl (в php не силён)…
Можно и без внешнего скрипта.
Вместо command = /usr/local/sbin/white_list.php
прописать
condition = ${lookup mysql{REPLACE INTO whitelist … и понеслась}{yes}{no}}
Я бы посоветовал REPLACE вместо INSERT для того, чтобы sql не ругался на дубликаты.
Можно и без отдельного роутера, если прописать эту команду в основной роутер.