Прошло несколько месяцев работы dspam-фильтров в промышленных масштабах. Серьёзных проблем не найдено, но захотелось немного изменить граничные точки для X-Junk-Score заголовка.
Было:
/* Defines the bar score ranges. By default the following ratios are used:
* digital Bar score
* 0 []
* 1-49 [X]
* 50-70 [XX]
* 71-89 [XXX]
* 90-94 [XXXX]
* 95-99 [XXXXX]
* 100 [XXXXXX]
*/
int BARSCORERANGES[] = {0,49,70,89,94,99,100, -1};
Стало:
/* Defines the bar score ranges. By default the following ratios are used:
* digital Bar score
* 0 []
* 1-49 [X]
* 50-70 [XX]
* 71-89 [XXX]
* 90-94 [XXXX]
* 95-98 [XXXXX]
* 99-100 [XXXXXX]
*/
int BARSCORERANGES[] = {0,49,70,89,94,98,100, -1};
Изменились два последних диапазона. Это позволяет отделить максимальную вероятность 99 в отдельную группу. И применять к ней более суровые фильтры.
Я соответственно изменил, выложенные на сайте cgp- и zmailer- фильтры. Это единственное изменение в новых версиях.









20.11.2011 в 00:13
Приветсвую.
Очень полезная информация, спасибо.
Есть, правда, несколько моментов:
— патч dspam_addheader.patch не ставится на dspam-3.10.1. Я это поправил, если надо могу выложить новую версию.
— не понял, как его «учить», может поделитесь?
20.11.2011 в 00:54
Добрый вечер.
1. Да, выкладывайте, у вас есть куда? Если да — шлите ссылку. Но я пока не ставил dspam-3.10.1 в продакшин, у меня с ним были проблемы. dspam-3.10.1 переставал работать в каких-то ситуациях. Я пока не смотрел внимательно почему и сижу пока на какой-то версии из git, где всё работает.
2. Пока могу рассказать только общее: учу скриптом на python. Заводится два спец. ящика: spam@ и ham@ типа MailDir и ошибки пересылаются или перекладываются по IMAP в соответствующий ящик. Из крона скрипт вычитывает содержимое ящиков и отправляет в dspam на переобучение.
Переобучение выглядит так:
Spam: cat spam.msg | dspam --user юзер --class=spam --source=corpus --mode=toe --client --deliver=summary --stdout
Ham: cat ham.msg | dspam --user юзер --class=innocent --source=corpus --mode=toe --client --deliver=summary --stdout
Это не совсем хороший способ, правильно использовать сигнатуры [--signature=DSPAM-Signature] и переобучаться в режиме [--source=error]. Но у меня большая нагрузка и dspamd работает в режиме «TrainingMode notrain», потому сигнатур нет. Для переобучения использую само тело письма. В этом случае важно, что бы тело письма осталось неизменным.
Из папки, куда письма перекладываются по IMAP, можно вырезать («X-Envelope-To», «X-Orcpt», «Original-Recipient», «X-DSPAM-Result», «X-DSPAM-Confidence», «X-DSPAM-Probability») заголовки и передать на обучение dspam. Из папки, куда пересылают письма (в режиме «переслать как вложение»), сначала надо вытащить из письма вложение, и уже это вложение передать на переобучение dspam-у. Python без проблем умеет всё это делать.
Варианты таких скриптов нагугливаются. Вот, как вариант: Я им не пользовался, но вроде что-то похожее.
20.11.2011 в 01:22
А как-то dspam_train не приручить? По названию — он для того и нужен вроде.
У меня на сервере не зело много почты, пока я включил TrainingMode teft.
Ну и как-то лениво «распиливать» мэйлбоксы. Правда, dspam_train на них ругается, говорит — result: BROKEN result!!
20.11.2011 в 01:41
Да, dspam_train умеет обучать. Он нужен для начального обучения, когда есть много писем со спамом и не спамом. Описанный мной выше вариант подходит для переобучения в случае ошибок уже в процессе эксплуатации.
Можно просто завести две папки spam и not_spam в своем ящике и перекладывать туда письма для переобучения в случае ошибок.
Что касается BROKEN result!, то это что-то не то вернулось из dspam. Посмотрите в dspam_train когда это происходит и попробуйте проделать это же самое руками. Будет понятнее что ждет скрипт и что происходит на самом деле.
20.11.2011 в 02:06
мда...
dspam[5916]: segfault at 7ffbe2471280 ip 00007ffbe301e4b7 sp 00007fff1bd80000 error 4 in libdspam.so.7.0.0[7ffbe3005000+1d000]
и часа не проработал...
20.01.2012 в 23:07
dspam-cgp.c обновил до версии 1.0.7.