Автоответчики Posfix, Dovecot. Vacation - "я в отпуске".
В заметке - описание типов автоответчиков и разные способы их реализации через Postfix и Dovecot. Механизмы включения автоответчика через PostfixAdmin и RoundCube. Особенности работы автоответчика типа Vacation ("я в отпуске").
В заметке есть и вопросы, которые пока остаются без ответа. Кроме того возможны неточности - это скорее конспект-шпаргалка, чем достоверный справочник.
ВАЖНО! Эта страница является частью списка заметок о настройке почтовой системы (Postfix+Dovecot и пр.).
Родительская страница - обязательна к просмотру: Установка и настройка почтового сервера
Подробнее о конфигурации к которой относятся примеры в этой статье - см. ссылку выше.
Тем же - коротко об основных терминах (MTA, MDA, MUA и т.п.).
Эта заметка имеет характер исследования. Все упомянутые в заметке эксперименты проводились на ОС Debian. Пожалуйста не используйте слепое копирование примеров. Автор не гарантирует, что применение изложенной здесь информации не приведет к потере данных.
Содержание
- Intro
- Postfix autoreply
- PostfixAdmin - vacation
- Dovecot
- MUA и ManageSieve
- Почтовые петли
- Готовые продукты
- Источники
Intro
Есть несколько способов создать автоответчики в связке Postfix+Dovecot. В любом случае должен присутствовать механизм, который распознает когда автоответчик должен сработать (например по адресу получателя, или при наступлении определенных условий и т.п.) и механизм, который сгенерирует ответное письмо.
Postfix autoreply
Для Postfix чаще всего встречается описание автоответчика, создаваемого через таблицу транспорта, где под автоответчик должно быть выделено доменное имя. При этом ответное письмо должен создавать скрипт, запускаемый от имени системного пользователя.
Далее вольный перевод из официальной документации.
Для того, чтобы настроить автоответчик для виртуальных получателей, доставляя им при этом почту как обычно, необходимо установить правило в таблице виртуальных алиасов
/etc/postfix/main.cf
virtual_alias_maps = hash:/etc/postfix/virtual
Сама таблица алиасов может быть такой
/etc/postfix/virtual
user@domain.tld user@domain.tld, user@domain.tld@autoreply.mydomain.tld
Указанная выше строка в таблице алиасов означает: доставлять почту изначальному получателю, а также направить копию по адресу, который генерирует автоматические ответы. Адрес автоответчика может обслуживаться на другой машине, либо локально, - если создана запись в таблице транспорта, для которого вся почта направленная на
ВАЖНО! не указывайте домен автоответчика "autoreply.mydomain.tld" в "mydestination".
Настройка транспорта для автоответчика может быть, например, такой
/etc/postfix/main.cf
transport_maps = hash:/etc/postfix/transport
/etc/postfix/transport
autoreply.mydomain.tld autoreply:
/etc/postfix/master.cf
# ============================================================= # service type private unpriv chroot wakeup maxproc command # (yes) (yes) (yes) (never) (100) # ============================================================= autoreply unix - n n - - pipe flags= user=nobody argv=/path/to/autoreply $sender $mailbox
Здесь "/path/to/autoreply" - путь к скрипту, запускаемому от имени "nobody" с аргументами "отправитель" ($sender) и
PostfixAdmin - vacation
PostfixAdmin позволяет реализовать Vacation. Это автоответчик, который включается на какое-то время для определенных ящиков (например когда сотрудник в отпуске). При этом ответ одному и тому же отправителю отсылается только заданное количество раз через заданные промежутки. Впрочем можно настроить постоянную отправку ответов.
После установки PostfixAdmin много полезной информации :) можно почерпнуть здесь: /usr/share/doc/postfixadmin/
/usr/share/doc/postfixadmin/examples/VIRTUAL_VACATION/
Далее вольный перевод распакованного файла инструкции (+ много отсебятины) /usr/share/doc/postfixadmin/examples/VIRTUAL_VACATION/INSTALL.TXT
Для работы понадобятся следующие Perl-модули:
DBD::Pg или DBD::mysql (зависит от того, что будет использоваться - PostgreSQL или MySQL)
Mail::Sender
Email::Valid
MIME::Charset
Log::Log4perl
Log::Dispatch
MIME::EncWords
GetOpt::Std
Можно произвести установку через CPAN, или другой инструмент установки. Установка модуля # perl -MCPAN -e shell
cpan[1]> install Mail::Sender ... cpan[1]> install ... ... cpan[1]> exit
При установке этим способом важно правильно указывать кавычки в нужных местах (когда установщик будет задавать вопросы).
Впрочем есть способ намного проще (рекомендую именно его): # apt-get install libdbd-pg-perl
# apt-get install libdbd-mysql-perl
И остальное:
Все, указанное выше, должно быть в консоли одной строкой.
Кроме того понадобится пакет MIME Tools: # apt-get install libmime-tools-perl
Скрипт Vacation работает в качестве сервиса в, настроенного в "master.cf". Кроме того используется таблица транспорта. Когда для пользователя задействовано свойство "я в отпуске", то добавляется алиас, который направляет копии всех писем на скрипт автоответчика.
Например письмо для "user@domain.tld" будет отправлено на "user@domain.tld", А ТАКЖЕ на "user#domain.tld@autoreply.domain.tld".
Почта на "@autoreply.domain.tld" будет перехвачена скриптом "vacation.pl" и ответ будет отправлен с учетом различных настроек. По умолчанию ответ отправляется только один раз.
Настройка сводится к следующим шагам.
Создание пользователя
Необходимо создать специального локального пользователя, с именем "vacation". Пользователь будет обрабатывать потенциально опасное содержимое, - поэтому он должен быть на выделенном аккаунте.
Нельзя использовать пользователя "nobody", и конечно нельзя использовать "root" или "postfix". Пользователь не должен иметь возможность залогиниться, не должен использовать пароль и не должен иметь домашний каталог.
Создаем пользователя и группу, сразу добавив его в нее:
# groupadd -r -g 65501 vacation # useradd -r -u 65501 -g vacation -d /var/spool/vacation -s /sbin/nologin vacation
После добавления это должно выглядеть примерно так
/etc/passwd
... # vacation:*:65501:65501::0:0:Virtual Vacation:/nonexistent:/sbin/nologin vacation:x:65501:65501::/var/spool/vacation:/sbin/nologin ...
Вторая строка - как оно в итоге получилось на Debian, первая - как описано в документации
/etc/group
... # vacation:*:65501: vacation:x:65501: ...
Создание папки и копирование файлов
Нужно создать папку, доступ к которой будет иметь только пользователь "vacation":
# mkdir /var/spool/vacation
В этой папке будут храниться временные файлы.
Нужно распаковать и скопировать скрипт в созданную выше папку:
# cp /usr/share/doc/postfixadmin/examples/VIRTUAL_VACATION/vacation.pl.gz /var/spool/vacation/vacation.pl.gz # cd /var/spool/vacation/ # gunzip vacation.pl.gz # chown -R vacation:vacation /var/spool/vacation # chmod -R 700 /var/spool/vacation
Настройка транспорта
Необходимо создать новый тип транспорта в Postfix
/etc/postfix/master.cf
... vacation unix - n n - - pipe flags=Rq user=vacation argv=/var/spool/vacation/vacation.pl -f ${sender} -- ${recipient} ...
Пробелы в опциях вокруг "=" недопустимы, а перед "flags" - обязательны (минимум два).
Необходимо также указать таблицу транспорта Postfix
/etc/postfix/main.cf
... transport_maps = hash:/etc/postfix/transport ...
Файл, указанный в настройке таблицы транспорта также должен быть настроен на транспорт, который был ранее настроен в "master.cf". Домен "domain.tld", присутствующий в примере, должен быть заменен на корректный. Это может быть любой произвольный домен, но проще всего выбрать тот, который может использоваться для всех Ваших доменов.
/etc/postfix/transport
autoreply.domain.tld vacation:
Возможно придется создать запись в /etc/hosts для несуществующего домена.
/etc/hosts
... 127.0.0.1 autoreply.domain.tld ...
Далее нужно будет обработать таблицу: # postmap /etc/postfix/transport
# service postfix reload
Настройка vacation.pl
В скрипте "vacation.pl" необходимо прописать тип SQL-базы данных PostfixAdmin и параметры подключения. Для этого нужно указать значения для всех соответствующих переменных, начинающихся с "$db_", а также указать "$db_type": либо "mysql", либо "pgsql".
Кроме того, значение переменной $vacation_domain должно совпадать с указанным в файле
Произвести эти настройки можно двумя способами:
- Отредактировать файл vacation.pl.
- Создать файл
и указать в нем все настройки. Для этого нужно просто использовать синтаксис языка Perl, и указать значения всех соответствующих переменных, без ключевого слова "our"./etc/mail/postfixadmin/vacation.conf
Например так:
/etc/mail/postfixadmin/vacation.conf
$db_type = 'mysql'; $db_username = 'postfix'; $db_password = '_ПАРОЛЬ_ПОЛЬЗОВАТЕЛЯ_БАЗЫ_ДАННЫХ_'; $db_name = 'postfix'; $vacation_domain = 'autoreply.domain.tld';
Проверка работы алиасов
В зависимости от настроек, может быть несколько smtpd сервисов в файле "master.cf". Это может быть актуально, например для Amavis или систем фильтрации, в которых почта перенаправляется во внешний сервис и потом возвращается обратно.
В таких случаях алиасы могут быть задействованы более одного раза, что может приводить к дублированию запросов автоответчику. Чтобы избежать этого необходимо использовать опцию " -o receive_override_options=no_address_mappings".
Пример:
/etc/postfix/master.cf
... smtp inet n - - - 12 smtpd -o content_filter=amavis:[127.0.0.50]:10024 ^^^ Alias expansion occurs here, so we don't want it to happen again for the other smtpd daemon (below) which receives email out of amavis on port 10025. 127.0.0.1:10025 inet n - - - - smtpd -o smtpd_autorized_xforward_hosts=127.0.0.0/8 -o smtpd_client_restrictions= -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o mynetworks=127.0.0.0/8 -o receive_override_options=no_unknown_recipient_checks,no_header_body_checks,no_address_mappings ...
После изменений нужно перезагрузить конфигурацию Postfix: # service postfix reload
PostfixAdmin
Необходимо также включить поддержку Vacation в web-интерфейсе PostfixAdmin
/etc/postfixadmin/config.inc.php
... $CONF['vacation'] = 'YES'; $CONF['vacation_control'] ='YES'; $CONF['vacation_control_admin'] = 'YES'; $CONF['vacation_domain'] = 'autoreply.domain.tld'; ...
В случае ошибок или проблем, нужно в первую очередь просмотреть лог: /var/log/mail.log
Безопасность
Это программное обеспечение распространяется без гарантии и периодически в нем обнаруживаются уязвимости!
В настройке связки Postfix-PostfixAdmin нужно учитывать несколько моментов:
- Postfix требуется доступ к таблицам базы данных только на чтение
- Для Vacation требуется доступ на запись только к таблице vacation_notification, а также доступ на чтение только к таблицам alias и vacation.
- PostfixAdmin требуется полный доступ ко всем таблицам
Учитывая вышесказанное, можно использовать нескольких пользователей базы данных с разными правами.
Доступ к файловой системе для PostfixAdmin может быть ограничен только сессиями.
Персональные автоответчики
Как уже было сказано выше в подразделе Безопасность, для работы скрипта будет использоваться три таблицы, из которых только в одну нужен доступ на запись. PostfixAdmin предоставляет возможность заходить каждому владельцу ящика через web-интерфейс и самостоятельно назначать/изменять свой автоответчик. Это доступно по адресу наподобие: domain.tld/postfixadmin/users (зависит от настроек сервера).
Но насколько безопасно открывать такой доступ - каждый решает сам. Особенно после информации из упомянутого выше раздела.
Sendmail
Некоторые умельцы переделывали скрипт под использование модуля # apt-get install libmail-sendmail-perl
Dovecot
В заметке, являющейся частичным переводом из официальной документации к "Dovecot 2": Dovecot 2 - Sieve, описаны расширения плагина Pigeonhole Sieve, которые реализуют автоответчик "я в отпуске" - vacation и vacation-seconds. Второе расширение является дополнением к первому, добавляя возможность настраивать интервалы ответов в секундах. Оба включены по умолчанию в плагине Pigeonhole Sieve, который представляет из себя поддержку языка Sieve для Dovecot, пользовательский доступ к персональным правилам (ManageSieve), а также расширения и некоторые другие плагины.
В упомянутой заметке, раздел Автоответчик Vacation посвящен описанию работы автоответчика, создаваемого путем написания и подключения скрипта, пример которого приведен ту же. Кроме того описана логика работы Vacation и разобраны механизмы, которые он реализует.
КСТАТИ! Пакет из репозитариев Debian libnet-sieve-script-perl дает возможность читать, анализировать и записывать Sieve-файл сценария, организуя доступ к правилам, действиям и условиям объектов.
MUA и ManageSieve
Автоответчик может быть задействован в т.ч. и в пользовательском почтовом клиенте - MUA. Например для RoundCube существует плагин rcubevacation, с FTP, SSHFTP, Setuid backends с поддержкой .forward и SQL.
См. раздел RoundCube плагины в заметке Полный пример установки всех пакетов и настройки конфигурационных файлов.
Кроме того, для того же RoundCube, к примеру, есть плагин managesieve, который позволяет использовать ManageSieve-сервер для сохранения пользовательских скриптов + имеет визуальный интерфейс, в котором эти правила можно создавать мышкой, не вникая в суть языка Sieve. Причем правила доступны достаточно сложные, с разным количеством условий и действий по результатам этих условий. В числе прочих стандартных элементов там есть функции автоответчика. Эти правила работают даже "в отсутствие пользователя". Т.е. Dovecot обрабатывает самостоятельно письмо при приеме, а не в момент подключения MUA. Это, например означает, что если в правилах стоит "Отбросить с сообщением..." (там есть такой стандартный элемент), то письмо будет принято Postfix, помещено в очередь, но Dovecot его не доставит в папку, и оно будет удалено, после чего будет создано ответное письмо с заданным в правиле текстом, которое будет отослано от "Mail Delivery Subsystem" (с соответствующим обратным адресом) отправителю. Подмена обратного адреса позволяет избежать зацикливания (см. следующий раздел). Обратный адрес в письме от автоответчика встречается в заголовке в виде /etc/dovecot/conf.d/20-lmtp.conf
protocol lmtp {...}
Тестирование упомянутого плагина RoundCube managesieve с настроенным автоответчиком в пределах одного домена показало, что даже письма отправленные на "Mail Delivery Subsystem" (address@domain.tld), с двумя встречными автоответчиками к зацикливанию не приводило (письмо просто терялось). Письмо отправленное из "чистого" внешнего ящика на автоответчик несколько раз подряд, приводило к его постоянному срабатыванию.
КСТАТИ! В репозитариях Debian доступен пакет: php-net-sieve.
Должен сказать, что когда я добрался до ManageSieve, то у меня отпало всякое желание изучать другие механизмы. :) Настолько легко, просто и гибко можно всё делать с использованием этого плагина. К счастью это произошло в самом конце моих исследований и я успел все-же кое-что изучить до того, как это желание пропало. :)
См. также заметку Dovecot 2 - Sieve и разделы в ней: ManageSieve сервер, и Автоответчик Vacation.
Почтовые петли
Что будет если кто-то с адреса, на котором настроен автоответчик пошлет письма на другой адрес, на котором так-же настроен автоответчик? Или если в адресе отправителя на каком-то из этапов появится адрес получателя, при этом на получателе будет установлен автоответчик?
Произойдет зацикливание. Очевидно, это проблема, которая должна быть решена в механизме настройки автоответчиков.
Одним из способов решения этой проблемы, является настройка автоответчика на определенное количество ответов одному отправителю с промежутками "молчания".
Еще одним решением этой проблемы, будет отправка ответного сообщения совершенно с другого адреса, без упоминания изначального получателя в заголовках. При этом адрес самого автоответчика должен быть "blackhole", - подвергаться проверке внешними MTA (иначе некоторые из них не примут от него письмо), но само письмо должно уничтожаться. Альтернативой "blackhole" может быть отсылка кода 550 отправителю только на реальное письмо, но прием проверочной "пустышки".
Кроме того, автоответчик должен сравнивать отправителя и получателя на предмет их совпадения. По-видимому есть еще некоторые не упомянутые здесь тонкости в настройке автоответчиков, до которых я просто не добрался.
Готовые продукты
Есть отличные готовые продукты, реализующие автоответчики и управление ими. Мне, например понравился "MSH Autoresponder", ссылка на который есть на странице Add-on на официальном сайте Postfix (см. раздел "Источники" ниже). Он состоит из серверного и десктопного модуля (под Windows и Linux), при этом платный только серверный модуль - $99.
Там же есть ссылка на "GNARWL - LDAP", который как видно из названия базируется на LDAP. Этот пакет присутствует в репозитариях Debian (gnarwl).
Наверное в этой сфере простор для творчества далеко не исчерпан. :)
Источники
Источники информации и ссылки перечислены на отдельной странице, указанной внизу главной страницы темы:
Установка и настройка почтового сервера
2018-11-03 в 11:16:09
https://clck.ru/EbTnZ - аналог airpods
Беспроводные наушники AirPods. Со скидкой 53% Чистая магия.
AirPods – Чистый звук. Отличная слышимость! Наушники обеспечивают высококачественное воспроизведение аудио в формате AAC; А чтобы вас лучше слышали, сдвоенные направленные микрофоны уменьшают уровень фоновых шумов во время звонков; Наушники быстро настраиваются и подключаются к любому телефону.
- 4 часа прослушивания музыки и разговоров без подзарядки;
- До 120 часов в режиме ожидания
Наушники точно Вам понравятся и станут отличным дополнением к вашему стилю!
http://playfee.ru/2054f605 - беспроводные наушники airpods
2018-11-04 в 14:08:00
https://clck.ru/EUf6D - женские наручные часы fossil
РАСПРОДАЖА БРЕНДОВЫХ ЧАСОВ. СКИДКА ДО 50% НА ВЕСЬ КАТАЛОГ! НАЖМИТЕ НА ССЫЛКУ, ЧТОБЫ УЗНАТЬ О НИХ ПОДРОБНЕЕ
https://clck.ru/EUf6D - часы guess steel цена
Оплата часов после получения на руки