Как в 1С 7.7 сохранять отправленные письма в почтовой программе при рассылке через DialMail или CDO?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Почему письма, отправленные через SMTP, не попадают в «Отправленные»

Проанализируем техническую сторону работы почтовых служб. Протокол SMTP (Simple Mail Transfer Protocol) разработан исключительно для передачи электронных писем между серверами и клиентами. Он не управляет структурой папок на сервере и не синхронизирует состояние почтового ящика.

Когда отправка выполняется через стандартную почтовую программу (например, Microsoft Outlook или Mozilla Thunderbird), клиент самостоятельно выполняет два действия:

  1. Передает письмо почтовому серверу по протоколу SMTP для доставки получателю.
  2. Помещает локальную копию письма в папку «Отправленные» или загружает её на сервер по протоколу IMAP.

Если внешняя компонента (например, DialMail.dll) или объект CDO.Message обращается напрямую к SMTP-серверу, сохранение письма в папку не происходит автоматически, если это не предусмотрено логикой самого почтового провайдера.

Решение 1. Отправка скрытой копии (BCC) на свой почтовый адрес

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

Посмотрим на пример отправки через внешнюю компоненту DialMail.dll с отправкой скрытой копии:


// Создание объектов компоненты
ЗагрузитьВнешнююКомпоненту(КаталогИБ() + "DialMail.dll");
ОтправкаПочты = СоздатьОбъект("AddIn.SMTP");

ОтправкаПочты.РабочийКаталог = КаталогПользователя();
ОтправкаПочты.ИспользоватьПрокси = 0;
ОтправкаПочты.ИспользоватьSSL = 1;
ОтправкаПочты.ВестиЛогФайл = 1;
ОтправкаПочты.ИмяЛогФайла = КаталогПользователя() + "dialmail.smtp.log";

СМТП = "smtp.yandex.ru";
Логин = "billing@company.ru";
Пароль = "ПарольПриложения";

МойАдрес = СокрЛП(тз.Адрес); // Адрес клиента
АдресСкрытойКопии = Логин;    // Адрес для сохранения копии

ЗаголовокСообщения = "Счёт на оплату";
ТекстПисьма = "Здравствуйте! Высылаем вам счёт.";
ВыбФайл = "C:\Invoices\Invoice_123.pdf";

// В параметрах СоздатьПисьмо передаем скрытую копию
текписьмо = ОтправкаПочты.СоздатьПисьмо(Логин, МойАдрес, , ЗаголовокСообщения, , ТекстПисьма, ВыбФайл, АдресСкрытойКопии);

Если ОтправкаПочты.Подключиться(СМТП, 465, Логин, Пароль, 1) = 0 Тогда
    Сообщить("Не удалось подключиться к SMTP-серверу!");
    ОтправкаПочты.Отключиться();
Иначе
    Рез = ОтправкаПочты.ОтправитьПисьмо(, 1, 0);
    Если Рез = 1 Тогда
        Сообщить("Письмо успешно отправлено контрагенту и сохранено через копию.");
    КонецЕсли;
    ОтправкаПочты.Отключиться();
КонецЕсли;

Решение 2. Отправка почты средствами CDO (Collaboration Data Objects)

Альтернативным способом без использования сторонних DLL является штатный системный компонент Windows — CDO.Message. Он позволяет гибко настроить параметры подключения, SSL/TLS и управление копиями.

Разберем пример отправки сообщения с вложением и скрытой копией через CDO.Message:


loConfig = CreateObject("CDO.Configuration");
loCdoMessage = CreateObject("CDO.Message");

loCdoMessage.Configuration = loConfig;
loCdoMessage.From = "billing@company.ru";
loCdoMessage.To = СокрЛП(МылоКонтрагента);
loCdoMessage.BCC = "billing@company.ru"; // Скрытая копия для сохранения
loCdoMessage.Subject = "Счет за услуги";

HTMLBody = "<html><body><h3>Счет во вложении</h3></body></html>";
loCdoMessage.BodyPart.Charset = "windows-1251";
loCdoMessage.HTMLBody = HTMLBody;

ПутьКФайлу = КаталогИБ() + "mail\" + СокрЛП(НомДок) + ".pdf";
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
    loCdoMessage.AddAttachment(ПутьКФайлу);
КонецЕсли;

// Настройка SMTP-соединения
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.yandex.ru";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 465;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "billing@company.ru";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "ПарольПриложения";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = 1;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
loConfig.Fields.Update();

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

Решение 3. Использование штатного объекта платформы «Почта» (MAPI)

Если на рабочих станциях пользователей установлен стандартный почтовый клиент (например, Microsoft Outlook или The Bat!), отправку можно делегировать ему через штатный механизм 1С 7.7 — объект Почта.

В этом случае 1С передает сформированное сообщение почтовой программе через интерфейс Simple MAPI, а почтовый клиент берет на себя отправку и штатное перемещение письма в системную папку «Отправленные».


ПочтоваяСессия = СоздатьОбъект("Почта");
Если ПочтоваяСессия.Подключиться() = 1 Тогда
    ПочтоваяСессия.НовоеСообщение();
    ПочтоваяСессия.ДобавитьПолучателя(СокрЛП(тз.Адрес));
    ПочтоваяСессия.Заголовок = "Счёт на оплату";
    ПочтоваяСессия.Текст = "Высылаем в ваш адрес счет.";
    ПочтоваяСессия.Вложения.Добавить(ВыбФайл);
    
    // Отправка через почтовый клиент (0 - без открытия диалогового окна)
    ПочтоваяСессия.Отправить(0);
    ПочтоваяСессия.Отключиться();
    Сообщить("Письмо передано почтовому клиенту.");
Иначе
    Сообщить("Не удалось запустить почтовый клиент по умолчанию!");
КонецЕсли;

Решение 4. Сохранение копий на диск в каталоги 1С

Для создания автономного архива отправлений часто используют дублирование файлов на диске сервера или локальной машины. При таком подходе:

  1. Все сгенерированные файлы (печатные формы, счета в форматах PDF/JPG/XLS) сохраняются в структурированный каталог (например, КаталогИБ() + "Auto\mail\out\").
  2. В информационной базе 1С фиксируется факт отправки (дата, время, номер документа, email получателя).
  3. При необходимости пользователь может открыть отправленный файл прямо из формы документа или отчета 1С 7.7.

Важные требования современных почтовых сервисов

При настройке отправки из 1С 7.7 через публичные сервисы (Яндекс, Mail.ru, Gmail) учитывайте следующие правила:

← На главную