Меню:


Данная статья является небольшим введением в технологию борьбы со спамом средствами пакета Gnus. Данная статья основывается на возможностях пакета, которые появились начиная с ветки Oort Gnus, существуют в текущей стабильной версии 5.10.x и сейчас развивается в версии NoGnus.

Базовые понятия

Для правильного понимания того, как производить настройку и работать с Gnus, необходимо уточнить некоторые понятия:

пометка (mark)
символьный атрибут, который устанавливается на статью;
функция разбиения (splitter)
функция, которая для каждого письма должна вернуть имя группы в которую его необходимо перенести, или nil, если продолжать обработку дальше;
хук (hook)
функция, выполняемая при возникновении какого-то условия и включении/выключении режима. Используется для предоставления пользователю возможности выполнять дополнительную настройку или другие действия.

Обработка спама

Основы настройки

Настройка анти-спама производится в несколько этапов, для выполнения которых необходимо в файл ~/.gnus добавить несколько команд:

(setq spam-install-hooks t) ;; заставим установить все нужные хуки
(setq spam-use-stat t) ;; мы будем использовать статистический метод
(require 'spam-stat) ;; для использования spam-stat
(require 'spam)
(setq nnmail-split-methods 'nnmail-split-fancy)
(setq nnmail-split-fancy
      '(|
          ;; перехватываем спам
          (: spam-split)
          ;; все остальное кладем в папку inbox
          "inbox"))

Аналогичным образом может быть настроена и функция разбиения для метода доступа nnimap.

Схема обработки спама

Схема обработки почты Gnus'ом показана на рисунке:

Здесь можно выделить несколько этапов:

Методы обработки спама

Gnus поддерживает разные методы и программы для определения писем со спамом. Вот список поддерживаемых методов:

Настройка

Настройка обработчиков писем со спамом и нормальных писем (как и прочих параметров обработки спама) производится с помощью параметров из группы spam (используйте команду M-x customize-group spam). В этой группе настройки пользователь может вручную указать какой метод обработки использовать, куда складывать письма со спамом, а также другие параметры.

Настройку обработки спама можно разделить на две большие группы — использование возможностей пакета spam и использование комбинации стандартных возможностей Gnus.

Настройка конкретных методов пакета spam

Как уже упоминалось выше, настройка конкретных методов обработки спама производится установкой переменной, соответствующей нужному методу. Ниже перечислены имена соответствующих переменных, а также приведены дополнительные настройки для конкретных методов.

spam-stat

При использовании метода spam-stat настройка может выглядеть так:

;; устанавливаем параметры, метод обработки и загружаем модули
(setq spam-install-hooks t)
(setq spam-use-stat t)
(require 'spam-stat)
(require 'spam)
;; загружаем файл со статистикой по словам
(when (file-exists-p spam-stat-file)
  (spam-stat-load))
;; задаем имя группы для спама
(setq spam-stat-split-fancy-spam-group "spam")

;; А эта функция нужна в основном для первоначального обучения
;; байесовского фильтра.
(defun my-spam-stat-learn ()
  "Learn about my spam and non-spam"
  (interactive)
  (let ((starting (current-time-string)))
    ;; обрабатываем спам
    (spam-stat-process-spam-directory "~/Mail/spam")
    ;; обрабатываем нормальные письма из разных каталогов
    (let ((ham-groups '("inbox" "Gnus-ding" "Emacs")))
      (mapc (lambda (x)
              (spam-stat-process-non-spam-directory
               (format "~/Mail/%s" x)))
            ham-groups))
    (spam-stat-reduce-size)
    (spam-stat-save)
    (message "my-spam-stat-learn:  started at %s, ended at %s"
             starting (current-time-string))))

Часто у пользователя уже есть письма со спамом. Для обучения по ним, и предназначена функция my-spam-stat-learn, которую можно вызвать интерактивно. Предполагается, что спам хранится в каталоге ~/Mail/spam, а нормальные письма берутся из каталогов ~/Mail/inbox, ~/Mail/Gnus-ding и ~/Mail/Emacs (вы можете подставить пути к своим каталогам, или удалить лишние записи в списке ("inbox" "Gnus-ding" "Emacs")). Функцию my-spam-stat-learn достаточно запустить один раз, при этом сформируется база с весами слов, и затем она будет дополняться по результатам ручной обработки почты — через соответствующие обработчики при выходе из группы.

Черные и белые списки

Для использования черных или белых списков надо присвоить истинное значение одной из переменных:

Вы можете явно задать значения в файлах с белыми и черными списками, отредактировав файлы, на которые ссылаются переменные spam-whitelist и spam-blacklist.

Белые списки из BBDB

Данный метод аналогичен по работе использованию белых списков, но белые списки при этом берутся из базы BBDB. Аналогично обычным белым спискам, для настройки используются две переменных: spam-use-BBDB и spam-use-BBDB-exclusive, которые заставляют Gnus работать также, как и при использовании spam-use-whitelist и spam-use-whitelist-exclusive.

Внешние источники черных списков (blackholes)

Gnus может проверять адреса в письмах относительно внешних, распределенных систем обработки спама. Для включения данного метода, вам необходимо присвоить истинное значение переменной spam-use-blackholes, например так:

(setq spam-use-blackholes t)

Кроме этого, пользователь может указать список серверов, относительно которых будет производиться проверка (с помощью переменной spam-blackhole-servers)2.

Соответствие заголовков регулярным выражениям

Данный метод позволяет пользователю использовать регулярные выражения для проверки заголовков писем. Пользователь может использовать регулярные выражения как для определения писем со спамом, так и для определения нормальных писем.

Для использования данного метода нужно установить в истинное значение переменную spam-use-regex-headers. Переменные spam-regex-headers-spam и spam-regex-headers-ham должны содержать в себе списки регулярных выражений для спама и обычной почты3.

Обработка спама с помощью bogofilter

Для данной программы возможно использование двух взаимоисключающих вариантов подключения. Первый вариант, который управляется переменной spam-use-bogofilter, запускает bogofilter для обрабатываемого письма и использует накопленную базу статистики. Второй метод, который включается переменной spam-use-bogofilter-headers, при фильтрации использует уже установленный заголовок X-Bogosity (например, он может быть установлен во время обработки письма с помощью procmail). Для использования одного из методов, необходимо установить соответствующую переменную в истинное значение.

Кроме основных переменных, включающих данный метод, пользователь имеет возможно задать расположение баз bogofilter. Оно задается с помощью переменной spam-bogofilter-database-directory.

Обработка спама с помощью ifile

Использование ifile выполняется путем присвоения истинного значения переменной spam-use-ifile. Кроме того, как и в случае с bogofilter, с помощью переменной spam-ifile-database-path пользователь может задать путь к базам ifile.

Обработка спама с помощью SpamOracle

Аналогично другим методам, использующим внешние программы, настройка SpamOracle производится установкой переменной с именем spam-use-spamoracle. Пользователь также может задать путь к базе SpamOracle с помощью переменной spam-spamoracle-database.

Дополнительные методы

Кроме перечисленных методов Gnus позволяет пользователю достаточно просто добавить свои обработчики спама. Для того, чтобы узнать как это делать, прочитайте раздел "Extending the Spam ELisp package" в руководстве Gnus.

Другие методы обработки

Кроме использования пакета spam, можно фильтровать спам и с помощью других средств. Например, так выполняется фильтрация спама при помощи SpamAssassin.

Обработка спама с помощью SpamAssassin

Данный метод напрямую не использует пакет spam, а использует стандартные возможности Gnus, такие как выполнение команд при заборе почты, и стандартные средства разбиения почты по заголовкам.

Сначала необходимо внести изменения в настройку источников почты. Нужно добавить обработчики :prescript и :postscript, используя команды, аналогичные приведенным в примере:

(setq mail-sources
      '((file :prescript "formail -bs spamassassin < /var/mail/%u")
        (pop :user "testuser"
             :server "myhost"
             :postscript
             "mv %t /tmp/testuserfile; formail -bs spamc < /tmp/testuserfile > %t")))

Это приведет к тому, что у пользователя окажется почта, в которой вставлены дополнительные заголовки SpamAssassin.

Затем пользователь может использовать стандартные средства разбиения почты, проверяя наличие заголовка X-Spam-Flag, как это показано в примере:

(setq nnmail-split-methods '(("spam"  "^X-Spam-Flag: YES")
                             ...))

1. По собственному опыту могу заметить, что этот метод очень эффективно отлавливает спам. За неделю сквозь фильтр проходит 1-2 писем со спамом, при общем потоке спама в 100-200 писем в неделю (того, который не ловится внешним SpamAssassin).

2. Для данного метода не предусмотрено обработчиков спама и нормальной почты.

3. Для данного метода не предусмотрено обработчиков спама и нормальной почты.

Last change: 05.03.2013 16:54

blog comments powered by Disqus