sp_processmail (Transact-SQL)
С помощью расширенных хранимых процедур (xp_findnextmsg, xp_readmail и xp_deletemail) данная хранимая процедура обрабатывает входящие почтовые сообщения из ящика Microsoft SQL Server. Ожидается, что в теле каждого сообщения содержится один запрос. С помощью хранимой процедуры xp_sendmail данная процедура возвращает автору сообщения результирующего набора в виде вложения.
Важно! |
---|
Старайтесь не использовать эту процедуру. Хранимая процедура sp_processmail обрабатывает данные, полученные по почте из неизвестных источников, и может стать причиной проникновения вредоносного кода. Перед выполнением какого-либо кода следует принимать меры безопасности по его проверке. Данная процедура добавлена для обеспечения обратной совместимости, но не устанавливается до включения службы SQL Mail. |
Примечание |
---|
В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. |
Синтаксис
sp_processmail [ [ @subject = ] 'subject' ]
[ , [ @filetype = ] 'filetype' ]
[ , [ @separator = ] 'separator' ]
[ , [ @set_user = ] 'user' ]
[ , [ @dbuse = ] 'dbname' ]
Аргументы
[ @subject = ] 'subject'
Тема сообщений, обрабатываемых SQL Server как сообщения запросов. Аргумент subject имеет тип varchar(255) и значение по умолчанию NULL. Когда этот аргумент задан, то хранимая процедура sp_processmail обрабатывает только сообщения с этой темой. По умолчанию SQL Server обрабатывает все сообщения так, как если бы в теле сообщений находились запросы.[ @filetype = ] 'filetype'
Расширение файла, используемого при отправке автору исходного сообщения результирующего набора запроса в виде вложения. Аргумент filetype имеет тип varchar(3) и значение по умолчанию txt.[ @separator = ] 'separator'
Разделитель столбцов (признак конца поля) для результирующего набора. Эти данные передаются расширенной хранимой процедуре xp_sendmail для возврата результирующего набора отправителю сообщения. Аргумент separator имеет тип varchar(3) и значение по умолчанию tab, то есть столбцы разделяются с помощью символа табуляции.[ @set_user = ] 'user'
Контекст безопасности, в котором должен выполняться запрос. Аргумент user имеет тип varchar(132) и значение по умолчанию guest.[ @dbuse = ] 'dbname'
Контекст базы данных, в котором должен выполняться запрос. Аргумент dbname имеет тип varchar(132) и значение по умолчанию master.
Значения кодов возврата
0 (успешное завершение) или 1 (неуспешное завершение)
Результирующие наборы
Нет
Замечания
Предполагается, что текст входящих сообщений содержит только один допустимый запрос SQL Server. Хранимая процедура sp_processmail обрабатывает только непрочитанные сообщения. Результаты запроса возвращаются отправителю сообщения, а также другим пользователям в списке «CC:» исходного сообщения. После обработки сообщения удаляются из почтового ящика. Если сообщения многократно отправляются серверу, то процедуру sp_processmail следует запускать часто. Для настройки регулярной обработки электронной почты можно использовать агент SQL Server и создать расписание для задания sp_processmail. При этом почта будет обрабатываться с указанной частотой, а в журнале заданий будут фиксироваться информационные сообщения, содержащие число обработанных запросов.
Результаты отправляются в виде вложения. Полное имя отправляемых файлов состоит из слова «SQL», за которым следует случайная строка цифр и заданное расширение файла, например SQL356.txt.
Важно! |
---|
Чтобы к сообщению присоединялся нужный значок, проверьте правильность сопоставления файлов. Чтобы создать сопоставление файлов, на рабочем столе дважды щелкните значок Мой компьютер и выберите пункт Свойства папки в меню Сервис. На вкладке Типы файлов диалогового окна Свойства папки задайте приложение, с помощью которого будет открываться файл. |
Для запросов в разных базах данных можно назначить различные задания хранимой процедуры sp_processmail. Например, предположим, что запросы к базе данных AdventureWorks отправляются в сообщениях с темой «SQL:AdventureWorks». Тогда процедуру sp_processmail можно выполнять, указав в параметре subject значение SQL:AdventureWorks, а в dbname — AdventureWorks. Другим базам данных и видам группирования могут соответствовать иные структуры форматирования. Например, задачам распространения соответствует параметр subject со значением SQL:distribution и dbname со значением distribution. Планировать выполнение всех этих заданий можно с помощью агента SQL Server.
Кроме того, системную хранимую процедуру sp_processmail можно настраивать различными способами: путем получения текста процедуры с помощью системной хранимой процедуры sp_helptext, путем редактирования кода Transact-SQL и создания новых пользовательских процедур. Возможные изменения.
Обрабатываются строго определенные пользовательские типы сообщений (расширенная хранимая процедура xp_findnextmsg с аргументом @type)
Сообщения после обработки можно не удалять, а помечать как read (выполните xp_readmail еще раз, присвоив аргументу peek значение false)
Результаты запроса отправляются в тексте сообщения путем вызова процедуры xp_sendmail с аргументом attach_result, имеющим значение false, и без параметра attachments
Контекст безопасности для выполнения запроса в пользовательском контексте задается в зависимости от того, кто является отправителем сообщения. Если имена пользователей электронной почты совпадают с именами пользователей SQL Server, то для этого нужно только изменить вызов процедуры xp_sendmail следующим образом: set_user = @originator. Если имена пользователей для электронной почты не являются допустимыми именами SQL Server (например, содержат внедренные пробелы), то можно выполнять уточняющий запрос для поиска заменяющих символов по таблице, получая допустимые имена пользователей SQL Server для передачи процедуре xp_sendmail
Разрешения
Эту процедуру могут выполнять только члены предопределенной роли сервера sysadmin.
Примеры
В следующем примере все сообщения в почтовом ящике обрабатываются как запросы в базе данных AdventureWorks. Результирующие наборы возвращаются клиенту в формате CSV (значения с разделителями-запятыми).
EXEC sp_processmail
@filetype = 'CSV'
,@separator = ','
,@dbuse = 'AdventureWorks';