Проблемы с почтовой интеграцией в 1С — это одна из самых коварных категорий ошибок, так как она находится на стыке прикладного кода, сетевых протоколов, настроек безопасности операционной системы и конфигурации почтового сервера. Часто мы сталкиваемся с ситуацией, когда вчера всё работало, а сегодня пользователи получают ошибки вида «Ошибка при вызове метода контекста (Послать)» или «Ошибка при работе с POP3. Код ошибки: 6». Ситуация осложняется тем, что встроенные средства диагностики 1С не всегда дают исчерпывающий ответ.
В этой статье мы подробно разберем, как диагностировать причины внезапного отказа почты, проанализируем специфические ошибки сетевого уровня и рассмотрим надежный «костыль» (обходное решение) через использование COM-объекта, который поможет восстановить работу системы, когда стандартные методы платформы бессильны.
Прежде чем приступать к правке кода, нам необходимо локализовать проблему. Проанализируем типичную ситуацию: в базе БИТ.Строительство (или любой другой на базе БСП) периодически или полностью перестает работать отправка сообщений. При этом проверка системной учетной записи может выдавать «зеленые галочки», но реальная отправка падает в исключение.
Критически важным является лог почтового сервера (например, Postfix на Linux). Если системный администратор видит запись вида lost connection after DATA (6 bytes) from sqlsrv.*******.local, это прямой сигнал о том, что соединение устанавливается, авторизация проходит, но при попытке передать тело письма происходит разрыв. Рассмотрим основные причины такого поведения:
DATA, размер сетевых пакетов увеличивается. Если на маршруте между сервером 1С и почтовым сервером есть узел с меньшим параметром MTU (Maximum Transmission Unit), пакеты могут отбрасываться.Если стандартный объект ИнтернетПочта и методы БСП (Библиотеки Стандартных Подсистем) отказываются работать из-за специфических настроек безопасности сети, проверенным временем решением является использование COM-объекта CDO.Message. Этот метод использует системные библиотеки Windows, которые зачастую более толерантны к нюансам настроек TLS и сетевым задержкам.
Рассмотрим пример кода, который можно внедрить в расширение или внешнюю обработку для переотправки «зависших» писем:
// Создание объекта сообщения
ПочтаСообщение = Новый COMОбъект("CDO.Message");
Конфигурация = Новый COMОбъект("CDO.Configuration");
// Настройка параметров сервера
Поля = Конфигурация.Fields;
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2; // cdoSendUsingPort
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "smtp.yourserver.ru";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 465; // Или 587/25
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 1; // cdoBasic
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "login@domain.ru";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "password";
Поля.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = Истина;
Поля.Update();
// Формирование письма
ПочтаСообщение.Configuration = Конфигурация;
ПочтаСообщение.From = "login@domain.ru";
ПочтаСообщение.To = "recipient@mail.ru";
ПочтаСообщение.Subject = "Тестовое письмо из 1С через CDO";
ПочтаСообщение.TextBody = "Текст сообщения";
// Попытка отправки
Попытка
ПочтаСообщение.Send();
Сообщить("Письмо успешно отправлено!");
Исключение
Сообщить("Ошибка отправки через CDO: " + ОписаниеОшибки());
КонецПопытки;
Использование этого метода позволяет обойти внутренние механизмы 1С по работе с OpenSSL или системным Schannel, которые могут конфликтовать с обновленными настройками почтового сервера.
Прежде чем полностью переходить на CDO, попробуем «дожать» типовые механизмы. Проанализируем объект ИнтернетПочтовыйПрофиль. В последних версиях платформы 1С добавлено много свойств для управления шифрованием. Выясним, какие комбинации настроек могут помочь:
СпособИспользованияЗащищенногоСоединения.STARTTLS или SSL вместо автоматического определения.Истина помогает, если сервер требует обязательного шифрования пароля.lost connection after DATA вызван долгой обработкой антиспам-фильтрами на стороне сервера.Рассмотрим пример настройки профиля в коде:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "user";
Профиль.ПарольSMTP = "pass";
Профиль.ИспользоватьЗащищенноеСоединениеДляОтправки = СпособИспользованияЗащищенногоСоединения.SSL;
Профиль.ТолькоЗащищеннаяАвторизацияSMTP = Ложь;
Профиль.Таймаут = 60;
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
// ... логика отправки ...
Почта.Отключиться();
Исключение
// Обработка ошибки
КонецПопытки;
Если программные методы не помогают, нам следует совместно с системным администратором проверить следующие параметры:
netsh interface ipv4 set subinterface "ИмяИнтерфейса" mtu=1400 store=persistent.
Если после этого отправка 10 из 10 писем проходит успешно — проблема в сетевом оборудовании.
Schannel. Они укажут на несовместимость алгоритмов шифрования (например, сервер требует AES-256, а в Windows разрешен только AES-128).Подводя итог, можно сказать, что постепенный отказ почты в 1С (когда письма отправляются через раз) — это классический признак сетевых проблем или проблем с рукопожатием (handshake) TLS.
Рекомендуемый алгоритм действий:
DATA.CDO.Message для критически важных процессов (например, регламентированной отчетности).rphost.exe.Помните, что использование CDO — это надежное, но внешнее решение. Оно помогает «дожить» до обновления платформы или перенастройки сервера, но в долгосрочной перспективе лучше стремиться к использованию типовых методов БСП, предварительно устранив сетевые препятствия.