Отправка электронной почты из программы

Материал из GedeminWiki
(Различия между версиями)
Перейти к: навигация, поиск
(Отсылка отчета)
(Справочник почтовых серверов)
 
(не показаны 6 промежуточных версий 1 участника)
Строка 1: Строка 1:
Организовать отсылку электронной почты из Гедымина проще всего с использованием [http://en.wikipedia.org/wiki/Collaboration_Data_Objects Collaboration Data Objects (CDO)].
+
Отправить электронную почту из программы можно с помощью встроенных функций платформы или используя внешние COM-объекты. Последний случай рассмотрен отдельно, см. [[Отправка электронной почты с использованием Collaboration Data Objects (CDO)]]. Ниже представлены возможности глобального объекта [[Gedemin_TLB.IgdWebClientControl|WebClientControl]].
  
===Пример отсылки простого сообщения===
+
===Отправка сообщения из макроса (скрипт-функции)===
 +
 
 +
Функция [[Gedemin TLB.IgdWebClientControl.SendEmail|WebClientControl.SendEMail]] позволяет задать все параметры отправки непосредственно в момент вызова:
  
 
<syntaxhighlight lang="vbnet">
 
<syntaxhighlight lang="vbnet">
 
Option Explicit
 
Option Explicit
 
Sub SendEmail
 
Sub SendEmail
  ''''''''''''''''''''''''''''''''''''''''''''
 
  ' Объявляем переменную и создаем объект
 
  ' для работы с электронной почтой
 
  Dim objMessage
 
  Set objMessage = CreateObject("CDO.Message")
 
 
 
  ''''''''''''''''''''''''''''''''''''''''''''
 
  ' Заполняем поля сообщения
 
 
 
  ' Заголовок сообщения
 
  objMessage.Subject = "Привет от Гедымина!"
 
 
 
  ' Обратный адрес. Не забудьте указать свой!
 
  objMessage.From = "xxxx@yyyy.by"
 
 
 
  ' Кому посылаем. Пропишите тут правильный адрес!
 
  objMessage.To = "xxxx@yyyy.by"
 
 
 
  ' Текст сообщения
 
  objMessage.TextBody = "Это сообщение отослано из макроса."
 
 
 
  ''''''''''''''''''''''''''''''''''''''''''''
 
  ' Указываем параметры почтового сервера
 
  ' Если они Вам неизвестны -- проконсультируйтесь
 
  ' у своего провайдера.
 
  objMessage.Configuration.Fields.Item _
 
    ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
 
   
 
  ' Адрес SMTP servera
 
  objMessage.Configuration.Fields.Item _
 
    ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "yyyy.by"
 
  objMessage.Configuration.Fields.Item _
 
    ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
 
  
  ' Имя пользователя. Укажите правильную информацию!
+
  WebClientControl.SendEMail _
  objMessage.Configuration.Fields.Item _
+
    "SMTP сервер", номер_порта, "SSLV3", _
    ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "user"
+
    "логин", "пароль", _
  ' Пароль
+
    "ящик с которого идет отправка", "кому", _
  objMessage.Configuration.Fields.Item _
+
    "Hello!", "This is a message", _
    ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
+
    "", False, False, True, 0, 0
  ' Номер порта. Если в Вашей сети используется брэндмаур,
+
 
  ' убедитесь, что соответствующий порт открыт!
+
  If WebClientControl.EmailErrorMsg = "" Then
  objMessage.Configuration.Fields.Item _
+
    MsgBox "Сообщение отослано"
    ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
+
  Else
  objMessage.Configuration.Fields.Item _
+
    MsgBox "Ошибка: " &  WebClientControl.EmailErrorMsg
    ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
+
  End If
  objMessage.Configuration.Fields.Item _
+
   
    ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
+
  objMessage.Configuration.Fields.Update
+
 
+
  ''''''''''''''''''''''''''''''''''''''''''''
+
  ' Посылаем сообщение
+
  objMessage.Send
+
 
End Sub
 
End Sub
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Вам наверняка захочется поэксперементировать с приведенным здесь кодом и отослать несколько тестовых сообщений на один и тот же адрес. Будьте внимательны, так как почтовая система может трактовать такую рассылку как вредный спам и поместить ваши послания в соответствующую папку.
+
Обратите внимание, что отправка может быть синхронной, программа останавливается и ждет завершения операции, или асинхронной -- выполнение продолжается, в то время, как сообщение отсылается в фоновом потоке.
  
===Автоматическое построение и отсылка отчета===
+
К сообщению могут быть прикреплены один или несколько файлов. Параметры WipeFile и WipeDir определяют что произойдет с файлами и папкой, где они находятся, после отправки сообщения: будут ли они удалены или сохранены.
  
Ниже приводится пример макроса, предложенный [http://code.google.com/u/nkornachenko/ nkornachenko], который строит отчет, сохраняет его в PDF файле и отсылает на указанный адрес электронной почты.
+
===Справочник почтовых серверов===
 +
 
 +
Вместо того, чтобы каждый раз прописывать данные почтового сервера в параметрах вызова функции, можно воспользоваться справочником, который находится в Исследователе, в разделе Сервис - Почтовые сервера.
 +
 
 +
Список почтовых серверов хранится в базе данных в таблице [[GD_SMTP]]. Функция [[Gedemin TLB.IgdWebClientControl.SendEmail2|SendEmail2]] принимает на вход ИД записи из GD_SMTP.
  
 
<syntaxhighlight lang="vbnet">
 
<syntaxhighlight lang="vbnet">
  ...
+
Option Explicit
  Dim B(2)
+
Sub SendEmail
  Set B(0) = OwnerForm
+
  B(1) = Date
+
  B(2) = Array(CarType)
+
  
  Dim FileName, objMessage, WScript 
+
  WebClientControl.SendEMail2 _
  FileName = ...
+
    gdcBaseManager.GetIDByRUIDString(РУИД записи из таблицы GD_SMTP), _
 +
    "кому", _
 +
    "Hello!", "This is a message", _
 +
    "", False, False, True, 0, 0
  
  Call System.ReportSystem.ExportReportWithParam(<id отчета>, B, FileName , "PDF")
+
  If WebClientControl.EmailErrorMsg = "" Then
  Set WScript = CreateObject("WScript.Shell")
+
    MsgBox "Сообщение отослано"
  Call WScript.Run("ping localhost", 1, True) 'Это пауза, потому что отчет не успевает
+
  Else
  Call WScript.Run("ping localhost", 1, True)  'построиться до отправки так как строится в отдельном потоке
+
    MsgBox "Ошибка: " & WebClientControl.EmailErrorMsg
  'WScript.Sleep 5000 'Пауза, чтобы отчет успел построиться
+
  End If
 +
   
 +
End Sub
 +
</syntaxhighlight>
  
  Set objMessage = CreateObject("CDO.Message")
+
Если на вход передать 0, то параметры сервера будут взяты из записи, помеченной флагом '''Основной'''.
  objMessage.Subject = "Тема письма"
+
  objMessage.From = "xxxxx@yyyy.by"
+
  objMessage.To = "xxxxx@yyyy.by"
+
  objMessage.TextBody = "Текст письма"
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "xxx.xxx.xxx.xxx" 'Адрес SMTP servera
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "xxxxx" 'Имя пользователя
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "yyyyy" 'Пароль
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
+
  objMessage.Configuration.Fields.Item _
+
    ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
+
  
  If FileName > "" Then
+
===Сервер по-умолчанию из файла gedemin.ini===
    objMessage.MimeFormatted = True
+
    objMessage.AddAttachment("file:" & FileName)
+
  End if
+
  
  objMessage.Configuration.Fields.Update
+
Если несколько баз используют один и тот же почтовый сервер, удобно прописать его параметры в файле [[gedemin.ini]], в разделе WEB CLIENT. В этом случае, при вызове функции SendEmail2 следует указать -1 в идентификаторе почтового сервера. Вообще, последовательность применения параметров следующая:
  
  objMessage.Send
+
# Если указан ИД = -1, то функция попытается взять параметры SMPT сервера из файла gedemin.ini. Если их там нет, см. следующий шаг.
  ...
+
# Ищем запись в GD_SMTP с заданным ИД. Если находим -- берем из нее параметры сервера. Если нет -- см. следующий шаг.
</syntaxhighlight>
+
# Ищем запись в GD_SMTP, для которой установлен флаг Основной. Если находим -- берем из нее параметры сервера. Если нет -- завершаем функцию с сообщением об ошибке.
 +
 
 +
===Построение и отправка отчета===
  
==См. также==
+
===Автоматическая отправка электронной почты===
  
* [http://www.paulsadowski.com/wsh/cdo.htm Send Email Using CDO]
 
  
 
[[Category:Школа системного администратора]]
 
[[Category:Школа системного администратора]]

Текущая версия на 14:10, 17 августа 2015

Отправить электронную почту из программы можно с помощью встроенных функций платформы или используя внешние COM-объекты. Последний случай рассмотрен отдельно, см. Отправка электронной почты с использованием Collaboration Data Objects (CDO). Ниже представлены возможности глобального объекта WebClientControl.

Содержание

[править] Отправка сообщения из макроса (скрипт-функции)

Функция WebClientControl.SendEMail позволяет задать все параметры отправки непосредственно в момент вызова:

Option Explicit
Sub SendEmail
 
   WebClientControl.SendEMail _
     "SMTP сервер", номер_порта, "SSLV3", _
     "логин", "пароль", _
     "ящик с которого идет отправка", "кому", _
     "Hello!", "This is a message", _
     "", False, False, True, 0, 0
 
   If WebClientControl.EmailErrorMsg = "" Then
     MsgBox "Сообщение отослано"
   Else
     MsgBox "Ошибка: " &  WebClientControl.EmailErrorMsg
   End If
 
End Sub

Обратите внимание, что отправка может быть синхронной, программа останавливается и ждет завершения операции, или асинхронной -- выполнение продолжается, в то время, как сообщение отсылается в фоновом потоке.

К сообщению могут быть прикреплены один или несколько файлов. Параметры WipeFile и WipeDir определяют что произойдет с файлами и папкой, где они находятся, после отправки сообщения: будут ли они удалены или сохранены.

[править] Справочник почтовых серверов

Вместо того, чтобы каждый раз прописывать данные почтового сервера в параметрах вызова функции, можно воспользоваться справочником, который находится в Исследователе, в разделе Сервис - Почтовые сервера.

Список почтовых серверов хранится в базе данных в таблице GD_SMTP. Функция SendEmail2 принимает на вход ИД записи из GD_SMTP.

Option Explicit
Sub SendEmail
 
   WebClientControl.SendEMail2 _
     gdcBaseManager.GetIDByRUIDString(РУИД записи из таблицы GD_SMTP), _
     "кому", _
     "Hello!", "This is a message", _
     "", False, False, True, 0, 0
 
   If WebClientControl.EmailErrorMsg = "" Then
     MsgBox "Сообщение отослано"
   Else
     MsgBox "Ошибка: " &  WebClientControl.EmailErrorMsg
   End If
 
End Sub

Если на вход передать 0, то параметры сервера будут взяты из записи, помеченной флагом Основной.

[править] Сервер по-умолчанию из файла gedemin.ini

Если несколько баз используют один и тот же почтовый сервер, удобно прописать его параметры в файле gedemin.ini, в разделе WEB CLIENT. В этом случае, при вызове функции SendEmail2 следует указать -1 в идентификаторе почтового сервера. Вообще, последовательность применения параметров следующая:

  1. Если указан ИД = -1, то функция попытается взять параметры SMPT сервера из файла gedemin.ini. Если их там нет, см. следующий шаг.
  2. Ищем запись в GD_SMTP с заданным ИД. Если находим -- берем из нее параметры сервера. Если нет -- см. следующий шаг.
  3. Ищем запись в GD_SMTP, для которой установлен флаг Основной. Если находим -- берем из нее параметры сервера. Если нет -- завершаем функцию с сообщением об ошибке.

[править] Построение и отправка отчета

[править] Автоматическая отправка электронной почты

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
Инструменты