Отправка электронных писем напрямую из 1С — типовая задача при автоматизации документооборота, оповещения контрагентов или отправки счетов. Однако разработчики часто сталкиваются с ситуацией, когда код написан, но почтовый сервер возвращает ошибку авторизации, сбрасывает соединение или выдает системную ошибку 421. Разберем по шагам, как правильно настроить подключение к почтовому серверу, сформировать письмо и избежать распространенных подводных камней.
Проанализируем ситуацию, с которой столкнулись участники обсуждения, и выделим критические ошибки, приводящие к отказу сервера:
Почта и ИнтернетПочта. Объект Почта предназначен исключительно для взаимодействия с почтовым клиентом операционной системы по интерфейсу MAPI. Он не предназначен для прямой работы с профилем ИнтернетПочтовыйПрофиль. Для прямой отправки по протоколу SMTP необходимо всегда использовать объект ИнтернетПочта.ИспользоватьSSLSMTP = Истина.Отправитель указать просто имя пользователя без почтового домена или сторонний e-mail, сервер вернет ошибку проверки подлинности адреса.Рассмотрим правильный порядок действий при программной отправке электронного сообщения средствами платформы 1С:Предприятие:
ИнтернетПочтовыйПрофиль, задавая параметры SMTP-сервера, логин, пароль приложения, порт 465 и обязательный признак SSL.ИнтернетПочтовоеСообщение: указываем получателей, тему, отправителя и добавляем текст сообщения через коллекцию Тексты.ИнтернетПочта внутри блока обработки исключений Попытка ... Исключение.Послать().Отключиться(), чтобы освободить сетевой канал.Посмотрим на практический пример кода, который можно встроить в обработчик нажатия кнопки на форме обработки или документа:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.yandex.ru";
Профиль.ПортSMTP = 465;
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПользовательSMTP = "vasha_pochta@yandex.ru";
// Важно: здесь необходимо указывать сгенерированный пароль приложения!
Профиль.ПарольSMTP = "parol_prilozheniya";
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.Таймаут = 60;
// Создаем сообщение
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Тема = "Тема письма из 1С";
Письмо.Отправитель = "vasha_pochta@yandex.ru";
Письмо.ИмяОтправителя = "ООО Наша Компания";
Письмо.Получатели.Добавить("client@example.com");
// Формируем тело сообщения
ТекстПисьма = Письмо.Тексты.Добавить("Здравствуйте! Направляем вам информацию из базы 1С.");
ТекстПисьма.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Отправка через ИнтернетПочта
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Сообщить("Письмо успешно отправлено!");
Исключение
Попытка
Почта.Отключиться();
Исключение
КонецПопытки;
Сообщить("Ошибка при отправке почты: " + ОписаниеОшибки());
КонецПопытки;
Выясним причину возникновения ошибки с кодом 421 (Service not available, closing transmission channel). Данная ошибка означает, что почтовый сервер принудительно разорвал канал передачи данных. Чаще всего это происходит в следующих случаях:
Таймаут в профиле.Отключиться() при возникновении сбоев, сервер держит открытые сессии до истечения времени ожидания. Именно поэтому вызов отключения рекомендуется дублировать в блоке Исключение.Рассмотрим альтернативные подходы, если стандартная отправка через ИнтернетПочта сталкивается с ограничениями безопасности или версий платформы:
HTTPСоединение. Этот вариант решает проблему блокировок стандартных почтовых портов интернет-провайдерами, так как обмен идет по обычному HTTPS-порту 443.