|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||
13.8 Альтернатива при работе с электронной почтой — применение объектной библиотеки CDOОбъектная модель CDO, отправка и получение сообщений средствами CDO Все-таки Outlook — это прежде всего программа для работы с электронной почтой, и, если вы обратились к его объектной модели, то очень может быть, что вы хотели автоматизировать именно операции с электронной почтой. Как мы уже выяснили, нормальной работе с электронной почтой сильно мешают ограничения безопасности, встроенные в объектную модель Outlook. С ними можно бороться (как описано в разделе 13.6), а можно просто обойти, используя для отправки электронной почты специальную объектную модель CDO, в которой этих ограничений нет. Эту объектную модель (как немой укор разработчикам из Microsoft) можно использовать в том числе и из Outlook. CDO (Collaboration Data Objects) — это специальный набор библиотек для работы с электронной почтой, а также для администрирования сервера Exchange Server Существует множество версий и разновидностей библиотек, которые входят в набор CDO, но нас интересует только одна: Microsoft CDO for Exchange 2000 Library, которая устанавливается в том числе и с Microsoft Office. Первое, что нужно будет нам сделать — добавить на нее ссылку при помощи меню Tools -> References в редакторе VBA. Самый простой вариант отправки почты средствами CDO выглядит так: Dim oMyMail As New CDO.Message oMyMail.To = "Administrator@nwtraders.msft" oMyMail.From = "Administrator@nwtraders.msft" oMyMail.Subject = "Hello from CDO" oMyMail.TextBody = "Our letter" oMyMail.AddAttachment "C:\1.txt" oMyMail.Send Однако этот вариант с параметрами по умолчанию будет работать только в том случае, если на вашем компьютере установлен Exchange Server 2000 или 2003 или установлен Internet Information Server с настроенной службой SMTP, поскольку физически сообщение просто будет помещено по умолчанию в каталог C:\Inetpub\mailroot\Pickup, откуда и должна забрать служба Exchange Server или IIS. Однако есть и более удобный способ отправки сообщения через любой почтовый сервер, который поддерживает протокол SMTP. Для этого перед вызовом метода Send() мы должны настроить параметры отправки: oMyMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 (значение 1, которое используется по умолчанию, означает – использовать каталог Pickup). Указать почтовый сервер можно так: omyMail.Configuration.Fields.Item _ Настройка режима аутентификации производится при помощи того же объекта CDO.Configuration: oMyMail.Configuration.Fields.Item _ Значение 1 означает, что используется базовая аутентификация, значение 0 – без аутентификации (анонимно), значение 2 – аутентификация NTLM. Имя пользователя и пароль можно передать точно так же: oMyMail.Configuration.Fields.Item _ Иногда необходимо также определить использование специфического порта (отличного от 25), будет или нет использоваться SSL и время тайм-аута: oMyMail.Configuration.Fields.Item _ После любых изменений, вносимых в конфигурацию, изменения вначале надо сохранить: oMyMail.Configuration.Fields.Update и только после вызывать метод Send(): oMyMail.Send Если возникает проблема с кодировками (обычно, если в системе уставнолен русский язык, не возникает, то можно еще перед отправкой добавить строку вида oMyMail.TextBodyPart.Charset ="windows -1251" К сожалению, эта библиотека работает только с протоколом SMTP и каталогом Pickup на диске. Она не умеет работать ни с протоколом POP3, ни с IMAP4, ни с MAPI, а, значит, подключиться к почтовому серверу и проверить на нем появление новых сообщений (как в нашем примере с Outlook) мы не сможем. Придется использовать другую библиотеку из набора CDO — Microsoft CDO 1.21 Library. Она умеет работать только с MAPI (читайте — Exchange Server), зато она умеет выполнять различные операции в почтовом ящике на Exchange Server без всяких предупреждающих сообщений. Например, отследить появление новых писем можно так:
Пишем следующий код : Dim oSession As New MAPI.Session Dim oFolder As MAPI.Folder Dim oMessage As MAPI.Message '" Outlook " — имя почтового профиля. Если этот параметр не передать, то возникнет 'диалоговое окно с предложением выбрать нужный профиль. Имя нужного профиля 'можно узнать как раз из этого диалогового окна oSession.Logon ("Outlook") Set oFolder = oSession.Inbox For Each oMessage In oFolder.Messages If oMessage.Unread = True Then Debug.Print oMessage Next Полную справку по этим объектным моделям можно прочитать в MSDN.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Получить учебные материалы по этому курсу |
||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||