Отправить сообщение.
Процедура ОтправитьСообщение(Знач УчетнаяЗапись, Знач ПараметрыОтправки) Экспорт
Перем Кому, Тема, Тело, Вложения, АдресОтвета, ТипТекста, Копии, СкрытыеКопии, ПротоколПочты, Соединение;
ПараметрыОтправки.Свойство("Соединение", Соединение);
ПараметрыОтправки.Свойство("ПротоколПочты", ПротоколПочты);
ПараметрыОтправки.Вставить("ИдентификаторСообщения", "");
ПараметрыОтправки.Вставить("ОшибочныеПолучатели", Новый Соответствие);
Если Не ПараметрыОтправки.Свойство("Тема", Тема) Тогда
Тема = "";
КонецЕсли;
Если Не ПараметрыОтправки.Свойство("Тело", Тело) Тогда
Тело = "";
КонецЕсли;
Кому = ПараметрыОтправки.Кому;
Если ТипЗнч(Кому) = Тип("Строка") Тогда
Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Кому);
КонецЕсли;
ПараметрыОтправки.Свойство("Вложения", Вложения);
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = Тема;
// Формируем адрес получателя.
Для Каждого ПочтовыйАдресПолучателя Из Кому Цикл
Получатель = Письмо.Получатели.Добавить(ПочтовыйАдресПолучателя.Адрес);
Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателя.Представление;
КонецЦикла;
// Формируем адрес получателя поля Копии.
Если ПараметрыОтправки.Свойство("Копии", Копии) Тогда
Для Каждого ПочтовыйАдресПолучателяКопии Из Копии Цикл
Получатель = Письмо.Копии.Добавить(ПочтовыйАдресПолучателяКопии.Адрес);
Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателяКопии.Представление;
КонецЦикла;
КонецЕсли;
// Формируем адрес получателя поля СкрытыеКопии.
Если ПараметрыОтправки.Свойство("СкрытыеКопии", СкрытыеКопии) Тогда
Для Каждого СведенияОПолучателе Из СкрытыеКопии Цикл
Получатель = Письмо.СлепыеКопии.Добавить(СведенияОПолучателе.Адрес);
Получатель.ОтображаемоеИмя = СведенияОПолучателе.Представление;
КонецЦикла;
КонецЕсли;
// Формируем адрес ответа, если необходимо.
Если ПараметрыОтправки.Свойство("АдресОтвета", АдресОтвета) Тогда
Для Каждого ПочтовыйАдресОтвета Из АдресОтвета Цикл
ПочтовыйАдресОбратный = Письмо.ОбратныйАдрес.Добавить(ПочтовыйАдресОтвета.Адрес);
ПочтовыйАдресОбратный.ОтображаемоеИмя = ПочтовыйАдресОтвета.Представление;
КонецЦикла;
КонецЕсли;
// Получение реквизитов отправителя.
РеквизитыОтправителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ИмяПользователя,АдресЭлектроннойПочты,ОтправлятьСкрытыеКопииПисемНаЭтотАдрес");
// Добавляем к письму имя отправителя.
Письмо.ИмяОтправителя = РеквизитыОтправителя.ИмяПользователя;
Письмо.Отправитель.ОтображаемоеИмя = РеквизитыОтправителя.ИмяПользователя;
Письмо.Отправитель.Адрес = РеквизитыОтправителя.АдресЭлектроннойПочты;
// Добавляем скрытую копию на адрес отправителя.
Если РеквизитыОтправителя.ОтправлятьСкрытыеКопииПисемНаЭтотАдрес Тогда
Получатель = Письмо.СлепыеКопии.Добавить(РеквизитыОтправителя.АдресЭлектроннойПочты);
Получатель.ОтображаемоеИмя = РеквизитыОтправителя.ИмяПользователя;
КонецЕсли;
// Добавляем вложения к письму.
Если Вложения <> Неопределено Тогда
Для Каждого Вложение Из Вложения Цикл
Если ТипЗнч(Вложение) = Тип("Структура") Тогда
ДанныеФайла = Неопределено;
Если ЭтоАдресВременногоХранилища(Вложение.АдресВоВременномХранилище) Тогда
ДанныеФайла = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище);
Иначе
ДанныеФайла = Вложение.АдресВоВременномХранилище;
КонецЕсли;
НовоеВложение = Письмо.Вложения.Добавить(ДанныеФайла, Вложение.Представление);
Если Вложение.Свойство("Кодировка") И Не ПустаяСтрока(Вложение.Кодировка) Тогда
НовоеВложение.Кодировка = Вложение.Кодировка;
КонецЕсли;
Если Вложение.Свойство("Идентификатор") Тогда
НовоеВложение.Идентификатор = Вложение.Идентификатор;
КонецЕсли;
Иначе // Поддержка обратной совместимости с 2.2.1.
Если ТипЗнч(Вложение.Значение) = Тип("Структура") Тогда
НовоеВложение = Письмо.Вложения.Добавить(Вложение.Значение.ДвоичныеДанные, Вложение.Ключ);
Если Вложение.Значение.Свойство("Идентификатор") Тогда
НовоеВложение.Идентификатор = Вложение.Значение.Идентификатор;
КонецЕсли;
Если Вложение.Значение.Свойство("Кодировка") Тогда
НовоеВложение.Кодировка = Вложение.Значение.Кодировка;
КонецЕсли;
Если Вложение.Значение.Свойство("ТипСодержимого") Тогда
НовоеВложение.ТипСодержимого = Вложение.Значение.ТипСодержимого;
КонецЕсли;
Если Вложение.Значение.Свойство("Имя") Тогда
НовоеВложение.Имя = Вложение.Значение.Имя;
КонецЕсли;
Иначе
ИнтернетПочтовоеВложение = Письмо.Вложения.Добавить(Вложение.Значение, Вложение.Ключ);
Если ТипЗнч(Вложение.Значение) = Тип("ИнтернетПочтовоеСообщение") Тогда
ИнтернетПочтовоеВложение.ТипСодержимого = "message/rfc822";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для Каждого Вложение Из Письмо.Вложения Цикл
Если Не ЗначениеЗаполнено(Вложение.ТипСодержимого) Тогда
ТипСодержимого = ОпределитьТипСодержимогоПоИмениФайла(Вложение.Имя);
Если ЗначениеЗаполнено(ТипСодержимого) Тогда
Вложение.ТипСодержимого = ТипСодержимого;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если ПараметрыОтправки.Свойство("ИдентификаторыОснований") Тогда
Письмо.УстановитьПолеЗаголовка("References", ПараметрыОтправки.ИдентификаторыОснований);
КонецЕсли;
ТипТекста = Неопределено;
Если ТипЗнч(Тело) = Тип("ФорматированныйДокумент") Тогда
СодержимоеПисьма = ПолучитьHTMLФорматированногоДокументаДляПисьма(Тело);
Тело = СодержимоеПисьма.ТекстHTML;
Картинки = СодержимоеПисьма.Картинки;
ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
Для Каждого Картинка Из Картинки Цикл
ИмяКартинки = Картинка.Ключ;
ДанныеКартинки = Картинка.Значение;
Вложение = Письмо.Вложения.Добавить(ДанныеКартинки.ПолучитьДвоичныеДанные(), ИмяКартинки);
Вложение.Идентификатор = ИмяКартинки;
КонецЦикла;
КонецЕсли;
Текст = Письмо.Тексты.Добавить(Тело);
Если ЗначениеЗаполнено(ТипТекста) Тогда
Текст.ТипТекста = ТипТекста;
КонецЕсли;
Если ТипТекста = Неопределено Тогда
Если ПараметрыОтправки.Свойство("ТипТекста", ТипТекста) Тогда
Если ТипЗнч(ТипТекста) = Тип("Строка") Тогда
Если ТипТекста = "HTML" Тогда
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
ИначеЕсли ТипТекста = "RichText" Тогда
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст;
Иначе
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
КонецЕсли;
ИначеЕсли ТипЗнч(ТипТекста) = Тип("ПеречислениеСсылка.ТипыТекстовЭлектронныхПисем") Тогда
Если ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTML
ИЛИ ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.HTMLСКартинками Тогда
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
ИначеЕсли ТипТекста = Перечисления.ТипыТекстовЭлектронныхПисем.РазмеченныйТекст Тогда
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.РазмеченныйТекст;
Иначе
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
КонецЕсли;
Иначе
Текст.ТипТекста = ТипТекста;
КонецЕсли;
Иначе
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
КонецЕсли;
КонецЕсли;
Важность = Неопределено;
Если ПараметрыОтправки.Свойство("Важность", Важность) Тогда
Письмо.Важность = Важность;
КонецЕсли;
Кодировка = Неопределено;
Если ПараметрыОтправки.Свойство("Кодировка", Кодировка) Тогда
Письмо.Кодировка = Кодировка;
КонецЕсли;
Если ПараметрыОтправки.Свойство("ОбрабатыватьТексты") И НЕ ПараметрыОтправки.ОбрабатыватьТексты Тогда
ОбрабатыватьТекстСообщения = ОбработкаТекстаИнтернетПочтовогоСообщения.НеОбрабатывать;
Иначе
ОбрабатыватьТекстСообщения = ОбработкаТекстаИнтернетПочтовогоСообщения.Обрабатывать;
КонецЕсли;
Если ПараметрыОтправки.Свойство("УведомитьОДоставке") Тогда
Письмо.УведомитьОДоставке = ПараметрыОтправки.УведомитьОДоставке;
КонецЕсли;
Если ПараметрыОтправки.Свойство("УведомитьОПрочтении") Тогда
Письмо.УведомитьОПрочтении = ПараметрыОтправки.УведомитьОПрочтении;
Письмо.АдресаУведомленияОПрочтении.Добавить(РеквизитыОтправителя.АдресЭлектроннойПочты);
КонецЕсли;
СоздаватьСоединение = ТипЗнч(Соединение) <> Тип("ИнтернетПочта");
УстановитьОтключениеБезопасногоРежима(Истина);
Профиль = ИнтернетПочтовыйПрофиль(УчетнаяЗапись);
УстановитьОтключениеБезопасногоРежима(Ложь);
Если СоздаватьСоединение Тогда
УстановитьОтключениеБезопасногоРежима(Истина);
ПротоколПодключения = ПротоколПодключенияПоПрофилю(Профиль);
Если ПротоколПодключения = ПротоколИнтернетПочты.POP3 Тогда
ПротоколПочты = "";
Иначе
ПротоколПочты = "Все";
КонецЕсли;
Соединение = Новый ИнтернетПочта;
Соединение.Подключиться(Профиль, ПротоколПодключения);
ОпределитьПапкуОтправленные(ПротоколПодключения, Соединение);
КонецЕсли;
Попытка
Если ПротоколПочты = "" Или ПротоколПочты = "Все" Тогда
ОшибочныеПолучатели = Соединение.Послать(Письмо, ОбрабатыватьТекстСообщения, ПротоколИнтернетПочты.SMTP);
ПараметрыОтправки.Вставить("ИдентификаторСообщения", Письмо.ИдентификаторСообщения);
ПараметрыОтправки.Вставить("ОшибочныеПолучатели", ОшибочныеПолучатели);
ПараметрыОтправки.Вставить("ИдентификаторСообщенияОтправкаIMAP", "");
КонецЕсли;
Если ПротоколПочты = "IMAP" Или ПротоколПочты = "Все" И Не ПочтовыйСерверХранитПисьмаОтправленныеПоSMTP(Профиль) Тогда
Соединение.Послать(Письмо, ОбрабатыватьТекстСообщения, ПротоколИнтернетПочты.IMAP);
ПараметрыОтправки.Вставить("ИдентификаторСообщенияОтправкаIMAP", Письмо.ИдентификаторСообщения);
КонецЕсли;
Исключение
Если СоздаватьСоединение Тогда
Попытка
Соединение.Отключиться();
Исключение
// Обработка и журналирование исключения не требуется, т.к.
// в вызывающий код передается исходное исключение, которое будет там обработано.
КонецПопытки;
КонецЕсли;
ВызватьИсключение;
КонецПопытки;
Если СоздаватьСоединение Тогда
Соединение.Отключиться();
УстановитьОтключениеБезопасногоРежима(Ложь);
КонецЕсли;
КонецПроцедуры
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2019, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////
СоздатьИОтправитьСообщениеSMS (БСП)
СформироватьСообщениеИОтправить (БСП)