Поиск по сайту:

Как направить входящую электронную почту в ваше приложение с помощью Exim


Exim — популярный агент передачи сообщений (MTA) для систем Unix. Он предлагает широкий выбор маршрутов и вариантов транспортировки. В этой статье мы покажем, как использовать Exim для передачи входящих писем в ваш собственный скрипт.

Мы предполагаем, что у вас уже есть работающий сервер Exim, способный получать электронную почту. Официальная вики предоставляет информативное руководство, если вы начинаете с нуля с новой установкой.

Управление конфигурацией Exim

Доступные подходы к настройке зависят от дистрибутива операционной системы. Установка Exim, собранная из исходников, будет использовать src/configure.default в качестве файла конфигурации.

Файл для Exim, установленный из менеджера пакетов, обычно имеет вид /etc/exim/config или /etc/exim.conf. Вы можете найти текущий путь, запустив exim -bP configure_file.

Операционные системы на основе Debian имеют немного более сложную систему. Существует два возможных метода конфигурации: один файл, /etc/exim4/exim4.conf.template, или разделенные файлы конфигурации внутри /etc/exim4/conf.d. Вам нужно запустить update-exim4.conf после внесения изменений. Это создает единый объединенный файл, который фактически читается Exim.

Exim следует перезапускать каждый раз, когда вы меняете его конфигурацию. Запустите service exim4 restart, чтобы применить изменения.

Создание маршрутизатора

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

Маршрутизаторы обрабатываются в том порядке, в котором они находятся в файле конфигурации. Любые маршрутизаторы выше вашего в файле могут сначала сопоставлять входящие электронные письма.

Добавьте свой маршрутизатор в файл конфигурации в разделе КОНФИГУРАЦИЯ МАРШРУТИЗАТОРОВ. Если вы используете разделенную конфигурацию Debian, вместо этого вы можете создать новый файл в /etc/exim4/conf.d/routers. При использовании этого подхода маршрутизаторы будут объединены в алфавитном порядке.

Вот пример роутера:

example_router:
  driver = accept
  domains = example.com
  transport = example_transport

Это базовый маршрутизатор, который соответствует любому электронному письму, отправленному на example.com. Когда совпадение будет обработано, Exim примет сообщение и доставит его, используя транспорт example_transport. Мы создадим это дальше.

Создание транспорта

Как только электронное письмо было принято маршрутизатором, оно доставляется транспортом. Транспорты отвечают за реализацию процедуры доставки сообщений. Различные драйверы могут отправлять через Интернет с помощью SMTP, передавать локальному пользователю Unix или записывать в файл.

Создание пользовательского транспорта на основе встроенного драйвера позволяет доставлять соответствующие электронные письма в ваше собственное приложение. Затем вы можете работать с каждым электронным письмом отдельно, вне Exim.

В отличие от маршрутизаторов порядок транспортов не имеет значения. Каждое входящее электронное письмо будет соответствовать единственному транспорту, указанному принимающим его маршрутизатором. Добавьте свой транспорт в любом месте раздела TRANSPORTS CONFIGURATION вашего файла Exim. Пользователи Debian с включенной раздельной конфигурацией могут создать файл в /etc/exim4/conf.d/transports.

Вот транспорт, который вызывает PHP-скрипт:

example_transport:
  driver = pipe
  command = /usr/bin/php /var/www/html/handle_incoming_email.php
  user = www-data
  group = www-data

В сочетании с приведенным выше примером маршрутизатора любое электронное письмо, отправленное на @example.com, будет доставлено на handle_incoming_email.php. Exim предоставляет всю электронную почту в формате, совместимом с RFC, в качестве стандартного ввода команды для чтения на вашем языке программирования.

// Get email content from standard input in PHP
$email = fopen("php://stdin", "r");
 
// To: user@example.com
// Subject: Demo Email
// 
// This is an email.

Транспорт настроен с помощью драйвера pipe. При этом используется конвейер Unix для передачи входящей электронной почты вашей command. Команда будет выполнена от имени указанного вами пользователя и группы.

Использование переменных среды

Exim установит несколько переменных окружения перед выполнением вашей команды. Их можно использовать для доступа к информации о сообщении без необходимости анализа полного формата электронной почты.

Доступные переменные включают в себя:

  • DOMAIN — домен, на который было отправлено входящее электронное письмо.
  • MESSAGE_ID — внутренний идентификатор Exim, представляющий электронное письмо.
  • RECIPIENT – адрес электронной почты, на который было отправлено сообщение.
  • SENDER – адрес электронной почты, с которого было отправлено сообщение.

Вы можете добавить дополнительные переменные в среду команды, установив параметр environment в вашем транспорте. Это принимает список пар ключ-значение, разделенных запятыми:

example_transport:
  environment = foo=bar,demo=example

Возвращаемые значения

Ваша команда должна выйти с кодом состояния 0, чтобы подтвердить успешную доставку. Ненулевой код выхода будет интерпретирован как неудачная доставка. Отправитель получит сообщение об отказе.

Это поведение отключается установкой параметра ignore_status в вашем транспорте. Затем exim обработает ненулевые коды состояния как успешные.

Кроме того, вы можете использовать параметр temp_errors для определения кодов выхода скрипта, которые указывают на то, что произошла ошибка, но предполагается, что она временная. Когда exim увидит один из этих кодов состояния, доставка сообщения будет отложена и повторена позже.

Содержимое сообщений о возврате можно настроить с помощью параметра return_fail_output. Когда для этого параметра установлено значение true, Exim включит содержимое стандартного вывода вашего скрипта в свое сообщение об отказе. Этот механизм упрощает использование кода вашего приложения для доставки отправителям персонализированных ответов о возврате.

Вызов команды

Exim обычно вызывает вашу команду прямо из транспорта. Если вы установите параметр use_shell, вместо этого команда будет передана в /bin/sh. Это может быть полезно в сценариях, где ваш сценарий требует наличия полной среды оболочки.

Время выполнения команды истекает через один час с конфигурацией по умолчанию. Тайм-аут рассматривается как ошибка доставки. Команда будет завершена, и отправителю будет возвращено сообщение об отказе. Время ожидания можно настроить с помощью параметра timeout. Кроме того, установка параметра timeout_defer приведет к тому, что тайм-ауты будут рассматриваться как временные ошибки, что позволит повторить попытку доставки после задержки.

example_transport:
  timeout = 5m
  timeout_defer

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

Заключение

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

Вам необходимо предоставить двоичный файл, который принимает электронное письмо на стандартный ввод как часть вашего приложения. Бинарный файл будет вызываться Exim всякий раз, когда будет получено новое сообщение. Затем вы должны проанализировать электронное письмо в соответствии со стандартами, чтобы извлечь содержимое тела и заголовки сообщений, относящиеся к вашей системе.




Все права защищены. © Linux-Console.net • 2019-2024