Альтернативный способ отправки почты из DIRECTUM по протоколу SMTP

14 7

Все, кому доводилось отправлять почту из DIRECTUM с использованием стандартных функций и блоков типовых маршрутов, скорее всего обратили внимание, что все они работают с почтовой фабрикой IMailFactory "SBUM.MailFactory". К сожалению, данный объект не всегда подходит для реализации задач отправки почты при определенных условиях (не умеет отправлять почту с использованием SSL, кодировку можно менять только у письма в формате HTML и т.п.). По этому поводу даже уже появилась соответствующая идея: Добавление возможности работы с SSL/TLS и 64-битным Outlook в библиотеки SBUM.

Ниже предлагается альтернативный вариант отправки почты из DIRECTUM, без использования "SBUM.MailFactory", с помощью объектной модели CDO (Collaboration Data Objects): 

  SmtpServer = "msg-01"
  SmtpPort = 25
  SmtpUser = "directum"
  SmtpPass = "password"
  Attachment = "c:\temp\test.doc"
  objMessage = CreateObject("CDO.Message")
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = SmtpServer
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = SmtpPort
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
  objMessage.BodyPart.CharSet = "windows-1251"
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1 // 0=None; 1=Basic; 2=NTLM
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = SmtpUser
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = SmtpPass
  objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
  objMessage.Configuration.Fields.Update
  objMessage.Subject = "Тема письма"
  objMessage.From = Format('"%s" <%s>'; ArrayOf("User"; User@company.ru))
  objMessage.To = "User1@company.ru"
  objMessage.CC = "User2@company.ru"
  objMessage.BCC = "User3@company.ru"
  objMessage.TextBody = "Текст письма"
  objMessage.AddAttachment(Attachment)
  objMessage.Send
  objMessage = nil

 

Подробную справку по объектной модели CDO можно найти в MSDN.

К сожалению, эта библиотека работает только с протоколом SMTP и каталогом Pickup на диске. Она не умеет работать ни с протоколом POP3, ни с IMAP4, ни с MAPI, а, значит, подключиться к почтовому серверу и проверить на нем появление новых сообщений мы не сможем. Придется использовать другую библиотеку из набора CDO — Microsoft CDO 1.21 Library. Она умеет работать только с MAPI, зато она умеет выполнять различные операции в почтовом ящике на Exchange Server без всяких предупреждающих сообщений. Справку по этой библиотеке также можно найти в MSDN.

В качестве еще одной альтернативы "SBUM.MailFactory", можно воспользоваться утилитами командной строки - например, sendmail и mapisend от Microsoft или bmail.

Ниже приложен набор функций и блоков типовых маршрутов для отправки почты из DIRECTUM с использованием объектной модели CDO. Разработка велась в DIRECTUM 4.7. Пример использования одной из этих функций: 

    SendingResult = RITSMTPMailSendDialog("user1"; "user1@company.ru"; "user2@company.ru, user3@company.ru"; 
      "medved@mail.ru"; ; "Тема письма"; "Текст письма"; "c:\temp\test.doc"; ; "koi8-r"; "Да"; "Basic"; "Нет")
      
    // Определить результаты отправки письма
    if SendingResult == ''
      ShowMessage('Письмо успешно отправлено')
    else
      ShowMessage(SendingResult)
    endif

 

 

 

 

 

 

 

Пример с использованием блоков типового маршрута приводить не буду, там и так все понятно. Добавлю только, что один из двух блоков отправляет письмо с вложениями из типового маршрута (свойства блока задаются по аналогии со стандартными блоками отправки письма), а второй блок добавляет к вложениям ярлык IS-Bulder на задачу, из которой письмо отправлено. 

SMTPMail.zip (23,68 Кб)

P.S. Я не знаю почему так "перекосило" пример кода, но если его вставлять прямо в текст, картина получается еще хуже. 

 

14
Авторизуйтесь, чтобы оценить материал.
1
Алексей Немцев

Дмитрий, во-первых, спасибо за решение, используем его во всех наших разработках.

А не подскажите - знаете ли альтернативные способы получения почты из Directum, помимо DCTS?

Проблема в том, что DCTS не получает информацию о "квитках", в формате iCalendar, которые нам нужно парсить.

Mikhail Kislitsyn

Алексей, может через ОМ Outlook?

Алексей Немцев

Михаил, нет Аутлука... В качестве почтовой системы используется IBM Lotus Notes...SBUM.MailFactory использовать не удается.. Или вы советуете установить и настроить Outlook в качестве почтового клиента и через его объектную модель работать?

Дмитрий Тарасов

Или еще в самом материале я указал:

Придется использовать другую библиотеку из набора CDO — Microsoft CDO 1.21 Library. Она умеет работать только с MAPI, зато она умеет выполнять различные операции в почтовом ящике на Exchange Server без всяких предупреждающих сообщений. Справку по этой библиотеке также можно найти в MSDN.

Вот пример использования:
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.

Олег Быков

В качестве почтовой системы нужно использовать SQL Database Mail и не ставить MS Office на ПК

Денис Евграфов

Всем привет, тема еще актуальна?

Хочу использовать SMTP Send pulse. Подскажите пожалуйста, можно как нибудь посмотреть логирование функции подключения objMessage.Configuration.Fields.Update. Данные ввел с сайта который предоставил мне сервис, проблема в том, что возвращает пустое значение при коннекте, обратился в тех поддержку сервиса, просят предоставить логи ( по коду ошибок нету, хотелось бы посмотреть, что происходит, трассировщиком не поймал, не могу провалиться в функцию Update)

Раиль Ахметзянов

Отличное решение. Благодарю за подробное описание.

Авторизуйтесь, чтобы написать комментарий