приветствую
захотелось мне добраться до значения параметра 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