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 необходимо выполнить последовательность шагов:
- Включение компонента — через мастер настройки Database Mail в SQL Server Management Studio (SSMS) или с помощью системной процедуры
sp_configure. По умолчанию компонент отключён. - Создание учётной записи (Account) — задаётся имя сервера SMTP, порт (обычно 25, 587 или 465), тип шифрования (SSL/TLS), учётные данные для аутентификации (если требуется). Можно указать несколько учётных записей для одного профиля.
- Создание профиля (Profile) — профиль объединяет одну или несколько учётных записей. Профили бывают двух типов: частные (доступны только указанным пользователям или ролям) и общедоступные (доступны всем пользователям базы данных msdb).
- Назначение профиля — профиль привязывается к пользователю или роли базы данных msdb. Для отправки почты пользователь должен быть членом роли
DatabaseMailUserRoleв базе msdb. - Проверка конфигурации — отправка тестового сообщения с помощью
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 Mail | MAPI | Синхронный | Outlook/Exchange | Устарел, удалён |
| Database Mail | SMTP | Асинхронный | 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 →