Содержание: как правильно экспортировать и импортировать фильтры обработки сообщений из учетных записей зимбры.
Веб-интерфейс позволяет создавать фильтры для обработки сообщений. Они сохраняются в параметре zimbraMailSieveScript.
Например:
Веб-интерфейс позволяет создавать фильтры для обработки сообщений. Они сохраняются в параметре 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;
}
А не было опыта переноса фильтров из Tunderbird в Zimbra?
ОтветитьУдалитьХочу переехать, но багаж тянет...
ps какая жалость, что фильтр пишется в настройках вебклиента, но при экспорте профайла не появляется в бэкапе.
Честно говоря, не понял вопроса. TB - почтовый клиент, Zimbra - в первую очередь почтовый сервер.
УдалитьДумаю, что можно написать какой-то конвертер, преобразующий синтаксис TB в синтаксис Zimbra, но зачем? Импорт фильтров в веб-клиенте Zimbra, как я помню, не предусмотрен: все команды, что описаны в моем посте, выполняются на сервере с администраторскими полномочиями, куда обычный пользователь доступа не имеет.
Об экспорте какого профайла речь?
Спасибо за ответ.
ОтветитьУдалитьХочу перейти от sendmail+TB -> Zimbra+web-client(или Zimbra-desktop). соответственно как сообщения и контакты понял переносить, а вот с фильтрами, которые раскладывали сообщения по развесистой системе папок в TB, непонятки.
Попытаюсь что-то изобразить на перле msgFilterRules.dat -> zm...
Если бы для себя одного то и не заморачивался, надо ещё и других юзеров перевести.
Теперь понятнее. Значит надо либо самому писать конвертер, либо искать готовый.
УдалитьПереходить на Zimbra Desktop, если ничего не изменилось за последние несколько лет, я бы не советовал: когда я ее пробовал, это была выхолощенная версия Firefox, "раскрашенная" под почтовый клиент.
Судя по моему msgfilt..., структура там довольно простая и особых проблем с конверсией быть не должно. Каждое правило начинается с имени, поэтому разбиваем текст на блоки от ^name= до ^name= и каждый блок построчно анализируем и переводим.
Я бы рекомендовал вручную воссоздать какой-нибудь развесистый фильтр в Zimbra, и экспортировать его текст для изучения, а остальное по аналогии.
Я не знаю перл, но msgfilt... - типичный "ассоциативный массив" неуникальных элементов, поэтому преобразование, думаю, можно без особых проблем выполнить в AWK
УдалитьА я не знаю awk. Может заодно и изучу. :)
УдалитьНе спеша чего-нить накропаю, всё равно сервак пока временный, надо ещё поменять на постоянный, время есть.
Просто, подумал что такая задача не у меня первого возникла, кто-то уже писал что-то подобное, ан нет, перерыл всё.
На первый имхо zmmailbox выводит в более похожем формате к ТВ.
awk заточен как раз под последовательную обработку файлов такого типа. Посмотрите, у меня где-то по тэгу zimbra был пост, где я рассказывал, как обрабатываю автоматическое включение и отключение переадресации.
УдалитьВпрочем, инструментовка особого значения не имеет, можно такой конвертер написать, например, и целиком на bash.
Возможно, поможет вот эта статья с описанием возможных условий и действий https://wiki.zimbra.com/wiki/Email_Rules_Migration
Спасибо за ссылку.
УдалитьЧто-то получилось на awk, но коряво по неопытности (первый раз писал) и ещё более коряво из-за несовпадений условий в фильтрах. Где-то идет перенос правил один в один, только другими словами (80%), где-то можно подобрать близкое по смыслу (%10), остальное в принципе не переносимо , ибо и понятий таких нет. К счастью, последний случай - экзотика.
Что-то даже не представляю, что именно может быть "нет таких понятий". Можно пример?
Удалитьнапример:
ОтветитьУдалитьу ТБ - есть дата, а есть возраст (письма) в днях!
в Zimbra - только дата письма
в Zimbra есть соцсети, ТБ про них не слышал.
1 копирование у ТБ vs 2 действия(keep+fileinto) в Zimbra
с флагами тоже чехарда: звёзды, флаги, отметки, приоритетов 5 у ТБ и 3 у Zimbra
у TB работа с subject напрямую, у Zimbra через обобщенный header
вложение у Zimbra отсутствует как класс у TB, зато с обсуждениями (ветки) картина обратная.
ну и т.д...
Было бы классно если бы еще написали как папки при этом создавать.
ОтветитьУдалитьТ.е. если надо фильтрами раскидывать письма по папкам....
У меня нет особой необходимости в создании папок - мои пользователи используют внешних почтовых клиентов вроде аутлука и в веб-клиент зимбры лезут в крайнем случае.
УдалитьНо посмотрите, возможно zmmailbox поможет?
Вторая ссылка по словам "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>
===