При изучении кода типовых конфигураций 1С, использующих Библиотеку стандартных подсистем (БСП), разработчики часто натыкаются на странную, на первый взгляд, последовательность действий в модуле РаботаСПочтовымиСообщениямиСлужебный. Программа сначала выполняет метод Послать с указанием протокола IMAP, а затем — повторно с протоколом SMTP. В этой статье мы подробно разберем, почему это не ошибка программистов, а техническая необходимость, продиктованная архитектурой почтовых протоколов.
Для начала проанализируем фундаментальное различие между протоколами интернета. Большинство пользователей привыкли воспринимать "электронную почту" как единую сущность, но программно она разделена на транспортную часть и часть управления хранилищем.
Таким образом, когда вы нажимаете кнопку "Отправить" в почтовом клиенте, программа должна выполнить два разных действия: доставить письмо адресату (SMTP) и сохранить копию письма в вашем личном архиве (IMAP). Если вам требуется реализовать подобный функционал без изменения типовой конфигурации, можно использовать специальное расширение для отправки и получения почтовых сообщений.
Рассмотрим фрагмент кода, который вызывает вопросы у разработчиков. В типовых решениях (например, 1С:Документооборот 3.0 или БСП) процедура отправки выглядит следующим образом:
Если ПротоколПолученияПочты = ПротоколИнтернетПочты.IMAP Тогда
// Шаг 1: Копирование письма в папку на сервере через IMAP
Соединение.Послать(Письмо, ОбрабатыватьТексты, ПротоколИнтернетПочты.IMAP);
РезультатОтправкиПисьма.Вставить("ИдентификаторПисьмаIMAP", Письмо.ИдентификаторСообщения);
// Установка флагов (например, помечаем как прочитанное в своей папке)
ФлагиПисьма = Новый ФлагиИнтернетПочтовогоСообщения;
ФлагиПисьма.Прочитанное = Истина;
ФлагиПисем = Новый Соответствие;
ФлагиПисем.Вставить(Письмо.ИдентификаторСообщения, ФлагиПисьма);
Соединение.УстановитьФлагиСообщений(ФлагиПисем);
КонецЕсли;
// Шаг 2: Фактическая отправка получателю через SMTP
ОшибочныеПолучатели = Соединение.Послать(Письмо, ОбрабатыватьТексты, ПротоколИнтернетПочты.SMTP);
Как мы видим, на первом этапе используется объект ИнтернетПочта для обращения к серверу по протоколу IMAP. В этот момент выполняется команда APPEND, которая "заливает" текст письма в папку "Отправленные". Если мы пропустим этот шаг, то письмо уйдет получателю, но в интерфейсе 1С вы не увидите это письмо в списке исходящих. Стоит учитывать, что при больших объемах рассылки такие действия могут занимать значительное время, поэтому разработчикам крайне важно правильно использовать длительные операции в БСП.
Выясним причину, по которой иногда в папке "Отправленные" появляются два одинаковых письма. Современные почтовые гиганты (такие как Gmail, Mail.ru или Яндекс.Почта) стали "умнее". Когда их SMTP-сервер получает письмо от клиента для отправки, сервер автоматически сохраняет его копию в папку Sent.
В этой ситуации происходит следующее:
1. 1С принудительно кладет копию через IMAP (первое письмо).
2. 1С отправляет письмо через SMTP.
3. Сервер (например, Gmail) видит отправку по SMTP и сам создает копию (второе письмо).
Чтобы избежать этого, в современных версиях 1С предусмотрены настройки в справочнике УчетныеЗаписиЭлектроннойПочты.
Проанализируем еще один важный аспект — идентификацию сообщений. При использовании метода Послать через IMAP, система 1С получает уникальный идентификатор сообщения на сервере. Это позволяет объекту ИнтернетПочтовоеСообщение корректно связать локальный объект в базе данных с объектом на сервере. Если полагаться только на SMTP, то письмо "улетает" в неизвестность, и программе сложнее отследить его судьбу в почтовом ящике отправителя.
Также стоит упомянуть исторический метод авторизации SMTP after POP (или IMAP). Хотя он считается устаревшим, некоторые серверы до сих пор требуют сначала успешно подключиться к серверу входящей почты, чтобы "подтвердить" личность отправителя, и только после этого открывают возможность отправки через SMTP. Именно поэтому в коде 1С сначала идет работа с IMAP, а уже потом — SMTP. Часто такая схема применяется в сервисных задачах, например, когда выполняется отправка на почту информации о проблемах применения расширений.
Обратите внимание на использование объекта ФлагиИнтернетПочтовогоСообщения. При ручном добавлении письма в папку через IMAP оно часто помечается сервером как "Новое" (непрочитанное). Это выглядит странно: пользователь сам отправил письмо, а оно висит в отправленных как непрочитанное. Поэтому разработчики 1С сразу после записи устанавливают свойство Прочитанное = Истина. Протокол SMTP в принципе не поддерживает работу с флагами, так как он оперирует только передачей данных.
Мы выяснили, что "двойная отправка" в 1С — это стандартный механизм обеспечения целостности данных. Рассмотрим краткий алгоритм того, как работает ИнтернетПочта:
Подключиться устанавливает связь сразу по двум каналам, используя ИнтернетПочтовыйПрофиль.Послать(..., IMAP) сохраняет историю переписки для отправителя.Послать(..., SMTP) доставляет информацию конечному адресату.IMAP.Понимание этой механики, а также дополнительные навыки, такие как автоматизированное сохранение почтовых вложений, позволяют разработчику 1С гибко настраивать почтовую подсистему под любые требования корпоративных или публичных почтовых серверов, гарантируя надежную доставку и корректное отображение истории писем.