Постмачтер 2 или CDO Live!
АрхивПрограммазм (архив)Продолжаем разговор о почтовой системе Windows. CDO для Windows 2000 - новый API для работы с SMTP и NNTP сервисами NT. Check this out.
Краткий обзор технологий
Приходилось ли вам программно отправлять почту или получать доступ к сообщениям вашего почтового ящика? Если вы программировали эти задачи на Visual C++, то наверняка вам знаком интерфес MAPI. Но о нем говорить, к счастью, не будем.
Bо времена Exchange 5.0 cуществовал и более легкий способ работы с почтовыми сообщениями - при помощи библиотеки OLEMSG32, которая по сути была COM оберткой для MAPI. С появлением Exchange 5.5 Microsoft сменил название библиотеки, сделав его весомым и кратким - CDO (Collaboration Data Object). Функциональность же принципиально не изменилась.
Библиотеки CDO ранних версий ( CDO v 1.x ) основывались на интерфейсах MAPI, и предоставляли разработчикам способы управления почтовыми сообщениями проще чем MAPI. За счет этого программирование при помощи CDO стало популярно среди разработчиков. Для доступа к компонентам SMTP и NNTP, входящим в состав IIS 4.0 появилась библиотека CDONTS - специализированное подмножество CDO.
Вместе с Windows 2000 вышла библиотека CDO 2.0 или CDO for Windows 2000. Основой для нее явились принципиально новые решения: поддержка Internet-стандартов и стандартизация доступа к данным через OLE DB/ADO интерфейс. Известно, что операционная система Windows 2000 активно использует эту библиотеку для своих задач.
С выходом Exchange 2000 на свет появилась еще несколько библиотек CDO - 3.0 или CDO for Exchange 2000, CDO for Exchange Management и CDO Workflow Objects for Exchange. CDO for Exchange естественно расширяет функциональность CDO for Windows. С помощью CDO 3.0 возможна разработка программных решения на базе Web Store. А наличие механизмов перехвата транспорнтых событий и событий от операций с даннымии ( transport and store event) позволяет расширять функциональность Web Store.
Примечание: Web Store - одна из ключевых инициатив Microsoft для унификации доступа к данным. Web Store комбинирует функциональность файловой системы, Web - доступа и процедур коллективной работы.
Далее не будем вспоминать, что было в веке минувшем и подробнее остановимся на версиях CDO, поставляемых с продуктами Microsoft версии 2000.
Основные черты CDO for Windows 2000 (CDOSYS.DLL)
- Для работы через CDOSYS необходимы ОС Windows 2000 и сервер SMTP ( локальный или удаленный ). Возможна программная настройка на SMTP сервер.
 - Поддержка транспортных событий. События протоколов для входящей и исходящей почты и новостей. Поддержка Internet - стандартов.
 - Создание и управление данными в форматах MIME/MHTML. Поддержка отправки/приема сообщений через SMTP/NNTP протоколы.
 - Стандартизованный доступ к данным. CDOSYS основана на технологии доступа к данным OLE DB/ADO.
 - Поддержка языков программирования. CDOSYS - это COM библиотека, поддерживающая дуальный интерфейс, что позволяет использовать ее во многих языках программирования: Visual Basic, VB Scripting Edition, Java Script, Visual Basic for Application, Visual C++.
 - Возможность обновления библиотеки. CDOSYS разрабатывалась как подмножество библиотеки CDO for Exchange (CDOEX). Поэтому поддерживается полная программная совместимость приложений, разработанных для CDOSYS после установки Exchange 2000.
 
Cценарии применения CDOSYS.DLL
- Массовые рассылки. Создание шаблонов сообщений.
 - Репликации, основанные на почтовых сообщениях. Например, Windows 2000 использует CDOSYS для репликаций Active Directory.
 - Проверка на наличие вирусов в почтовых сообщениях и новостях перед доставкой получателю.
 - Выявление spam - сообщений перед доставкой получателю.
 - Отправка Web - страниц, включая ссылки и графику по запросам пользователей. Например, организация подписки на страницы с новостями.
 - Формирование и отправка сообщений, подтверждающих завершение транзакций.
 - Автоматическая пересылка входящей почты.
 - Административные сообщения.Например, периодическая отправка сообщений о состоянии серверов/сервисов в почтовый ящик системного администратора.
 
Основные черты CDO for Exchange Server 2000 (CDOEX.DLL)
- Расшираяет функциональность CDO for Windows. Поддерживается программная совместимость с CDOSYS.
 - Управление календарем через CDOEX. Протокол работы c кадендарем основан на стандартах Internet (iCalendar). Поддерживается полная совместимость с календарем Outlook 98 и Outlook 2000.
 - Разделение функциональности. ADO используется для навигации по данным а CDO для связывания с Web Store.
 - Создание пользовательских объектов CDO. CDOEX позволяет имплементировать базовые объекты CDO при создании пользовательских CDO объектов.
 - Дополнительные библиотеки для Exchange Server 2000. Библиотека CDOEXM - CDO for Exchange Mangement Libraries предоставляет объекты и интерфейсы для управления сервером и почтовыми ящиками Exchange Server. Для обеспечения доступа к Active Directory Microsoft рекомендует использовать эту библиотеку соместно с интерфейсами ADSI (Active Directory Service Interfaces). Еще одна новая библиотека CDOWF служит для управления объектами Exchange Workflow Engine.
 
Версии CDO
| Exchange 5.0 | Exchange 5.5 | IIS 4.0 | Windows 2000 Server | Exchange 2000 | |
|---|---|---|---|---|---|
| Active Messaging | 
 Да  | 
 Нет  | 
 Нет  | 
 Нет  | 
 Нет  | 
| CDO 1.2 | 
 Нет  | 
 Да  | 
 Нет  | 
 Нет  | 
 Да  | 
| CDO 1.2 for Windows NT Server | 
 Нет  | 
 Да  | 
 Да  | 
 Да*  | 
 Да*  | 
| CDO for Windows 2000 Server | 
 Нет  | 
 Нет  | 
 Нет  | 
 Да  | 
 Нет  | 
| CDO for Exchange 2000 | 
 Нет  | 
 Нет  | 
 Нет  | 
 Нет  | 
 Да  | 
* - поддерживается для совместимости с существующими приложениями.
Примеры создания объектов библиотеки CDO в разных языках программирования
VbScript
Dim iMsg
Set iMsg = CreateObject("CDO.Message")
Dim iDsrc
Set iDsrc = iMsg.DataSource
Dim iBp
Set iBp = iMsg.BodyPart
Visual Basic
Предварительно необходимо установить ссылки на Microsoft CDO for Microsoft Windows 2000 Library Microsoft ActiveX Data Objects 2.5 Library 
Dim iMsg As New CDO.Message ...
Visual C++
Если вы хотите работать с объектами CDOSYS на языке С++, используя только COM, то основа программы будет выглядеть следующим образом: 
#import "c:\program files\common files\system\ado\msado15.dll"
no_namespace raw_interfaces_only #import "cdosys.dll" no_namespace raw_interfaces_only /* Флаг raw_interfaces_only запрещает создание классов - оберток для использования "смарт-поинтеров". По флагу no_namespace не просиходит генерации компилятором пространста имен. */ #include "с:\sdk\include\cdosysstr.h" #include "с:\sdk\include\cdosyserr.h" #include <assert.h> void main() { CoInitialize(NULL); IMessage* pMsg = NULL; HRESULT hr = CoCreateInstance(__uuidof(Message), NULL, CLSCTX_INPROC_SERVER, __uuidof(IMessage), reinterpret_cast<void**>(&pMsg)); assert(SUCCEEDED(hr)); Fields* pFlds = NULL; pMsg->get_Fields(&pFlds); ... CoUninitialize(); }
Важное замечание
Обязательно нужно использовать ADO 2.5 в глобальном пространстве имен или в пространстве имен CDO. Иначе по умолчанию параметры в функциях CDO из пространства имен ADO не будут корректно разрешены при компиляции. 
Пример использования классов - оберток
#import "c:\program files\common files\system\ado\msado15.dll"
no_namespace #import
"c:\program files\common files\Microsoft Shared\CDO\cdoex.dll" \ no_namespace #include "cdoexstr.h" #include "cdoexerr.h" void main() { CoInitialize(NULL); { try { IMessagePtr iMsg(__uuidof(Message)); FieldsPtr Flds; Flds = iMsg->Fields; : } catch( _com_error err) { // ... } } CoUninitialize(); return 1; }
Объектная модель CDO 2.0
- IBodyPart - содержит абстрактные методы и свойства для управления секции тела сообщения.
 - IMessage - содержит абстрактные методы и свойства для управления сообщением в целом.
 - IDataSource - содержит абстрактные методы и свойства для связывания и упорядочивания, выделения и вставки данных сообщений в другие объекты или из них.
 - IDropDirectory - содержит методы доступа к сообщениям, хранящимся в файловой системе (например в Windows 2000 SMTP drop directory).
 - IMessages - содержит интерфейс коллекции сообщений.
 - IBodyParts - содержит интерфейс коллекции секций сообщения.