Добрый день, вечер или ночь, все зависит от времени суток в который вам довелось прочитать мою статью.
Отделу продаж потребовалось в переписке с клиентами отправлять спец предложения по 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, но это тема для другой статьи.
Автор: Teon_501