[sa-conf] exiscan: get X-Spam-Satus

Victor Ustugov victor на corvax.kiev.ua
Вс Янв 22 19:33:39 EET 2006


приветствую

захотелось мне добраться до значения параметра autolearn поля 
X-Spam-Status в системном фильтре эксима. но я обнаружил, что 
информация, доступная в поле X-Spam-Status после проверки письма с 
помощью spamc или spamassassin, недоступна в exim/exisan

exim/exiscan отдает демону spamd команду REPORT примерно так:


( \
echo -e -n "REPORT SPAMC/1.2\r\n" ; \
echo -e -n "User: root\r\n" ; \
echo -e -n "Content-length: 82\r\n\r\n" ; \
echo -e -n "From: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" ; \
echo -e -n "To: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" \
) | nc localhost 783


результат получается примерно такой:


SPAMD/1.1 0 EX_OK
Spam: True ; 7.2 / 5.0

Content analysis details:   (7.2 points, 5.0 required)

  pts    rule name              description
------ ---------------------- 
--------------------------------------------------
  2.0 MESSAGE_ID_MISSED      Message-Id is missed
-0.0 NO_RELAYS              Informational: message was not relayed via SMTP
  2.5 MISSING_HB_SEP         Missing blank line between message header 
and body
-1.4 BAYES_20               BODY: Bayesian spam probability is 5 to 20%
                             [score: 0.1601]
  1.8 MISSING_SUBJECT        Missing Subject: header
  2.3 EMPTY_MESSAGE          Message appears to be empty with no 
Subject: text
-0.0 NO_RECEIVED            Informational: message has no Received headers


шаблон для построения этого результата описан в 
http://mta.org.ua/spamassassin/rules.corvax/99_report_headers-0.01.cf:


report Content analysis details:   (_HITS_ points, _REQD_ required)
report
report " pts    rule name              description"
report  ------ ---------------------- 
--------------------------------------------------
report _SUMMARY_


это почти дефолтовый вид отчета, просто немного обкусанный.

никаких упоминаний об autolearn тут нет.

если же взглянуть на механизм работы spamc, то можно увидеть, что он 
отдаем демону spamd команду PROCESS примерно так:


( \
echo -e -n "PROCESS SPAMC/1.2\r\n" ; \
echo -e -n "User: root\r\n" ; \
echo -e -n "Content-length: 82\r\n\r\n" ; \
echo -e -n "From: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" ; \
echo -e -n "To: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" \
) | nc localhost 783


вот типичный результат:


SPAMD/1.1 0 EX_OK
Content-length: 1031

X-Spam-Level: *******
X-Spam-Status: Yes, score=7.2 required=5.0 tests=BAYES_20,EMPTY_MESSAGE,
         MESSAGE_ID_MISSED,MISSING_HB_SEP,MISSING_SUBJECT,NO_RECEIVED,
         NO_RELAYS autolearn=no version=3.1.0
X-Spam-Report: Content analysis details: (7.2 points, 5.0 required)
         pts    rule name              description
         ------ ---------------------- 
--------------------------------------------------
         *  2.0 MESSAGE_ID_MISSED Message-Id is missed
         * -0.0 NO_RELAYS Informational: message was not relayed via SMTP
         *  2.5 MISSING_HB_SEP Missing blank line between message header 
and body
         * -1.4 BAYES_20 BODY: Bayesian spam probability is 5 to 20%
         *      [score: 0.1601]
         *  1.8 MISSING_SUBJECT Missing Subject: header
         *  2.3 EMPTY_MESSAGE Message appears to be empty with no 
Subject: text
         * -0.0 NO_RECEIVED Informational: message has no Received headers
X-Spam-Flag: YES
X-Spam-Checker-Version: SpamAssassin 3.1.0 (2005-09-13) on
         gobblin.corvax.kiev.ua
From: Vasya Pupkin <vasya на pupkin.org.ua>
To: Vasya Pupkin <vasya на pupkin.org.ua>


т. е. spamd возвращает полностью письмо с уже добавленными служебными 
заголовками X-Spam-*.

заголовок X-Spam-Report в данном случае строится по шаблону, описанному 
в http://mta.org.ua/spamassassin/rules.corvax/99_report_headers-0.01.cf 
как "add_header all Report"

дефолтовый шаблон для поля X-Spam-Status следующий:


add_header all Status "_YESNO_, score=_SCORE_ required=_REQD_ 
tests=_TESTS_ autolearn=_AUTOLEARN_ version=_VERSION_"


spamassassin формирует заголовки для проверенного пиьма таким же 
образом, как и spamc.

это можно проверить командами:

( \
echo -e -n "From: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" ; \
echo -e -n "To: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" \
) | spamc -d localhost -p 783

( \
echo -e -n "From: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" ; \
echo -e -n "To: Vasya Pupkin <vasya на pupkin.org.ua>\r\n" \
) | spamassassin


результат будет таким же, как при записи непосредственно в сокет команды 
PROCESS


а теперь вопрос: так как же проще всего добраться до значения autolearn 
из exim/exiscan? т. е. до того значения, которое в шаблонах указано как 
_AUTOLEARN_.

есть как минимум два варианта:

1. продолжать использовать команду REPORT в диалоге exiscan и spamd. при 
этом надо в шаблон report'а внести _AUTOLEARN_.
при этом придется патчить exiscan на предмет парсинга результатов 
report'а. мало того, при этом надо учитывать, что в настройках 
spamassassin'а может быть как дефолтовое значение шаблона отчета, так и 
содержащее _AUTOLEARN_

2. пропатчить exiscan на предмет использования команды PROCESS в диалоге 
со spamd. при этом придется все равно рихтовать обработку результатов 
проверки в самом exiscan'е, мало того, при этом spamd будет в сокет 
писать все тело письма.


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

1. модифицировать шаблон отчета для команды REPORT таким образом:


report Content analysis details:   (_HITS_ points, _REQD_ required)
report
report " pts    rule name              description"
report  ------ ---------------------- 
--------------------------------------------------
report _SUMMARY_
X-Spam-Status: _YESNO_, score=_SCORE_ required=_REQD_ tests=_TESTS_ 
autolearn=_AUTOLEARN_ version=_VERSION_


2. ответ демона в этом случае будет выглядеть так:


SPAMD/1.1 0 EX_OK
Spam: True ; 7.2 / 5.0

Content analysis details:   (7.2 points, 5.0 required)

  pts    rule name              description
------ ---------------------- 
--------------------------------------------------
  2.0 MESSAGE_ID_MISSED      Message-Id is missed
-0.0 NO_RELAYS              Informational: message was not relayed via SMTP
  2.5 MISSING_HB_SEP         Missing blank line between message header 
and body
-1.4 BAYES_20               BODY: Bayesian spam probability is 5 to 20%
                             [score: 0.1601]
  2.3 EMPTY_MESSAGE          Message appears to be empty with no 
Subject: text
-0.0 NO_RECEIVED            Informational: message has no Received headers
  1.8 MISSING_SUBJECT        Missing Subject: header

X-Spam-Status: Yes, score=7.2 required=5.0 
tests=BAYES_20,EMPTY_MESSAGE,MESSAGE_ID_MISSED,MISSING_HB_SEP,MISSING_SUBJECT,NO_RECEIVED,NO_RELAYS 
autolearn=no version=3.1.0


3. пропатчить exiscan для поиска в ответе демона подстроки, начинающейся 
с "X-Spam-Status:" и заполнять на основе ее значения переменную 
spam_status, потом сделать ее доступной в exiscan'е на равне с 
$spam_report, $spam_score, $spam_score_int, $spam_bar

4. при парсинге ответа от демона учитывать, что X-Spam-Report там может 
и не быть


есть у кого-то конструктивные идеи на эту тему или мысли о том, какой из 
вариантов более приемлем?

-- 
Best wishes Victor Ustugov   mailto:victor на corvax.kiev.ua
public GnuPG/PGP key:        http://victor.corvax.kiev.ua/corvax.asc
ICQ UIN: 77186900, 32418694  nic-handle: CRV2-RIPE, CRV-UANIC




Подробная информация о списке рассылки sa-conf