В процессе работы с конфигурацией Управление производственным предприятием (УПП) 1.3 на платформе 1С:Предприятие 8.3 разработчики часто сталкиваются с ситуацией, когда отправка почты отлично работает в фоновых заданиях, но выдает критическую ошибку при попытке пользователя отправить письмо интерактивно. Ошибка выглядит следующим образом: Ошибка при вызове метода контекста (Подключиться): Сервис отключен с разрывом канала (SMTP error code 421 SMTP connection broken (reply)).
В этой статье мы подробно разберем, почему возникает эта проблема, проанализируем разницу в выполнении кода на клиенте и сервере, и внедрим надежное решение, которое позволит отправлять сообщения с вложениями без сбоев.
Разберем ситуацию: регламентное задание выполняется непосредственно на сервере 1С под учетной записью службы. Интерактивное же действие выполняется в контексте «толстого» или «тонкого» клиента на рабочей станции пользователя. Ошибка SMTP 421 сигнализирует о том, что почтовый сервер принудительно разорвал соединение. Рассмотрим основные причины такого поведения:
Проанализировав ситуацию, мы приходим к выводу: самый стабильный способ — всегда выполнять отправку почты на стороне сервера, независимо от того, кто инициировал действие.
Для начала рассмотрим, как изменить структуру вызовов. Если код отправки находится в общем модуле ЭлектроннаяПочта, нам нужно убедиться, что он выполняется именно на сервере. Рассмотрим по шагам:
Создадим новый общий модуль (например, ДополнительныеПроцедурыСервер) или отредактируем существующий. В свойствах модуля обязательно должны быть установлены флаги: Сервер и Вызов сервера. Флаг Клиент должен быть снят.
Вынесем процедуру подключения и отправки в этот модуль. Пример кода функции-обертки:
Функция ОтправитьСообщениеНаСервере(Профиль, Сообщение) Экспорт
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
Возврат Истина;
Исключение
ЗаписьЖурналаРегистрации("Отправка почты", УровеньЖурналаРегистрации.Ошибка,,, ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
Просто вызвать серверную функцию из клиентской формы недостаточно, если в письме есть вложения. Если вы укажете путь к файлу типа C:\Users\Admin\Documents\Report.pdf, серверный код не сможет его найти, так как он будет искать файл на диске сервера, а не вашего компьютера.
Проанализируем правильный алгоритм передачи данных между клиентом и сервером:
ДвоичныеДанные.ИнтернетПочтовоеСообщение.Рассмотрим пример реализации на стороне клиента:
// Код в форме или клиентском модуле
ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
АдресХранилища = ПоместитьВоВременноеХранилище(ДанныеФайла, УникальныйИдентификатор);
СтруктураВложения = Новый Структура;
СтруктураВложения.Вставить("Данные", АдресХранилища);
СтруктураВложения.Вставить("ИмяФайла", "Отчет.pdf");
// Вызываем наш серверный модуль
Результат = ДополнительныеПроцедурыСервер.ОтправитьПисьмоСВложениями(Профиль, Тема, Текст, Получатель, СтруктураВложения);
Теперь разберем, как сервер должен обработать это вложение:
Функция ОтправитьПисьмоСВложениями(Профиль, Тема, Текст, Получатель, СтруктураВложения) Экспорт
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тема = Тема;
Сообщение.Получатели.Добавить(Получатель);
// Работа с текстом
ТекстПисьма = Сообщение.Тексты.Добавить(Текст);
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Извлекаем вложение из временного хранилища
ДанныеИзХранилища = ПолучитьИзВременногоХранилища(СтруктураВложения.Данные);
Если ТипЗнч(ДанныеИзХранилища) = Тип("ДвоичныеДанные") Тогда
Сообщение.Вложения.Добавить(ДанныеИзХранилища, СтруктураВложения.ИмяФайла);
КонецЕсли;
// Далее подключаемся и отправляем через ИнтернетПочта
// ...
КонецФункции
Помимо переноса кода на сервер, стоит обратить внимание на параметры самого объекта ИнтернетПочтовыйПрофиль. Ошибка 421 часто возникает, если сервер ожидает шифрования, а клиент его не инициирует вовремя.
Рекомендуется явно указывать использование SSL и увеличивать время ожидания. Посмотрим на настройки для популярных сервисов:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "my@mail.ru";
Профиль.ПарольSMTP = "my_password";
// Важные параметры для стабильности:
Профиль.ИспользоватьЗащищенноеСоединениеSMTP = Истина;
Профиль.ТолькоЗащищеннаяАвторизацияSMTP = Ложь;
Профиль.ВремяОжидания = 120; // Увеличиваем до 2 минут
Важный нюанс: В некоторых случаях (особенно со старыми корпоративными почтовыми серверами) помогает метод "авторизация POP3 перед SMTP". Хотя это считается устаревшим, включение порта 110 и предварительное подключение по POP3 может "открыть" IP-адрес для отправки сообщений.
Подведем итоги нашего исследования. Если вы столкнулись с ошибкой SMTP 421 в 1С:УПП, не спешите менять настройки совместимости всей конфигурации.
Основные правила стабильной отправки:
Подключиться() и Послать(). Это снимает зависимость от сетевого окружения пользовательских ПК.ПоместитьВоВременноеХранилище и ПолучитьИзВременногоХранилища, чтобы избежать ошибок доступа к файловой системе.ВремяОжидания в профиле, если письма содержат тяжелые вложения.ИспользоватьЗащищенноеСоединениеSMTP, так как современные почтовые сервисы больше не принимают подключения по открытым каналам.Следуя этим шагам, мы обеспечим надежную работу почтового модуля в клиент-серверной архитектуре 1С.