Извините за очень длинное письмо, но тема уж больно интересная.
---
Я сам сейчас сейчас пробую разные подходы для решения этой проблемы.
Выработать универсальные рекомендации - сложно,
поскольку специфика работы разных организаций/пользователей (а также цели, политика и т.д.) -
разные. Да и характер спама, приходящего в разные места - разный.
То что можно сделать в одном случае - не пройдёт в другом.Например, на одном полюсе такая ситуация -
есть контора, кот. использует email для деловой переписки
внутри фирмы и для общения с узким кругом партнёров -- в этом случае можно
пропускать только письма с "известных" адресов (email, IP etc.) и резать
все остальные.
На другом полюсе такая --
приёмная комиссия университета или PR - отдел - они по роду
работы должны держать свои адреса "открытыми для всех" - даже в
рекламной информации может быть что-то интересное или полезное.
Самый эффективный подход, ( и по моему мнению, по возможности, нужно идти
на такие жёсткие ограничения) -- это как раз определять для почтового адреса "узкий круг"
известных адресов и резать всё остальное (например, для себя, если возможно создавать "закрытые"
адреса, на которых я общаюсь с узким кругом людей и которые нигде никогда не светятся и
"публичные" (возможно, временные) адреса, которые можно сообщать новым людям, оставлять для
регистрации и т.д., и которыми можно легко пожертвовать).
Если это, по каким-то причинам не возможно, приходится использовать смешанные
стратегии борьбы со спамом:
1) фильтрация по ip, доменам и т.д - статический список или динамический,
кот. будет автоматически обновляться из Internet (напр. RBL другие списки на основе DNS) --
но в моём случае это работает частично - я поддерживаю и свой статический список адресов и
шаблонов адресов и доменов, с которых регулярно приходят "левые" письма, но использовать
публичные списки спаммеров из Internet не могу, поскольку в них, как правило, "светятся" все
публичные mail - сервера типа hotmail.com, а мы получаем много писем с таких адресов.
Есть вариант, который используется и у меня - поддерживать базу данных адресов,
с которых разрешено принимать почту. Если приходит сообщение с адреса, которого
нет в базе - письмо остаётся в очереди почтового сервера, а отправителю автоматичеки посылается
письмо с уникальным ключём с просьбой подтвердить отправленое письмо.
Если человек отвечает, его адрес автоматически
добавляется в базу и письмо из очереди доставляется адресату.
Если ответа нет - через некоторое время письмо просто удаляется из очереди.
Подход достаточно эффективный, основан на том, что ответа с обратного
спаммерского адреса не будет.
Недостатки - в идеале каждый сам должен контроллировать свою базу разрешенных адресов
(т.е. если я - admin, мне сложно установить это незаметно и для всех - надо
учить пользователей, как с этим обращаться).
Но проблемы связаны практически только с рассылками.
Например, если я подписываюсь на список рассылки, я должен руками в базу добавить
адрес, с которого будет приходить расылка, иначе ничего не будет доходить,
т.к. ответа с подтвержением с рассылочного сайта тоже не будет.
Так что, в принципе, можно людей предупреждать, что если они на что-то
подписываются - пусть сообщают admin-у, или приходить ничего не будет.
Реализовать это можно при помощи напр. tmda (http://tmda.sourceforge.net/)
или qconfirm (http://smarden.org/qconfirm/).
2) использовать всякие характерные черты спаммерских писем для его определения и блокирования -
например использовать tarpitting и т.д. (imho мало эффективно)
3) использовать напр. регулярные выражения для анализа письма целиком (мало эффективно) -
лучше использовать пакет, который может обучаться/настраиваться, например на основе
нейронных сетей (к сожалению, ничего такого готового не нашёл, но читал, что люди работают,
и может быть, что-то уже и есть),
или на основе статистического анализа - алгоритм Баеса (автор идеи Paul Graham, http://www.paulgraham.com/spam.html -
стоит прочитать - очень интересно).
Я поставил такой у себя, пока в тестовом режиме, http://sourceforge.net/projects/bmf/.
Проблема с такими средствами в том, что их нужно обучать и контролировать, т.е. они после анализа
помечают письмо как спам или как не-спам и далее с ним что-то делают. Но они могут делать ошибки и
им надо указывать, что такое-то письмо, помеченное как спам, спамом не является (или наоборот),
что-бы этот пакет изменил свои настройки (обучение).
Проблема в том, что я не могу подстраивать bmf для других пользователей
т.к. не могу просматривать чужую почту,
поэтому установить такую систему на все почтовые ящики сервера сложно.
В идеале каждый должен работать с таким фильтром сам и обучать его сам -
но для этого нужно обучать пользователей, а это сложно, а иногда и не возможно.
Вообще хороший обзор пакетов для борьбы со спамом и источники информации
можно найти на http://www.qmail.org/top.html#spam