Отправка электронных писем из платформы 1С:Предприятие 7.7 — классическая задача, с которой до сих пор сталкиваются многие разработчики и администраторы при поддержке старых конфигураций. В прошлые годы стандартным решением было использование внешних компонент вроде ROM-Mail.dll. Однако технологии не стоят на месте: современные почтовые сервисы (Yandex, Gmail, Mail.ru) перешли на обязательное шифрование трафика (SSL/TLS) и заблокировали авторизацию по обычным паролям аккаунтов. При необходимости отправки документов прямо из интерфейса можно использовать обработку для отправки документов по электронной почте из 1С 7.7.
В этой статье мы подробно разберем, почему старые методы отправки почты дают сбои, и рассмотрим самые надежные и актуальные способы настройки отправки писем из «семерки», которые работают на современных операционных системах Windows 10/11 и Windows Server.
Проанализируем ситуацию: старая компонента ROM-Mail.dll разрабатывалась в эпоху, когда почта передавалась в открытом виде по протоколу SMTP (порт 25) без обязательного шифрования. Сегодня попытка отправить письмо через незащищенное соединение отвергается серверами на этапе подключения.
Почтовые гиганты требуют обязательного использования протоколов SSL (обычно порт 465) или TLS/STARTTLS (обычно порт 587). Так как старые библиотеки не умеют инициализировать защищенное рукопожатие (Handshake) с сервером, соединение обрывается с ошибкой «Не удалось отправить сообщение».
Кроме того, при переносе баз на 64-разрядные операционные системы (Windows 10, Windows Server 2016/2019/2022) возникают серьезные трудности с регистрацией старых 32-битных ActiveX/COM-компонент в реестре.
Прежде чем приступать к написанию кода в 1С 7.7, выясним важнейшую деталь безопасности. Ни один современный почтовый сервис больше не примет ваш обычный пароль от ящика, даже если код написан абсолютно верно. Попытка авторизоваться под основным паролем вернет ошибку авторизации SMTP error 535.
Для интеграции стороннего софта (включая 1С 7.7) необходимо использовать так называемый Пароль приложения. Разберем по шагам, как его получить:
Рассмотрим наиболее стабильный и кроссплатформенный вариант, не требующий регистрации сторонних DLL-библиотек в операционной системе. Мы будем использовать системный объект Windows — CDO.Message (Collaboration Data Objects). Он присутствует во всех версиях Windows «из коробки» и умеет работать с SSL-шифрованием. Для этого варианта можно использовать готовое решение для отправки писем из 1С 7.7 через CDO.
Посмотрим на практический пример реализации процедуры отправки:
Процедура ОтправитьПисьмоCDO()
// Создаем системные объекты для работы с почтой
Попытка
Письмо = СоздатьОбъект("CDO.Message");
Конфигурация = СоздатьОбъект("CDO.Configuration");
Исключение
Предупреждение("Не удалось инициализировать системные объекты CDO. Проверьте компоненты Windows.");
Возврат;
КонецПопытки;
// Настраиваем поля конфигурации SMTP-клиента
Поля = Конфигурация.Fields;
// Схема настроек CDO
Схема = "http://schemas.microsoft.com/cdo/configuration/";
// Указываем отправку через внешний SMTP-сервер (значение 2)
Поля.Item(Схема + "sendusing").Value = 2;
// Адрес и порт SMTP сервера (например, для Яндекса)
Поля.Item(Схема + "smtpserver").Value = "smtp.yandex.ru";
Поля.Item(Схема + "smtpserverport").Value = 465; // Используем защищенный порт SSL
// Включаем использование защищенного соединения SSL
Поля.Item(Схема + "smtpusessl").Value = 1;
// Настройка авторизации: 1 - базовая (логин/пароль)
Поля.Item(Схема + "smtpauthenticate").Value = 1;
// Указываем логин (полный адрес почты) и пароль приложения
Поля.Item(Схема + "sendusername").Value = "my_email@yandex.ru";
Поля.Item(Схема + "sendpassword").Value = "abcdifghijklnmop"; // Сюда пишем 16-значный пароль приложения
// Таймаут ожидания сервера в секундах
Поля.Item(Схема + "smtpconnectiontimeout").Value = 60;
// Обновляем параметры конфигурации
Поля.Update();
// Заполняем параметры самого письма
Письмо.Configuration = Конфигурация;
Письмо.To = "recipient@mail.ru"; // Получатель
Письмо.From = "my_email@yandex.ru"; // Отправитель (должен совпадать с логином авторизации)
Письмо.Subject = "Тестовое письмо из 1С 7.7 через CDO"; // Тема письма
// Текст письма (поддерживается как обычный текст, так и HTML)
Письмо.TextBody = "Приветствуем! Это тело письма, отправленного из 1С 7.7 без использования сторонних внешних компонент.";
// Если нужно отправить HTML-код, используем HTMLBody:
// Письмо.HTMLBody = "<html><body><h1>Важный отчет</h1><p>Текст отчета...</p></body></html>";
// Пример добавления вложения (файла)
ПутьКФайлу = "C:\Otchety\Report.pdf";
ФС = СоздатьОбъект("ФС");
Если ФС.СуществуетФайл(ПутьКФайлу) = 1 Тогда
Письмо.AddAttachment(ПутьКФайлу);
КонецЕсли;
// Кодировка письма (Windows-1251 для корректного отображения кириллицы)
Письмо.BodyPart.Charset = "windows-1251";
// Отправляем сформированное сообщение
Попытка
Письмо.Send();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка отправки почты: " + ОписаниеОшибки(), "!");
Предупреждение("Не удалось отправить письмо. Проверьте настройки подключения и пароль приложения.");
КонецПопытки;
КонецПроцедуры
Важное примечание по CDO: Если при использовании кода выше на современных серверах возникает ошибка соединения, это может быть связано с тем, что в операционной системе Windows по умолчанию отключена поддержка протокола TLS 1.2 для устаревших приложений. Убедитесь, что в реестре Windows активированы соответствующие протоколы шифрования, либо используйте альтернативные методы ниже.
Если вам необходим более глубокий контроль над процессом отправки (например, получение детальных логов сессии SMTP, детальный анализ ошибок или работа с IMAP/POP3), проанализируем использование проверенной временем внешней компоненты DialMail.dll (разработчик SWA).
В отличие от ROM-Mail, данная библиотека полноценно поддерживает протоколы шифрования SSL и TLS. Перед запуском кода саму библиотеку DialMail.dll необходимо скопировать в каталог информационной базы (или в папку платформы) и зарегистрировать в системе.
Посмотрим на пример программной реализации отправки через DialMail:
Процедура ОтправитьЧерезDialMail()
// Загружаем внешнюю компоненту
Если ЗагрузитьВнешнююКомпоненту("DialMail.dll") = 0 Тогда
Предупреждение("Не удалось загрузить компоненту DialMail.dll! Проверьте наличие файла.");
Возврат;
КонецЕсли;
// Создаем объект отправки почты SMTP
Попытка
Почта = СоздатьОбъект("AddIn.SMTP");
Исключение
Предупреждение("Не удалось создать объект AddIn.SMTP. Возможно компонента не зарегистрирована.");
Возврат;
КонецПопытки;
// Настраиваем логирование для отладки
Почта.ВестиЛог = 1;
Почта.ИмяФайлаЛога = КаталогИБ() + "dialmail_smtp.log";
// Указываем параметры подключения
Почта.РабочийСервер = "smtp.gmail.com";
Почта.Порт = 465; // Для SSL используем 465, для TLS - 587
Почта.ИспользоватьSSL = 1; // Обязательно включаем SSL-шифрование
// Авторизация на сервере
Почта.ИспользоватьАвторизацию = 1;
Почта.Логин = "yyyyyyyyyy@gmail.com";
Почта.Пароль = "xxxxxxx"; // Здесь указываем 16-значный "пароль приложения"
// Формируем заголовки и тело письма
Почта.АдресОтправителя = "yyyyyyyyyy@gmail.com";
Почта.ИмяОтправителя = "Робот 1С";
Почта.ДобавитьПолучателя("client@yandex.ru");
Почта.Тема = "Тестовая отправка через DialMail";
Почта.Тело = "Содержимое письма. Компонента DialMail успешно отрабатывает SSL соединения.";
Почта.Кодировка = "windows-1251";
// Прикрепляем файл, если необходимо
// Почта.ДобавитьВложение("C:\temp\invoice.xls");
// Подключаемся и отправляем
Если Почта.Подключиться() = 1 Тогда
Если Почта.Отправить() = 1 Тогда
Сообщить("Сообщение успешно отправлено через DialMail!");
Иначе
Сообщить("Ошибка отправки! См. лог: " + Почта.ИмяФайлаЛога, "!");
КонецЕсли;
Почта.Отключиться();
Иначе
Сообщить("Не удалось подключиться к SMTP-серверу! Проверьте порты и фаервол.", "!");
КонецЕсли;
КонецПроцедуры
Рассмотрим изящный способ, который избавляет разработчика от необходимости регистрировать старые 32-битные DLL-библиотеки в современной 64-разрядной ОС. Начиная с Windows 10 (сборка 1803) и Windows Server 2019, в операционную систему по умолчанию интегрирована консольная утилита cURL (curl.exe).
С помощью curl.exe мы можем отправить MIME-сообщение напрямую через командную строку одной инструкцией. Нам потребуется лишь сформировать текстовый файл с телом письма и заголовками в формате MIME.
Разберем по шагам, как это реализовать в коде 1С 7.7:
Процедура ОтправитьЧерезCurl()
// Определяем пути к временным файлам
КаталогВременныхФайлов = КаталогВременныхФайлов();
ФайлПисьма = КаталогВременныхФайлов + "mail_message.txt";
// Задаем параметры отправки
SmtpServer = "smtp.gmail.com:465";
Логин = "sender@gmail.com";
ПарольПрил = "abcdifghijklnmop"; // Пароль приложения
Получатель = "recipient@mail.ru";
// Сформируем файл письма с заголовками по стандарту MIME
ТекстФайла = СоздатьОбъект("Текст");
ТекстФайла.ДобавитьСтроку("From: " + Логин);
ТекстФайла.ДобавитьСтроку("To: " + Получатель);
ТекстФайла.ДобавитьСтроку("Subject: Test mail from 1C 7.7 via cURL");
ТекстФайла.ДобавитьСтроку("Content-Type: text/plain; charset=windows-1251");
ТекстФайла.ДобавитьСтроку(""); // Пустая строка отделяет заголовки от тела
ТекстФайла.ДобавитьСтроку("Здравствуйте! Это письмо отправлено из 1С 7.7 через утилиту cURL.");
ТекстФайла.ДобавитьСтроку("Никакие внешние компоненты регистрировать не потребовалось!");
// Сохраняем файл на диск
ТекстФайла.Записать(ФайлПисьма);
// Формируем командную строку для запуска curl
// Ключ --ssl-reqd указывает на необходимость шифрования SSL/TLS
Команда = "curl --url ""smtps://" + SmtpServer + """ " +
"--ssl-reqd " +
"--mail-from """ + Логин + """ " +
"--mail-rcpt """ + Получатель + """ " +
"--user """ + Логин + ":" + ПарольПрил + """ " +
"--upload-file """ + ФайлПисьма + """ --silent";
// Запускаем исполнение команды скрытно через WshShell
Попытка
WshShell = СоздатьОбъект("Wscript.Shell");
// Параметр 0 скрывает черное окно консоли, 1 - ожидать завершения
Результат = WshShell.Run(Команда, 0, 1);
Если Результат = 0 Тогда
Сообщить("Письмо успешно отправлено через cURL!");
Иначе
Сообщить("Ошибка отправки через cURL. Код возврата: " + Результат, "!");
КонецЕсли;
Исключение
Сообщить("Не удалось запустить утилиту cURL: " + ОписаниеОшибки(), "!");
КонецПопытки;
// Удаляем временный файл
ФС = СоздатьОбъект("ФС");
ФС.УдалитьФайл(ФайлПисьма);
КонецПроцедуры
Этот способ невероятно надежен: cURL регулярно обновляется в составе операционной системы Windows, поддерживает абсолютно все актуальные стандарты криптографии и сетевой безопасности, включая TLS 1.3, и работает одинаково хорошо как на локальных компьютерах, так и на серверах терминалов.
Еще одна отличная альтернатива, встроенная в операционную систему Windows — использование оболочки PowerShell. В ней есть мощный встроенный командлет Send-MailMessage, который прекрасно справляется с защищенными соединениями.
Мы можем динамически генерировать исполняемый PowerShell-скрипт (файл с расширением .ps1) или передавать параметры командной строки напрямую.
Посмотрим, как выглядит запуск PowerShell скрипта из 1С:
Процедура ОтправитьЧерезPowerShell()
Логин = "sender@gmail.com";
ПарольПрил = "abcdifghijklnmop"; // Наш пароль приложения
Получатель = "recipient@mail.ru";
Тема = "Отправка через PowerShell и 1С 7.7";
Тело = "Текст сообщения, отправленного с использованием PowerShell.";
// Формируем команду скрипта. Преобразуем пароль в защищенную строку.
Скрипт = "$secpasswd = ConvertTo-SecureString '" + ПарольПрил + "' -AsPlainText -Force; " +
"$mycreds = New-Object System.Management.Automation.PSCredential ('" + Логин + "', $secpasswd); " +
"Send-MailMessage -From '" + Логин + "' -To '" + Получатель + "' " +
"-Subject '" + Тема + "' -Body '" + Тело + "' -BodyAsHtml " +
"-SmtpServer 'smtp.gmail.com' -Port 587 -UseSsl -Credential $mycreds -Encoding UTF8";
// Запускаем PowerShell в скрытом режиме
КомандаЗапуска = "powershell.exe -NoProfile -NonInteractive -WindowStyle Hidden -Command """ + Скрипт + """";
Попытка
WshShell = СоздатьОбъект("Wscript.Shell");
КодВозврата = WshShell.Run(КомандаЗапуска, 0, 1);
Если КодВозврата = 0 Тогда
Сообщить("Письмо успешно отправлено силами PowerShell!");
Иначе
Сообщить("Ошибка PowerShell при отправке почты. Код ошибки: " + КодВозврата, "!");
КонецЕсли;
Исключение
Сообщить("Не удалось выполнить команду PowerShell: " + ОписаниеОшибки(), "!");
КонецПопытки;
КонецПроцедуры
Если вы все-таки решили использовать компоненту (например, DialMail.dll), разберем основные причины, по которым она может отказываться регистрироваться на новых серверах:
regsvr32.exe запускает регистрацию 64-битных библиотек. Платформа 1С 7.7 является строго 32-битным приложением, а значит и библиотеки ей нужны 32-битные. Регистрировать их нужно специальной утилитой из папки SysWOW64. Команда в консоли CMD, запущенной от имени Администратора, должна выглядеть так:
C:\Windows\SysWOW64\regsvr32.exe "C:\ПутьКБазе\DialMail.dll"
1cv7s.exe в исключения DEP в настройках системы.HKEY_CLASSES_ROOT). Всегда запускайте командную строку от имени Администратора для выполнения регистрации.Мы детально изучили эволюцию отправки почты из старой доброй «семерки». Резюмируем наши выводы:
ROM-Mail.dll устарела окончательно из-за отсутствия нативной поддержки SSL/TLS. Использовать ее сегодня не имеет практического смысла.regsvr32 в папке SysWOW64.