Довольно часто разработчики сталкиваются с ситуацией, когда процедура отправки электронных писем безупречно отрабатывает в контексте клиента, но при переносе в фоновое задание или под директиву &НаСервере падает с ошибками проверки подлинности. При этом в журнал регистрации записываются ошибки протокола 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();
Почему этот код успешно отрабатывает под директивой &НаКлиенте, но завершается аварийно под &НаСервере? Разберем ключевые факторы:
rphost, который работает под системной учетной записью (как правило, локальный пользователь USR1CV8 или SYSTEM). У этой учетной записи нет прав в домене и нет почтового ящика, из-за чего механизм NTLM завершается с ошибкой.ИнтернетПочта разработчики нередко сталкиваются с ошибкой 504 Unrecognized authentication type. Она возникает из-за того, что объект ИнтернетПочта не поддерживает NTLM-аутентификацию, а почтовый сервер Exchange на 25-м порту без включенного шифрования TLS запрещает открытые методы авторизации (AUTH LOGIN).Отказ от устаревших 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.
Если корпоративный почтовый сервер расположен во внутреннем контуре предприятия и использование TLS на 25-м порту не планируется, оптимальным решением со стороны системных администраторов будет настройка внутреннего ретранслятора (Relay):
Anonymous Users), либо настраивается базовая аутентификация без обязательного шифрования.В этом случае в коде 1С достаточно указать отправку без авторизации, что полностью исключит проблемы с правами службы:
ПочтПрофиль = Новый ИнтернетПочтовыйПрофиль;
ПочтПрофиль.АдресСервераSMTP = "10.78.2.26";
ПочтПрофиль.ПортSMTP = 25;
ПочтПрофиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
// Логин и пароль при настроенном Relay не требуются
Если в конфигурации жестко завязано использование COM-объекта CDO.Message со свойством smtpauthenticate = 2 (NTLM), необходимо скорректировать учетную запись службы операционной системы на сервере приложений 1С:
1C:Enterprise 8.3 Server Agent).DOMAIN\1c_service), у которой есть права доступа к почтовому серверу.После смены пользователя служба сервера 1С получит возможность успешно проходить доменную NTLM-аутентификацию на почтовом сервере точно так же, как это происходило в сеансе пользователя на клиенте.