Зачем 1С отправляет письмо дважды: разбираемся в работе протоколов IMAP и SMTP

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При изучении кода типовых конфигураций 1С, использующих Библиотеку стандартных подсистем (БСП), разработчики часто натыкаются на странную, на первый взгляд, последовательность действий в модуле РаботаСПочтовымиСообщениямиСлужебный. Программа сначала выполняет метод Послать с указанием протокола IMAP, а затем — повторно с протоколом SMTP. В этой статье мы подробно разберем, почему это не ошибка программистов, а техническая необходимость, продиктованная архитектурой почтовых протоколов.

Разделение обязанностей: SMTP против IMAP

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

  1. SMTP (Simple Mail Transfer Protocol) — это протокол "почтотальон". Его единственная задача — доставить конверт с письмом от отправителя к серверу получателя. Важно понимать: стандарт SMTP не содержит команд для сохранения письма в папке "Отправленные" в вашем почтовом ящике. Он просто передает данные дальше.
  2. IMAP (Internet Message Access Protocol) — это протокол "библиотекарь". Он предназначен для работы с папками на сервере: чтения, перемещения, удаления и поиска писем. IMAP сам по себе не умеет пересылать письма внешним адресатам по интернету.

Таким образом, когда вы нажимаете кнопку "Отправить" в почтовом клиенте, программа должна выполнить два разных действия: доставить письмо адресату (SMTP) и сохранить копию письма в вашем личном архиве (IMAP). Если вам требуется реализовать подобный функционал без изменения типовой конфигурации, можно использовать специальное расширение для отправки и получения почтовых сообщений.

Разбор программного кода 1С

Рассмотрим фрагмент кода, который вызывает вопросы у разработчиков. В типовых решениях (например, 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С предусмотрены настройки в справочнике УчетныеЗаписиЭлектроннойПочты.

Особенности авторизации и Message-ID

Проанализируем еще один важный аспект — идентификацию сообщений. При использовании метода Послать через IMAP, система 1С получает уникальный идентификатор сообщения на сервере. Это позволяет объекту ИнтернетПочтовоеСообщение корректно связать локальный объект в базе данных с объектом на сервере. Если полагаться только на SMTP, то письмо "улетает" в неизвестность, и программе сложнее отследить его судьбу в почтовом ящике отправителя.

Также стоит упомянуть исторический метод авторизации SMTP after POP (или IMAP). Хотя он считается устаревшим, некоторые серверы до сих пор требуют сначала успешно подключиться к серверу входящей почты, чтобы "подтвердить" личность отправителя, и только после этого открывают возможность отправки через SMTP. Именно поэтому в коде 1С сначала идет работа с IMAP, а уже потом — SMTP. Часто такая схема применяется в сервисных задачах, например, когда выполняется отправка на почту информации о проблемах применения расширений.

Работа с флагами сообщений

Обратите внимание на использование объекта ФлагиИнтернетПочтовогоСообщения. При ручном добавлении письма в папку через IMAP оно часто помечается сервером как "Новое" (непрочитанное). Это выглядит странно: пользователь сам отправил письмо, а оно висит в отправленных как непрочитанное. Поэтому разработчики 1С сразу после записи устанавливают свойство Прочитанное = Истина. Протокол SMTP в принципе не поддерживает работу с флагами, так как он оперирует только передачей данных.

Подведем итоги

Мы выяснили, что "двойная отправка" в 1С — это стандартный механизм обеспечения целостности данных. Рассмотрим краткий алгоритм того, как работает ИнтернетПочта:

  1. Метод Подключиться устанавливает связь сразу по двум каналам, используя ИнтернетПочтовыйПрофиль.
  2. Команда Послать(..., IMAP) сохраняет историю переписки для отправителя.
  3. Команда Послать(..., SMTP) доставляет информацию конечному адресату.
  4. Если вы наблюдаете дубликаты — это признак того, что сервер "слишком умный", и в коде или настройках следует пропустить шаг с IMAP.

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

← На главную