Отправка электронных сообщений из 1С:Предприятие 8 с помощью компоненты CDO.Message

Logo_1c_8_RazradotkaВ данной статье я рассмотрю пример кода, который позволяет отправлять электронные сообщения из 1С:Предприятие 8 с помощью стандартной библиотеки CDO.Message. Данная библиотека по умолчанию входит во все версии ОС Windows начиная с Win2K. Этот метод отправки сообщений может пригодится когда на почтовом сервере используется защищенный протокол SSL и позволяет избежать необходимости установки дополнительного ПО, такого как stunnel и пр. Итак:

 

 

Раннее, я уже приводил пример кода отправки электронных сообщений из 1С. Но, как уже говорилось выше, данный метод будет необходим, если smtp-сервер использует протокол SSL (например, данный протокол сейчас обязателен для yandex.ru, mail.ru gmail.com)

Библиотека CDO.Message по умолчанию встроена в ОС семейства Windows начиная с Win2K, вместе с классом CDO.Configuration, который также необходим для отправки сообщений. Описание библиотек на сайте MSDN.

Весь приведенный ниже код может работать как на клиенте, так и на сервере. Главное чтобы были доступны COM-объекты «CDO.Message» и «CDO.Configuration».

Для отправки сообщений, необходимо вызвать функцию, содержащую следующий код:

// Отправить электронное сообщение с помощью CDO.Message
//
// Параметры:
//  СтруктураСообщения      - Структура - струкутура отправляемого сообщения:
//    * АдресЭлектроннойПочтыПолучателя     - Строка - Адрес электронной почты получателя сообщения. Может содержать несколько адресов, разделеных знаком ";".
//    * АдресЭлектроннойПочтыОтправителя    - Строка - Адрес электронной почты отправителя сообщения.
//    * ТемаСообщения                       - Строка - Тема сообщения.
//    * ТипТекстаПочтовогоСообщения         - Системное перечисление ТипТекстаПочтовогоСообщения - тип тела сообщения
//    * ТекстСообщения                      - Строка - Текст сообщения
//    * Вложения                            - Строка или СписокЗначений, состоящий из строк - Путь к вложениями сообщения
//  УчетнаяЗаписьЭП         - Структура - структура учетной записи электронной почты для отправки:
//    * АдресSMTP                           - Строка - Адрес SMTP-сервера
//    * ПортSMTP                            - Строка - Порт SMTP-сервера
//    * ПользовательSMTP                    - Строка - Имя пользвоателя SMTP-сервера
//    * ПарольSMTP                          - Строка - Пароль пользвоателя SMTP-сервера
//    * ИспользоватьSSL                     - Булево - Использовать протокол SSL
//
// Возвращаемое значение:
//  Булево                  - Результат отправки сообщения:
//   * Истина                               - Сообщение успешно отправлено.
//   * Ложь                                 - Ошибка отправки собщения
//
&НаКлиенте
Функция ОтправитьСообщениеCDOMessage(СтруктураСообщения, УчетнаяЗаписьЭП)

  //Создание объектов
  Попытка
    loConfig = Новый COMОбъект("CDO.Configuration");
    loCdoMessage = Новый COMОбъект("CDO.Message");
  Исключение
    Сообщить(ОписаниеОшибки());
    Возврат Ложь;
  КонецПопытки;

  //Адрес получателя
  loCdoMessage.To = СокрЛП(СтруктураСообщения.АдресЭлектроннойПочтыПолучателя);
  //Адрес отправителя
  loCdoMessage.From = СокрЛП(СтруктураСообщения.АдресЭлектроннойПочтыОтправителя);
  //Тема сообщения
  loCdoMessage.Subject = СокрЛП(СтруктураСообщения.ТемаСообщения);

  //Текст сообщения в зависимости от формата
  #Если ВебКлиент Тогда
    loCdoMessage.Textbody = СокрЛП(СтруктураСообщения.ТекстСообщения);
  #Иначе
  Если СтруктураСообщения.ТипТекстаПочтовогоСообщения = ТипТекстаПочтовогоСообщения.HTML Тогда
    loCdoMessage.HTMLBody = СокрЛП(СтруктураСообщения.ТекстСообщения);
  Иначе
    loCdoMessage.Textbody = СокрЛП(СтруктураСообщения.ТекстСообщения);
  КонецЕсли;
  #КонецЕсли

  //Вложения
  СписокВложений = СтруктураСообщения.Вложения;
  Если ТипЗнч(СписокВложений) = Тип("Строка") И Не СписокВложений = "" Тогда
    Попытка
      loCdoMessage.AddAttachment(СписокВложений);
    Исключение
    КонецПопытки;
  ИначеЕсли ТипЗнч(СписокВложений) = Тип("СписокЗначений") Тогда
    Для Каждого ПутьКВложению Из СписокВложений Цикл
      Попытка
        loCdoMessage.AddAttachment(ПутьКВложению.Значение);
      Исключение
      КонецПопытки;
    КонецЦикла;
  КонецЕсли;

  //Параметры сообщения
  loCdoMessage.Configuration = loConfig;
  //Адрес SMTP-Сервера
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = УчетнаяЗаписьЭП.АдресSMTP;
  //Порт SMTP-сервера
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = УчетнаяЗаписьЭП.ПортSMTP;
  //Имя пользвоателя SMTP-сервера
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = УчетнаяЗаписьЭП.ПользовательSMTP;
  //Пароль пользвоателя SMTP-сервера
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = УчетнаяЗаписьЭП.ПарольSMTP;
  //Способ передачи сообщения:
  //  1 - Отправить сообщение с помощью локального каталога SMTP-службы
  //  2 - Отправить сообщение через сеть (по протоколу SMTP по сети).
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
  //Проверка подлинности:
  //  0 - Без аутентифиации
  //  1 - Использовать базовую (открытым текстом) проверку подлинности.
  //  2 - Использовать проверку подлинности ntlm
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;
  //Использование протокола SSL
  //  0 - Не использовать
  //  1 - Использовать
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = ?(УчетнаяЗаписьЭП.ИспользоватьSSL,1,0);
  //Число секунд ожидания для службы SMTP
  loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
  //Обновляем настройки
  loConfig.Fields.Update();

  //Отправка сообщения
  Попытка
    loCdoMessage.Send();
    Возврат Истина;
  Исключение
    Сообщить(ОписаниеОшибки());
    Возврат Ложь;
  КонецПопытки;

КонецФункции

Пример вызова функции может быть следующим:

&НаКлиенте
Процедура Отправить(Команда)

  //Структура сообщения
  СтруктураСообщения = Новый Структура;
  СтруктураСообщения.Вставить("АдресЭлектроннойПочтыПолучателя","example@mail.ru");
  СтруктураСообщения.Вставить("АдресЭлектроннойПочтыОтправителя","example@yandex.ru");
  СтруктураСообщения.Вставить("ТемаСообщения","Проверка сообщения");
  #Если ВебКлиент Тогда
    СтруктураСообщения.Вставить("ТипТекстаПочтовогоСообщения",Неопределено);
  #Иначе
    СтруктураСообщения.Вставить("ТипТекстаПочтовогоСообщения",ТипТекстаПочтовогоСообщения.HTML);
  #КонецЕсли
  ТекстСообщения =
  "˂html˃
  |˂head˃
  |˂meta content=""text/html; charset=Windows-1251"" http-equiv=""content-type""˃
  |˂title˃ Проверка сообщения ˂/title˃
  |˂/head˃
  |˂body˃
  |˂p˃˂/p˃
  |˂h1> Заголовок сообщения ˂/h1˃
  |˂p˃˂/p˃
  |˂p˃ Это текст тестового сообщения!˂/p˃
  |˂p˃˂/p˃
  |˂/body˃
  |˂/html˃";
  СтруктураСообщения.Вставить("ТекстСообщения",ТекстСообщения);
  СтруктураСообщения.Вставить("Вложения","E:\example\Счет_на_оплату.pdf");

  //Учетная запись электронной почты
  УчетнаяЗаписьЭП = Новый Структура;
  УчетнаяЗаписьЭП.Вставить("АдресSMTP","smtp.yandex.ru");
  УчетнаяЗаписьЭП.Вставить("ПортSMTP","465");
  УчетнаяЗаписьЭП.Вставить("ПользовательSMTP","example@yandex.ru");
  УчетнаяЗаписьЭП.Вставить("ПарольSMTP","Pass123");
  УчетнаяЗаписьЭП.Вставить("ИспользоватьSSL",Истина);

  //Отпрпавка сообщения
  Если ОтправитьСообщениеCDOMessage(СтруктураСообщения, УчетнаяЗаписьЭП) Тогда
    Сообщить("Сообщение успешно отправлено!");
  КонецЕсли;

КонецПроцедуры

Пример использования данной процедуры можно посмотреть вот в этой простой обработке (на управляемых формах):

Скачать обработку

otpravka-email-d-cdo-message-iz-1c-001

Помогла ли вам данная статья?
Да, спасибо, все получилось.
Немного помогла.
Совсем не помогла.
Не то, что я искал(а).
Смотреть результаты
Запись опубликована в рубрике Разработка в 1С с метками . Добавьте в закладки постоянную ссылку.


2 Responses to Отправка электронных сообщений из 1С:Предприятие 8 с помощью компоненты CDO.Message

  1. Аноним говорит:

    Обработка ругается следующим образом. Т.е. объект COM-объект создается, но его свойства недоступны. В чем может быть причина?
    Поле объекта не обнаружено (To)
    {ВнешняяОбработка.ОтправкаСообщенияCDOMessage.Форма.Форма.Форма(91)}: loCdoMessage.To = СокрЛП(СтруктураСообщения.АдресЭлектроннойПочтыПолучателя);
    {ВнешняяОбработка.ОтправкаСообщенияCDOMessage.Форма.Форма.Форма(49)}: Если ОтправитьСообщениеCDOMessage(СтруктураСообщения, УчетнаяЗаписьЭП) Тогда

    • Виталий Онянов говорит:

      Добрый день.

      Вообще, обработка уже давно не актуальна, т. к. в современных версиях платформы никаких проблем с отправкой электронных писем нет.

      Какой версии Windows стоит на компьютере, где вы запускаете обработку?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *