Многие разработчики, поддерживающие системы на базе 1С:Предприятие 7.7, столкнулись с внезапным прекращением работы почтовых сервисов через протокол SMTP. Основная причина заключается в том, что крупные почтовые провайдеры, такие как Gmail и Mail.ru, заблокировали возможность авторизации по обычному логину и паролю в целях повышения безопасности. Теперь стандартный метод через объект CDO.Message выдает ошибку аутентификации. В этой статье мы подробно разберем, как адаптировать старую систему к новым реалиям, рассмотрим использование паролей приложений, специализированных компонент и современных скриптовых решений.
Google убрал из интерфейса прямую настройку «разрешить доступ небезопасным приложениям», однако оставил механизм Паролей приложений. Этот метод создает уникальный 16-значный код, который заменяет ваш основной пароль в настройках 1С.
Разберем алгоритм действий по шагам:
abcd efgh ijkl mnop).CDO.Рассмотрим пример кода на языке 1С 7.7 для отправки через CDO с использованием пароля приложения:
// Создание объекта сообщения
Почта = СоздатьОбъект("CDO.Message");
Конфиг = СоздатьОбъект("CDO.Configuration");
// Настройка полей конфигурации SMTP
Поля = Конфиг.Fields;
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.gmail.com";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 465;
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = 1; // Обязательно SSL
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1;
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "your-email@gmail.com";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "ваш_пароль_приложения";
Поля.Update();
Почта.Configuration = Конфиг;
Почта.From = "your-email@gmail.com";
Почта.To = "client@example.com";
Почта.Subject = "Тестовое письмо из 1С 7.7";
Почта.TextBody = "Текст сообщения";
Попытка
Почта.Send();
Предупреждение("Письмо успешно отправлено!");
Исключение
Предупреждение("Ошибка при отправке: " + ОписаниеОшибки());
КонецПопытки;
Выясним причину, по которой даже с верным паролем почта может не уходить. 1С 7.7 использует системные библиотеки Windows, которые в старых версиях ОС (Windows 7, Server 2008) не поддерживают протоколы шифрования TLS 1.2 и TLS 1.3. Gmail же требует современное шифрование.
Чтобы не переписывать код и не обновлять ОС, что актуально для Windows Server 2008/2012, мы можем использовать программу-прокладку stunnel. Она работает как локальный прокси-сервер: 1С отправляет письмо на 127.0.0.1 без шифрования, а stunnel «оборачивает» его в актуальный TLS и передает на сервера Google.
Посмотрим, как настроить эту связку:
stunnel.conf пропишите следующие параметры:
[gmail-smtp]
client = yes
accept = 127.0.0.1:25
connect = smtp.gmail.com:465
checkHost = smtp.gmail.com
OCSPia = yes
После этого в коде 1С достаточно указать smtpserver = "127.0.0.1", smtpserverport = 25 и smtpusessl = 0. Вся нагрузка по шифрованию ляжет на стороннюю утилиту.
Проанализируем современный подход, который не требует регистрации внешних DLL компонент в системе. В каждой современной Windows есть PowerShell, который отлично справляется с сетевыми задачами. Мы можем сформировать скрипт из 1С и запустить его командой системы.
Разберем пример реализации такой функции:
Процедура ОтправитьЧерезPS(Кому, Тема, Текст)
ПарольПриложения = "ваш_пароль_приложения";
Отправитель = "your-email@gmail.com";
// Формируем строку команды
ТекстСкрипта = "$msgh = New-Object Net.Mail.MailMessage;
$msgh.From = '" + Отправитель + "';
$msgh.To.Add('" + Кому + "');
$msgh.Subject = '" + Тема + "';
$msgh.Body = '" + Текст + "';
$smtp = New-Object Net.Mail.SmtpClient('smtp.gmail.com', 587);
$smtp.EnableSsl = $true;
$smtp.Credentials = New-Object System.Net.NetworkCredential('" + Отправитель + "', '" + ПарольПриложения + "');
$smtp.Send($msgh);";
// Записываем во временный файл .ps1 или запускаем напрямую
Команда = "powershell -ExecutionPolicy Bypass -Command " + ТекстСкрипта;
КомандаСистемы(Команда);
КонецПроцедуры
Этот метод хорош тем, что он обходит ограничения старых библиотек COM и использует возможности .NET Framework, установленного в системе.
Если вам необходим более гибкий контроль над процессом (например, работа с IMAP, обработка вложений или детальное логирование), стоит рассмотреть специализированные инструменты. Популярная в кругах 1С-разработчиков компонента DialMail.dll до сих пор справляется со своими задачами, если правильно указать порты и использовать те же пароли приложений.
Также эффективным инструментом является curl (или его адаптация curl1c). Это консольная утилита, которая поддерживает практически все современные протоколы передачи данных. Вызов curl из 1С позволяет гибко настраивать заголовки писем и параметры авторизации.
При использовании массовых рассылок (например, отправка счетов сотням клиентов) помните о лимитах Google. Даже при использовании пароля приложения, слишком частая отправка может привести к временной блокировке IP-адреса или аккаунта. В таких случаях мы рекомендуем вставлять паузы между письмами (от 5 до 60 секунд), чтобы алгоритмы антиспама не срабатывали на вашу учетную запись.
Важное замечание: При работе с корпоративными почтами Google Workspace (на собственном домене), создание паролей приложений может быть запрещено администратором организации. В этом случае необходимо сначала разрешить эту опцию в консоли администратора Google.