четверг, 24 мая 2012 г.

Почтовый адрес с автоответом в Exchange

Для решения одной из вредных^Wбизнес задач потребовалось сделать почтовый адрес, при отправлении письма на который генерировался бы автоответ с полезной информацией. В Exchange данный функционал не предусмотрен.

Функционал генерирования автоответов в Exch не представлен, автоответ почтового ящика слишком сильно ограничен, да и задачи у него немного другие. Для решенения воспользуемся маленькой виртуальной машиной с Linux(Debian\CentOS по вкусу) на борту. Конкретно будет использоваться Exim+Procmail, наружу их лучше не выставлять, т.к. opennet пестрит проблемами с безопасностью Exim.

В самом начале необходимо выбрать почтовый домен, который будет использоваться для генерации адресов и пересылки почты с Exch до Exim. Создаем коннектор и направляем его на linux. Для каждого адреса добавляем контакт, который будет пересылать почту на Linux. Основная причина - возможность добавления контакта в группы рассылки и прохождение почты через систему аудита Exch.

В качестве факультативного материала необходимо почитать How To Do Autoreplies Without The World Hating You

Задумка очень простая: для каждого нового адреса создаем скрипт, содержащий сценарий procmail. Имя файла совпадает с первой частью адреса, пользователь, от которого запускается exim должен иметь право чтения этих конфигов. В конфиг exim.conf добавляем информацию в два раздела, создавая маршрут для доставки почты и правила её обработки

begin routers:
...
virtual_autoreply:
  driver = accept
  require_files = +/etc/exim4/procmailrcs/$local_part : /usr/bin/procmail
  transport = procmail_virtual
begin transports
...
procmail_virtual:
  driver = pipe
  command = "/usr/bin/procmail -m /etc/exim4/procmailrcs/$local_part 2>/dev/null"
  freeze_exec_fail
  return_path_add
  delivery_date_add
  envelope_to_add
  user = Debian-exim
  group = mail
  initgroups

Файлы сценария procmail будут иметь примерно такой вид. Последний фильтр с /dev/null необходим на случай условности предыдущих фильтров.

:0
* !^From:.*(contoso.ru|hasbro.com|job.ru)
* !^From: nobody@host.superjob.ru
* !^Subject:.*Re
* !^Subject:.*Fw
* !^X-Loop: no-reply@contoso.ru
* ^Subject.*
| (formail -r -A"X-Loop: no-reply@contoso.ru" -I "Subject: =?koi8-r?Q?=CF=D4=D7=C5=D4 =CE=C1 =F7=C1=DB=C5 =D2=C5=DA=C0=CD=C5?=" -I "Content-Type: text/plain; charset=koi8-r" -I "Content-Transfer-Encoding: quoted-printable" ; cat /home/autoreply/vacante6.txt) | sendmail -t -f no-reply@contoso.ru

:0
/dev/null

Кратко рассмотрим файл конфигурации procmail.

Файл конфигурации состоит из последовательно проверяемых "рецептов", каждый рецепт начинается строкой

:0

после которой может идти один или несколько флагов. Наиболее интересны флаги W(не генерировать отбойник при возникновении проблем) и c(в данный рецепт передается копия сообщения, при совпадении условия копия сообщения передается в следующий по порядку рецепт).

После этого идут последовательно проверяемые условия, каждое условие начинается с знака "*". После символа "*" идет регулярное выражение, применяемое к каждой строчке заголовка сообщения. Условия проверяются последовательно, при несовпадении в одном из условий данный рецепт считается не подходящим и сообщение передается на обработку в следующий рецепт.

Если все условия выполнены, выполняется действие, описываемое специальным символом после условия. Сами условия состоят из регулярных выражений, через которые прогоняется заголовок письма. Соответственно можно проверить поля From, Subject... Сразу хочу сказать, что есть разные поля From с ":" и без оного, и еще есть тонкости с ответом на письмо, отправленное на группу рассылки

После проверки всех условий над письмом может совершаться одно из действий, а именно:

  • "!" - перенаправить сообщение по указанному после знака действия адресу. Строка после команды рассматривается как команда, которой передается на вход письмо. Т.е. можно написать статический адрес вроде mail@softline.ru, а можно и скрипт, генерирующий адрес из телп письма. Скрипт заключается в обратные кавычки `
  • "|" - конвеер, передать сообщение на обработку в скрипт
  • <<file>> - дописать сообщение в файл, используется в терминирущем правиле для отправки сообщения в /dev/null.

Про синтаксис procmail, formail и exim можно найти много в интернете.

Кроме статического автоответа еще можно сделать (и сделано) отправку файлов или динамически генерируемое письмо.


Комментариев нет:

Отправить комментарий