Отправка почты из Navision так, чтобы она осталась в почтовом клиенте
В организации используются в качестве почтового клиента Outlook и TheBat. Возникла необходимость отправлять почту так, что бы она оставалась в почтовом клиенте у конкретного пользователя, отправляющего почту из Navision. При этом немаловажным фактором является то, что нужно подключать аттачменты.
Порывшись в интернете я понял, что для этого можно использовать протокол MAPI который поддерживают как Outlook так и TheBat.
Ниже приведен код:
(
Получатель : Text[100];
Заголовок : Text[150];
Сообщение : Text[500];
VAR СписокФайлов : TEMPORARY Record "Коды Резервов"
)
//***********************************
// Отправка почтового сообщения с несколькими файлами
// параметры
// Получатель - email получателя
// Заголовок - заголовок почтового сообщения
// Сообщение - почтовое сообщение. Может быть HTML.
// СписокФайлов - временая таблица со списком передаваемых файлов.
// "СписокФайлов.Описание" - полный путь и имя файла
//
// !!!! Navision будет недоступен до момента отправки сообщения из почтовой программы.
// В случае отмены отправки сообщения будет выдано сообщение об ошибке.
//****************************
//Локальные переменные
// mapiSession OCX Microsoft MAPI Session Control, version 6.0
// mapMess OCX Microsoft MAPI Messages Control, version 6.0
// AttchInd Integer номер передаваемого в аттачменте файла
//
mapiSession.DownLoadMail:=FALSE;
mapiSession.LogonUI:=TRUE;
mapiSession.SignOn;
mapMess.SessionID:=mapiSession.SessionID;
mapMess.MsgIndex:=-1;
mapMess.Compose;
mapMess.RecipType:=1;
mapMess.RecipAddress:=Получатель;
mapMess.MsgSubject:=Заголовок;
mapMess.MsgNoteText:=Сообщение;
AttchInd:=0;
IF СписокФайлов.FINDSET THEN
BEGIN
REPEAT
mapMess.AttachmentType := 0;
mapMess.AttachmentIndex := AttchInd;
mapMess.AttachmentPathName:=СписокФайлов.Описание;
mapMess.AttachmentPosition := AttchInd;
AttchInd+=1;
UNTIL СписокФайлов.NEXT=0;
END;
mapMess.Action:=2;
mapiSession.SignOff;
/////////////////
В параметрах передается все необходимое для формирования почтового сообщения. Во временной таблице СписокФайлов в поле Описание указан полный путь к файлу и его имя. На момент формирования сообщения файл должен существовать на диске.
Сообщение может быть в виде HTML, что позволит придать письму более презентабельный вид.
mapiSession – это объект для управления подключением к почтовому клиенту через протокол MAPI. Поле SessionID будет содержать номер сеанса подключения. DownLoadMail:=FALSE для того чтобы при подключении не закачивалась почта с сервера. LogonUI:=TRUE будет требовать регистрации пользователя в почтовом клиенте, иначе Вам нужно будет знать имя и пароль пользователя при подключении почтового клиента и прописать это в коде.
mapiSession.SignOn инициирует подключение.
mapMess – это объект для работы с почтовым сообщением. Код для формирования сообщения достаточно простой и не требует комментариев. Присваивая Action значение, Вы инициализируете выполнение тех, или иных действий у почтового клиента.
В данном случае Action:=2, что означает появление окна редактирования почтового сообщения и пользователь сам принимает решение отправлять почту или нет. К сожалению, до момента пока пользователь не отправит почту, клиент Navision будет заблокирован. Хотя с другой стороны это предотвращает желание создавать массовые рассылки. Но главное, что бы в момент формирования сообщения, Вы не начали транзакцию в Navision, иначе возникнет блокировка до тех пор, пока пользователь не отреагирует. Если пользователь откажется сохранять/отправлять сообщение — Navision выдаст ошибку. Почему непонятно, побороть я это не смог. Очередная «особенность» Navision. Вот если бы в языке была предусмотрена обработка ошибок… Ну имеем то, что имеем.
Есть возможность отправлять почту сразу без участия пользователя (Action:=3). Однако я считаю, что в этом случае лучше пользоваться SMTP протоколом и работать сразу с сервером почты…
mapiSession.SignOff – завершает сеанс и освобождает ресурсы.
Ниже приведена процедура для отправки одного файла, т.к. это наиболее часто востребованная функция.
// Локальная переменная
// ВремСписок Record Коды Резервов
//
ВремСписок.INIT;
ВремСписок.Код:='1';
ВремСписок.Описание:=Файл;
ВремСписок.INSERT;
EMail_Отправить(Получатель,Заголовок,Сообщение,ВремСписок);
////////
При настройке почтового клиента обратите внимание, что бы у пользователя был указан почтовый ящик по умолчанию. Именно в этом почтовом ящике будет сохранено сообщение.
Так же при настройке почтового клиента, устанавливая, что почтовый клиент должен работать с протоколом MAPI у пользователя должны быть права администратора, т.к. почтовый клиент может менять библиотеки MAPI в системном каталоге Windows.
На сайте «Первые шаги — Элементы управления MAPI» можно посмотреть более детальное описание элементов управления MAPI или смотрите MSDN.
Используя MAPI можно обрабатывать почту не только для отправки сообщений, но и для приема.

Автор: Владимир Викол
Количество статей, опубликованных автором: 5. Дополнительная информация об авторе появится вскоре.