Книга: Технологии интеграции "1С:Предприятия 8.3""
Назад: Электронная почта
Дальше: Отправить и получить сообщение обмена

Отправить и получить почту

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

Листинг 1.151. Функция «ПолучитьПрофиль»

&НаКлиенте

Функция ПолучитьПрофиль()

 

// Создать почтовый профиль.

Профиль = Новый ИнтернетПочтовыйПрофиль;

 

Профиль.АдресСервераSMTP = СерверSMTP;

Профиль.ПользовательSMTP = Пользователь;

Профиль.ПарольSMTP = Пароль;

Профиль.ТолькоЗащищеннаяАутентификацияSMTP = Истина;

 

Профиль.АдресСервераPOP3 = СерверPOP3;

Профиль.Пользователь = Пользователь;

Профиль.Пароль = Пароль;

 

Профиль.АдресСервераIMAP = СерверIMAP;

Профиль.ПользовательIMAP = Пользователь;

Профиль.ПарольIMAP = Пароль;

 

Возврат Профиль;

 

КонецФункции

Обратите внимание, что свойства профиля ПортSMTP, ПортIMAP и ПортPOP3 мы не указывали. По умолчанию значения этих свойств равны нулю. Это значит, что для защищенных или незащищенных соединений будут использоваться стандартные порты. Поэтому, если нет какой-то специфической задачи использовать нестандартные порты, значения этих свойств можно не задавать.

С помощью полученного почтового профиля выполняется подключение к нужному почтовому серверу.

Теперь рассмотрим пример, когда тело сообщения формируется с помощью форматированного документа, в него помещаются форматированный текст, картинки, ссылки, специальные символы. Затем это сообщение отправляется, далее принимается с помощью почтового сервера и отображается в форме обработки в HTML-документе.

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

Для отправки сообщений мы должны получить почтовый профиль с помощью функции ПолучитьПрофиль(), описанной выше (см. листинг 1.151), и сформировать отправляемое сообщение. Затем подключиться к SMTP-серверу методом Подключиться(<Профиль>) объекта ИнтернетПочта, отправить сообщение методом Послать() и отключиться от почтового сервера.

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

Листинг 1.152. Процедура «ОтправитьПочту»

&НаКлиенте

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

 

Перем HTML, Картинки;

 

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

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

 

// Сформировать сообщение, содержащее форматированный документ.

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

Сообщение.Тема = "Форматированный документ ";

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

 

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

 

// Создать вложения с картинками.

Содержимое.ПолучитьHTML(HTML, Картинки);

Для Каждого Картинка Из Картинки цикл

Вложение = Сообщение.Вложения.Добавить(Картинка.Значение.ПолучитьДвоичныеДанные());

Вложение.Идентификатор = Картинка.Ключ;

Вложение.Имя = Картинка.Ключ;

HTML = СтрЗаменить(HTML, Картинка.Ключ, "cid:" + Вложение.Идентификатор);

КонецЦикла;

 

ТекстСообщения = Сообщение.Тексты.Добавить(HTML, ТипТекстаПочтовогоСообщения.HTML);

 

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

 

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

 

Попытка

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

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

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

Исключение

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

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

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

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

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

Возврат;

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

 

Сообщ.Текст = "Сообщение отправлено. ";

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

 

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

 

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

Сначала мы получаем почтовый профиль, затем формируем сообщение обмена для отправки. При этом мы указываем отправителя в свойстве Отправитель объекта ИнтернетПочтовоеСообщение и добавляем получателя в список получателей сообщения – Сообщение.Получатели.Добавить(АдресПолучателя).

Для отправки содержимого форматированного документа (реквизит Содержимое) используется его метод ПолучитьHTML(), который получает HTML-составляющие форматированного документа – массив картинок и HTML-текст. Затем полученные картинки добавляются как вложения в почтовое сообщение и сопоставляются с текстом письма путем установки свойства Идентификатор объекта ИнтернетПочтовоеВложение. HTML-текст добавляется в массив текстов почтового сообщения с указанием типа текста ТипТекстаПочтовогоСообщения.HTML. Остальная работа по отправке сообщения выполняется с помощью методов Подключиться() и Послать() объекта ИнтернетПочта.

Для получения сообщений мы должны получить почтовый профиль с помощью функции ПолучитьПрофиль(), описанной ранее (см. листинг 1.151). Затем, используя этот профиль, подключиться к почтовому серверу для получения почты по протоколу IMAP или POP3. Тип протокола интернет-почты можно передать вторым параметром в метод Подключиться() объекта ИнтернетПочта или использовать протокол по умолчанию (SMTP – для отправки почты, POP3 – для получения почты).

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

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

Данный метод возвращает массив объектов типа ИнтернетПочтовоеСообщение. Каждый объект содержит информацию из заголовка сообщения. Вложения и тексты с сервера не принимаются.

Для получения сообщения, содержащего форматированный документ, и отображения его в поле HTML-документа можно использовать следующий фрагмент кода (листинг 1.153).

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

&НаКлиенте

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

 

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

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

 

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

 

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

 

Попытка

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

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

Иначе

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

КонецЕсли;

 

Исключение

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

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

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

Возврат;

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

 

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

ПараметрыОтбораIMAP = Новый Структура;

ПараметрыОтбораIMAP.Вставить("Прочитанные", Ложь);

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

 

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

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

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

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

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

Возврат;

КонецЕсли;

 

// Создать соответствие для установки флагов сообщений.

ФлагиСообщенийIMAP = Новый Соответствие;

 

// Получить полностью сообщения.

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

 

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

 

ФлагСообщения = Новый ФлагиИнтернетПочтовогоСообщения();

ФлагСообщения.Удаленное = Истина;

ФлагиСообщенийIMAP.Вставить(МассивСообщений[Индекс].Идентификатор[0], ФлагСообщения);

 

Сообщ.Текст = "Принято сообщение: " + МассивСообщений[Индекс].Тема;

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

 

// Вывести содержимое письма в HTML документ для последнего сообщения.

Если Индекс = КоличествоСообщений - 1 Тогда

Для каждого Элемент Из МассивСообщений[Индекс].Тексты Цикл

Если Элемент.ТипТекста = ТипТекстаПочтовогоСообщения.HTML Тогда

// Отобразить тело сообщения в HTML документе.

ТекстHTML = Элемент.Текст;

Если Найти(ТекстHTML, "<HTML>") = 0 Тогда

ТекстHTML = "<HTML><BODY>" + ТекстHTML + "</BODY></HTML>";

КонецЕсли;

 

Вложения = Новый Массив;

// Обработать вложения, чтобы правильно сформировать HTML.

Для каждого Вложение Из МассивСообщений[Индекс].Вложения Цикл

Ид = "cid:" + Вложение.Идентификатор;

Если Найти(ТекстHTML, Ид) <> 0 Тогда

Вложения.Добавить(Вложение);

КонецЕсли;

КонецЦикла;

КонецЕсли;

КонецЦикла;

 

Индекс = 0;

Для каждого Вложение Из Вложения Цикл

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

ФайлОбмена = Вложение.Данные;

ИмяФайла = "c:\temp\pict_" + Строка(Индекс) + ".png";

ФайлОбмена.Записать(ИмяФайла);

 

// Отобразить картинку в HTML.

Ид = """cid:" + Вложение.Идентификатор + """";

ТекстHTML = СтрЗаменить(ТекстHTML, Ид, """" + ИмяФайла + """");

Индекс = Индекс + 1;

КонецЦикла;

 

КонецЕсли;

 

КонецЦикла;

 

Почта.УстановитьФлагиСообщений(ФлагиСообщенийIMAP);

 

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

 

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

В данном примере для получения почты мы будем использовать протокол IMAP, поэтому с помощью метода ПолучитьЗаголовки() мы можем получить с сервера массив заголовков только тех сообщений, которые удовлетворяют параметрам отбора, указанным нами в структуре ПараметрыОтбораIMAP. Эту структуру мы передаем в метод ПолучитьЗаголовки(). В нашем примере мы используем отбор по непрочитанным письмам – ПараметрыОтбораIMAP.Вставить("Прочитанные", Ложь).

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

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

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

В цикле обхода массива сообщений мы добавляем в соответствие элемент, ключом которого является идентификатор почтового сообщения (МассивСообщений[Индекс].Идентификатор[0]), а значением – объект ФлагиИнтернетПочтовогоСообщения. Свойство Удаленное этого объекта мы устанавливаем в значение Истина.

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

Для отображения картинок в HTML-документе мы заполняем массив Вложения. В цикле обхода этого массива мы сохраняем каждую картинку во временный файл и сопоставляем этот файл с текстом HTML.

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

Итак, после отправки и получения почты форма обработки будет иметь следующий вид (рис. 1.42).

Рис. 1.42. Работа с почтой

Назад: Электронная почта
Дальше: Отправить и получить сообщение обмена