Как настроить отправку почты из 1С 7.7 через современные почтовые сервисы с поддержкой SSL и TLS?

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

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

В этой статье мы подробно рассмотрим несколько проверенных способов решения этой задачи: использование системного объекта CDO, настройку компоненты DialMail и использование прокси-утилит.

Способ 1. Использование системного объекта CDO (Collaboration Data Objects)

Это один из самых надежных способов, так как он использует встроенные возможности операционной системы Windows и не требует регистрации сторонних DLL в системе (хотя сама библиотека CDO должна присутствовать). Разберем пример кода, который позволяет отправить письмо через SMTP Gmail или Mail.ru с использованием порта 465 и SSL-шифрования.

Рассмотрим структуру процедуры отправки:


Процедура ОтправкаПочты()
    Попытка
        // Создаем объекты конфигурации и сообщения
        loConfig = CreateObject("CDO.Configuration");
        loCdoMessage = CreateObject("CDO.Message");
        loCdoMessage.Configuration = loConfig;

        // Заполняем основные поля письма
        loCdoMessage.From = "Ваше Имя <vasha_pochta@mail.ru>";
        loCdoMessage.To = "poluchatel@gmail.com";
        loCdoMessage.Subject = "Тема письма из 1С 7.7";
        
        // Формируем текст письма в формате HTML для корректного отображения
        HTMLBody = "<html>
        |<head>
        |<meta content=""text/html; charset=Windows-1251"" http-equiv=""content-type"">
        |</head>
        |<body>
        |<p>Приветствуем! Это тестовое сообщение с вложением.</p>
        |</body>
        |</html>";
        
        loCdoMessage.BodyPart.Charset = "windows-1251";
        loCdoMessage.HTMLBody = HTMLBody;
        
        // Добавляем вложение, если необходимо
        ПутьКФайлу = "C:\Reports\Otchet.txt";
        loCdoMessage.AddAttachment(ПутьКФайлу);
        
        // Настраиваем параметры подключения к серверу
        // Используем константы схемы Microsoft для настройки SMTP
        Схема = "http://schemas.microsoft.com/cdo/configuration/";
        loConfig.Fields.Item(Схема + "sendusing").Value = 2; // Port
        loConfig.Fields.Item(Схема + "smtpserver").Value = "smtp.mail.ru";
        loConfig.Fields.Item(Схема + "smtpserverport").Value = 465;
        loConfig.Fields.Item(Схема + "smtpauthenticate").Value = 1; // Basic authentication
        loConfig.Fields.Item(Схема + "sendusername").Value = "vasha_pochta@mail.ru";
        
        // ВАЖНО: Вместо обычного пароля от почты используйте "Пароль приложения"!
        loConfig.Fields.Item(Схема + "sendpassword").Value = "abcd-efgh-ijkl-mnop";
        loConfig.Fields.Item(Схема + "smtpusessl").Value = 1; // Включаем SSL
        loConfig.Fields.Item(Схема + "smtpconnectiontimeout").Value = 60;
        
        loConfig.Fields.Update();
        
        // Отправляем
        loCdoMessage.Send();
        Предупреждение("Письмо успешно отправлено!");
    Исключение
        Сообщить("Ошибка при отправке: " + ОписаниеОшибки(), "!");
        Предупреждение("Письмо не отправлено!");
    КонецПопытки;
КонецПроцедуры

Проанализируем важные настройки в этом коде. Поле sendusing = 2 означает, что отправка идет через сеть (SMTP). Для большинства сервисов сегодня актуален порт 465 с параметром smtpusessl = 1. Если ваш сервер использует STARTTLS, попробуйте порт 587.

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

Если по каким-то причинам CDO вам не подходит, можно воспользоваться внешней компонентой DialMail.dll. Она более функциональна в плане обработки входящей почты, но требует правильной настройки окружения. Главная причина, по которой DialMail может не работать с SSL — отсутствие библиотек OpenSSL.

Выясним, что нужно для корректной работы DialMail:

  1. Поместите файл DialMail.dll в каталог базы или в BIN платформы 1С.
  2. Обязательно скачайте и положите в тот же каталог файлы libeay32.dll и ssleay32.dll. Без этих библиотек работа с защищенными портами (465, 587) будет невозможна.
  3. Загрузите компоненту в 1С через ЗагрузитьВнешнююКомпоненту().

Рассмотрим пример кода для DialMail:


Процедура ОтправитьЧерезDialMail()
    Если ЗагрузитьВнешнююКомпоненту("DialMail.dll") = 0 Тогда
        Сообщить("Не удалось загрузить DialMail.dll");
        Возврат;
    КонецЕсли;

    SMTP = СоздатьОбъект("AddIn.SMTP");
    SMTP.РабочийКаталог = КаталогИБ();
    
    // Включаем поддержку шифрования (доступно в новых версиях компоненты)
    SMTP.ИспользоватьSSL = 1; 
    SMTP.ИспользоватьTSL = 1; 

    // Создаем письмо
    // Параметры: ОтКого, Кому, Копии, Тема, Тело, Вложения
    SMTP.СоздатьПисьмо("vasha_pochta@mail.ru", "poluchatel@gmail.com", "", "Заголовок", "", "Текст письма", "C:\file.txt");
    
    // Подключаемся. Внимание на порт 465!
    Если SMTP.Подключиться("smtp.mail.ru", "465", "vasha_pochta@mail.ru", "пароль_приложения", 1) = 0 Тогда
        Сообщить("Ошибка подключения к SMTP");
    Иначе
        Если SMTP.ОтправитьВсеПисьма(0, 1, 0) = -100 Тогда
            Сообщить("Успешно отправлено");
        КонецЕсли;
    КонецЕсли;
    SMTP.Отключиться();
КонецПроцедуры

Почему письма "не доходят" или их нет в "Отправленных"?

Разберем ситуацию, когда 1С рапортует об успешной отправке, но вы не видите письма в папке "Отправленные" вашего почтового клиента (например, The Bat! или Outlook). Проанализируем причину: протокол SMTP предназначен исключительно для передачи письма серверу для дальнейшей доставки. Он не обязан сохранять копию письма в вашем ящике. Копия в "Отправленных" появляется только в двух случаях:

Если ваше письмо дошло до получателя, но его нет в ваших "Отправленных" — это нормальное поведение для многих серверов. Для контроля отправки рекомендуется добавлять свой адрес в скрытую копию (BCC).

Критически важный нюанс: "Пароли приложений"

Это самый важный момент в 2024 году. Если вы укажете в коде 1С свой обычный пароль, который вводите для входа в почту через браузер, вы получите ошибку авторизации. Google, Mail.ru и Yandex запретили использование основных паролей в сторонних приложениях.

Как это исправить:

  1. Зайдите в настройки безопасности вашего почтового аккаунта.
  2. Включите Двухфакторную аутентификацию (2FA).
  3. Найдите раздел "Пароли для внешних приложений" (или "Пароли приложений").
  4. Сгенерируйте новый пароль для "Почты" на "Windows". Вы получите код из 16 символов.
  5. Именно этот код (без пробелов) вставьте в поле пароля в коде 1С.

Альтернативный вариант: Использование Stunnel

Если ваш код в 1С 7.7 слишком сложен для переделки или вы используете очень старую компоненту, которую невозможно заменить, рассмотрите вариант с Stunnel. Рассмотрим принцип работы: Stunnel — это маленькая программа-прослойка. Вы настраиваете её так, чтобы она слушала локальный порт (например, 25) и перенаправляла трафик на защищенный порт сервера (например, smtp.mail.ru:465), добавляя шифрование "на лету". В этом случае в 1С вы указываете Сервер = "127.0.0.1" и Порт = 25, и ваша старая добрая компонента ROM-Mail снова начинает работать.

Подведем итог: для современной отправки почты из 1С 7.7 лучшим выбором будет использование CDO с портами 465/587 и обязательным использованием пароля приложения. Это решение не требует лишних файлов и стабильно работает на всех актуальных версиях Windows.

← На главную