В данной статье я рассмотрю пример кода, который позволяет отправлять электронные сообщения из 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(СтруктураСообщения, УчетнаяЗаписьЭП) Тогда Сообщить("Сообщение успешно отправлено!"); КонецЕсли; КонецПроцедуры
Пример использования данной процедуры можно посмотреть вот в этой простой обработке (на управляемых формах):
Обработка ругается следующим образом. Т.е. объект COM-объект создается, но его свойства недоступны. В чем может быть причина?
Поле объекта не обнаружено (To)
{ВнешняяОбработка.ОтправкаСообщенияCDOMessage.Форма.Форма.Форма(91)}: loCdoMessage.To = СокрЛП(СтруктураСообщения.АдресЭлектроннойПочтыПолучателя);
{ВнешняяОбработка.ОтправкаСообщенияCDOMessage.Форма.Форма.Форма(49)}: Если ОтправитьСообщениеCDOMessage(СтруктураСообщения, УчетнаяЗаписьЭП) Тогда
Добрый день.
Вообще, обработка уже давно не актуальна, т. к. в современных версиях платформы никаких проблем с отправкой электронных писем нет.
Какой версии Windows стоит на компьютере, где вы запускаете обработку?