31.10.2014
Данный раздел описывает некоторые особенности использования объекта ИнтернетПочта. Вначале кратко описаны используемые протоколы связи с почтовыми серверами. Далее выделены особенности для каждой фазы отправки/приема сообщений.
Протоколы SMTP и POP3 наиболее распространены в Интернете. Кратко опишем назначение каждого из них.
Целью протокола SMTP (Simple Mail Transfer Protocol – простой протокол передачи электронной почты) является эффективная и надежная доставка сообщений электронной почты.
Использование SMTP протокола можно представить следующим образом:
Когда пользователь хочет отправить сообщение, он организует двухсторонний канал связи (порт номер 25) с почтовым сервером (сервером SMTP). Фактически отправитель выступает в роли клиента, а получатель – в роли сервера. Клиент посылает команды, сообщающие серверу кому направляется сообщение и само сообщение.
Post Office Protocol (POP) – протокол доставки с почтового ящика сервера POP накопившихся сообщений. Целью протокола является получение сообщений от почтового сервера.
Когда клиент хочет получить почту, он устанавливает с сервером (номер порта 110) канал связи. Если соединение установлено, сервер отправляет приглашение клиенту. Далее происходит обмен данными, после чего соединение закрывается. Сессия POP3 состоит из нескольких режимов. После того как сервер отправил приглашение, он переходит в режим авторизации (AUTHORIZATION). В этом режиме происходит аутентификация клиента на сервере. Если аутентификация успешна, сервер переходит в режим обмена данными (TRANSACTION). Когда клиент закрывает сессию после режима обмена данными, сервер переходит в режим сохранения изменений (UPDATE), освобождает все занятые ресурсы и завершает работу.
Перед отправкой/приемом сообщений необходимо заполнить свойства объекта ИнтернетПочтовыйПрофиль. Подключение происходит только к тем серверам, адреса которых указаны в профиле. Если не указано ни одного адреса, будет возникать исключительная ситуация. Например, при рассылке достаточно будет указать только адрес SMTP сервера.
Если SMTP сервер требует аутентификации перед посылкой, нужно в настройках заполнить значения свойств объекта (ИнтернетПочтовыйПрофиль) SMTPПользователь и SMTPПароль.
Для медленных линий связи нужно устанавливать большее ВремяОжидания.
Объект ИнтернетТекстПочтовогоСообщения содержит два свойства: сами текстовые данные и тип текста. Можно использовать три типа текста – это ПростойТекст, HTML и РазмеченныйТекст (RTF). Использовать размеченный текст (определяется в RFC 1341) не рекомендуется, поскольку не все почтовые клиенты могут обрабатывать этот текст корректно. Вместо типа РазмеченныйТекст лучше использовать тип HTML – он более распространен и имеет больше возможностей.
Протокол SMTP позволяет посылать только текстовые данные, при этом отводя на каждый октет (символ) только 7 или 8 бит. Все текстовые данные сообщения посылаются в Unicode (16 бит на символ), поэтому необходимо предварительное конвертирование в UTF-8. UTF-8 кодирует один символ текста от одного до четырех байт по 8 бит каждый. Но UTF-8 строка является бинарными данными, а для почтовых протоколов это не приемлемо. Таким образом, полученная UTF-8 строка еще дополнительно кодируется (не путать с шифрованием) по методу base64.
При пересылке HTML текста, в нем могут содержаться различные данные, например картинки. В HTML документе они могут быть представлены как ссылка на локальный ресурс и, если у получателя по такой же ссылке нет этих данных, в HTML документе данные не будут отображаться. Для того, что бы этого не случилось, используется метод ОбработатьТексты() (или во втором параметре метода Послать() указать ОбработкаТекстаИнтернетПочтовогоСообщения.Обрабатывать – используется по умолчанию). Этот метод вставляет данные в тело сообщения как вложение с заменой ссылки на локальный ресурс локальной ссылкой на часть почтового сообщения. При приеме таких писем отделить вложение от объекта HTML документа можно по непустому свойству ИнтернетПочтовоеВложение.Идентификатор. Например:
Копировать в буфер обменаКартинки = ЭлементыФормы.HTMLДокумент.Документ.all.tags("img"); Для Инд = 0 По Картинки.length - 1 Цикл Картинка = Картинки.item(Инд); Для каждого Вложение Из Сообщение.Вложения Цикл Если ("cid:" + Вложение.Идентификатор = Картинка.href) Тогда ВременныйФайл = ПолучитьИмяВременногоФайла(); Вложение.Данные.Записать(ВременныйФайл); Картинка.src = ВременныйФайл; КонецЕсли; КонецЦикла; КонецЦикла;
Вначале элементу ПолеHTMLДокумента присваивается HTML текст сообщения. Затем перебираются все элементы HTML документа с именем тега "IMG". Для каждого элемента в цикле ищется вложение с таким же идентификатором и если находится такое вложение, оно сохраняется во временном файле, а в HTML документе прописывается ссылка к этому файлу.
Некоторые старые почтовые клиенты могут корректно принимать сообщения только с простым текстом. Метод ОбработатьТексты() также автоматически создает в сообщении две части идентичного текста, одна из которых имеет тип текста HTML, а другая – ПростойТекст. Принимающий почтовый клиент выбирает тот тип текста, который сможет показать корректно.
Почтовое сообщение состоит из заголовка и нескольких частей, включающих в себя текстовые данные и/или бинарные. Так же как и бинарных данных (вложений) текстовых может быть тоже несколько частей. Для создания этих частей существует коллекция ИнтернетТекстыПочтовогоСообщения.
Если при приеме писем методу Выбрать() не передавать значение Истина, что означает удаление полученных сообщений с сервера, каждый раз будут получаться все сообщения которые есть в данный момент на сервере: и уже полученные, и новые. По умолчанию, сообщения при выборке удаляются.
Также протокол не допускает одновременного подключения к почтовому ящику нескольких клиентов, поэтому могут генерироваться исключения, говорящие о том, что в данный момент почтовый ящик заблокирован другим почтовым клиентом.
Некоторые сообщения могут содержать вложенные сообщения, например, возврат сервером отчета об аварийной оправке сообщения. Вложенное сообщение находится во вложениях с типом ИнтернетПочтовоеСообщение. Например, распознать их можно так:
Копировать в буфер обменаЕсли (ТипЗнч(Вложение.Данные) = Тип("ИнтернетПочтовоеСообщение")) Тогда // обработка вложенного сообщения КонецЕсли;
У сообщения есть уникальный для всего мира идентификатор, который можно использовать для идентификации сообщения, например для определения новых сообщений.
Методу УдалитьСообщения() нужно передавать массив объектов ИнтернетПочтовоеСообщение, но из этих объектов можно удалить все вложения и коллекцию текста.
Выборочное удаление удобно, когда прикладное решение должно выбрать из общего набора сообщений персонального почтового ящика те, которые необходимо обработать (например, будут загружаться заявки), а другие сообщения должны остаться в почтовом ящике сервера, чтобы пользователь мог просмотреть их другим почтовым клиентом. В этом случае получить сообщения необходимо без удаления (Выбрать(Истина)), а затем, отобранные по определенному критерию, сообщения следует удалить.