Как сделать, чтобы отправленное из базы 1С письмо сохранилось в папке «Отправленные»?

Программист 1С v7.7
← На главную

При автоматизации рассылок из 1С, например в рамках автоматической отправки счетов и договоров из 1С:Бухгалтерии, программисты часто сталкиваются с ситуацией: письмо успешно уходит адресату, но в почтовом ящике отправителя (например, в Outlook, Gmail или Mail.ru) в папке «Отправленные» оно не появляется. Это происходит потому, что стандартный протокол отправки SMTP предназначен только для передачи сообщения и не подразумевает автоматического сохранения копии на сервере.

В данной статье мы подробно разберем, как решить эту задачу для различных версий платформы 1С, рассмотрим работу с протоколами IMAP, использование объекта CDO.Message и альтернативные «хитрые» методы, такие как скрытая копия.

Почему письма не сохраняются автоматически?

Для начала проанализируем техническую сторону вопроса. Когда мы используем код для отправки почты, мы обычно взаимодействуем с SMTP-сервером. SMTP (Simple Mail Transfer Protocol) — это «почтальон», который берет конверт и несет его получателю. У него нет обязанности оставлять копию в вашем «шкафу» (папке на сервере). Чтобы копия письма появилась в папке Sent, клиентское приложение (в нашем случае 1С) должно само положить её туда, используя другой протокол — IMAP.

Решение для 1С 8.x: Использование протокола IMAP

В современных версиях 1С (8.3) наиболее правильным способом является прямое указание почтовому серверу поместить письмо в нужную папку после отправки. Рассмотрим, как это реализовать с помощью встроенных средств работы с интернет-почтой.

Разберем по шагам пример кода, который ищет папку «Отправленные» (она может называться по-разному в зависимости от настроек сервера) и помещает туда сообщение:


// Создаем объект для работы с IMAP
ИнтернетПочтаIMAP = Новый ИнтернетПочта;
Попытка
    ИнтернетПочтаIMAP.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP);
    
    // Получаем список всех доступных ящиков (папок) на сервере
    Ящики = ИнтернетПочтаIMAP.ПолучитьПочтовыеЯщики();
    флПапкаНайдена = Ложь;
    
    Для Каждого ТекущийЯщик из Ящики Цикл
        // Проверяем имя папки на разных языках
        ИмяВРег = ВРег(ТекущийЯщик);
        Если ИмяВРег = "ОТПРАВЛЕННЫЕ" ИЛИ ИмяВРег = "SENT" ИЛИ ИмяВРег = "INBOX.SENT" Тогда
            Попытка
                ИнтернетПочтаIMAP.ТекущийПочтовыйЯщик = ТекущийЯщик;
                флПапкаНайдена = Истина;
                Прервать;
            Исключение
                Продолжить;
            КонецПопытки;
        КонецЕсли;
    КонецЦикла;

    Если флПапкаНайдена Тогда
        // Помещаем письмо в выбранную папку
        ИнтернетПочтаIMAP.Послать(Письмо,, ПротоколИнтернетПочты.IMAP);
    КонецЕсли;
    
    ИнтернетПочтаIMAP.Отключиться();
Исключение
    Сообщить("Ошибка при работе с IMAP: " + ОписаниеОшибки());
КонецПопытки;

В данном примере мы используем метод Послать, но с указанием протокола ПротоколИнтернетПочты.IMAP. Важно понимать, что в этот момент письмо не отправляется получателю заново, а именно копируется в структуру папок сервера.

Решение для 1С 7.7: Использование CDO (Collaboration Data Objects)

Для платформы 7.7 ситуация сложнее, так как штатные средства сильно ограничены. Часто используется библиотека CDO.Message. Рассмотрим стандартный код отправки через SMTP, который сам по себе не сохраняет письмо:


Письмо = СоздатьОбъект("CDO.Message");
Письмо.To = "получатель@mail.ru";
Письмо.From = "отправитель@mail.ru";
Письмо.Subject = "Тема письма";
Письмо.TextBody = "Текст сообщения";

// Настройка конфигурации SMTP
Конфиг = Письмо.Configuration.Fields;
Конфиг.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
Конфиг.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.mail.ru";
Конфиг.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;
Конфиг.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "логин";
Конфиг.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "пароль";
Конфиг.Update();

Попытка
    Письмо.Send();
Исключение
    Сообщить("Ошибка отправки: " + ОписаниеОшибки());
КонецПопытки;

Поскольку CDO.Message не умеет работать с папками IMAP напрямую, у программиста 1С 7.7 есть три пути:

  1. Метод BCC (Скрытая копия): Добавить адрес отправителя в поле скрытой копии. Письмо придет и получателю, и вам. Затем на почтовом сервере (через веб-интерфейс) нужно настроить простое правило: "Если письмо пришло от самого себя, переместить его в папку Отправленные".
  2. Внешние компоненты: Использовать специализированные DLL, такие как DialMail.dll или ROM-Mail. Они обладают расширенным функционалом и позволяют работать с IMAP-папками в "семерке" гораздо эффективнее.
  3. Настройка сервера: Проверить настройки почтового сервера. Современные сервисы (Gmail, Яндекс.Почта) часто имеют опцию "Сохранять копии писем, отправленных по SMTP" в настройках аккаунта. Это самый простой способ, не требующий написания кода.

Нюансы именования папок

Проанализируем ситуацию с именами папок. Использование жестко прописанного имени "Отправленные" — это частая ошибка. На разных серверах структура может отличаться:

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

Использование PowerShell как универсальный инструмент

Если штатные средства 1С (особенно в 7.7) не позволяют реализовать требуемое, можно прибегнуть к вызову внешнего скрипта PowerShell. Это современный и надежный способ. Скрипт может принять параметры из 1С (адрес, текст, вложение), отправить письмо через SMTP и тут же, используя библиотеки .NET, подключиться по IMAP и создать копию сообщения в нужной папке. Для пользователя 1С это будет выглядеть как мгновенное действие, а программный код будет работать стабильнее, чем через старые COM-объекты. Подобные сценарии работы с внешними системами также реализуются через платформу RPA для роботизации повторяющихся операций.

Выводы

Чтобы письмо сохранялось в "Отправленных", мы должны либо полагаться на автоматику сервера (что не всегда доступно), либо использовать протокол IMAP для явного копирования сообщения в нужную папку после отправки. Для платформы 1С 8.3 это реализуется через ИнтернетПочта с методом Послать(..., ПротоколИнтернетПочты.IMAP). Для 1С 7.7 оптимальным решением станет использование внешних компонент или метода скрытой копии (BCC).

← На главную