uCheckeruChecker

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.

MDAMail Delivery AgentDovecotпочтовый ящикинфраструктура
← Глоссарий