Вначале в качестве эпиграфа к статье предполагалось использовать
известную реплику мультипликационного героя Вовки, который, попав в
тридевятое царство и став счастливым обладателем ларца с двумя крайне
услужливыми товарищами, был несказанно удивлен тем, что они собираются за
него не только работать, но и кушать. Однако она не вполне отвечает
контексту (а речь -- в который раз -- пойдет о средствах автоматизации
Microsoft Office), поскольку в данном случае тех самых пресловутых
"одинаковых с лица" все же сначала придется чему-то научить.
Мы принимаем все, что получаем, За медную монету, а
потом -- Порою поздно -- пробу различаем На ободке
чеканно-золотом. Самуил Маршак
Безусловно, выбранная тема не нова, и вопрос "кому и зачем это
нужно?" наверняка многим успел набить оскомину. Суть же в том, что с
каждой новой версией своего офисного пакета Microsoft методично
совершенствует средства автоматизации каждого приложения, расширяя
объектные модели и списки доступных функций. Однако все это остается вне
поля зрения значительной части не только пользователей, но и
обозревателей.
Да многие ли из нас действительно пользуются всей
мощью этих средств Microsoft Office? Вне всякого сомнения большинство
ограничиваются разве что записью макросов для их повторного исполнения.
Нередко, кстати, это означает, что данному пользователю вовсе и не нужны
такие интеллектуальные возможности Word, Excel и иже с ними, и они вполне
могли бы обойтись более простыми и дешевыми (или совсем бесплатными --
примеров на страницах "Компьютерного Обозрения" было предостаточно)
приложениями.
Однако, если речь заходит об автоматизации рутинных
действий или адаптации приложений под свои нужды, Microsoft Office вне
конкуренции. То, что это не прихоть и не просто популярное развлечение,
сполна подтверждается фактом существования программы Microsoft Office
Extensions, в рамках которой энтузиастами созданы и продолжают
создаваться сотни интересных (и порой весьма нетривиальных) разработок,
призванных решать вполне реальные задачи и проблемы.
Для личного использования
макросы удобно подписывать с помощью сертификата, созданного
утилитой selfcert
В основе такого успеха лежат технологии COM и VBA, хорошо известные
разработчикам и продвинутым пользователям. И, безусловно, -- политика
самой Microsoft, снабжающей ПО необходимыми API, а программистов (всех
рангов) -- соответствующими инструментарием и документацией. Это как раз
тот случай, когда самые современные технологии делаются доступными для
любого пользователя.
Сравните, к примеру, Outlook и Outlook Express
(в качестве исключительно почтовых клиентов). Насколько просто найти
всевозможные дополнительные компоненты -- извлекающие вложения,
фильтрующие спам и пр. -- для первой, настолько же сложно (почти
невозможно) -- для второй, хотя в популярности ее сомневаться не
приходится. И дело вовсе не в том, что Outlook априори рассматривается как
"корпоративный" продукт, пользователи которого в большей степени готовы
выложить свои кровные за понравившуюся разработку, бесплатные (и при этом
вполне добротные) компоненты имеются практически на все случаи жизни.
Стало быть, все упирается именно в архитектуру ПО.
Тем не менее
разработки для Outlook отнюдь не так популярны и распространены, как для
других приложений Microsoft Office -- Word, Excel, Access. Библиотека
Microsoft Office Extensions демонстрирует это очень наглядно. И это тем
более странно, что начиная с версии 2000 программа поддерживает
полноценный VBA (вместо прежнего VBScript, для которого не было даже среды
разработки). Да и в аспектах, требующих совершенствования, доработки или
адаптации, недостатка, кажется, нет.
В дальнейшем основное внимание
будет уделяться именно специфическим (новым) функциям Outlook 2002, хотя
приведенные примеры можно реализовать (вероятно, с несколько большими
усилиями) и в версии 2000.
Скажем, многие жалуются на ограниченные
возможности оповещения о поступлении новой корреспонденции. Не беда -- все
поправимо буквально в течение нескольких минут. Открываем из Outlook
редактор Visual Basic, находим стандартный модуль ThisOutlookSession, из
двух выпадающих списков вверху окна кода выбираем соответственно объект
Application и событие NewMail (на досуге можно познакомиться и с
остальными). В появившийся шаблон процедуры добавляем несколько строк, как
в листинге 1.
Листинг
1
Private Sub Application_NewMail() Dim oInbox As
MAPIFolder Dim oItem As MailItem Set oInbox =
Application.Session.GetDefaultFolder(olFolderInbox) Set oItem =
oInbox.Items.GetLast foo = Shell("net send igor " +
oItem.Subject, vbHide) End Sub
Скорее всего, готовый код окажется достаточно понятным даже впервые
взявшимся за программирование для Outlook -- названия объектов и их
атрибутов совершенно прозрачны (хотя и требуют, естественно, изучения).
Вопрос может вызвать лишь последняя строка, реализующая вызов системной
команды net send. Она выбрана прежде всего для простоты, с таким же
успехом можно применить любую другую программу или скрипт либо
поэкспериментировать с VBA. Стандартная же функция msgbox для этого
не годится, поскольку ее окно жестко привязано к Outlook (а результирующее
окно net send гарантированно оказывается самым
верхним).
Второй "огорчительный" момент -- невозможность
использования вместо (или вместе с) oItem.Subject другого свойства --
oItem.SenderName (хотя оно, естественно, доступно). Дело в том, что при
этом вызове срабатывает встроенная система безопасности Outlook и требует
дополнительного подтверждения, что гораздо менее удобно.
Однако
несмотря на данные ограничения мы все же получили кое-что принципиально
новое: при поступлении очередного почтового сообщения вы оперативно (без
необходимости переключения в Outlook) узнаете его тему. Согласитесь, не
так уж плохо для трех строк кода (не считая объявления переменных). Кроме
того, оповещения легко переадресуются на любой компьютер локальной
сети!
Впрочем, если этот пример все же покажется надуманным, можно коснуться и более
животрепещущей темы -- спама. При обилии различных средств для борьбы с этим
электронным злом подобрать такое, которое полностью устраивало бы именно вас,
крайне непросто. Одно страдает избытком ложных срабатываний, другое требует
постоянного внимания со стороны пользователя, третье, наоборот, является "вещью
в себе". Таким образом, идеальное решение наверняка должно относиться к категории
"сделай сам", и Outlook в этом смысле -- лучший "конструктор".
Но даже
развитый механизм правил обработки корреспонденции не дает возможности
реализовать действительно интеллектуальный фильтр. Однако Outlook 2002
(именно эта версия!) позволяет пользователю исправить данный недостаток
средствами VBA. Достаточно лишь правильно объявить процедуру -- и она сможет использоваться в
Мастере правил. Для демонстрации этого свойства создадим макрос,
фильтрующий сообщения, где сторожем Norton Antivirus были обнаружены и
удалены вирусы. Он приведен в листинге 2.
Листинг 2
Sub RuleNAV(oItem As MailItem) Dim oAtt As
Attachment For Each oAtt In oItem.Attachments If
InStr(oAtt.FileName, "Norton Antivirus Deleted") > 0
Then oItem.Delete Exit For End If Next End Sub
Этот код нужно разместить в любом модуле, сохранить проект и
перейти в Мастер правил. Затем последовательно выбрать кнопки (либо
пункты) Создать, Создать новое правило, Проверка
сообщений после получения, Далее, Далее, Да,
Запустить сценарий (вот он, принципиальный момент). В окне выбора
сценария найти свой макрос и щелкнуть на Далее. Наконец определить
вспомогательные условия и дать правилу подходящее название.
Все.
Конечно, неплохо было бы также автоматически занести
отправителя в "черный список", но это требует дополнительного кодирования
(несложного, но все же избыточного для страниц нашего еженедельника).
Впрочем, похожая методика подробно расписана прямо на сайте Microsoft Office.
Как видите, средства
автоматизации Outlook действительно предоставляют пользователю весьма
мощные инструменты -- хватило бы фантазии. К примеру, не секрет, что в
последнее время участились случаи распространения почтовых "червей" с
помощью сообщений в формате HTML. Раз и навсегда справиться с этой бедой
позволит код, приведенный в листинге 3 (также предназначенный для
использования в качестве правила), попросту преобразующий такие письма в
обычный текст.
Листинг
3
Sub RulePlain(oItem As MailItem) If
oItem.GetInspector.EditorType = olEditorHTML
Then oItem.BodyFormat = olFormatPlain oItem.Save End
If End Sub
При необходимости сохранять форматирование достаточно установить преобразование
в RTF (olFormatRichText), однако изображения, если они не были вложены в сообщение,
исчезнут в обоих случаях. Правило можно также усовершенствовать с тем, чтобы
конвертировать лишь страницы со сценариями. Подобное решение содержится по адресу
http://agricola.myweb.nl/outlook2002.html.
Напоследок напомним, что приведенный в статье код носит исключительно демонстрационный
характер и, безусловно, не приспособлен "на все случаи жизни". Но в этом-то
и заключается сила макросов -- пользователю вовсе не обязательно предусматривать
все нюансы. Другое дело, если макросы предполагается распространять, -- тогда
уж придется потрудиться.