Чужой опыт экономит время и увеличивает шансы для удачи

Автоответчики Posfix, Dovecot. Vacation - "я в отпуске".

В заметке - описание типов автоответчиков и разные способы их реализации через Postfix и Dovecot. Механизмы включения автоответчика через PostfixAdmin и RoundCube. Особенности работы автоответчика типа Vacation ("я в отпуске").
В заметке есть и вопросы, которые пока остаются без ответа. Кроме того возможны неточности - это скорее конспект-шпаргалка, чем достоверный справочник.

ВАЖНО! Эта страница является частью списка заметок о настройке почтовой системы (Postfix+Dovecot и пр.).
Родительская страница - обязательна к просмотру: Установка и настройка почтового сервера

Подробнее о конфигурации к которой относятся примеры в этой статье - см. ссылку выше.
Тем же - коротко об основных терминах (MTA, MDA, MUA и т.п.).

Эта заметка имеет характер исследования. Все упомянутые в заметке эксперименты проводились на ОС Debian. Пожалуйста не используйте слепое копирование примеров. Автор не гарантирует, что применение изложенной здесь информации не приведет к потере данных.

Это скорее конспект-шпаргалка, чем достоверный справочник. Кроме ответов здесь могут присутствовать вопросы.

Содержание

  1. Intro
  2. Postfix autoreply
  3. PostfixAdmin - vacation
  4. Dovecot
  5. MUA и ManageSieve
  6. Почтовые петли
  7. Готовые продукты
  8. Источники

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", попадает в некоторый скрипт, который создает автоматический ответ для отправителя.

ВАЖНО! не указывайте домен автоответчика "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) и "адрес получателя" ($mailbox), например: "user@domain.tld".

PostfixAdmin - vacation

PostfixAdmin позволяет реализовать Vacation. Это автоответчик, который включается на какое-то время для определенных ящиков (например когда сотрудник в отпуске). При этом ответ одному и тому же отправителю отсылается только заданное количество раз через заданные промежутки. Впрочем можно настроить постоянную отправку ответов.

После установки PostfixAdmin много полезной информации :) можно почерпнуть здесь: /usr/share/doc/postfixadmin/ . Но главный интерес представляет каталог /usr/share/doc/postfixadmin/examples/VIRTUAL_VACATION/ . Там есть инструкция по установке, упакованная в архив "INSTALL.TXT.gz".

Далее вольный перевод распакованного файла инструкции (+ много отсебятины)
/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, или другой инструмент установки. Установка модуля Mail::Sender и др. модулей может выглядеть примерно так (в консоли):
# perl -MCPAN -e shell

cpan[1]> install Mail::Sender
...
cpan[1]> install ...
...
cpan[1]> exit

При установке этим способом важно правильно указывать кавычки в нужных местах (когда установщик будет задавать вопросы).

Впрочем есть способ намного проще (рекомендую именно его):
# apt-get install libdbd-pg-perl - для PostgreSQL

# apt-get install libdbd-mysql-perl - для MySQL

И остальное:

# apt-get install libmail-sender-perl libemail-valid-perl libmime-perl libmime-charset-perl liblog-log4perl-perl liblog-dispatch-perl libmime-encwords-perl libgetopt-argvfile-perll

Все, указанное выше, должно быть в консоли одной строкой.

Кроме того понадобится пакет 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 и выполнить перезагрузку Postfix для вступления изменений в силу: # service postfix reload .

Настройка vacation.pl

В скрипте "vacation.pl" необходимо прописать тип SQL-базы данных PostfixAdmin и параметры подключения. Для этого нужно указать значения для всех соответствующих переменных, начинающихся с "$db_", а также указать "$db_type": либо "mysql", либо "pgsql".

Кроме того, значение переменной $vacation_domain должно совпадать с указанным в файле "/etc/postfix/transport".

Произвести эти настройки можно двумя способами:

  1. Отредактировать файл vacation.pl.
  2. Создать файл /etc/mail/postfixadmin/vacation.conf и указать в нем все настройки. Для этого нужно просто использовать синтаксис языка Perl, и указать значения всех соответствующих переменных, без ключевого слова "our".
  3. Например так:

    /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 нужно учитывать несколько моментов:

  1. Postfix требуется доступ к таблицам базы данных только на чтение
  2. Для Vacation требуется доступ на запись только к таблице vacation_notification, а также доступ на чтение только к таблицам alias и vacation.
  3. PostfixAdmin требуется полный доступ ко всем таблицам

Учитывая вышесказанное, можно использовать нескольких пользователей базы данных с разными правами.

Доступ к файловой системе для PostfixAdmin может быть ограничен только сессиями.

Персональные автоответчики

Как уже было сказано выше в подразделе Безопасность, для работы скрипта будет использоваться три таблицы, из которых только в одну нужен доступ на запись. PostfixAdmin предоставляет возможность заходить каждому владельцу ящика через web-интерфейс и самостоятельно назначать/изменять свой автоответчик. Это доступно по адресу наподобие: domain.tld/postfixadmin/users (зависит от настроек сервера).

Но насколько безопасно открывать такой доступ - каждый решает сам. Особенно после информации из упомянутого выше раздела.

Sendmail

Некоторые умельцы переделывали скрипт под использование модуля Mail::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" (с соответствующим обратным адресом) отправителю. Подмена обратного адреса позволяет избежать зацикливания (см. следующий раздел). Обратный адрес в письме от автоответчика встречается в заголовке в виде "Return-Path: <>", а в поле "From: " адрес берется из параметра настройки postmaster_address = address@domain.tld используемого агента доставки (для lmtp этот параметр указывается в файле /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).

Наверное в этой сфере простор для творчества далеко не исчерпан. :)

Источники

Источники информации и ссылки перечислены на отдельной странице, указанной внизу главной страницы темы:
Установка и настройка почтового сервера

Рекламные ссылки:
Вопросы по теме статьи (просьба - без личностей), - присутствует премодерация:
   - регистрироваться НЕ обязательно! -

Комментарий будет опубликован только после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)