Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


вторник, 8 сентября 2015 г.

Zimbra: грамотно работаем с фильтрами сообщений в веб-клиенте и в командной строке

Содержание: как правильно экспортировать и импортировать фильтры обработки сообщений из учетных записей зимбры.

Веб-интерфейс позволяет создавать фильтры для обработки сообщений. Они сохраняются в параметре zimbraMailSieveScript.

Например:

$ zmprov ga учетка zimbramailsievescript

zimbraMailSieveScript: require ["fileinto", "reject", "tag", "flag"];

# только от диспетчеров
if allof (not address :all :contains :comparator "i;ascii-casemap" ["from"] "диспетчер@мой-домен") {
    fileinto "Inbox/ошибка отправителя";
    stop;
}

# test-forwards
if anyof (address :localpart :contains :comparator "i;ascii-casemap" ["to","cc"] "+sms",
  header :contains ["subject"] "sms:",
  header :contains ["subject"] "+sms",
  header :contains ["subject"] "смс:",
  header :contains ["subject"] "+смс") {
    redirect "номер@sms.megafondv.ru";
    redirect "адрес@домен";
    redirect "псевдоним@sms.megafondv.ru";
    keep;
    stop;
}

В менее человеческом виде этот скрипт показывает команда

zmmailbox -m аккаунт -A -z gfrl

Экспорт и импорт таких скриптов расписан, например, здесь

https://pario.no/2011/07/21/migrate-zimbra-mail-filter-rules-between-servers/

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

Решение  простое: выполняем эти операции из-под рута, указывая полный путь к скрипту и полные пути к используемым бинарникам.

1. делаем экспорт из-под зимбры или из-под рута - не важно, экспортируется правильно, в текущей системной кодировке (у меня это UTF-8)

# регистр в названии параметра не важен, можно написать и zimbramailsievescript
# я принципиально добавляю к скриптам оболочки расширение sh, чтобы самому было понятно. Разумеется, другие не обязаны следовать этому правилу.

/opt/bin/zmprov ga учетка zimbraMailSieveScript>имя-скрипта.sh

2. поскольку управляющие программы зимбры не воспринимают конвейеры, то передать им текст через перенаправление нельзя. Значит будем делать из говна конфетку из мухи слона из сценария фильтра сценарий оболочки

chmod  +x имя-скрипта.sh

Любым редактором правим этот файл, я предпочитаю mcedit. Убираем красное, добавляем зеленое

/opt/zimbra/bin/zmprov ga $1 zimbraMailSieveScript
# name учетка
/opt/zimbra/bin/zmprov ma $1 zimbraMailSieveScript: 'require ["fileinto", "reject", "tag", "flag"];

# имя фильтра
if anyof (address :localpart :contains :comparator "i;ascii-casemap" ["to","cc"] "+sms",
...
}'
/opt/zimbra/bin/zmprov ga $1 zimbraMailSieveScript

Кусок скрипта вырезан, чтобы не загромождать пример. Особое внимание на два зеленых апострофа вокруг текста экспортированного скрипта - выделяем ими длинную строку от "require" до закрывающей фигурной скобки.

Для красоты и удобства, особенно если фильтр требуется применить к нескольким учеткам, подставляем вместо имени учётки переменную, и дважды - до и после операции - выводим состояние параметра zimbraMailSieveScript.

3. Полученный сценарий выполняем из-под рута! Исполнение из-под зимбры приведёт к к тому, что вся кириллица похерится.

Вот пример. Создаем простенький бурчащий фильтр :-)



zimbra@host:~$ zmprov ga учётка zimbramailsievescript
# name учётка@домен
zimbraMailSieveScript: require ["fileinto", "reject", "tag", "flag"];

# бурbur
if anyof (header :contains ["subject"] "burбур") {
    keep;
    stop;
}

root@host:/opt/zimbra/bin# ./zmprov ga учётка zimbramailsievescript
# name учётка@домен
zimbraMailSieveScript: require ["fileinto", "reject", "tag", "flag"];

# бурbur
if anyof (header :contains ["subject"] "burбур") {
    keep;
    stop;
}

Как видно, оба экспорта идентичны. А теперь попробуем импортировать (текст правим, как я писал выше).

$ cat bur.sh
# показать текущее состояние
/opt/zimbra/bin/zmprov ga $1 zimbramailsievescript
# очистить для верности
/opt/zimbra/bin/zmprov ma $1 zimbramailsievescript ""
# обновляем
/opt/zimbra/bin/zmprov ma $1 zimbramailsievescript 'require ["fileinto", "reject", "tag", "flag"];

# бурbur
if anyof (header :contains ["subject"] "burбур") {
    keep;
    stop;
}'

/opt/zimbra/bin/zmprov ga $1 zimbramailsievescript

Запуск под зимброй:

zimbra@host:~$ /tmp/bur.sh учётка
# name учётка@домен
zimbraMailSieveScript: require ["fileinto", "reject", "tag", "flag"];

# бурbur
if anyof (header :contains ["subject"] "burбур") {
    keep;
    stop;
}

# name учётка@домен
zimbraMailSieveScript: require ["fileinto", "reject", "tag", "flag"];

# ������bur
if anyof (header :contains ["subject"] "bur������") {
    keep;
    stop;
}


Некрасиво, правда?

Теперь тот же скрипт из-под рута (не буду вычищать то, что наделалось при предыдущем импорте - пусть меняется неправильный фильтр):

root@host:/tmp# ./bur.sh учётка
# name учётка@домен
zimbraMailSieveScript: require ["fileinto", "reject", "tag", "flag"];

# ??????bur
if anyof (header :contains ["subject"] "bur??????") {
    keep;
    stop;
}

# name учётка@домен
zimbraMailSieveScript: require ["fileinto", "reject", "tag", "flag"];

# бурbur
if anyof (header :contains ["subject"] "burбур") {
    keep;
    stop;
}

Результирующий скриншот не привожу, он совпадает с первым.

На сладкое. В менее наглядной форме с фильтрами позволяет работать zmmailbox. Если zmprov может импортировать только набор фильтров целиком (каждый фильтр начинается с комментария со своим именем, синтаксис можно найти в интернетах, пример - в самом первом листинге этой статьи: два фильтра "только от диспетчеров" и "test-forwards"), то zmmailbox позволяет работать с отдельными фильтрами. К сожалению, способа работать с отдельными правилами в пределах фильтра я не нашел, поэтому, если надо изменить одно правило, делаем экспорт фильтра, меняем в его тексте нужное правило, импортируем обратно. Параметры и ключи CLI zmmailbox - в манах и интернетах.

Вот как выглядит "бурбур" в исполнении zmmailbox:

zimbra@host:~$ zmmailbox -m учётка -A -z gfrl
"бурbur" active any header "subject" contains "burбур" keep stop



название фильтра
состояние (active/inactive)
условия
действия

edit: для отключения фильтра через SieveScript (соответствует inactive для gfrl) надо в начале текста добавить "disabled_":

действует:

# бурbur
if anyof (header :contains ["subject"] "burбур") {
    keep;
    stop;
}


Не действует:

# бурbur
disabled_if anyof (header :contains ["subject"] "burбур") {
    keep;
    stop;
}


13 комментариев:

  1. А не было опыта переноса фильтров из Tunderbird в Zimbra?
    Хочу переехать, но багаж тянет...
    ps какая жалость, что фильтр пишется в настройках вебклиента, но при экспорте профайла не появляется в бэкапе.

    ОтветитьУдалить
    Ответы
    1. Честно говоря, не понял вопроса. TB - почтовый клиент, Zimbra - в первую очередь почтовый сервер.
      Думаю, что можно написать какой-то конвертер, преобразующий синтаксис TB в синтаксис Zimbra, но зачем? Импорт фильтров в веб-клиенте Zimbra, как я помню, не предусмотрен: все команды, что описаны в моем посте, выполняются на сервере с администраторскими полномочиями, куда обычный пользователь доступа не имеет.
      Об экспорте какого профайла речь?

      Удалить
  2. Спасибо за ответ.
    Хочу перейти от sendmail+TB -> Zimbra+web-client(или Zimbra-desktop). соответственно как сообщения и контакты понял переносить, а вот с фильтрами, которые раскладывали сообщения по развесистой системе папок в TB, непонятки.
    Попытаюсь что-то изобразить на перле msgFilterRules.dat -> zm...
    Если бы для себя одного то и не заморачивался, надо ещё и других юзеров перевести.

    ОтветитьУдалить
    Ответы
    1. Теперь понятнее. Значит надо либо самому писать конвертер, либо искать готовый.
      Переходить на Zimbra Desktop, если ничего не изменилось за последние несколько лет, я бы не советовал: когда я ее пробовал, это была выхолощенная версия Firefox, "раскрашенная" под почтовый клиент.

      Судя по моему msgfilt..., структура там довольно простая и особых проблем с конверсией быть не должно. Каждое правило начинается с имени, поэтому разбиваем текст на блоки от ^name= до ^name= и каждый блок построчно анализируем и переводим.

      Я бы рекомендовал вручную воссоздать какой-нибудь развесистый фильтр в Zimbra, и экспортировать его текст для изучения, а остальное по аналогии.

      Удалить
    2. Я не знаю перл, но msgfilt... - типичный "ассоциативный массив" неуникальных элементов, поэтому преобразование, думаю, можно без особых проблем выполнить в AWK

      Удалить
    3. А я не знаю awk. Может заодно и изучу. :)
      Не спеша чего-нить накропаю, всё равно сервак пока временный, надо ещё поменять на постоянный, время есть.
      Просто, подумал что такая задача не у меня первого возникла, кто-то уже писал что-то подобное, ан нет, перерыл всё.
      На первый имхо zmmailbox выводит в более похожем формате к ТВ.

      Удалить
    4. awk заточен как раз под последовательную обработку файлов такого типа. Посмотрите, у меня где-то по тэгу zimbra был пост, где я рассказывал, как обрабатываю автоматическое включение и отключение переадресации.
      Впрочем, инструментовка особого значения не имеет, можно такой конвертер написать, например, и целиком на bash.

      Возможно, поможет вот эта статья с описанием возможных условий и действий https://wiki.zimbra.com/wiki/Email_Rules_Migration

      Удалить
    5. Спасибо за ссылку.
      Что-то получилось на awk, но коряво по неопытности (первый раз писал) и ещё более коряво из-за несовпадений условий в фильтрах. Где-то идет перенос правил один в один, только другими словами (80%), где-то можно подобрать близкое по смыслу (%10), остальное в принципе не переносимо , ибо и понятий таких нет. К счастью, последний случай - экзотика.

      Удалить
    6. Что-то даже не представляю, что именно может быть "нет таких понятий". Можно пример?

      Удалить
  3. например:
    у ТБ - есть дата, а есть возраст (письма) в днях!
    в Zimbra - только дата письма
    в Zimbra есть соцсети, ТБ про них не слышал.
    1 копирование у ТБ vs 2 действия(keep+fileinto) в Zimbra
    с флагами тоже чехарда: звёзды, флаги, отметки, приоритетов 5 у ТБ и 3 у Zimbra
    у TB работа с subject напрямую, у Zimbra через обобщенный header
    вложение у Zimbra отсутствует как класс у TB, зато с обсуждениями (ветки) картина обратная.
    ну и т.д...

    ОтветитьУдалить
  4. Было бы классно если бы еще написали как папки при этом создавать.
    Т.е. если надо фильтрами раскидывать письма по папкам....

    ОтветитьУдалить
    Ответы
    1. У меня нет особой необходимости в создании папок - мои пользователи используют внешних почтовых клиентов вроде аутлука и в веб-клиент зимбры лезут в крайнем случае.

      Но посмотрите, возможно zmmailbox поможет?

      Удалить
    2. Вторая ссылка по словам "man zmmailbox" дает нам

      https://www.zimbra.com/docs/os/5.0.19/administration_guide/A_app-command-line.12.9.html

      где сказано, что

      zmmailbox help folder

      показывает справку по командам работы с папками. И даже приводится несколько примеров:

      ===
      domain.example.com$ /opt/zimbra/bin/zmprov
      prov> ca user10@domain.example.com test123
      9a993516-aa49-4fa5-bc0d-f740a474f7a8
      prov> sm user10@domain.example.com
      mailbox: user10@domain.example.com, size: 0 B, messages: 0, unread: 0
      mbox user10@domain.example.com> createFolder /Archive
      257
      mbox user10@domain.example.com> createTag TODO
      64
      mbox user10@domain.example.com> createSearchFolder /unread "is:unread"
      258
      mbox user10@domain.example.com> exit
      prov>
      ===

      Удалить

Пожалуйста, воздержитесь от грубостей и персональных нападок.
Я не против матерщины, но она должна быть уместной и использоваться для выражения эмоций, а не в качестве основного средства выражения мыслей.