Как стать автором
Обновить

Добавление специальных предложений для клиентов в почтовых сообщениях средствами Zentyal + Postfix + alterMIME

Время на прочтение 3 мин
Количество просмотров 2.9K
Добрый день, вечер или ночь, все зависит от времени суток в который вам довелось прочитать мою статью.

Отделу продаж потребовалось в переписке с клиентами отправлять спец предложения по email без рутиной работы. В двух словах изложу, что и как получилось.

Исходные данные:
— почтовый сервер на базе Zentyal 5.0.1(postfix + dovecot + openDKIM и т.д.)
— alterMIME v0.3.10
— HTML шаблон с предложением.

Сразу скажу спасибо статье Унифицированная динамическая корпоративная подпись с логотипом Postfix + alterMIME, а так же комментариям, из неё подчеркнул основную идею.

Первым делом в файл master.cf внесем изменения, а именно:

Заменим:

smtp      inet  n       -       y       -       -       smtpd

На:

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=dfilt:
dfilt     unix    -       n       n       -       -       pipe
  flags=Rq user=filter argv=/etc/postfix/disclaimer.sh -f ${sender} -- ${recipient}

Далее создадим структуру каталогов:

useradd -r -c "Postfix Filters" -d /var/spool/filter filter
mkdir /var/spool/filter
mkdir /etc/postfix/disclaimer
chown filter:filter /var/spool/filter
chmod 750 /var/spool/filter
 

Теперь основное, создадим исполняемый файл /etc/postfix/disclaimer.sh с содержимым:

#!/bin/bash

# Рабочий каталог
INSPECT_DIR=/var/spool/filter
# Ссылка на sendmail
SENDMAIL=/usr/sbin/sendmail
# Список email отдела продаж
DISCLAIMER_ADDRESSES=/etc/postfix/disclaimer/addresses

EX_TEMPFAIL=75
EX_UNAVAILABLE=69

trap "rm -f in.$$" 0 1 2 3 15

cd $INSPECT_DIR || { echo $INSPECT_DIR does not exist; exit
$EX_TEMPFAIL; }

cat > in.$$ || { echo Cannot save mail to file; exit $EX_TEMPFAIL; }

# Определим адрес назначения (для точно чтобы не слать вложения локальным пользователям)
from_address=`grep "From:" in.$$ | cut -d "<" -f 2 | cut -d ">" -f 1  | sed 's/^From: //g' | awk '{print $1}' | cut -d "@" -f 2 | grep -v ^h= | grep -v ^To`

to_dom=`echo $to_address |cut -d "@" -f 2`
my_domain="example.org"

# Применяем правило только для отдела продаж
if [ `grep -wi ^${from_address}$ ${DISCLAIMER_ADDRESSES}` ]; then
# Определяем что шлем не локальным клиентам
if [ "$from_address" = "example.org" ]; then


# Прикреплять только в HTML сообщения
ContentTypeFirst=`grep -m 1 '^Content-Type: ' in.$$ | cut -d " " -f 2 | cut -d ";" -f 1`
ContentTypeMixed=`grep -m 2 '^Content-Type: ' in.$$ | cut -d " " -f 2 | cut -d ";" -f 1 | tail -n 1`

isHTML=true

    if [ "$ContentTypeFirst" = "" ] || [ "$ContentTypeFirst" = "text/plain" ]; then isHTML=false; fi
    if [ "$ContentTypeFirst" = "multipart/mixed" ] && [ "$ContentTypeMixed" = "text/plain" ]; then isHTML=false; fi
    if [ "$ContentTypeFirst" = "multipart/mixed" ] && [ "$ContentTypeMixed" != "text/html" ] && [ "$ContentTypeMixed" != "multipart/related" ] && [ "$ContentTypeMixed" != "multipart/alternative" ]; then isHTML=false; fi

            if $isHTML ; then
            /usr/bin/altermime --input=in.$$ \
                --disclaimer=/etc/postfix/disclaimer/disclaimer.txt \
                --disclaimer-html=/etc/postfix/disclaimer/disclaimer.html \
                --xheader="X-Copyrighted-Material: Please visit https://www.example.org/privacy.htm" || \
                { echo Message content rejected; exit $EX_UNAVAILABLE; }
            fi
fi
fi

$SENDMAIL -oi "$@" < in.$$

exit $?

Теперь по порядку:

DISCLAIMER_ADDRESSES — в данный файл заносим адреса отдела продаж, в принципе если у вас домен можно автоматизировать, пример есть в статье откуда я брал идею.

from_address, to_dom и my_domain — требуется для создания фильтра, чтобы не применять это правило для других отделов и не слать письма с предложениями самим себе.

disclaimer.html — html файл с предложениями, включая картинки т.п.

В принципе, если есть желание, модифицировать можно до бесконечности, главное задача, для которой это необходимо.

P.S. Данное решение можно было реализовать и через amavisd-new, но от этой идеи пришлось отказаться, так как нельзя в тело письма вставить xheader, но это тема для другой статьи.
Теги:
Хабы:
+6
Комментарии 0
Комментарии Комментировать

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн