Использование
компонентов “Microsoft MAPI Controls 6.0”
в Visual Basic.
Simple MAPI это набор
интерфейсов и функций, которые обеспечивают доступ к почтовому транспорту и
хранилищам данных (таких как адресные книги и сообщения). Этот механизм
позволяет принимать/отсылать почту из собственных приложений независимо от
конкретного почтового клиента, который будет использоваться.
Все приложения, поддерживающие simple
MAPI, должны реализовать двенадцать функций и предоставить три структуры
разработчикам. Описание этих функций и список параметров заранее известен и
жестко определен.
MAPI является стандартом, который поддерживают многие
почтовые серверы Microsoft. В последних версиях и в TheBat! включена поддержка simple MAPI. Функции и структуры
находятся в библиотеке tbmapi.dll.
Если TheBat! установлен, как обработчик запросов simple MAPI по умолчанию, то эта библиотека замещает системную
mapi32.dll
Подробное описание этих функций и их параметров смотрите в
соответствующей литературе — MSDN (самое полное и подробное
руководство); справка по MAPI, например, есть в стандартной поставке Delphi,
файл mapi.hlp.
Данный материал не является справкой по simple MAPI, не
претендует на абсолютную полноту изложения материала, возможно упущены
некоторые нюансы. Данный материал является лишь обобщением небольшого
собственного опыта.
Я не ставил перед собой цель написать статью по MAPI, мне
хотелось рассказать о некоторых особенностях применения этих функций при
работе, т.е. про то, с чем мне пришлось столкнуться. Так как особенности
функционирования самого почтового сервера конечно же отражаются на реализации simple
MAPI.
Практические
стороны вежливости
Не так давно мне потребовалось разослать резюме
в различные кадровые агентства. И всё бы ничего, если бы только этих агентств
не было так много. Интересующих меня заведений подобного рода в одной только
Москве свыше двух сотен. Как известно из опыта, агенства очень плохо переносят
множественную рассылку резюме и, получая сообщения, в которых в поле
"To" невооружённым глазом просматриваются ещё с пару десятков их
конкурентов, просто оставляют "посылку" без внимания. Поэтому
групповая отправка невозможна. Однажды, поговорив с одним из агентов, я услышал
фразу "Нужна же элементарная вежливость...". Это и есть причина того,
почему не стоит рассылать бомбы на сто адресов одним сообщением. Они обижаются!
Ладно, будем делать предложение каждому по отдельности.
Всякому ясно, что непосредственная рассылка их
Outlook если и возможна, то потребует нечеловеческого напряжения внимания и
всего прочего в том духе: нельзя отправлять два резюме по одному адресу, нельзя
никого пропускать, ни в коем случае нельзя оставлять поле "Subj"
пустым и т.п. Было решено "час потерять и за пять минут долететь". То
есть написать простенькую программку, которая брала бы текстовый файл и
отправляла его каждому из адресатов. Поскольку терять даже час не хотелось, то
было решено воспользоваться следующей комбинацией: Visual Basic + MAPI Control.
Применение этой пары позволяет делать с почтой ( в том числе и с отправкой)
почти всё, что необходимо. "Почти" - потому что нельзя,
например, каким-нибудь простым способом изменить адрес отправителя: всё только
в рамках учётных записей, существующих в Outlook. Но это не так важно для той
цели, ради которой я связался с отправкой. Возможны различные сценарии, о
которых чуть подробней можно прочитать в "заключении".
Процесс
Итак, Visual Basic запущен. Добавляем на форму
компонент Microsoft MAPI Control.
Рис 1. Добавление библиотеки компонентов и изменения в "Палитре"
Всё. Большая часть работы сделана. Осталось
только разместить нужные компоненты на форме и организовать процесс чтения с
диска резюме и его отправки в агентства. О том, как поместить на форму
компонент многие, уверен, догадываются. Поэтому, пока что обойдёмся без
иллюстраций.
Размышляя над тем, какая информация необходима
для отправки, я пришёл к выводу, что минимально необходимы:
Позже мне пришло в голову устраивать рассылку от
имени другого человека (мало ли для чего, вдруг жена-подруга-друг попросят), и
я добавил ещё одно поле: "From". Ввиду ряда ограничений MAPI Control
6.0 это поле пока что не задействовано, но если уж потребуется когда-нибудь
рассылать резюме для кого-то, то я уж расстараюсь, но это всё отступления.
Итак, форма создана. На рис 2. показан её общий вид:
Рис 2. Общий вид главной формы для рассылки резюме по многим адресам
Неприметный жёлтый конвертик справа
внизу - кнопка "отправить", а отступ
слева - место для логотипа. Это я к тому, что дарю идею нового
суперпродукта.:)
Раньше уже было сказано, что терять время на
написание чего-то подобного очень жалко, поэтому я обошёлся без излишеств,
создав один-единственный обработчик. А именно обработчик события Click того
самого "жёлтого конвертика".
Внутри обработчика находится код для:
Код для получения списка адресов
"думает", что каждый адрес отделён от другого символом ";",
а кроме того, самый последний адрес списка также имеет ";" после
себя. Это некоторое упрощение ничем не может помешать в столь простой задаче,
поэтому и код был очень прост:
Листинг 1. Код разбора
адресов получателей
Дальше требовалось прочитать резюме. Хорошая,
коммерческая программа обязана поддерживать огромное количество форматов
документов, но для такого случая как мой, было достаточно и текстового файла.
Поэтому в коде просто открывается текстовый файл и все данные из него
помещаются в строковую переменную:
Листинг 2. Чтение
текстового файла с резюме
Из пояснений необходимо лишь сказать, что
"Text4" - имя TextBox, стоящего справа от слова
"File".
Ну и, наконец, собственно отправка:
Листинг 3. Отправка
сообщения всем адресатам из списка по очереди
Здесь MAPISession1 и
MAPIMessages1 - имена элементов управления, находящихся на форме.
Что получилось
После того, как весь код обработчика написан,
можно смело копировать в поле "To" адреса получателей, указывать
Subj, говорить, из какого файла добывать резюме и жать на конверт. MAPI
отправит сообщения в очередь исходящих программы почты по умолчанию. Вот, как
это выглядит:
Рис 3. Вид папки "Исходящие" Outlook Express
И теперь достаточно лишь нажать F5, чтобы каждый
из рекрутеров получил свою порцию внимания. С MAPI вежливым быть очень просто.
Заключение
Отмечу напоследок, что отправка сообщения будет
происходить от имени той учётной записи, которая установлена по умолчанию. То
есть, желая отправить резюме от имени друга, необходимо создать новую учётную
запись с его параметрами (имя-адрес-пароль) и выполнить предлагаемую программу.
Получатель будет уверен, что всё по-честному и сообщения отправил ваш друг.
Листинг 1. Код разбора адресов получателей
Private Sub Picture1_Click()
Dim C As Integer
Dim Pos As Integer
Dim Addresses() As String
Dim TextCopy As String
Dim Item As String
Pos = 1
C = 0
TextCopy = Text1
TextCopy = Trim(TextCopy)
For Pos = 1 To Len(TextCopy)
If Mid(TextCopy, Pos, 1) = " " Then
TextCopy = Left(TextCopy, Pos - 1) & Right(TextCopy, Len(TextCopy) - Pos)
End If
Next
For Pos = 1 To Len(Text1)
If Mid(Text1, Pos, 1) = ";" Then
C = C + 1
End If
Next
ReDim Addresses(C)
C = 0
Item = ""
For Pos = 1 To Len(TextCopy)
If Mid(TextCopy, Pos, 1) <> ";" Then
Item = Item & Mid(TextCopy, Pos, 1)
Else
C = C + 1
Addresses(C) = Item
Item = ""
End If
Next
Листинг 2. Чтение текстового файла с резюме
Dim msg As String
Open Text4 For Input As #1
TextCopy = ""
Dim A As String
Do While Not EOF(1)
Line Input #1, A
TextCopy = TextCopy &
vbCr & vbLf & A
Loop
Close #1
Листинг 3. Отправка сообщения всем адресатам из списка по очереди
MAPISession1.SignOn
For Pos = 1 To C
MAPIMessages1.SessionID =
MAPISession1.SessionID
MAPIMessages1.Compose
MAPIMessages1.RecipAddress = Addresses(Pos)
MAPIMessages1.MsgNoteText
= TextCopy
MAPIMessages1.MsgSubject
= Text3
MAPIMessages1.Send
MAPIMessages1.Delete
mapRecipientDelete
Next
MAPISession1.SignOff