Разработчики, работающие с платформой 1С 7.7, часто сталкиваются с проблемой: старые проверенные методы отправки почты, такие как компонента ROM-Mail.dll, перестают работать. При попытке отправить письмо программа выдает ошибку "Не удалось отправить сообщение", хотя все настройки кажутся верными. Причина кроется в том, что современные почтовые гиганты (Mail.ru, Gmail, Yandex) давно перешли на обязательное использование протоколов шифрования SSL/TLS и требуют авторизации через специальные пароли приложений. Старая компонента ROM-Mail попросту не умеет работать с этими протоколами.
В этой статье мы подробно рассмотрим несколько проверенных способов решения этой задачи: использование системного объекта CDO, настройку компоненты DialMail и использование прокси-утилит.
Это один из самых надежных способов, так как он использует встроенные возможности операционной системы 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.
Если по каким-то причинам CDO вам не подходит, можно воспользоваться внешней компонентой DialMail.dll. Она более функциональна в плане обработки входящей почты, но требует правильной настройки окружения. Главная причина, по которой DialMail может не работать с SSL — отсутствие библиотек OpenSSL.
Выясним, что нужно для корректной работы DialMail:
DialMail.dll в каталог базы или в BIN платформы 1С.libeay32.dll и ssleay32.dll. Без этих библиотек работа с защищенными портами (465, 587) будет невозможна.ЗагрузитьВнешнююКомпоненту().Рассмотрим пример кода для 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С 7.7 слишком сложен для переделки или вы используете очень старую компоненту, которую невозможно заменить, рассмотрите вариант с Stunnel. Рассмотрим принцип работы: Stunnel — это маленькая программа-прослойка. Вы настраиваете её так, чтобы она слушала локальный порт (например, 25) и перенаправляла трафик на защищенный порт сервера (например, smtp.mail.ru:465), добавляя шифрование "на лету". В этом случае в 1С вы указываете Сервер = "127.0.0.1" и Порт = 25, и ваша старая добрая компонента ROM-Mail снова начинает работать.
Подведем итог: для современной отправки почты из 1С 7.7 лучшим выбором будет использование CDO с портами 465/587 и обязательным использованием пароля приложения. Это решение не требует лишних файлов и стабильно работает на всех актуальных версиях Windows.