Как отправить электронное письмо с вложением из 1С:Предприятие 7.7?

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

В платформе 1С:Предприятие 7.7 отсутствуют встроенные средства для прямой отправки электронной почты по протоколу SMTP, как это реализовано в старших версиях платформы. Для автоматизации рассылки отчетов, прайс-листов или заявок поставщикам разработчики используют системные COM-объекты Windows или внешние специализированные компоненты. Разберем основные способы реализации отправки писем, примеры рабочего программного кода, а также частые проблемы и ошибки подключения.

Способ 1. Отправка почты с помощью системного объекта CDO (Collaboration Data Objects)

Наиболее популярный и не требующий установки сторонних библиотек вариант — использование встроенного в операционную систему COM-объекта CDO.Message в связке с конфигурационным объектом CDO.Configuration. Этот механизм позволяет сформировать тело письма, настроить параметры SMTP-сервера, указать аутентификацию, включить защищенное соединение и прикрепить файлы вложений.

Посмотрим на пример универсального кода отправки письма через объект CDO:


Попытка
    iConf = CreateObject("CDO.Configuration");
    iMsg  = CreateObject("CDO.Message");
Исключение 
    Сообщить("Не удалось создать объекты CDO для работы с электронной почтой!", "!");
    Возврат;
КонецПопытки;

// Настройка полей конфигурации SMTP
cdoSendUsingMethod        = "http://schemas.microsoft.com/cdo/configuration/sendusing";
cdoSMTPServer             = "http://schemas.microsoft.com/cdo/configuration/smtpserver";
cdoSMTPServerPort         = "http://schemas.microsoft.com/cdo/configuration/smtpserverport";
cdoSendUserName           = "http://schemas.microsoft.com/cdo/configuration/sendusername";
cdoSendPassword           = "http://schemas.microsoft.com/cdo/configuration/sendpassword";
cdoSMTPAuthenticate       = "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate";
cdoSendEmailAddress       = "http://schemas.microsoft.com/cdo/configuration/sendemailaddress";
cdoSMTPUseSSL             = "http://schemas.microsoft.com/cdo/configuration/smtpusessl";
cdoSMTPConnectionTimeout  = "http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout";

// Способ отправки: 2 - отправка по сети через SMTP-порт
iConf.Fields(cdoSendUsingMethod).Value        = 2;
iConf.Fields(cdoSMTPServer).Value             = "smtp.yandex.ru";
iConf.Fields(cdoSMTPServerPort).Value         = 465;
iConf.Fields(cdoSendUserName).Value           = "robot@domain.ru";
iConf.Fields(cdoSendPassword).Value           = "app_password_here"; // Пароль приложения
iConf.Fields(cdoSMTPAuthenticate).Value       = 1; // Базовая аутентификация
iConf.Fields(cdoSMTPUseSSL).Value             = 1; // Использовать SSL/TLS
iConf.Fields(cdoSMTPConnectionTimeout).Value  = 30;
iConf.Fields.Update();

// Привязка конфигурации к сообщению
iMsg.Configuration = iConf;

// Заполнение реквизитов письма
iMsg.To   = "supplier@partner.ru";
iMsg.From = "Моя Организация <robot@domain.ru>";
iMsg.Subject = "Заявка на поставку товара";
iMsg.TextBody = "Добрый день! Во вложении сформированная заявка на поставку.";
iMsg.TextBodyPart.Charset = "windows-1251";

// Добавление вложений
ИмяФайлаВложения = "C:\Temp\Order_123.pdf";
Если ФС.СуществуетФайл(ИмяФайлаВложения) = 1 Тогда
    iMsg.AddAttachment(ИмяФайлаВложения);
Иначе
    Сообщить("Файл вложения не найден, письмо отправляется без файла.", "!");
КонецЕсли;

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

Разбор ошибки: «The transport failed to connect to the server»

При использовании объекта CDO разработчики часто сталкиваются с ошибкой CDO.Message.1: The transport failed to connect to the server. Проанализируем ключевые причины возникновения этой проблемы:

  1. Несовместимость версий протоколов шифрования (TLS 1.2 / TLS 1.3): Компонент CDO опирается на системный криптографический провайдер (Schannel). На устаревших операционных системах (например, Windows Server 2003) поддержка современных протоколов TLS 1.2 отсутствует по умолчанию, из-за чего современные почтовые серверы (Яндекс, Mail.ru, Google) принудительно разрывают SSL-соединение еще на этапе рукопожатия.
  2. Использование обычного пароля вместо пароля приложения: Почтовые сервисы требуют создания отдельного пароля для внешних приложений в профиле безопасности учетной записи. Обычный пароль от веб-интерфейса или двухфакторная аутентификация приводят к блокировке подключения.
  3. Неправильный порт или тип шифрования: Для прямого SSL-соединения в объекте CDO необходимо указывать порт 465 и флаг cdoSMTPUseSSL = 1. Стандартный порт 587 (STARTTLS) механизмом CDO поддерживается некорректно.
  4. Несоответствие адреса отправителя: Поле iMsg.From обязательно должно содержать тот же адрес электронной почты, под которым выполняется авторизация в cdoSendUserName.

Способ 2. Использование внешних компонент DialMail и ROM-Mail

Если штатный механизм CDO не удается применить из-за ограничений операционной системы, используют специализированные внешние компоненты, разработанные для 1С 7.7:

  1. ВК DialMail: Популярная библиотека для работы с почтовыми серверами. Позволяет тонко настраивать параметры соединения, таймауты и кодировки без привязки к системному CDOSYS.DLL.
  2. ВК ROM-Mail: Легковесная внешняя компонента для отправки и получения почты. При ее использовании важно явно указывать свойство отправителя письма.

Для обхода проблем с TLS/SSL на устаревших серверах при работе с компонентами ROM-Mail или DialMail настраивают локальный туннель через утилиту stunnel. В такой схеме 1С отправляет письмо на локальный адрес 127.0.0.1:25 без шифрования, а утилита stunnel упаковывает трафик в защищенный канал TLS 1.2/1.3 и перенаправляет на внешний почтовый сервер.

Способ 3. Консольные утилиты и внешние релеи

Разберем еще один надежный вариант, исключающий проблемы с устаревшими криптопровайдерами Windows — отправку через сторонние консольные утилиты с независимым стеком SSL/TLS:

  1. Утилита curl: Позволяет выполнять защищенные запросы по протоколам SMTPS напрямую с указанием актуальных сертификатов шифрования. Запуск выполняется из 1С через команду запуска приложения или объект WScript.Shell.
  2. Консольные утилиты sendEmail или mailsend: Специализированные SMTP-клиенты для командной строки, которые поддерживают современные алгоритмы шифрования и легко вызываются пакетным скриптом из 1С 7.7.
← На главную