Как реализовать синхронизацию отправленных писем в 1С при использовании IMAP и SMTP

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

При работе со встроенным почтовым клиентом в 1С (особенно в конфигурациях на обычных формах, таких как УТП 8.2 или УПП) пользователи часто сталкиваются с проблемой: письма, отправленные из программы, не отображаются в папке «Отправленные» на почтовом сервере и в других почтовых клиентах (Outlook, мобильные устройства). Это происходит потому, что протокол SMTP отвечает только за передачу сообщения, а протокол IMAP — за управление почтовыми ящиками. Стандартные механизмы многих старых конфигураций 1С не выполняют автоматическое копирование отправленного сообщения в соответствующую папку на сервере.

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

Причина возникновения проблемы

Проанализируем ситуацию: когда вы отправляете письмо из 1С, программа подключается к серверу по протоколу SMTP и передает ему данные. Сервер доставляет письмо получателю, но он не всегда обязан сохранять копию этого письма в вашей папке «Sent» (Отправленные). Почтовые клиенты (например, TheBat! или Outlook) делают это принудительно: после отправки через SMTP они подают команду через IMAP, чтобы «положить» копию письма в нужную папку. Рассмотрим, как реализовать этот механизм в 1С.

Способ 1: Настройка на стороне почтового сервера

Прежде чем приступать к написанию кода, проверим настройки вашего почтового сервиса. Современные провайдеры (Mail.ru, Yandex) часто имеют встроенную функцию автоматического сохранения писем, отправленных через сторонние приложения по SMTP.

Например, в Mail.ru в разделе настроек «Работа с почтой» существует опция «Сохранять отправленные через SMTP письма». Если ее включить, сервер сам будет помещать копию письма в папку «Отправленные», даже если 1С об этом «не просит». Аналогичные настройки стоит поискать в панелях управления корпоративными почтовыми серверами (Exchange, Kerio, iredmail).

Способ 2: Программное копирование письма через IMAP (APPEND)

Если сервер не поддерживает автоматическое сохранение, нам необходимо реализовать это в 1С самостоятельно. Основная идея заключается в следующем: после успешной отправки письма методом Отправить() объекта ИнтернетПочта, мы должны заново подключиться к серверу по протоколу IMAP и записать это же письмо в папку «Отправленные».

Разберем примерный алгоритм и фрагмент кода для реализации этой логики:


// 1. Сначала отправляем письмо по SMTP
Почта = Новый ИнтернетПочта;
Почта.Подключиться(ПрофильСМТП, ПротоколИнтернетПочты.SMTP);
Почта.Отправить(Сообщение);
Почта.Отключиться();

// 2. Теперь подключаемся по IMAP для синхронизации
Почта.Подключиться(ПрофильИМАП, ПротоколИнтернетПочты.IMAP);

// Выбираем папку "Отправленные". 
// Важно: имя папки зависит от сервера (Sent, Отправленные, INBOX.Sent)
МассивПапок = Почта.ВыбратьПапки();
ПапкаОтправленные = Неопределено;

Для Каждого ТекущаяПапка Из МассивПапок Цикл
    Если Найти(ТекущаяПапка.Имя, "Sent") > 0 Или Найти(ТекущаяПапка.Имя, "Отправленные") > 0 Тогда
        ПапкаОтправленные = ТекущаяПапка;
        Прервать;
    КонецЕсли;
КонецЦикла;

Если ПапкаОтправленные <> Неопределено Тогда
    Почта.ТекущаяПапка = ПапкаОтправленные;
    // Копируем сообщение в выбранную папку
    Почта.ЗаписатьСообщение(Сообщение, ПапкаОтправленные);
КонецЕсли;

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

Проанализируем важный нюанс, упомянутый в обсуждении: Message-ID. Чтобы почтовые серверы и клиенты понимали, что письмо в 1С и письмо на сервере — это один и тот же объект, желательно принудительно генерировать уникальный идентификатор заголовка сообщения. Если этого не сделать, при повторной синхронизации могут возникнуть дубли.

Способ 3: Метод «Скрытой копии» (BCC)

Существует элегантный обходной путь, который не требует сложной работы с протоколом IMAP. Суть метода заключается в использовании поля «Скрытая копия» (BCC).

  1. При формировании письма в 1С в поле СкрытыеКопии программно добавляется адрес самого отправителя.
  2. Письмо отправляется через SMTP.
  3. Сервер доставляет письмо получателю и, так как вы указаны в скрытой копии, доставляет его и вам во «Входящие».
  4. На почтовом сервере (через веб-интерфейс) создается правило фильтрации: «Если письмо пришло от [Ваш Email] — переместить его в папку "Отправленные" и отметить как прочитанное».

Этот метод гарантирует 100% надежность попадания письма на сервер без дополнительных манипуляций с объектами 1С.

Способ 4: Использование внешних компонент

В старых версиях платформы 8.2 штатный объект ИнтернетПочта иногда некорректно работает с кодировками или специфическими расширениями IMAP. В таких случаях программисты используют внешние библиотеки, такие как Chilkat или Mail.dll.

Рассмотрим, почему это может быть полезно. Внешние компоненты позволяют работать с почтой на более низком уровне, обеспечивая:

Технические тонкости: Пароли приложений и SSL

Выясним причину, по которой даже правильно написанный код может не работать. Современные почтовые сервисы требуют использования «Паролей приложений». Обычный пароль от почтового ящика в 1С работать не будет — сервер просто сбросит соединение. Вы должны зайти в настройки безопасности (Mail.ru или Yandex) и создать отдельный пароль для 1С.

Также обратим внимание на параметры подключения:

В объекте ИнтернетПочтовыйПрофиль это настраивается следующим образом:


Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;

Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;

Заключение

Для полноценной реализации синхронизации в старых конфигурациях 1С (УТП, УПП, БП 2.0) наиболее надежным решением является сочетание отправки по SMTP и последующего копирования через IMAP (метод ЗаписатьСообщение). Если же требуется быстрое решение без глубокого погружения в код обработки почты, метод BCC в связке с серверным правилом станет отличной альтернативой.

← На главную