Как отправить файлы по электронной почте из 1С 7.7?

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

При автоматизации задач в 1С 7.7 часто возникает необходимость отправлять электронные письма с вложенными файлами (например, прайс-листами, счетами или печатными формами). Главная сложность при работе из 7.7 заключается в том, что современные почтовые сервисы (Yandex, Mail.ru, Gmail и др.) требуют обязательной защиты соединения по протоколам SSL/TLS и использования специальных паролей приложений.

Рассмотрим основные способы решения этой задачи с помощью внешних компонент, системных COM-объектов Windows и сторонних утилит.

Способ 1. Использование внешней компоненты DialMail.dll

Внешняя компонента DialMail.dll — одно из самых популярных решений для работы с электронной почтой в 1С 7.7. Она позволяет формировать письма, подключаться по SMTP/POP3, использовать авторизацию и работать с вложениями.

Разберем пример кода отправки письма с файлом вложения через DialMail.dll:


Путь = КаталогИБ() + "DialMail.dll";
Если ЗагрузитьВнешнююКомпоненту(Путь) = 0 Тогда 
    Сообщить("Неудачная попытка загрузить DialMail.dll"); 
КонецЕсли;

ОтправкаПочты = СоздатьОбъект("AddIn.SMTP");  
ОтправкаПочты.РабочийКаталог = СокрЛП(КаталогИБ());  
ОтправкаПочты.УстановитьКодировкуИСпособКодирования(14, 1); 
ОтправкаПочты.MakeContentDescriptionTag = 0;             
ОтправкаПочты.ПочтоваяПрограмма = "1C 7.7 Mail Bot";

// Установка параметров шифрования SSL
ОтправкаПочты.ИспользоватьSSL = 1;

// Путь к файлу-вложению (имя файла должно быть заключено в кавычки)
ВыбФайл = СокрЛП(КаталогИБ()) + "Temp\Report.xls";    
ВыбФайл = """" + ВыбФайл + """";           

// Формируем письмо: ОтКого, Кому, Копии, Тема, Текст, Вложения
ОтправкаПочты.СоздатьПисьмо("sender@yandex.ru", "receiver@domain.ru", "", "Отчет 1С", , "Автоматическая выгрузка во вложении.", СокрЛП(ВыбФайл));

// Подключаемся к SMTP-серверу: Хост, Порт, Логин, Пароль
Если ОтправкаПочты.Подключиться("smtp.yandex.ru", 465, "sender@yandex.ru", "пароль_приложения") = 0 Тогда
    Сообщить("Не смогли подключиться к SMTP-серверу");
    Сообщить("Ошибка: " + ОтправкаПочты.ПоследняяОшибкаСтр);
    Сообщить("Ответ сервера: " + ОтправкаПочты.ПоследнийОтветСервера);
Иначе
    // Отправка писем
    Если ОтправкаПочты.ОтправитьВсеПисьма(0, 1, 0) = -100 Тогда
        Сообщить("Успешно отправлено");
    Иначе
        // Пробуем отправить по одному письму
        ОтправкаПочты.ОтправитьПисьмо(1, 1);
    КонецЕсли;
    
    ОтправкаПочты.Отключиться();
КонецЕсли;

Проанализируем важные детали отладки при использовании DialMail.dll:

  1. Диагностика ошибок: Если соединение не устанавливается или письмо не отправляется, обязательно анализируйте свойства ПоследняяОшибкаСтр и ПоследнийОтветСервера.
  2. Просмотр логов: Компонента ведет протокол работы в рабочем каталоге. Ищите текстовые файлы логов вида dialmail_smtpYYYY_MM.log, чтобы увидеть подробную картину взаимодействия с сервером.
  3. Метод отправки: Вместо групповой отправки ОтправитьВсеПисьма() можно использовать поштучную отправку ОтправитьПисьмо().

Способ 2. Использование системного COM-объекта CDO.Message

Компонента CDO (Collaboration Data Objects) встроена в операционную систему Windows и не требует регистрации сторонних DLL-файлов. Этот способ считаются наиболее надежным, так как CDO работает через системный стек Windows.

Рассмотрим пошаговую настройку отправки через CDO.Message:


Почта = СоздатьОбъект("CDO.Message");
Конфигурация = СоздатьОбъект("CDO.Configuration");

// Настройка параметров подключения по SMTP
Конфигурация.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2; // Отправка через сетевой SMTP
Конфигурация.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.yandex.ru";
Конфигурация.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 465; // SSL порт
Конфигурация.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1; // Basic auth
Конфигурация.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "sender@yandex.ru";
Конфигурация.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "пароль_приложения";
Конфигурация.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = 1; // Использовать SSL

Конфигурация.Fields.Update();
Почта.Configuration = Конфигурация;

Почта.From = "sender@yandex.ru";
Почта.To = "receiver@domain.ru";
Почта.Subject = "Файл из 1С 7.7";
Почта.TextBody = "Во вложении находится запрашиваемый файл.";

// Добавление вложения
Почта.AddAttachment(КаталогИБ() + "Temp\Report.xls");

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

Способ 3. Встроенная библиотека V7PLUS.DLL

В стандартную поставку 1С 7.7 входит внешняя компонента V7PLUS.DLL, в которой присутствует объект AddIn.V7Mail. Она подходит для отправки писем внутри локальной сети или через внутренние почтовые серверы без строгих требований к протоколам шифрования.

Однако стоит учитывать ограничение: библиотека V7PLUS.DLL давно не обновлялась и не поддерживает современные протоколы безопасности TLS 1.2 / TLS 1.3. При попытке отправки через публичные сервисы (Yandex, Mail.ru) напрямую подключиться не удастся.

Способ 4. Использование внешних утилит и SSL-прокси для TLS 1.2+

Если почтовый провайдер полностью отключил старые протоколы SSL 2.0/3.0 и TLS 1.0, а старые DLL-компоненты выдают ошибки подключения, разберем альтернативные подходы:

  1. Локальный SSL-туннель (stunnel): На сервер с 1С устанавливается утилита stunnel. В 1С 7.7 вы отправляете письмо без SSL на 127.0.0.1 (локальный порт), а stunnel оборачивает трафик в TLS 1.2/1.3 и пересылает внешнему почтовому серверу.
  2. Вызов консольной утилиты cURL: С помощью объекта WScript.Shell запускается утилита curl.exe, которая поддерживает современные стандарты шифрования и может передавать письма с вложениями по SMTP/SMTPS.
  3. Отправка через HTTP/REST API: Вместо SMTP-протокола можно использовать отправку HTTP-запросов к API почтовых сервисов через системные объекты WinHttp.WinHttpRequest.5.1 или MSXML2.ServerXMLHTTP.
← На главную