При организации автоматической отправки счетов, актов и отчетов из 1С:Предприятия 7.7 разработчики часто сталкиваются с ситуацией: письма успешно отправляются клиентам через протокол SMTP, однако в почтовом клиенте (или в веб-интерфейсе ящика) в папке «Отправленные» эти сообщения не отображаются. Разберем причины такого поведения и рассмотрим практические способы решения этой задачи.
Проанализируем техническую сторону работы почтовых служб. Протокол SMTP (Simple Mail Transfer Protocol) разработан исключительно для передачи электронных писем между серверами и клиентами. Он не управляет структурой папок на сервере и не синхронизирует состояние почтового ящика.
Когда отправка выполняется через стандартную почтовую программу (например, Microsoft Outlook или Mozilla Thunderbird), клиент самостоятельно выполняет два действия:
Если внешняя компонента (например, DialMail.dll) или объект CDO.Message обращается напрямую к SMTP-серверу, сохранение письма в папку не происходит автоматически, если это не предусмотрено логикой самого почтового провайдера.
Самый простой, надежный и распространенный способ сохранить историю отправленных сообщений — добавить адрес отправителя в поле скрытой копии (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 Тогда
Сообщить("Письмо успешно отправлено контрагенту и сохранено через копию.");
КонецЕсли;
ОтправкаПочты.Отключиться();
КонецЕсли;
Альтернативным способом без использования сторонних 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();
Сообщить("Счет успешно отправлен для " + СокрЛП(КонтрагентНаименование));
Исключение
Сообщить("Ошибка отправки: " + ОписаниеОшибки());
КонецПопытки;
Если на рабочих станциях пользователей установлен стандартный почтовый клиент (например, Microsoft Outlook или The Bat!), отправку можно делегировать ему через штатный механизм 1С 7.7 — объект Почта.
В этом случае 1С передает сформированное сообщение почтовой программе через интерфейс Simple MAPI, а почтовый клиент берет на себя отправку и штатное перемещение письма в системную папку «Отправленные».
ПочтоваяСессия = СоздатьОбъект("Почта");
Если ПочтоваяСессия.Подключиться() = 1 Тогда
ПочтоваяСессия.НовоеСообщение();
ПочтоваяСессия.ДобавитьПолучателя(СокрЛП(тз.Адрес));
ПочтоваяСессия.Заголовок = "Счёт на оплату";
ПочтоваяСессия.Текст = "Высылаем в ваш адрес счет.";
ПочтоваяСессия.Вложения.Добавить(ВыбФайл);
// Отправка через почтовый клиент (0 - без открытия диалогового окна)
ПочтоваяСессия.Отправить(0);
ПочтоваяСессия.Отключиться();
Сообщить("Письмо передано почтовому клиенту.");
Иначе
Сообщить("Не удалось запустить почтовый клиент по умолчанию!");
КонецЕсли;
Для создания автономного архива отправлений часто используют дублирование файлов на диске сервера или локальной машины. При таком подходе:
КаталогИБ() + "Auto\mail\out\").При настройке отправки из 1С 7.7 через публичные сервисы (Яндекс, Mail.ru, Gmail) учитывайте следующие правила: