Почему отправка почты работает на клиенте, но выдает ошибку авторизации на сервере 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

Довольно часто разработчики сталкиваются с ситуацией, когда процедура отправки электронных писем безупречно отрабатывает в контексте клиента, но при переносе в фоновое задание или под директиву &НаСервере падает с ошибками проверки подлинности. При этом в журнал регистрации записываются ошибки протокола SMTP: SMTP error code 504, 5.7.4 Unrecognized authentication type или SMTP error code 530, 5.7.1 Client was not authenticated.

Проанализируем ситуацию, выясним коренные причины такого поведения платформы и почтового сервера, а также разберем по шагам правильные способы реализации отправки почтовых сообщений.

Анализ проблемы: разница контекстов выполнения кода

Посмотрим на исходный пример, в котором для отправки сообщений использовался COM-объект CDO.Message:


// Создание объектов CDO
loConfig = Новый COMОбъект("CDO.Configuration");
loCdoMessage = Новый COMОбъект("CDO.Message");

loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver").Value = "10.78.2.26";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport").Value = 25;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername").Value = "user";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword").Value = "password";
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing").Value = 2;

// Использование NTLM-аутентификации
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate").Value = 2;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl").Value = 0;
loConfig.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout").Value = 60;
loConfig.Fields.Update();

loCdoMessage.Configuration = loConfig;
loCdoMessage.Send();

Почему этот код успешно отрабатывает под директивой &НаКлиенте, но завершается аварийно под &НаСервере? Разберем ключевые факторы:

  1. Контекст учетной записи операционной системы: на клиенте код выполняется от имени текущего интерактивного пользователя операционной системы Windows. Если пользователь входит в домен Active Directory, протокол NTLM прозрачно подтверждает подлинность пользователя на почтовом сервере (например, Microsoft Exchange).
  2. Контекст службы кластера 1С: на сервере вызовы выполняются процессом rphost, который работает под системной учетной записью (как правило, локальный пользователь USR1CV8 или SYSTEM). У этой учетной записи нет прав в домене и нет почтового ящика, из-за чего механизм NTLM завершается с ошибкой.
  3. Ограничения стандартного объекта 1С: при попытке переписать код на штатный объект ИнтернетПочта разработчики нередко сталкиваются с ошибкой 504 Unrecognized authentication type. Она возникает из-за того, что объект ИнтернетПочта не поддерживает NTLM-аутентификацию, а почтовый сервер Exchange на 25-м порту без включенного шифрования TLS запрещает открытые методы авторизации (AUTH LOGIN).

Решение 1. Переход на штатный объект «ИнтернетПочта» с настройкой шифрования

Отказ от устаревших COM-объектов Windows (таких как CDO.Message) необходим не только для надежности, но и для обеспечения кроссплатформенности серверов на базе Linux. Рассмотрим правильный пример отправки почты средствами платформы 1С:


ПочтПрофиль = Новый ИнтернетПочтовыйПрофиль;
ПочтПрофиль.АдресСервераSMTP = "10.78.2.26";
ПочтПрофиль.ПортSMTP = 25; // Или 587 при использовании явного TLS
ПочтПрофиль.ПользовательSMTP = "user@domain.com"; // Рекомендуется указывать полный UPN или DOMAIN\user
ПочтПрофиль.ПарольSMTP = "SecretPassword";
ПочтПрофиль.ВремяОжидания = 60;

// Указываем явный способ аутентификации
ПочтПрофиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;

// Включаем использование защищенного соединения
// Без SSL/TLS многие почтовые серверы отклоняют незашифрованную аутентификацию
ПочтПрофиль.ИспользоватьSSLSMTP = Истина;

ПочтСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтСообщение.Кодировка = "windows-1251";
ПочтСообщение.Тема = "Тестовое оповещение";
ПочтСообщение.Отправитель.Адрес = "dr_orenburg@volga.rt.ru";
ПочтСообщение.Отправитель.ОтображаемоеИмя = "Робот 1С";
ПочтСообщение.Получатели.Добавить("igor.tsyganov@rt.ru");
ПочтСообщение.Тексты.Добавить("Текст сообщения", ТипТекстаПочтовогоСообщения.ПростойТекст);

Почта = Новый ИнтернетПочта;
Попытка
    Почта.Подключиться(ПочтПрофиль);
    Почта.Послать(ПочтСообщение);
    Почта.Отключиться();
    Сообщить("Письмо успешно отправлено!");
Исключение
    Сообщить("Ошибка отправки: " + ОписаниеОшибки());
КонецПопытки;

Обратите внимание на свойство ПочтПрофиль.ИспользоватьSSLSMTP. Когда почтовый сервер Exchange видит защищенное соединение (STARTTLS или SSL), он разрешает передачу логина и пароля методом AUTH LOGIN, что устраняет ошибку 504 5.7.4 Unrecognized authentication type.

Решение 2. Настройка коннектора на стороне почтового сервера (Exchange Relay)

Если корпоративный почтовый сервер расположен во внутреннем контуре предприятия и использование TLS на 25-м порту не планируется, оптимальным решением со стороны системных администраторов будет настройка внутреннего ретранслятора (Relay):

  1. На почтовом сервере создается отдельный коннектор получения (Receive Connector).
  2. В параметрах сетевой безопасности коннектора указывается точный IP-адрес сервера приложений 1С.
  3. Для данного IP-адреса разрешается анонимная отправка (разрешение Anonymous Users), либо настраивается базовая аутентификация без обязательного шифрования.

В этом случае в коде 1С достаточно указать отправку без авторизации, что полностью исключит проблемы с правами службы:


ПочтПрофиль = Новый ИнтернетПочтовыйПрофиль;
ПочтПрофиль.АдресСервераSMTP = "10.78.2.26";
ПочтПрофиль.ПортSMTP = 25;
ПочтПрофиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
// Логин и пароль при настроенном Relay не требуются

Решение 3. Запуск службы сервера 1С от имени доменной учетной записи

Если в конфигурации жестко завязано использование COM-объекта CDO.Message со свойством smtpauthenticate = 2 (NTLM), необходимо скорректировать учетную запись службы операционной системы на сервере приложений 1С:

  1. Откроем оснастку Службы (services.msc) на сервере, где установлен кластер 1С.
  2. Найдем службу Агент сервера 1С:Предприятия (1C:Enterprise 8.3 Server Agent).
  3. В свойствах службы перейдем на вкладку Вход в систему.
  4. Вместо встроенной учетной записи укажем доменную учетную запись (например, DOMAIN\1c_service), у которой есть права доступа к почтовому серверу.
  5. Перезапустим службу 1С:Предприятия.

После смены пользователя служба сервера 1С получит возможность успешно проходить доменную NTLM-аутентификацию на почтовом сервере точно так же, как это происходило в сеансе пользователя на клиенте.

← На главную