При организации автоматической рассылки писем из системы 1С (особенно на платформе 1С:Предприятие 7.7) разработчики часто сталкиваются с ситуацией, когда стабильно работавший механизм отправки почты внезапно дает сбой. При этом интерактивный доступ к почтовому ящику через браузер или почтовый клиент продолжает работать без нареканий, а в 1С возвращается критическая ошибка «Не удалось подключиться к почтовому серверу».
В этой статье мы подробно разберем, почему возникает данная проблема, проанализируем внутренние механизмы сетевого взаимодействия операционной системы и рассмотрим несколько эффективных способов решения — от быстрой реанимации службы до полного перехода на более надежные альтернативные компоненты.
Для начала рассмотрим типовую реализацию отправки почты с использованием некогда популярной внешней компоненты ROM-Mail.dll. Проанализируем пример программного кода, который часто становится источником сбоя:
Если ЗагрузитьВнешнююКомпоненту("ROM-Mail.dll")=0 Тогда
Сообщить("Не удалось загрузить внешнюю компоненту ROM-Mail.dll");
Возврат;
КонецЕсли;
// Инициализация объекта и заполнение параметров подключения
Почта=СоздатьОбъект("AddIn.AddInMail");
Почта.СерверОтправки=СокрЛП(Константа.АдресПочтовогоСервера);
Почта.ПортОтправки="25";
Почта.Логин=Константа.Почта;
Почта.Пароль=Константа.ПарольПочты;
Почта.АутентификацияПриОтправке=1;
Если Почта.Соединение=0 Тогда
Если Почта.Подключиться("Отправка")=0 Тогда
Сообщить("Не удалось подключиться к почтовому серверу","!");
Возврат;
КонецЕсли;
КонецЕсли;
В штатном режиме этот код отрабатывает мгновенно. Однако при возникновении ошибки свойство Почта.Соединение возвращает значение 0, а метод Подключиться() завершается неудачей. Выясним, по каким причинам это происходит.
Как показывает практика администрирования, самым быстрым «лекарством» от внезапного прекращения отправки писем является перезагрузка сервера, на котором развернута платформа 1С. Разберем физику этого процесса:
TIME_WAIT (по умолчанию это состояние длится до 4 минут). Если рассылка идет быстрее, чем порты успевают закрываться, свободные сокеты в ОС заканчиваются, и компонента ROM-Mail.dll не может инициировать новое подключение.ROM-Mail.dll имеет архитектурный недостаток — при возникновении любого сетевого таймаута она способна намертво заблокировать рабочий поток. При этом сессия пользователя в 1С закрывается, но в диспетчере задач сервера остается висеть скрытый процесс 1cv7.exe. Этот «зомби-процесс» продолжает монопольно удерживать сетевой порт и блокировать библиотеку DLL.Решение: Если полная перезагрузка сервера невозможна из-за активной работы других пользователей, выполните принудительное завершение всех зависших процессов 1cv7.exe через Диспетчер задач или консоль PowerShell, а также очистите зависшие сетевые сессии.
Очень часто системные администраторы вносят изменения в правила маршрутизации или настройки безопасности сети, забывая предупредить разработчиков 1С. Выясним причину сбоя с помощью простых шагов диагностики:
telnet:
telnet ip_адрес_почтового_сервера 25
Почта.СерверОтправки.Использование устаревшей компоненты ROM-Mail.dll в современных реалиях несет в себе слишком много рисков. Разработчик прекратил её поддержку, она не умеет вести логи работы и часто вызывает аварийное завершение работы платформы. Мы рекомендуем перейти на использование библиотеки DialMail.dll.
Преимущества DialMail:
Если вы хотите полностью избавиться от необходимости регистрации сторонних библиотек на сервере и клиентских машинах, лучшим решением будет использование встроенного в Windows объекта CDO (Collaborative Data Objects). Этот механизм работает надежно, стабильно и поддерживает все современные требования безопасности.
Разберем пример реализации отправки почты через CDO по шагам:
// Создание объектов CDO
ПочтовоеСообщение = СоздатьОбъект("CDO.Message");
Конфигурация = СоздатьОбъект("CDO.Configuration");
Поля = Конфигурация.Fields;
// Настройка параметров подключения к SMTP-серверу
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2; // Отправка через сеть
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.yourserver.ru";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 465; // Порт с поддержкой SSL
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1; // Требуется авторизация
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "your_login@yourserver.ru";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "your_app_password";
// Включение шифрования SSL/TLS
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = 1;
// Обновление и сохранение настроек конфигурации
Поля.Update();
ПочтовоеСообщение.Configuration = Конфигурация;
// Заполнение полей письма
ПочтовоеСообщение.To = "recipient@mail.ru";
ПочтовоеСообщение.From = "your_login@yourserver.ru";
ПочтовоеСообщение.Subject = "Автоматическая рассылка из 1С";
ПочтовоеСообщение.TextBody = "Приветствуем! Данное сообщение отправлено автоматически из базы данных 1С.";
// Попытка отправки сообщения
Попытка
ПочтовоеСообщение.Send();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка при отправке почты: " + ОписаниеОшибки(), "!");
КонецПопытки;
Современные публичные почтовые сервисы (Yandex, Gmail, Mail.ru) полностью закрыли доступ по незащищенному 25 порту, требуя обязательного использования SSL/TLS на портах 465 или 587. Старая компонента ROM-Mail.dll технически не способна работать с шифрованием.
Если по каким-то причинам вы не можете переписать код в вашей конфигурации 1С, решением станет настройка локального SSL-шлюза с помощью бесплатной утилиты Stunnel:
stunnel.conf настройте перенаправление трафика. Например, для отправки через Яндекс пропишите:
[smtp-yandex]
accept = 127.0.0.1:25
connect = smtp.yandex.ru:465
client = yes
127.0.0.1 и порт 25.smtp.yandex.ru.Если вы настроили защищенное соединение SSL, указали верный логин и пароль от ящика, но сервер все равно возвращает ошибку авторизации при подключении из 1С, проверьте настройки безопасности самого почтового ящика.
Современные почтовые системы запрещают авторизацию внешних программ по основному паролю учетной записи. Вам необходимо зайти в личный кабинет почты через веб-интерфейс, перейти в раздел безопасности и сгенерировать специальный «Пароль приложения» (или SMTP-пароль). Именно этот сгенерированный код необходимо прописать в константах 1С вместо основного пароля от вашей почты.