Zimbra — Генерация HTML подписи на основе данных LDAP

Введение


В Веб-Админке Zimbra отсутствуют инструменты для генерации подписи к письмам. Перелопатив кучу мануалов — понял, что ни один из Них меня не устраивает.

Задача кажется тривиальной, но решения в лоб — найти сразу не удалось. Надеюсь, эта статья поможет кому-то сэкономить кучу времени и сил.

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

Системные требования


система: Linux Ubuntu 18.04
версия Zimbra: Zimbra 8.8.15

Скрипт генерации HTML подписи


Начнем сразу с самого скрипта… ниже дам пояснения и описание работы скрипта.

#!/bin/bash
# created by Parfentiev Aleksey, Shultz Denis
 
SRC_LOGO="https://mail.domen.ru/home/it@domen.ru/Briefcase/Logo/tl_logo.png"
SRC_TXT="ЛОГО организации"
SIGN_NAME="Подпись_Организации"
DOMEN="domen.ru"
 
# Check for run as zimbra user
ID=`id -u -n`
if [ x$ID != "xzimbra" ]; then
   echo "Please run as ZIMBRA user"
   echo "Exiting..."
   exit 1
fi
 
# Obtain all user accounts in $DOMEN (template: Family.IN@domen.com or family.in_jr@domen.com)
accounts=`zmaccts | grep 'active'| grep $DOMEN | grep -P "(\b[A-z]+)\.(\D{2,5}@).*" | awk '{print $1}'`
 
for ac in $accounts; do
  echo -ne "Checking account: $ac \t"
 
    # Try delete signature
    /opt/zimbra/bin/zmprov dsig $ac $SIGN_NAME
 
    echo -ne "Setting signature... "
 
    # Obtain signature from LDAP user atributes
 
    declare -A arr
    mapfile -t ARRAY < <(/opt/zimbra/bin/zmprov ga $ac | egrep "(^cn|^title|^mobile|^zimbraPrefFromAddress|^st|^l|^street|^telephoneNumber|^pager|^postalCode)" | sed 's/: /:/')
    for sgn in "${ARRAY[@]}" ; do
        KEY=${sgn%%:*}
        VALUE=${sgn#*:}
        arr[$KEY]=$VALUE
    done
 
    HTML='<div style="display: inline-block;" data-mce-style="display: inline-block;">'
    HTML+='<br><table style="width: 550px; border: 0; border-top: 1px #e0e0e0 solid;" align="left" data-mce-style="width: 550px; border: 0; border-top: 1px #e0e0e0 solid;">'
    HTML+='<tbody>'
    HTML+='<tr><td style="width: 87px; padding: 5px;" valign="middle" align="center" data-mce-style="width: 87px; padding: 5px;">'
    HTML+='<img src="'$SRC_LOGO'"  alt="'$SRC_TXT'"></td>'
    HTML+='<td style="font-size: 10pt; color: #808080; font-family: georgia, serif; width: 389px;" data-mce-style="font-size: 10pt; color: #808080; font-family: georgia, serif; width: 389px;">'
    HTML+="${arr['cn']} - ${arr['title']}   <br>тел: ${arr["telephoneNumber"]} доб.${arr["pager"]}   моб: ${arr["mobile"]}"
    HTML+="<br>e-mail: ${ac} <br>${arr['postalCode']} ${arr['st']} ${arr['l']} ${arr['street']}</td></tr></tbody></table></div>"
    unset arr
 
    # Set signature for account $ac and obtain signature id account
    sign_id=$(/opt/zimbra/bin/zmprov csig $ac $SIGN_NAME zimbraPrefMailSignatureHTML "$HTML")
    # Obtain delegates mailbox accounts
    mapfile -t ARRAY < <(/opt/zimbra/bin/zmprov gid $ac name | cut -d " "  -f 3-7 | grep -P '[^.*]')
    for gid in "${ARRAY[@]}" ; do
    # Set defalt signature position (outlook (before) or internet (after attachments)) for each account
    /opt/zimbra/bin/zmprov modifyIdentity $ac "$gid" zimbraPrefDefaultSignatureId $sign_id zimbraPrefForwardReplySignatureId $sign_id zimbraPrefMailSignatureStyle outlook
    done
    echo "done!"

передаем данный скрипт на хостовую машину, любым Вам известным способом.

Помещаем в папку /usr/local/bin… или создаем файл zm_sign_html.sh по этому пути и copy/paste…

sudo -i
# ввести пароль от sudo user
# создать файл  /usr/local/bin/zm_sign_html.sh
touch /usr/local/bin/zm_sign_html.sh
# открыть любым редактором copy/paste
# сделать исполняемым
chmod 755 /usr/local/bin/zm_sign_html.sh

Описание работы скрипта


  1. проверяем запущен ли скрипт от пользователя zimbra ( команды CLI выполняются от пользователя zimbra).
    возможно сделать и по-другому… использовать команду runuser и запускать скрипт из-под root.
  2. получаем все активные пользовательские аккаунты в нужном домене.

    У нас в организации приняты следующие шаблоны именования пользователей:

    family.in@domen.ru или family.in_jr@domen.ru

    где: family — фамилия Пользователя транслитерацией.
    in — инициалы Пользователя
    in_jr — инициалы Пользователя с дополнением (для Пользователей у которых совпали Фамилия.Инициалы).

    Отсылка к статье на Хабре: Как я внедрял Zimbra

    Соответственно, ящик ivanov.aa@domen.ru попадет в список для генерации подписи, а служебный ящик zavod@domen.ru будет проигнорирован.

    За это отвечает регулярка grep -P "(\b[A-z]+)\.(\D{2,5}@).*" в строке скрипта

    accounts=`zmaccts | grep 'active'| grep $DOMEN | grep -P "(\b[A-z]+)\.(\D{2,5}@).*" | awk '{print $1}'`
    

  3. удаляем подпись с Названием SIGN_NAME ( если такой подписи нет — будет ошибка в этой CLI команде, и скрипт пойдет далее )
  4. Перебираем Пользователей.

    Забираем нужные поля для текущего Пользователя с LDAP, собираем в массив, собираем HTML подпись (переменная HTML в скрипте).

    
    mapfile -t ARRAY < <(/opt/zimbra/bin/zmprov ga $ac | egrep "(^cn|^title|^mobile|^zimbraPrefFromAddress|^st|^l|^street|^telephoneNumber|^pager|^postalCode)" | sed 's/: /:/')
    

    Здесь, как видно я собираю данные из полей: cn, title и т.д.

    Название полей можно посмотреть в Админке:


  5. Получаем аккаунты делегированных ящиков (отправить от имени, отправить как) для текущего Пользователя.

    Чтобы было понятнее для чего это делается, покажу на Скриншоте (Настройки — Подписи).



    Допустим, у Вас есть доп профиль (здесь он называется «Ит отдел», в которых настроена возможность «отправлять от Имени» или «Отправлять как»).

    Тогда мы получаем все доп. профили и для Них устанавливаем подпись.

    Расположение подписи настраивается так:

    /opt/zimbra/bin/zmprov modifyIdentity $ac "$gid" zimbraPrefDefaultSignatureId $sign_id zimbraPrefForwardReplySignatureId $sign_id zimbraPrefMailSignatureStyle outlook

    Последний параметр zimbraPrefMailSignatureStyle: outlook — перед вложенными сообщениями, internet — после…

    Сами профили настраиваем в Настройки — Учетные Записи:


  6. устанавливаем подпись.
  7. переходим к следующему Пользователю.

Описание параметров


SRC_LOGOmail.domen.ru/home/it@domen.ru/Briefcase/Logo/tl_logo.png» — ссылка на логотип организации.

Создаём ящик отдела ИТ (it@domen.ru). В Zimbra есть встроенный сервис хранения документов (Портфель). В ящике отдела ИТ в Портфеле, создаем папку LOGO, в неё помещаем логитип Нашей организации.

Разрешаем доступ к данной папке.

image

Теперь логотип Нашей организации доступен по адресу:
mail.domen.ru/home/it@domen.ru/Briefcase/Logo/tl_logo.png

SRC_TXT=«ЛОГО Организации» — текстовое пояснение, если отключена загрузка изображений в браузере.

SIGN_NAME=«Организация» — Название подписи ( можно транслитом, можно по-русски).

DOMEN=«domen.ru» — почтовый домен, для которого будем устанавливать подписи.

Автоматизация выполнения


Настраиваем crontab от пользователя zimbra:

sudo su zimbra
crontab -e

Будьте внимательны, в crontabe данного Пользователя выполняются фоновые задания zimbra (между секциями ZIMBRA_START и ZIMBRA_END).

Дописываем Наше задание в конец файла… не забываем оставить пустую строку в конце!

Запускаем скрипт /usr/local/bin/zimbra/zm_sign_html.sh каждый день в 6:00.

Пример файла crontab:

#
35 3 * * * /opt/zimbra/bin/zmcbpadmin --cleanup >/dev/null 2>&1
# ZIMBRAEND -- DO NOT EDIT ANYTHING BETWEEN THIS LINE AND ZIMBRASTART
0 6 * * * /usr/local/bin/zm_sign_html.sh

Заключение


На этом пока все. Можно дописать отсылку на e-mail. Если это кому-то необходимо — дополню.
Пишите в комментах…

Всем хорошего настроения! И не болеть!

Ссылки на используемые статьи


phas13.blogspot.com/search/label/Zimbra
wiki.zimbra.com/wiki/Setting_automatic_Default_Signature

P.S.: Отдельная благодарность Шульц Денису (tlk234) за помощь в отладке скрипта и работе с документацией Zimbra CLI.

Similar posts

Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 6

    0
    В своё время реализовывал в зимбре подобный механизм формирования подписи. Вопрос с логотипом (он был небольшой) реализовал в виде хранения в теле письма в Base64.
      0
      Тогда будет проблема…
      Все письма будут помечены значком («скрепка») — вложение.
      Чтобы избежать этого логотип вставлен в виде ссылки.
        0
        Если сделать так, то не будет пометки вложения.
        <img src="data:image/gif;base64,R0lGODlhEAAOALMAAOazToeHh0tLS/7LZv/0j
        vb29t/f3//Ub//ge8WSLf/rhf/3kdbW1mxsbP//mf///yH5BAAAAAAALAAAAAAQAA4AAA
        Re8L1Ekyky67QZ1hLnjM5UUde0ECwLJoExKcppV0aCcGCmTIHEIUEqjgaORCMxIC6e0Cc
        guWw6aFjsVMkkIr7g77ZKPJjPZqIyd7sJAgVGoEGv2xsBxqNgYPj/gAwXEQA7" width="16"
        height="14" alt="внедренная иконка папки"/>
          0
          Да, согласен.
          Вчера как раз обсудили с коллегой этот вариант.
          Если вписываетесь в ограничения по кодированию, то наверное этот вариант будет предпочтительнее. Иконка с лого тогда внедрена внутрь письма.
        0
        Спасибо.
        Попробуйте Sogo вместо зимбры. Из минусов — нет аналога Диска в Зимбра. Но можно решить внедрением того же Nextcloud-а. А в остальном ничем не хуже — есть возможность шарить папки, адресные книги, задачи etc.
        Nightly-сборки Sogo опакечены.
        Зы.У меня к почте прикручены Apache Solr + Apache Tika + Tesseract OCR для распознавания картинок и их индексирования для быстрого поиска.
          0
          Спасибо.
          Буду иметь в виду, что есть такой проект.
          Nextcloud используем через zimlet Zimbra WebDAV Client

          PS: Понятно, что переходить с полностью отлаженной и стабильно работающей системы — никто не будет.
          Работаем с Zimbra ( редакция OpenSource) уже 9 лет.

        Only users with full accounts can post comments. Log in, please.