Содержание
Функционал модуля можно разделить на три задачи: сервер - принимает сообщения электронной почты от пользователей или других MTA и помещает их в очередь на обработку, очередь сообщений - обработка сообщений в очереди, доставка в локальные почтовые ящики или передача клиенту для отправки на другие MTA, клиент - соединяется с другими MTA и отправляет сообщения, возвращает в очередь недоставленные сообщения для повторной отправки.
Для доставки принимаются сообщения если целевой домен локальный, т.е. обслуживается данным сервером, либо для этого домена данный сервер является шлюзом. Чтобы сообщение было принято для доставки во внешний домен через другие MTA отправляющий сообщение пользователь должен быть аутентифицирован или его адрес IP должен находиться в списке доверенных адресов.
Когда сервер SMTP получает очередное сообщение электронной почты, для него создаётся задание на доставку в очереди сообщений. После этого сообщение доставляется в локальный почтовый ящик или передаётся клиенту SMTP для отправки на целевой MTA. Если при отправке сообщения возникли временные проблемы, в задании назначается время следующей попытки отправки сообщения.
Сообщения электронной почты находящиеся в очереди помещаются в
директорию mail-root/#queue
в виде файлов с расширением .eml. Каждому сообщению соответствует
файл с именем соответствующим файлу сообщения, но с расширением
.que. Этот файл описывает
задание и состоит из трёх или более строк:
0:attempt:time <reverse-path@address.dom> mail-parameters <recipient1@destination.dom> rcpt-parameters ...
Первая строка состоит из трёх числовых компонентов разделённых двоеточиями. Первое число - версия формата файла задания, текущее значение - 0. Второе число - номер текущей попытки доставки сообщения, начиная 1. Третье число - время следующей попытки доставки в формате unix timestamp - количество секунд, прошедших с 00:00:00 (UTC) 1 января 1970.
Вторая строка представляет собой адрес отправителя в угловых
скобках за которым могут следовать параметры сообщения,
те же что используются в команде MAIL FROM протокола SMTP: BODY=<7BIT 8BITMIME
BINARYMIME> SIZE=nnn RET=<HDRS FULL> ENVID=string SMTPUTF8
AUTH=string. Если параметры не указаны, угловые скобки в адресе
необязательны.
Все строки начиная с третьей содержат адреса получателей в
угловых скобках за которыми могут следовать параметры, те же что
используются в команде RCPT TO протокола SMTP: NOTIFY=<NEVER SUCCESS FAILURE
DELAY> ORCPT=string. Если параметры не указаны, угловые скобки в
адресе необязательны.
Директория очереди сообщений периодически
сканируется. Задания которые должны быть выполнены до следующего
сканирования загружаются в память и выполняются в указанное время.
Если время выполнения задания находится в прошлом, то задание
выполняется немедленно. Это позволяет пользователю создавать задания
которые будут выполняться модулем SMTP. Достаточно поместить файл
сообщения в директорию очереди заданий назначив ему расширение
.eml и создать соответствующий
файл задания с расширением .que. Допустим, сообщение электронной
почты записано в файл mail-root/#queue/my_message.eml.
Адрес отправителя сообщения no-reply@sender.domain, получатель
recipient@destination.domain. Файл задания mail-root/#queue/my_message.que
для него может иметь следующий вид:
0:1:0 no-reply@sender.domain recipient@destination.domain
При доставке сообщений во внешние домены, адреса целеых MTA для этих доменов запрашиваются у серверов системы доменных имён. Это поведение может быть изменено конфигурацией модуля SMTP, которая позволяет для некоторых (или даже для любых) доменов назначать имена или адреса MTA на которые будут отправляться сообщения для доставки в эти домены.
Для случая когда сервер не имеет прямого доступа в Internet и должен отправлять на другой MTA все исходящие сообщения: в конфигурации клиента достаточно указать что для домена соответствующего шаблону '*' используется конкретный сервер (или несколько серверов). Также, в конфигурации сервера SMTP следует указать что другой MTA пересылает сообщения из других доменов нам.