Использование компонентов “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.

components.gif
Рис 1. Добавление библиотеки компонентов и изменения в "Палитре"

Всё. Большая часть работы сделана. Осталось только разместить нужные компоненты на форме и организовать процесс чтения с диска резюме и его отправки в агентства. О том, как поместить на форму компонент многие, уверен, догадываются. Поэтому, пока что обойдёмся без иллюстраций.

Размышляя над тем, какая информация необходима для отправки, я пришёл к выводу, что минимально необходимы:

Позже мне пришло в голову устраивать рассылку от имени другого человека (мало ли для чего, вдруг жена-подруга-друг попросят), и я добавил ещё одно поле: "From". Ввиду ряда ограничений MAPI Control 6.0 это поле пока что не задействовано, но если уж потребуется когда-нибудь рассылать резюме для кого-то, то я уж расстараюсь, но это всё отступления. Итак, форма создана. На рис 2. показан её общий вид:

mainform.gif
Рис 2. Общий вид главной формы для рассылки резюме по многим адресам

Неприметный жёлтый конвертик справа внизу - кнопка "отправить", а отступ слева - место для логотипа. Это я к тому, что дарю идею нового суперпродукта.:)

Раньше уже было сказано, что терять время на написание чего-то подобного очень жалко, поэтому я обошёлся без излишеств, создав один-единственный обработчик. А именно обработчик события Click того самого "жёлтого конвертика".

Внутри обработчика находится код для:

Код для получения списка адресов "думает", что каждый адрес отделён от другого символом ";", а кроме того, самый последний адрес списка также имеет ";" после себя. Это некоторое упрощение ничем не может помешать в столь простой задаче, поэтому и код был очень прост:

Листинг 1. Код разбора адресов получателей

Дальше требовалось прочитать резюме. Хорошая, коммерческая программа обязана поддерживать огромное количество форматов документов, но для такого случая как мой, было достаточно и текстового файла. Поэтому в коде просто открывается текстовый файл и все данные из него помещаются в строковую переменную:

Листинг 2. Чтение текстового файла с резюме

Из пояснений необходимо лишь сказать, что "Text4" - имя TextBox, стоящего справа от слова "File".

Ну и, наконец, собственно отправка:

Листинг 3. Отправка сообщения всем адресатам из списка по очереди

Здесь MAPISession1 и MAPIMessages1 - имена элементов управления, находящихся на форме.

Что получилось

После того, как весь код обработчика написан, можно смело копировать в поле "To" адреса получателей, указывать Subj, говорить, из какого файла добывать резюме и жать на конверт. MAPI отправит сообщения в очередь исходящих программы почты по умолчанию. Вот, как это выглядит:

mymail.gif
Рис 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

 

Хостинг от uCoz