Об отправке электронных писем средствами платформы "Бухгалтерия предприятия КОРП"

Публикация № 1029390

Разработка - Системная интеграция - Email рассылки

Почта интернет-почта почтовый сервис отчет доставка

Взаимодействие между пользователями посредством пересылки сообщений электронной почты на сегодняшний день является естественной необходимостью, такой, к примеру, как пересылка сообщений в социальных сетях и чатах. Современные системы автоматизации, такие как платформа 1С, способны удовлетворить потребность пользователей в отправке документации средствами взаимодействия платформы с почтовыми сервисами. Но для осуществления такого взаимодействия необходимо произвести настройки системы, об этом и пойдёт речь.

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

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

Для отправки сообщений использовалось два пути:

  1. «Почта», с использованием Outlook.

  2. «ИнтернетПочта», то есть встроенные функции 1С.

Первый вариант достаточно прост. Учитывая то, что все учётные записи пользователя, вместе с паролями находятся в приложении Outlook, то остаётся только обратиться к ним из 1С, добавить адресата, сформировать само письмо, если необходимо, то с вложениями, и отправить его.

Процедура ОтправкаПисьма(Кнопка)
	ПредставлениеСохраняемогоФайла = ПолучитьТекстЗаголовка(Ложь);
	Результат = ЭтаФорма.ЭлементыФормы.Результат;
	ПолноеИмяФайла = РаботаСФайлами.УдалитьЗапрещенныеСимволыИмени(ПредставлениеСохраняемогоФайла);
	КаталогВр = КаталогВременныхФайлов(); //Определение каталога временного файла
	Результат.Записать(КаталогВр + ПолноеИмяФайла + ".xls",ТипФайлаТабличногоДокумента.XLS); //Запись таблицы отчёта в файл на диске
	ПолучитьПользователя = ПараметрыСеанса.ТекущийПользователь;
	ЯщикПользователя = Справочники.КД_ЭлектроннаяПочтаСотрудников.НайтиПоНаименованию(ПолучитьПользователя).ПочтовыйПрофиль;
	НовСообщение = Новый ПочтовоеСообщение; //Создание сообщения
	ТекстСообщения = "";
	ПодсказкаСообщ = "Введите текст сообщения.";
	ВвестиСтроку(ТекстСообщения,ПодсказкаСообщ,500,Ложь);
	НовСообщение.Текст = ТекстСообщения;
	НовСообщение.Отправитель = ЯщикПользователя;
	ТекстТема = "";
	ПодсказкаТема = "Введите тему письма.";
	ВвестиСтроку(ТекстТема,ПодсказкаТема,50,Ложь);
	НовСообщение.Тема = ТекстТема;
	ТекстПолучатель = "";
	ПодсказкаПолуч = "Введите имя получателя.";
	ВвестиСтроку(ТекстПолучатель,ПодсказкаПолуч,50,Ложь);
	АдресПолучателя = ТекстПолучатель;
	ЯщикПолучателя = Справочники.КД_ЭлектроннаяПочтаСотрудников.НайтиПоНаименованию(АдресПолучателя).ПочтовыйПрофиль;
	НовСообщение.Получатели.Добавить(ЯщикПолучателя);
	ФайлВложения = КаталогВр + ПолноеИмяФайла + ".xls";
	НовСообщение.Вложения.Добавить(ФайлВложения,ПолучитьТекстЗаголовка(Ложь));	
	Почта = Новый Почта;
	Почта.Подключиться();	
	Попытка
		Почта.Послать(НовСообщение,Истина);
	Исключение
		Сообщить(ОписаниеОшибки());
		Возврат
	КонецПопытки;
	Почта.Отключиться();
КонецПроцедуры

 

Во втором варианте подключение к почтовому ящику без особых условий и запретов получается только на сервисе mail.ru. Yandex и Google не позволяют авторизоваться из-за особенностей протоколов безопасности, проблема решается более тонкой настройкой сервисов (полная справка находится на «саппорте» каждого сервиса).

Упростить работу помогла функция определения сервиса почтового ящика (ведь у пользователя он может быть и не один), функция, помещенная в модуль объекта. Функция определяет почтовый сервис и возвращает значение необходимого профиля почты.

Функция ПолучитьПрофиль(ИмяЯщика,ПочтовыйСервис,ПарольОтЯщика) Экспорт		
		Профиль = Новый ИнтернетПочтовыйПрофиль;		
		Если ПочтовыйСервис = "@mail.ru" Тогда
			Профиль.АдресСервераSMTP = "smtp.mail.ru";			
			Профиль.ПортSMTP = 25;
			Профиль.Пароль = ПарольОтЯщика;
			Профиль.ПарольSMTP = ПарольОтЯщика;
			Профиль.Пользователь = ИмяЯщика + ПочтовыйСервис;
			Профиль.ПользовательSMTP = ИмяЯщика + ПочтовыйСервис;
			Профиль.ВремяОжидания = 60; 
			Возврат Профиль;
		ИначеЕсли  ПочтовыйСервис = "@yandex.ru" Тогда 
			Профиль.АдресСервераSMTP = "smtp.yandex.ru";
			Профиль.ПортSMTP = 465;	
			Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
			Профиль.ИспользоватьSSLSMTP = Истина;
			Профиль.Пароль = ПарольОтЯщика;
			Профиль.ПарольSMTP = ПарольОтЯщика;
			Профиль.Пользователь = ИмяЯщика + ПочтовыйСервис;
			Профиль.ПользовательSMTP = ИмяЯщика + ПочтовыйСервис;
			Профиль.ВремяОжидания = 60; 
			Возврат Профиль;
		ИначеЕсли ПочтовыйСервис = "@gmail.com" Тогда
			Профиль.АдресСервераSMTP = "smtp.gmail.com";
			Профиль.ПортSMTP = 465;
			Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
			Профиль.ИспользоватьSSLSMTP = Истина;
			Профиль.Пароль = ПарольОтЯщика;
			Профиль.ПарольSMTP = ПарольОтЯщика;
			Профиль.Пользователь = ИмяЯщика + ПочтовыйСервис;
			Профиль.ПользовательSMTP = ИмяЯщика + ПочтовыйСервис;
			Профиль.ВремяОжидания = 60; 
			Возврат Профиль; 			
		КонецЕсли;		
	КонецФункции

Затем следует процедура формирования и отправки письма.

Процедура ДействияФормыОсновныеОтправить(Кнопка)
	
	ПредставлениеСохраняемогоФайла = ПолучитьТекстЗаголовка(Ложь);
	Результат = ЭтаФорма.ЭлементыФормы.Результат;
	ПолноеИмяФайла = РаботаСФайлами.УдалитьЗапрещенныеСимволыИмени(ПредставлениеСохраняемогоФайла);
	КаталогВр = КаталогВременныхФайлов();
	Результат.Записать(КаталогВр + ПолноеИмяФайла + ".xls",ТипФайлаТабличногоДокумента.XLS);
	ПолучитьПользователя = ПараметрыСеанса.ТекущийПользователь;
	Запрос = Новый Запрос;
	Запрос.Текст = "Выбрать Представление
	|ИЗ РегистрСведений.КонтактнаяИнформация
	|Где Объект = &ПП";
	Запрос.УстановитьПараметр("ПП",ПолучитьПользователя);
	РЗ = Запрос.Выполнить().Выгрузить();
	Для каждого Стр Из РЗ Цикл
		ПочтЯщ = Стр.Представление;	
	КонецЦикла;
	ПрофильПочты = ПолучитьПрофильПочты(ПочтЯщ);
	СервисПочты = ПолучитьСервисПочты(ПочтЯщ);
	ЯщикПользователя = ПрофильПочты + СервисПочты;
	ПарольОтЯщика = "";
	ПодсказкаПароля = "Введите пароль от своего почтового ящика!";
	ВвестиСтроку(ПарольОтЯщика,ПодсказкаПароля,15,Ложь);
	Если ПарольОтЯщика = "" Тогда
		Сообщить("Без пароля не получится!");
		Возврат;
	КонецЕсли;
	///////Подключение к почте///////
	Почта = Новый ИнтернетПочта;
	Попытка
		Почта.Подключиться(ПолучитьПрофиль(ПрофильПочты,СервисПочты,ПарольОтЯщика));
		Письмо = Новый ИнтернетПочтовоеСообщение;
		Письмо.Вложения.Добавить(КаталогВр + ПолноеИмяФайла + ".xls",ПолучитьТекстЗаголовка(Ложь));
		Письмо.Отправитель = ЯщикПользователя;
		Письмо.ИмяОтправителя = ПолучитьПользователя;
		ПочтовыеАдреса = Письмо.Получатели;
		ПочтовыйАдрес = ПочтовыеАдреса.Добавить();
		ВозврЗначАдресат = Справочники.Пользователи.ПолучитьФормуВыбора("ФормаВыбора",ЭтаФорма).ОткрытьМодально();//Получение адресата из списка пользователей
		Если ВозврЗначАдресат = "" Тогда
			Сообщить("Не заполнено ФИО адресата! Попробуйте ещё раз!");
			Возврат;
		Иначе
			Запрос = Новый Запрос;        //Получение почтового ящика из регистра сведений
			Запрос.Текст = "Выбрать Представление КАК Ящик
			|ИЗ РегистрСведений.КонтактнаяИнформация
			|Где Объект.Наименование = &ПП";
			Запрос.УстановитьПараметр("ПП",ВозврЗначАдресат.Наименование);
			РЕЗ = Запрос.Выполнить().Выгрузить();
			Для каждого Стр Из РЕЗ Цикл
				ЯщикАдр = Стр.Ящик;	
			КонецЦикла;
			ПрофильАдресата = ПолучитьПрофильПочты(ЯщикАдр);
			СервисАдресата =  ПолучитьСервисПочты(ЯщикАдр);
			ПочтаАдресата =  ПрофильАдресата + СервисАдресата;
			ПочтовыйАдрес.Адрес = ПочтаАдресата;
		КонецЕсли;
		Письмо.Тема = "";
		ПодсказкаТемы = "Обозначьте тему письма! (Не обязательно)";
		ВвестиСтроку(Письмо.Тема,ПодсказкаТемы,50,Ложь);
		ИнтернетТекстПочтовогоСообщения = Письмо.Тексты.Добавить();
		ИнтернетТекстПочтовогоСообщения.Текст = "С уважением, " + ПолучитьПользователя + ".";
		ИнтернетТекстПочтовогоСообщения.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
		Попытка
			Почта.Послать(Письмо);
			Предупреждение("Ваше письмо успешно отправлено. Хорошего завершения дня!",10);
		Исключение
			Сообщить(ОписаниеОшибки());
			Возврат;
		КонецПопытки;		
	Исключение
		Сообщить("УПС! " + ОписаниеОшибки());
	КонецПопытки;
	Почта.Отключиться();
	///
	РегистрыСведений.АС_ЗадачиПользователя.ПолучитьФормуРедактированияЗаписи(,ЭтаФорма).ОткрытьМодально();//Создание задачи пользователю в планировщике.
КонецПроцедуры

 

Но даже если не плыть против течения и использовать сервис, который даёт беспрепятственный вход в почтовый ящик (mail.ru, к примеру), то после отправки письма адресату возникает вопрос - "как программно задать получение отчета о прочтении?". Ответом оказалось "Никак". Даже в самом почтовом ящике Mail.ru кнопка, включающая оповещение о доставке письма не активна, то есть при нажатии на неё не происходит абсолютно ничего, письмо отправляется, но отчёт о его доставке не приходит (программно, что естественно, тоже не включается).

Тогда был опробован первый вариант. С помощью Outlook отправлялись сообщения как с сервиса Mail.ru на Yandex и Google, так и обратно. Даже при установке в настройках Outlook флажка о доставке отчёта о доставке и прочтении не происходило ничего.

Выводы.

В процессе поисков решений было выяснено, что на почтовых сервисах, не известно с какого времени (это касается всех почтовых сервисов, описанных выше), была встроена функция, позволяющая пользователю, получающему письмо, не отправлять отчёт о доставке и прочтении. Так, к примеру, на Yandex.ru, при получении письма появляется кнопка, при нажатии которой отправляется отчёт о том, что письмо доставлено, если её не нажимать, то, естественно, отчёт о доставке отправлен не будет, и неважно - сколько потратил времени программист на то, чтобы программно задать запрос проверки доставки письма.

На Gmail.com сделано ещё интересней, конечно же отчёт можно по желанию не отправлять, но разработчики добавили функцию игнорирования письма, при активизации которой полученное письмо просто "испаряется" из почтового ящика, как будто его там и не было.

Ну а Mail.ru просто не отправляют отчёт о доставке и всё.

Из всего вышесказанного следует:

- настроить отправку почты из 1С возможно и не находится за гранью недосягаемого;

- программная установка запроса на подтверждение доставки и прочтения электронного письма не имеет никакого смысла.

Специальные предложения

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

См. также

Механизм "Отложенная отправка писем", при записи документа

Email v8 1cv8.cf Бесплатно (free)

Иногда требуется отправлять письма при записи документа. Чтобы избежать проблем с производительностью, сделал механизм "Отложенная отправка писем".

14.10.2019    4365    John_d    6    

Реализация отправки Email через SendPulse API

Email v8 УТ11 Россия Бесплатно (free)

Описана реализация отправки Email с использованием API и применением очереди отправки как пример для программистов (вариант компоновка блоков в контексте конкретного сервиса).

06.10.2019    3719    malikov_pro    5    

Вдохнем вторую жизнь во встроенный почтовый клиент из 1С:Управление торговлей 10.3

Email Управление взаимоотношениями с клиентами (СRM) Управление взаимоотношениями с клиентами (СRM) v8 УТ10 УУ Бесплатно (free)

Хотели было воспользоваться почтовым клиентом из Управление торговлей 10.3, да не тут-то было. К сожалению, фирма "1С" почти совсем ее забросила и если Ваш респондент отправляет Вам письма, содержащие HTML, то Вас ждут матюки... Ну что же, как говорится: "Спасение утопающих - дело рук самих утопающих".

25.12.2018    8675    1c.pro.fun    9    

Код для кнопки "Отправить почтовым сообщением" любого табличного документа, используя механизмы УТ 11.2

Email Практика программирования v8 УТ11 Бесплатно (free)

Это не автономный код процедуры отправки, это приписка к уже существующему механизму почтовых сообщений, реализованному в УТ 11.2, когда ваша учетная запись уже создана, и вам остается лишь "навесить" код на кнопку. Этот механизм может быть использован для любой управляемой формы, на которой также присутствует Табличный документ.

23.01.2017    12502    RockLeeSan    0    

Как отправить по почте НЕтиповой документ, используя стандартные средства БП 3.0

Email Практика программирования v8 БП3.0 Россия Бесплатно (free)

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

08.02.2016    16787    config    3    

Алгоритм создания и отправки электронного письма (со вложением) УТ 3.0 для Украины

Практика программирования Email v8 УТ10 Украина Бесплатно (free)

Алгоритм позволит быстро создать письмо с вложением (например, печатная форма Заказа клиента в формате XLS) и отправить его партнеру. Для конфигурации Управление торговлей для Украины 3.0

20.07.2015    23445    Bor_ka    6    

Настройка электронной почты в УНФ для Google Mail (gmail)

Email v8 УНФ Россия Бесплатно (free)

В конфигурации Управление небольшой фирмой имеется встроенный почтовый клиент, но он имеет серьезный недостаток, нет поддержки шифрования SSL. Соответственно работа с ящиком gmail будет невозможна. В данной статье я расскажу как заставить УНФ работать с gmail.

19.04.2013    28899    plkv    4    

Отправка почты с использованием основного почтового клиента ОС (продолжение)

Практика программирования Email v8 КА1 Россия Бесплатно (free)

В публикации описан фрагмент кода, позволяющий отправлять печатные формы с помощью почтового клиента операционной системы. Дальнейшее развитие публикации http://infostart.ru/public/91206/ Добавлено: 1. Поддержка Mozilla Thunderbird. 2. Автоподстановка адресата письма.

27.03.2013    16021    d7k    7    

Отправка почты с использованием основного почтового клиента ОС

Универсальные функции Email v8 УТ10 УПП1 Бесплатно (free)

В публикации описан фрагмент кода, позволяющий отправлять печатные формы с помощью почтового клиента операционной системы (напр. Outlook, Bat и т.д.)

21.09.2011    29962    Администратор 1С    18    

Управление электронной почтой: картинки в теле письма как tmp

Email v8 1cv8.cf Россия Бесплатно (free)

Столкнулся с проблемой отправки картинок из 1С (при использовании внешнего HTML редактора)

21.03.2011    13647    mozz    4    

Отправка e-mail через Microsoft Office Outlook

Практика программирования Email v8 1cv8.cf Россия Бесплатно (free)

Способ обхода повышенной безопасности Microsoft Office Outlook, для программного доступа к функциям работы с почтой. Используется библиотека Outlook Redemption.

02.03.2011    16445    ruslanruslan    1    

Почтовый клиент УТ и gmail

Администрирование данных 1С Универсальные функции Email v8 Бесплатно (free)

Скрещиваем почтовый клиент Управления торговлей и Google Apps. Натолкнулся на это - http://infostart.ru/public/16429/ - решение, и вспомнил, что делал похожую вещь для MS Exchange. Модификация конфигурации не потребуется.

06.10.2009    103139    vabue    48