При работе со встроенным почтовым клиентом в 1С (особенно в конфигурациях на обычных формах, таких как УТП 8.2 или УПП) пользователи часто сталкиваются с проблемой: письма, отправленные из программы, не отображаются в папке «Отправленные» на почтовом сервере и в других почтовых клиентах (Outlook, мобильные устройства). Это происходит потому, что протокол SMTP отвечает только за передачу сообщения, а протокол IMAP — за управление почтовыми ящиками. Стандартные механизмы многих старых конфигураций 1С не выполняют автоматическое копирование отправленного сообщения в соответствующую папку на сервере.
В этой статье мы подробно разберем, как решить эту задачу несколькими способами: от простых настроек сервера до программной доработки кода 1С.
Проанализируем ситуацию: когда вы отправляете письмо из 1С, программа подключается к серверу по протоколу SMTP и передает ему данные. Сервер доставляет письмо получателю, но он не всегда обязан сохранять копию этого письма в вашей папке «Sent» (Отправленные). Почтовые клиенты (например, TheBat! или Outlook) делают это принудительно: после отправки через SMTP они подают команду через IMAP, чтобы «положить» копию письма в нужную папку. Рассмотрим, как реализовать этот механизм в 1С.
Прежде чем приступать к написанию кода, проверим настройки вашего почтового сервиса. Современные провайдеры (Mail.ru, Yandex) часто имеют встроенную функцию автоматического сохранения писем, отправленных через сторонние приложения по SMTP.
Например, в Mail.ru в разделе настроек «Работа с почтой» существует опция «Сохранять отправленные через SMTP письма». Если ее включить, сервер сам будет помещать копию письма в папку «Отправленные», даже если 1С об этом «не просит». Аналогичные настройки стоит поискать в панелях управления корпоративными почтовыми серверами (Exchange, Kerio, iredmail).
Если сервер не поддерживает автоматическое сохранение, нам необходимо реализовать это в 1С самостоятельно. Основная идея заключается в следующем: после успешной отправки письма методом Отправить() объекта ИнтернетПочта, мы должны заново подключиться к серверу по протоколу IMAP и записать это же письмо в папку «Отправленные».
Разберем примерный алгоритм и фрагмент кода для реализации этой логики:
// 1. Сначала отправляем письмо по SMTP
Почта = Новый ИнтернетПочта;
Почта.Подключиться(ПрофильСМТП, ПротоколИнтернетПочты.SMTP);
Почта.Отправить(Сообщение);
Почта.Отключиться();
// 2. Теперь подключаемся по IMAP для синхронизации
Почта.Подключиться(ПрофильИМАП, ПротоколИнтернетПочты.IMAP);
// Выбираем папку "Отправленные".
// Важно: имя папки зависит от сервера (Sent, Отправленные, INBOX.Sent)
МассивПапок = Почта.ВыбратьПапки();
ПапкаОтправленные = Неопределено;
Для Каждого ТекущаяПапка Из МассивПапок Цикл
Если Найти(ТекущаяПапка.Имя, "Sent") > 0 Или Найти(ТекущаяПапка.Имя, "Отправленные") > 0 Тогда
ПапкаОтправленные = ТекущаяПапка;
Прервать;
КонецЕсли;
КонецЦикла;
Если ПапкаОтправленные <> Неопределено Тогда
Почта.ТекущаяПапка = ПапкаОтправленные;
// Копируем сообщение в выбранную папку
Почта.ЗаписатьСообщение(Сообщение, ПапкаОтправленные);
КонецЕсли;
Почта.Отключиться();
Проанализируем важный нюанс, упомянутый в обсуждении: Message-ID. Чтобы почтовые серверы и клиенты понимали, что письмо в 1С и письмо на сервере — это один и тот же объект, желательно принудительно генерировать уникальный идентификатор заголовка сообщения. Если этого не сделать, при повторной синхронизации могут возникнуть дубли.
Существует элегантный обходной путь, который не требует сложной работы с протоколом IMAP. Суть метода заключается в использовании поля «Скрытая копия» (BCC).
СкрытыеКопии программно добавляется адрес самого отправителя.SMTP.Этот метод гарантирует 100% надежность попадания письма на сервер без дополнительных манипуляций с объектами 1С.
В старых версиях платформы 8.2 штатный объект ИнтернетПочта иногда некорректно работает с кодировками или специфическими расширениями IMAP. В таких случаях программисты используют внешние библиотеки, такие как Chilkat или Mail.dll.
Рассмотрим, почему это может быть полезно. Внешние компоненты позволяют работать с почтой на более низком уровне, обеспечивая:
Выясним причину, по которой даже правильно написанный код может не работать. Современные почтовые сервисы требуют использования «Паролей приложений». Обычный пароль от почтового ящика в 1С работать не будет — сервер просто сбросит соединение. Вы должны зайти в настройки безопасности (Mail.ru или Yandex) и создать отдельный пароль для 1С.
Также обратим внимание на параметры подключения:
SMTP обычно используется порт 465 с поддержкой SSL.IMAP используется порт 993 с поддержкой SSL.В объекте ИнтернетПочтовыйПрофиль это настраивается следующим образом:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.АдресСервераIMAP = "imap.mail.ru";
Профиль.ПортIMAP = 993;
Профиль.ИспользоватьSSLIMAP = Истина;
Для полноценной реализации синхронизации в старых конфигурациях 1С (УТП, УПП, БП 2.0) наиболее надежным решением является сочетание отправки по SMTP и последующего копирования через IMAP (метод ЗаписатьСообщение). Если же требуется быстрое решение без глубокого погружения в код обработки почты, метод BCC в связке с серверным правилом станет отличной альтернативой.