ОтправитьСообщение (БСП)

Автор: 1С
ОбщийМодуль.РаботаСПочтовымиСообщениямиСлужебный
БСП

Отправить сообщение.

Процедура ОтправитьСообщение(Знач УчетнаяЗапись, Знач ПараметрыОтправки) Экспорт
	Перем Кому, Тема, Тело, Вложения, АдресОтвета, ТипТекста, Копии, СкрытыеКопии, ПротоколПочты, Соединение;
	
	ПараметрыОтправки.Свойство("Соединение", Соединение);
	ПараметрыОтправки.Свойство("ПротоколПочты", ПротоколПочты);
	ПараметрыОтправки.Вставить("ИдентификаторСообщения", "");
	ПараметрыОтправки.Вставить("ОшибочныеПолучатели", Новый Соответствие);
	
	Если Не ПараметрыОтправки.Свойство("Тема", Тема) Тогда
		Тема = "";
	КонецЕсли;
	
	Если Не ПараметрыОтправки.Свойство("Тело", Тело) Тогда
		Тело = "";
	КонецЕсли;
	
	Кому = ПараметрыОтправки.Кому;
	
	Если ТипЗнч(Кому) = Тип("Строка") Тогда
		Кому = ОбщегоНазначенияКлиентСервер.РазобратьСтрокуСПочтовымиАдресами(Кому);
	КонецЕсли;
	
	ПараметрыОтправки.Свойство("Вложения", Вложения);
	
	Письмо = Новый ИнтернетПочтовоеСообщение;
	Письмо.Тема = Тема;
	
	// Формируем адрес получателя.
	Для Каждого ПочтовыйАдресПолучателя Из Кому Цикл
		Получатель = Письмо.Получатели.Добавить(ПочтовыйАдресПолучателя.Адрес);
		Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателя.Представление;
	КонецЦикла;
	
	// Формируем адрес получателя поля Копии.
	Если ПараметрыОтправки.Свойство("Копии", Копии) Тогда
		Для Каждого ПочтовыйАдресПолучателяКопии Из Копии Цикл
			Получатель = Письмо.Копии.Добавить(ПочтовыйАдресПолучателяКопии.Адрес);
			Получатель.ОтображаемоеИмя = ПочтовыйАдресПолучателяКопии.Представление;
		КонецЦикла;
	КонецЕсли;
	
	// Формируем адрес получателя поля СкрытыеКопии.
	Если ПараметрыОтправки.Свойство("СкрытыеКопии", СкрытыеКопии) Тогда
		Для Каждого СведенияОПолучателе Из СкрытыеКопии Цикл
			Получатель = Письмо.СлепыеКопии.Добавить(СведенияОПолучателе.Адрес);
			Получатель.ОтображаемоеИмя = СведенияОПолучателе.Представление;
		КонецЦикла;
	КонецЕсли;
	
	// Формируем адрес ответа, если необходимо.
	Если ПараметрыОтправки.Свойство("АдресОтвета", АдресОтвета) Тогда
		Для Каждого ПочтовыйАдресОтвета Из АдресОтвета Цикл
			ПочтовыйАдресОбратный = Письмо.ОбратныйАдрес.Добавить(ПочтовыйАдресОтвета.Адрес);
			ПочтовыйАдресОбратный.ОтображаемоеИмя = ПочтовыйАдресОтвета.Представление;
		КонецЦикла;
	КонецЕсли;
	
	// Получение реквизитов отправителя.
	РеквизитыОтправителя = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(УчетнаяЗапись, "ИмяПользователя,АдресЭлектроннойПочты,ОтправлятьСкрытыеКопииПисемНаЭтотАдрес");
	
	// Добавляем к письму имя отправителя.
	Письмо.ИмяОтправителя              = РеквизитыОтправителя.ИмяПользователя;
	Письмо.Отправитель.ОтображаемоеИмя = РеквизитыОтправителя.ИмяПользователя;
	Письмо.Отправитель.Адрес           = РеквизитыОтправителя.АдресЭлектроннойПочты;
	
	// Добавляем скрытую копию на адрес отправителя.
	Если РеквизитыОтправителя.ОтправлятьСкрытыеКопииПисемНаЭтотАдрес Тогда
		Получатель = Письмо.СлепыеКопии.Добавить(РеквизитыОтправителя.АдресЭлектроннойПочты);
		Получатель.ОтображаемоеИмя = РеквизитыОтправителя.ИмяПользователя;
	КонецЕсли;
	
	// Добавляем вложения к письму.
	Если Вложения <> Неопределено Тогда
		Для Каждого Вложение Из Вложения Цикл
			Если ТипЗнч(Вложение) = Тип("Структура") Тогда
					ДанныеФайла = Неопределено;
				Если ЭтоАдресВременногоХранилища(Вложение.АдресВоВременномХранилище) Тогда
					ДанныеФайла = ПолучитьИзВременногоХранилища(Вложение.АдресВоВременномХранилище);
				Иначе
					ДанныеФайла = Вложение.АдресВоВременномХранилище;
				КонецЕсли;
				НовоеВложение = Письмо.Вложения.Добавить(ДанныеФайла, Вложение.Представление);
				Если Вложение.Свойство("Кодировка") И Не ПустаяСтрока(Вложение.Кодировка) Тогда
					НовоеВложение.Кодировка = Вложение.Кодировка;
				КонецЕсли;
				Если Вложение.Свойство("Идентификатор") Тогда
					НовоеВложение.Идентификатор = Вложение.Идентификатор;
				КонецЕсли;
			Иначе // Поддержка обратной совместимости с 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 (БСП)

СформироватьСообщениеИОтправить (БСП)

ОтправитьДанныеСообщенияВТехПоддержку (БСП)

ОтправитьИПолучитьСообщения (БСП)

TurboConf - расширение Конфигуратора 1С