MDA (Mail Delivery Agent): что это и как работает доставка в ящик
MDA (Mail Delivery Agent) - программный компонент почтовой инфраструктуры, который отвечает за финальный этап доставки: приём письма от MTA (Mail Transfer Agent) и размещение его в почтовом ящике конкретного пользователя. Если MTA - это почтовая служба, которая перевозит письмо между городами, то MDA - почтальон, который кладёт конверт в ящик на двери.
В цепочке обработки email MDA стоит последним. Отправитель создаёт письмо в MUA (почтовом клиенте), MUA передаёт его MTA через SMTP, MTA маршрутизирует письмо к серверу получателя, а MDA принимает сообщение и записывает его в хранилище.
Место MDA в архитектуре почтовой системы
Почтовая инфраструктура состоит из трёх основных компонентов:
- MUA (Mail User Agent) - клиент, через который пользователь пишет и читает письма. Thunderbird, Outlook, мобильное приложение Gmail.
- MTA (Mail Transfer Agent) - сервер, который принимает письма по SMTP и пересылает их между узлами. Postfix, Exim, Sendmail.
- MDA (Mail Delivery Agent) - агент, который забирает письмо у MTA и помещает его в ящик. Dovecot LDA, Procmail, maildrop.
На практике границы между этими компонентами размыты. Postfix, например, содержит встроенный локальный агент доставки (local delivery agent), который может выполнять функции MDA без внешних программ. Но в сложных конфигурациях MDA выделяется в отдельный процесс, потому что берёт на себя задачи, выходящие за рамки простой записи файла на диск.
Что делает MDA помимо записи в ящик
Современный MDA - не просто файловый писатель. Он выполняет цепочку действий перед тем, как поместить письмо в хранилище:
- Фильтрация по правилам. MDA может перенаправлять письма в разные папки на основе заголовков, отправителя, темы, размера. В Dovecot для этого используется язык Sieve (RFC 5228), в Procmail - собственный синтаксис рецептов.
- Квоты. MDA проверяет, не превышена ли квота ящика. Если ящик заполнен, MDA отклоняет письмо и возвращает MTA временную ошибку (4xx), которая приведёт к soft bounce и повторной попытке, либо постоянную (5xx), если политика жёсткая.
- Автоответчик. Сообщения типа «Я в отпуске» генерируются MDA через Sieve-скрипт vacation. MDA отслеживает, кому уже отправлялся автоответ, чтобы не создавать петли.
- Индексация. Dovecot при доставке обновляет индексы для быстрого поиска по ящику. Это позволяет IMAP-клиенту мгновенно находить письма, не перебирая файлы на диске.
Форматы хранения: Maildir и mbox
MDA записывает письма в одном из двух основных форматов:
- mbox - все письма одной папки хранятся в одном файле, разделённые строкой «From ». Формат простой, но при большом объёме возникают проблемы: блокировка файла при записи, медленный доступ к отдельным сообщениям, риск повреждения при сбое.
- Maildir - каждое письмо хранится в отдельном файле внутри структуры каталогов (new/, cur/, tmp/). Нет блокировок, операции атомарны, параллельный доступ безопасен. Большинство современных серверов используют Maildir.
Формат хранения влияет на производительность и надёжность, но не на функциональность для конечного пользователя. IMAP-сервер абстрагирует формат, и клиент работает с папками и сообщениями одинаково.
Распространённые MDA
- Dovecot LDA / LMTP. Dovecot - в первую очередь IMAP/POP3-сервер, но он включает собственный агент доставки. Dovecot LDA вызывается как внешняя программа из Postfix или Exim. LMTP (Local Mail Transfer Protocol) - сетевой вариант: MTA передаёт письмо Dovecot по протоколу LMTP вместо вызова процесса. LMTP предпочтительнее для распределённых систем, где MTA и хранилище находятся на разных серверах.
- Procmail. Классический MDA из мира Unix. Мощная система фильтрации через файл .procmailrc. Проект не поддерживается с 2001 года, но до сих пор встречается на старых серверах.
- maildrop. Современная альтернатива Procmail. Поддерживает Maildir, виртуальных пользователей, квоты. Часто используется в связке с Courier IMAP.
MDA и bounce-сообщения
Когда MDA не может доставить письмо (ящик переполнен, пользователь не существует, Sieve-фильтр отклонил сообщение), он возвращает MTA код ошибки. MTA, получив отказ, генерирует bounce-сообщение (DSN - Delivery Status Notification) и отправляет его обратно отправителю.
Тип bounce зависит от кода ошибки. Если MDA вернул 452 (недостаточно места), MTA будет пытаться доставить повторно в течение нескольких дней. Если MDA вернул 550 (пользователь не найден), MTA немедленно создаёт hard bounce. Для отправителей рассылок это означает, что адрес нужно удалить из базы.
MDA в облачных почтовых сервисах
Gmail, Outlook.com, Yahoo Mail используют собственные MDA, недоступные извне. Логика та же: принять письмо от MTA, применить фильтры (спам, категоризация, правила пользователя), записать в хранилище. Отличие в масштабе: вместо Maildir на одном сервере - распределённые системы хранения на тысячах машин. Но концептуально MDA остаётся тем же компонентом, который выполняет финальную доставку.
MDA и валидация email
При SMTP-валидации адреса проверяющий сервис отправляет команду RCPT TO на MTA получателя. MTA в свою очередь может обратиться к MDA, чтобы проверить, существует ли ящик. Если MDA подтверждает наличие пользователя, MTA отвечает 250 OK. Если нет - 550 User unknown. Этот ответ и используется валидатором для определения статуса адреса.
Однако некоторые MTA принимают все адреса на этапе RCPT TO (accept-all), а проверку откладывают до момента фактической доставки MDA. В таких случаях SMTP-валидация не может точно определить, существует ли ящик, и адрес получает статус «неопределённый».
uChecker проверяет каждый email на уровне SMTP-сессии с MTA получателя. Если MDA за ним отклоняет ящик, вы узнаете об этом до отправки рассылки, а не после bounce.
