Открыть сервис

Database Mail

Database Mail — это компонент Microsoft SQL Server, предназначенный для отправки электронных сообщений из приложений и хранимых процедур напрямую через экземпляр SQL Server. Он представляет собой корпоративное решение для асинхронной рассылки почты, использующее протокол SMTP (Simple Mail Transfer Protocol) и не требующее установки сторонних почтовых клиентов или серверов MAPI (Messaging Application Programming Interface) на сервере баз данных.

История и предпосылки создания

До появления Database Mail в более ранних версиях SQL Server (2000 и 2005) использовался компонент SQL Mail. SQL Mail работал через интерфейс MAPI и требовал установки почтового клиента Microsoft Outlook или Exchange Client на сервере. Это создавало ряд проблем: необходимость в лицензировании Outlook, зависимость от запущенного сеанса пользователя, высокая нагрузка на сервер и сложность в администрировании. Кроме того, SQL Mail был синхронным — отправка сообщения блокировала выполнение запроса до завершения всей операции.

В ответ на эти ограничения корпорация Microsoft представила Database Mail в SQL Server 2005. Основным новшеством стало использование SMTP-протокола, что позволило отказаться от MAPI и Outlook. Database Mail был спроектирован как асинхронный и масштабируемый компонент, использующий очередь Service Broker для обработки сообщений. В последующих версиях SQL Server (2008, 2012, 2016, 2019, 2022) функциональность Database Mail была расширена и стабилизирована, а SQL Mail был объявлен устаревшим и удалён из продукта.

Архитектура и компоненты

Database Mail состоит из нескольких взаимосвязанных компонентов, работающих в среде SQL Server:

  • Системные хранимые процедуры и функции — основной интерфейс для настройки и отправки почты. Ключевые процедуры: sp_send_dbmail (отправка сообщения), sysmail_add_account_sp, sysmail_add_profile_sp, sysmail_configure_sp.
  • Очередь Service Broker — внутренняя очередь, в которую помещаются запросы на отправку сообщений. Это обеспечивает асинхронность: вызов sp_send_dbmail немедленно возвращает управление, а фактическая отправка происходит в фоновом режиме.
  • Внешняя программа DatabaseMail.exe — отдельный процесс, который запускается SQL Server Agent (или вручную) и обрабатывает сообщения из очереди. Он устанавливает SMTP-соединения, выполняет аутентификацию и передаёт данные.
  • Системные таблицы и представления — хранят конфигурацию учётных записей, профилей, а также журнал отправленных и неудачных сообщений. Основные таблицы: sysmail_mailitems, sysmail_log, sysmail_allitems.
  • Пакет утилит Database Mail — набор объектов, управляющих жизненным циклом компонента (запуск, остановка, проверка состояния).

Настройка и конфигурация

Для использования Database Mail необходимо выполнить последовательность шагов:

  1. Включение компонента — через мастер настройки Database Mail в SQL Server Management Studio (SSMS) или с помощью системной процедуры sp_configure. По умолчанию компонент отключён.
  2. Создание учётной записи (Account) — задаётся имя сервера SMTP, порт (обычно 25, 587 или 465), тип шифрования (SSL/TLS), учётные данные для аутентификации (если требуется). Можно указать несколько учётных записей для одного профиля.
  3. Создание профиля (Profile) — профиль объединяет одну или несколько учётных записей. Профили бывают двух типов: частные (доступны только указанным пользователям или ролям) и общедоступные (доступны всем пользователям базы данных msdb).
  4. Назначение профиля — профиль привязывается к пользователю или роли базы данных msdb. Для отправки почты пользователь должен быть членом роли DatabaseMailUserRole в базе msdb.
  5. Проверка конфигурации — отправка тестового сообщения с помощью sp_send_dbmail.

Отправка сообщений

Основная процедура для отправки почты — sp_send_dbmail. Она принимает множество параметров:

  • @profile_name — имя профиля, используемого для отправки.
  • @recipientsсписок получателей (через точку с запятой).
  • @subject — тема письма.
  • @body — тело письма (текст или HTML).
  • @body_format — формат тела (TEXT или HTML).
  • @importance — важность (HIGH, NORMAL, LOW).
  • @file_attachments — пути к файлам, прикрепляемым к письму (доступны только файлы, к которым имеет доступ служба SQL Server).
  • @query — SQL-запрос, результат которого будет включён в тело письма в виде таблицы.

Пример вызова: ``sql EXEC msdb.dbo.sp_send_dbmail @profile_name = 'MyProfile', @recipients = 'admin@example.com', @subject = 'Отчёт о продажах', @body = 'Продажи за месяц превысили план.', @importance = 'HIGH'; ``

Мониторинг и устранение неисправностей

Database Mail предоставляет несколько системных представлений и процедур для отслеживания состояния:

  • sysmail_allitems — список всех сообщений (отправленных, ожидающих, с ошибками).
  • sysmail_sentitems — только успешно отправленные.
  • sysmail_unsentitems — сообщения, ожидающие отправки.
  • sysmail_faileditems — сообщения, отправка которых завершилась ошибкой.
  • sysmail_log — журнал событий компонента (запуск, остановка, ошибки подключения к SMTP).
  • Процедура sysmail_help_status_sp — показывает текущее состояние Database Mail (работает/остановлен).

При возникновении ошибок (например, недоступность SMTP-сервера, неверные учётные данные, превышение размера вложения) запись попадает в sysmail_faileditems и sysmail_log. Администратор может проанализировать причину и исправить конфигурацию.

Безопасность и ограничения

Database Mail работает в контексте безопасности SQL Server. Для отправки почты пользователь должен иметь разрешение EXECUTE на процедуру sp_send_dbmail и быть членом роли DatabaseMailUserRole. Права на создание профилей и учётных записей имеют только члены фиксированной серверной роли sysadmin или роли DatabaseMailAdminRole.

Ограничения по умолчанию:

  • Максимальный размер вложения — 1 МБ (настраивается через sysmail_configure_sp).
  • Максимальное количество вложений — 20.
  • Максимальное количество получателей в одном сообщении — 100.
  • Максимальный размер тела письма — 2 ГБ (но практически ограничен возможностями SMTP).

Применение

Database Mail широко используется в корпоративных средах для:

  • Автоматической отправки уведомлений — например, о завершении резервного копирования, ошибках в журнале, превышении порогов производительности.
  • Рассылки отчётов — результаты SQL-запросов, сформированные в виде таблиц, могут быть отправлены по электронной почте.
  • Интеграции с бизнес-приложениями — приложения, работающие с SQL Server, могут вызывать sp_send_dbmail для отправки подтверждений заказов, уведомлений о статусе.
  • Мониторинга SQL Server Agent — задания агента могут использовать Database Mail для отправки оповещений при успешном или неудачном выполнении.

Сравнение с альтернативами

КомпонентПротоколАсинхронностьТребованияПоддержка
SQL MailMAPIСинхронныйOutlook/ExchangeУстарел, удалён
Database MailSMTPАсинхронныйSMTP-серверАктивно поддерживается
CLR-интеграцияSMTP (через .NET)СинхронныйНастройка CLRВозможна, но сложнее
xp_smtp_sendmail (сторонние)SMTPСинхронныйУстановка расширенияНеофициально

Database Mail является предпочтительным выбором для большинства сценариев благодаря встроенной поддержке, асинхронности и простоте настройки.

Интересные факты

  • Database Mail может работать без запущенного SQL Server Agent, если процесс DatabaseMail.exe запущен вручную.
  • Для отправки почты можно использовать несколько SMTP-серверов в одном профиле — в случае сбоя основного сервера будет использован следующий по списку.
  • Компонент не поддерживает шифрование STARTTLS на уровне протокола — только SSL/TLS на уровне сокета.
  • В SQL Server 2012 и выше появилась возможность отправлять почту через порт 587 с аутентификацией, что соответствует современным требованиям почтовых сервисов.

Источники

  • Microsoft Docs: Database Mail (SQL Server) — официальная документация.
  • Microsoft SQL Server 2005 Books Online: Database Mail Overview.
  • Microsoft SQL Server 2019: Database Mail Configuration and Troubleshooting.
  • Статья «Database Mail vs SQL Mail» на SQLServerCentral.com.
  • Книга «SQL Server 2012 Administration» by Adam Jorgensen et al.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →