пятница, 6 апреля 2012 г.

Roundcube Webmail и плагин markasjunk2


Наконец-то дошли руки до локального почтовика. Решил прикрутить к клиенту плагин markasjunk2, который позволяет помечать письма как спам и тут же обучать SpamAssassin.

Я использую Roundcube 0.7.2 и markasjunk2 0.8-beta
Как обычно, красненьким - то, что было изменено мной.



Качаем плагин и помещаем в папку plugins
Папка с плагином обязательно должна называться markasjunk2, так что если что - переименовываем.

Далее изменяем config/main.inc.php


Дописываем название папки плагина в список активных плагинов

$rcmail_config['plugins'] = array('markasjunk2');

Изменяем plugins/markasjunk2/config.inc.php
Если файла "config.inc.php" нет, создаем его из plugins/markasjunk2/config.inc.php.dist и меняем параметры:
...
$rcmail_config['markasjunk2_learning_driver'] = 'cmd_learn' ;
...
$rcmail_config['markasjunk2_spam_cmd'] = 'sa-learn --spam --no-sync --username=%u %f';
...
$rcmail_config['markasjunk2_ham_cmd'] =
'sa-learn --ham --no-sync --username=%u %f';

%u - имя пользователя
%f - путь к письму

По идее это все. Однако у меня как обычно возникли проблемы: при попытке пометить письмо как спам, я получал сообщение "Внутренняя ошибка сервера"

В /logs/errors я обнаружил следующее:

PHP Fatal error: Call to undefined method stdClass::get_raw_body() in /var/www/plugins/markasjunk2/drivers/cmd_learn.php on line 55

Идем в  cmd_learn.php в строчку 55 и видим:

file_put_contents($tmpfname, $rcmail->storage->get_raw_body($uid));


Класс  rcmail у нас хранится в файле program/include/rcmail.php. Идем туда и видим, что никакого storage там нет и в помине. А есть в помине всякая другая ерунда, среди которой нужно найти объект, который содержит функцию get_raw_body.
Из документации (ура-ура!) я узнал, что get_raw_body - это функция класса rcube_imap. А поле этого класса в rcmail называется вовсе не storage, а (шок!) imap.
Соответственно - меняем срочку 55 в cmd_learn.php:

file_put_contents($tmpfname, $rcmail->imap->get_raw_body($uid)); 


Правда, после этого все равно ничего не запустилось и я получил:

PHP Fatal error: Call to undefined method stdClass::set_flag() in /var/www/plugins/markasjunk2/markasjunk2.php on line 103


Идем туда и видим злополучный  $rcmail->storage. Меняем и там 2 строчки:
...
 $storage = $rcmail->imap;
...
if ($flag = array_search($rcmail->config->get('markasjunk2_spam_flag'), $rcmail->imap->conn->flags))


Все, допилили, все работает, помечается и обучается.



Комментариев нет:

Отправить комментарий