Шлюз email в xmpp(jabber)


При попытке внедрения учета заявок в ИТ службу на основе GLPI. потребовалось сделать шлюз из почты в жаббер, т.е. чтобы письмо отправленное на user@jabber.domain пользоватеям приходило как обычное сообщение.

При этом необходимо чтобы пользователь для этого ничего не делал. Т.е. без всяких регистраций на транспортах и т.д.

Готовых решений сходу найти не получилось, пришлось изобретать свой велосипед с квадратными колесами самому думать, как бы это сделать не особо напрягая мозги вспоминая программирование, т.к. последнее время дальше grep'a, sed'a и awk хожу очень редко.

Получилась следующая конструкция:

  1. Вся почта для домена jabber.mydomain сыпется в один ящик mail2xmpp
  2. fetchmail периодически смотрит этот ящик и передает письма скрипту mail2xmpp.sh:
    1. если скрипт нормально отработал, то письмо удаляется из ящика.
    2. если "что-то пошло не так", то письмо оставляем до следующей проверки.
  3. Скрипт mail2xmpp.sh
    1. получает письмо
    2. выдергивает из него необходимые данные (отправителя, получателя, тему и т.д.)
    3. согласно условиям передает следующему скрипту (на данный момент glpi.sh или other.sh) для обработки
  4. скрипт обработки:
    1. модифицирует письмо по своему вкусу (удаляет вложения, html-тэги, лишние строки и т.д.)
    2. отправляет его через sendxmpp от имени helpdesk@jabber.mydomain (на самом деле, делает что хочет, может даже пожелать сокойной ночи и потушить сервер)
    3. возвращает код ошибки в скрипт mail2xmpp.sh
  5. mail2xmpp.sh:
    1. смотрит код ошибки
    2. сохраняет или удаляет письмо для истории
    3. вызывает скрипт clean_spool.sh, который подчищает хвосты и удаляет файлы времен диназавров
    4. возвращает свой код ошибки.

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

Теперь подробности

1. Настройка exim, для получения всей почты для домена в один ящик.

В файле exim/configure, после begin routers добавляем

jabber_stnn_ru:
  driver = redirect
  domains = jabber.mydomain
  data = mail2xmpp@mydomain

Не забываем создать такой ящик и рассказать exim'у, что у нас появился домен jabber.mydomain. Если бы у меня учетные записи жаббера совпадали с почтовыми адресами, пришлось бы это как-то прикручивать, наверное, через правила и транспорт.

2. Настраиваем fetchmail на мониторинг этого ящика и передачу писем нашему скрипту

# cat /usr/local/etc/fetchmailrc
set daemon 10
set logfile /var/log/fetchmail.log
set idfile /usr/data/script/fetchids

defaults mda "/usr/data/script/mail2xmpp/mail2xmpp.sh %T %F"
poll mailserver.mydomain
   localdomains jabber.mydomain
   proto pop3
   user mail2xmpp@mydomain
   pass mypassword
        to * here
   sslproto SSL2
#   keep - оставляем почту на сервере, удобно на этапе тестирования
   fetchall

3. Скрипты и настройки в аттаче. На мой взгляд, они достаточно простые и приспособить под конкретные задачи достаточно легко.

P.S.

  1. Все работает хорошо, но с обработкой не штатных ситуаций могут быть проблемы - надо обратить внимание.
  2. Тему письма я нормально разгребать не научился и эту часть, нужно будет допилить.

ВложениеРазмер
mail2xmpp1.54 КБ