В платформе 1С:Предприятие 7.7 отсутствуют встроенные средства для прямой отправки электронной почты по протоколу SMTP, как это реализовано в старших версиях платформы. Для автоматизации рассылки отчетов, прайс-листов или заявок поставщикам разработчики используют системные COM-объекты Windows или внешние специализированные компоненты. Разберем основные способы реализации отправки писем, примеры рабочего программного кода, а также частые проблемы и ошибки подключения.
Наиболее популярный и не требующий установки сторонних библиотек вариант — использование встроенного в операционную систему 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();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке письма: " + ОписаниеОшибки(), "!");
КонецПопытки;
При использовании объекта CDO разработчики часто сталкиваются с ошибкой CDO.Message.1: The transport failed to connect to the server. Проанализируем ключевые причины возникновения этой проблемы:
465 и флаг cdoSMTPUseSSL = 1. Стандартный порт 587 (STARTTLS) механизмом CDO поддерживается некорректно.iMsg.From обязательно должно содержать тот же адрес электронной почты, под которым выполняется авторизация в cdoSendUserName.Если штатный механизм CDO не удается применить из-за ограничений операционной системы, используют специализированные внешние компоненты, разработанные для 1С 7.7:
CDOSYS.DLL.Для обхода проблем с TLS/SSL на устаревших серверах при работе с компонентами ROM-Mail или DialMail настраивают локальный туннель через утилиту stunnel. В такой схеме 1С отправляет письмо на локальный адрес 127.0.0.1:25 без шифрования, а утилита stunnel упаковывает трафик в защищенный канал TLS 1.2/1.3 и перенаправляет на внешний почтовый сервер.
Разберем еще один надежный вариант, исключающий проблемы с устаревшими криптопровайдерами Windows — отправку через сторонние консольные утилиты с независимым стеком SSL/TLS:
WScript.Shell.