Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Отправить и получить почту
Дальше: Глава 2. Внешние источники данных

Отправить и получить сообщение обмена

Теперь рассмотрим пример, позволяющий отправлять почтовые сообщения вместе с вложенными в них файлами обмена.

Процедуру для отправки сообщения заполним следующим образом (листинг 1.154).

Листинг 1.154. Процедура «ОтправитьСообщение»

&НаКлиенте

Процедура ОтправитьСообщение(Команда)

 

// Получить почтовый профиль.

Профиль = ПолучитьПрофиль();

 

// Сформировать сообщение обмена.

Сообщение = Новый ИнтернетПочтовоеСообщение;

Сообщение.Тема = "СООБЩЕНИЕ_ОБМЕНА: " + ФайлВложения;

Сообщение.Отправитель = АдресОтправителя;

 

Сообщение.Получатели.Добавить(АдресПолучателя);

 

Если ФайлВложения <> "" Тогда

ФайлСообщения = Новый Файл(ФайлВложения);

// Создать вложение с файлом обмена.

Сообщение.Вложения.Добавить(ФайлВложения, ФайлСообщения.Имя);

КонецЕсли;

 

Почта = Новый ИнтернетПочта;

 

Сообщ = Новый СообщениеПользователю();

 

Попытка

Почта.Подключиться(Профиль);

// Отправить сообщение с файлом обмена.

Почта.Послать(Сообщение);

Исключение

// Вывести сообщение об ошибке при подключении к серверу или при отправке сообщения обмена.

Сообщ.Текст = "Ошибка при отправке файла: " + ФайлВложения;

Сообщ.Сообщить();

Сообщ.Текст = ОписаниеОшибки();

Сообщ.Сообщить();

Возврат;

КонецПопытки;

 

Сообщ.Текст = "Отправлен файл: " + ФайлВложения + " на адрес: " + АдресПолучателя;

Сообщ.Сообщить();

 

Почта.Отключиться();

 

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

Сначала мы получаем почтовый профиль, затем формируем сообщение обмена для отправки. При этом мы указываем отправителя в свойстве Отправитель объекта ИнтернетПочтовоеСообщение и добавляем получателя в список получателей сообщения – Сообщение.Получатели.Добавить(АдресПолучателя). А также мы помечаем тему сообщения как "СООБЩЕНИЕ_ОБМЕНА: ", чтобы при приеме почты, при получении заголовков сообщений, отобрать нужные нам сообщения по теме.

И если файл вложения был выбран, то добавляем его в коллекцию вложений сообщения – Сообщение.Вложения.Добавить(ФайлВложения, ФайлСообщения.Имя).

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

Обработчик команды для выбора файла вложения заполним следующим образом (листинг 1.155).

Листинг 1.155. Процедура «ВыбратьФайлВложения»

&НаКлиенте

Процедура ВыбратьФайлВложения(Команда)

 

ВыборФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);

ВыборФайла.Заголовок = "Выбор файла";

ВыборФайла.Показать(Новый ОписаниеОповещения("ПослеВыбораФайлов", ЭтотОбъект));

 

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

В процедуру-обработчик оповещения ПослеВыбораФайлов() в параметре ВыбранныеФайлы передается массив выбранных имен файлов (листинг 1.156).

Листинг 1.156. Процедура «ПослеВыбораФайлов»

&НаКлиенте

Процедура ПослеВыбораФайлов(ВыбранныеФайлы, ДопПараметры) Экспорт

 

Если ВыбранныеФайлы = Неопределено Тогда

Возврат;

КонецЕсли;

 

ФайлВложения = ВыбранныеФайлы[0];

 

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

Теперь реализуем получение отправленного сообщения с почтового сервера. Процедуру для получения сообщения заполним следующим образом (листинг 1.157).

Листинг 1.157. Процедура «ПолучитьСообщение»

&НаКлиенте

Процедура ПолучитьСообщение(Команда)

 

// Получить почтовый профиль.

Профиль = ПолучитьПрофиль();

 

Сообщ = Новый СообщениеПользователю();

 

Почта = Новый ИнтернетПочта;

 

Попытка

Если ИспользоватьIMAP Тогда

Почта.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);

Иначе

Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);

КонецЕсли;

 

Исключение

// Вывести сообщение об ошибке при подключении к серверу или при приеме сообщения обмена.

Сообщ.Текст = "Ошибка при подключении к серверу или приеме" + ОписаниеОшибки();

Сообщ.Сообщить();

Возврат;

КонецПопытки;

 

// Получить заголовки сообщений из почтового ящика.

МассивЗаголовков = Новый Массив;

ЗаголовкиСообщений = Почта.ПолучитьЗаголовки();

 

Если ЗаголовкиСообщений.Количество() = 0 Тогда

Сообщ.Текст = "Сообщений в почтовом ящике нет.";

Сообщ.Сообщить();

Почта.Отключиться();

Возврат;

КонецЕсли;

 

// Отфильтровать по теме массив заголовков сообщений обмена.

Для Индекс = 0 По ЗаголовкиСообщений.Количество() - 1 Цикл

ЧастьТемы = "СООБЩЕНИЕ_ОБМЕНА: ";

Если Лев(ЗаголовкиСообщений[Индекс].Тема, СтрДлина(ЧастьТемы)) = ЧастьТемы Тогда

МассивЗаголовков.Добавить(ЗаголовкиСообщений[Индекс]);

КонецЕсли;

КонецЦикла;

 

 

Если МассивЗаголовков.Количество() = 0 Тогда

Сообщ.Текст = "Сообщений обмена в почтовом ящике нет.";

Сообщ.Сообщить();

Почта.Отключиться();

Возврат;

КонецЕсли;

 

// Получить полностью сообщения обмена, которые впоследствии будут удалены с сервера.

МассивСообщенийОбмена = Почта.Выбрать(Истина, МассивЗаголовков);

 

ФайлВложения = "";

Для Индекс = 0 По МассивСообщенийОбмена.Количество() - 1 Цикл

Если МассивСообщенийОбмена[Индекс].Вложения[0].Имя > ФайлВложения Тогда

// Выбрать сообщение с последним номером сообщения обмена.

ФайлВложения = МассивСообщенийОбмена[Индекс].Вложения[0].Имя;

ИндексСообщения = Индекс;

КонецЕсли;

КонецЦикла;

 

Если ИндексСообщения <> Неопределено Тогда

// Записать файл обмена во временный файл.

ФайлОбмена = МассивСообщенийОбмена[ИндексСообщения].Вложения[0];

ФайлОбмена.Данные.Записать("c:\temp\" + ФайлОбмена.ИмяФайла);

Сообщ.Текст = "Принят файл обмена данными: " + ФайлВложения + " с адреса: " + АдресОтправителя;

Сообщ.Сообщить();

КонецЕсли;

 

Почта.Отключиться();

 

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

В этой процедуре мы подключаемся к серверу для получения почты, затем с помощью метода ПолучитьЗаголовки() получаем с сервера массив заголовков всех сообщений (объектов типа ИнтернетПочтовоеСообщение). Затем из массива ЗаголовкиСообщений в массив МассивЗаголовков отфильтровываем только те сообщения, тема которых начинается с префикса "СООБЩЕНИЕ_ОБМЕНА: ".

Если МассивЗаголовков пуст, то, значит, сообщений обмена на сервере нет, поэтому мы отключаемся от почтового сервера и заканчиваем работу процедуры. Иначе мы передаем массив заголовком вторым параметром в метод Выбрать()объекта ИнтернетПочта и получаем нужные нам сообщения обмена целиком (вместе с вложениями) в массиве МассивСообщенийОбмена. Первым параметром в этот метод мы передаем Истина (это значение по умолчанию). Это означает, что полученные сообщения обмена будут удалены с сервера.

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

Кроме того, можно заключить процедуру получения сообщений в операторы Попытка … Исключение, что позволит продолжить получение, если при приеме определенного сообщения произошла ошибка. Также можно поместить в форме индикатор для графического отображения процесса получения сообщений.


Назад: Отправить и получить почту
Дальше: Глава 2. Внешние источники данных