SQL Mail и CDO – новые возможности Windows 2000

ПУБЛИКАЦИИ  

В рассылке "MS SQL Server - дело тонкое" и в форуме проекта SQL.RU уже неоднократно дискутировалась тема использования возможностей SQL Mail для автоматизации задач администрирования сервера баз данных. Практика показывает, что проблемы использования стандартных возможностей MS SQL Server для организации оповещений являются наиболее типичными и особенно часто связаны с необходимостью отступления от стандартной схемы взаимодействия СУБД, почтового клиента и сервера электронной почты. С другой стороны, одним из наиболее типичных вопросов сегодняшнего дня является анализ новых возможностей, которые привнесены последними версиями операционных систем и серверов баз данных Микрософт. Поскольку эта тема ещё мало озвучена (виду своей необъятности) и вызывает повышенный интерес у подавляющего большинства DBA и SQL программистов, хочу предложить Вам для обсуждения (и возможного применения) одно из новшеств операционной системы Windows 2000, которое может иметь широкое применение в контексте повседневных задач администрирования или для организации доступа к данным из интернет.
Одним из таких новшеств, которое меня чрезвычайно заинтересовало, является Collaboration Data Objects (CDO), представляющие набор объектов, обеспечивающих передачу данных средствами Microsoft Windows 2000 (Cdosys.dll). Имеется ввиду версия 2.0 спецификации CDO API, которая входит в Component Object Model (COM). Основной целью CDO является упрощение программирования почтовых возможностей, создание и  управление сообщениями Internet. Windows 2000 CDO добавляет Вам новые классы COM, которые Вы можете использовать в прикладных программах, написанных на языках, поддерживающих COM и Automation, такие, как Microsoft Visual Basic, Microsoft Visual C++, Microsoft Visual J++, или языки создания сценария типа Visual Basic Scripting Edition. Вы получаете инструмент для создания клиентских или серверных приложений, которые будут иметь возможность создания, форматирования и управления сообщениями Internet, например, стандарта Multipurpose Internet Mail Extensions (MIME). Также, CDO поддерживает сообщения протоколов SMTP и NNTP, RFC 822 Message Format и UUENCODE Attachment Format. Модель объектов CDO основана на этих форматах, и обеспечивает объектно-ориентированную среду разработки для каждого формата. С помощью CDO Вы легко сможете, как отформатировать полученное сообщение, так и преобразовать его в другую форму, записать его в поток или сохранить в файл.
Создание сообщения в Вашем коде будет выглядеть очень просто:

[Visual Basic]
' Reference to Microsoft ActiveX Data Objects 2.5 Library
' Reference to Microsoft CDO for Windows 2000 Library
Dim iMsg As New CDO.Message

[C++,IDL]
#import "c:\program files\common files\system\ado\msado15.dll" no_namespace
#import <cdosys.dll> no_namespace
// ...
IMessagePtr iMsg(__uuidof(Message));

[VBScript]
Dim iMsg
Set iMsg = CreateObject("CDO.Message")

Чтобы посылать созданное SMTP сообщение, Вы должны будете определить ещё и его свойства (кому, от кого). Для отправки многократных сообщений создают специальный объект Message и используют его повторно для каждого нового сообщения. Для отправки сообщений с одинаковым содержанием, но разным получателям, просто изменяют адрес, и вызывают метод IMessage.Send или IMessage.Post для каждого сообщения. Если Вам нужно изменять и содержание письма, можно воспользоваться методом IBodyParts.DeleteAll. В вашем распоряжении будут множество объектов и методов, которые возможно применять  для самых разнообразных вариантов оформления и управления почтовыми сообщениями. Например, создание сообщения в HTML формате будет выглядеть таким образом:

[VBScript]
Dim iMsg
Set iMsg = CreateObject("CDO.Message")
With iMsg
   .To = "mssqlhelp@km.ru"
   .Newsgroups = "comp.mssqlhelp.sqlnewsgroup"
   .Subject    = "MS SQL Server – дело тонкое…"
   .HTMLBody   = "<html><body><p> <a href=”http://mssqlhelp.com.ru/”> Архив рассылки тут </a></p></body></html>"
End With

Но для нас наиболее интересным применением может стать использование возможности MS SQL Server работать с OLE Automation, а также наличие у Windows 2000 набора OLE Automation серверов для работы с CDO, т.е. с сообщениями электронной почты.
Существует набор системных хранимых процедур sp_OA….., которые обеспечивают интерфейс OLE объектов и с помощью которых можно вызывать объекты или методы из пользовательских хранимых процедур и т.п. Например, создать сообщение:

DECLARE @object int
DECLARE @hr int

EXEC @hr = sp_OACreate 'CDO.Message', @object OUTPUT
…..

Таким образом, Вы можете с помощью CDO написать своего почтового клиента (для того сервера, который Вам нужен) и запускать его прямо из хранимой процедуры, причём, выбирая тот профиль, который Вам наиболее подходит в каждом конкретном случае. В принципе, Вы можете не только заменить имеющиеся расширенные хранимые процедуры (xp_sendmail), но и значительно расширить их возможности. Это, как вариант, для тех подписчиков, которые испытывали проблемы с отправкой оповещений через не Микрософтовские почтовые сервера, а также, для тех, кого не устраивает наличие только одного профиля в распоряжении SQL сервера.
Другим возможным применением описанных выше инструментов, может стать организация автоматической рассылки данных через почтовые сообщения и т.п.
Можно ещё долго фантазировать на тему возможных применений CDO, поскольку представляемый в настоящей статье инструментарий достаточно сильно развит, гибок и полностью интегрирован в операционную систему. Индустрия интернет приложений развивается сегодня настолько бурно, что представить себе все возможные применения просто невозможно.
Более подробную информацию о Collaboration Data Objects Вы можете почерпнуть в MSDN, воспользовавшись поиском по ключевому слову: «CDO».


Автор: Александр Гладченко  2001г.

ПУБЛИКАЦИИ

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz