При программном формировании печатных форм и их отправке по электронной почте из 1С разработчики часто сталкиваются с двумя популярными проблемами: некорректным формированием путей к файлам вложений на сервере и ошибкой отправки сообщения SMTP error code 501 (Неверный синтаксис команды). Разберем подробно, почему возникают эти ошибки и как правильно написать код для отправки писем через объекты ИнтернетПочта и ИнтернетПочтовыйПрофиль.
Код ошибки 501 в протоколе SMTP означает неверный синтаксис параметров команды. При вызове метода Почта.Послать(Письмо) платформа формирует заголовки письма и передает их почтовому серверу. Ошибка возникает в следующих случаях:
Письмо.Отправитель необходимо передавать исключительно адрес электронной почты (например, info@domain.ru). Если присвоить этому полю ссылку на справочник или наименование организации (например, ООО "Ромашка"), почтовый сервер отклонит отправку.Письмо.Получатели должны добавляться корректные строки с e-mail адресами. Если туда попадает пустая строка, кавычки или некорректный объект, сервер также вернет код 501.Проанализируем некорректную запись в коде:
// НЕПРАВИЛЬНО: В поле Отправитель передается наименование или ссылка на объект
Письмо.Отправитель = Объект.Организация;
Чтобы исправить проблему, необходимо разделить адрес электронной почты и отображаемое имя отправителя:
// ПРАВИЛЬНО: В Отправитель передаем e-mail, а в ИмяОтправителя — текстовое название
Письмо.Отправитель = "123@mail.ru";
Письмо.ИмяОтправителя = СокрЛП(Объект.Организация.Наименование);
Еще одна распространенная проблема — жесткое кодирование абсолютных путей к файлам (например, C:/Новая папка/ или /home/ExchangeLocal/). Если код выполняется в серверном контексте, служба сервера 1С может не иметь прав на запись в пользовательские папки Windows или Linux, из-за чего файлы вложений просто не создаются.
Рассмотрим универсальный подход: создание файлов во временном каталоге с помощью стандартной функции КаталогВременныхФайлов() или ПолучитьИмяВременногоФайла(). Это гарантирует наличие прав на запись независимо от операционной системы (Windows/Linux) и типа выполнения (сервер/клиент).
Разберем рабочий пример формирования печатной формы во временный файл:
// Получаем путь к временному файлу PDF
ПутьКФайлу = ПолучитьИмяВременногоФайла("pdf");
// Сохраняем табличный документ во временный файл
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
// Добавляем файл во вложения письма
Письмо.Вложения.Добавить(ПутьКФайлу, "Акт выполненных работ.pdf");
Сберем решение воедино. Рассмотрим полный и исправленный алгоритм подключения к почтовому серверу Mail.ru и отправки писем с прикрепленными документами:
Процедура ОтправитьПисьмоКонтрагенту(ЭлектроннаяПочтаПолучателя, ЗаголовокПисьма, МассивПутейКФайлам)
// 1. Настройка почтового профиля
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "smtp.mail.ru";
Профиль.ПортSMTP = 465;
Профиль.ПользовательSMTP = "my_email@mail.ru";
Профиль.ПарольSMTP = "пароль_приложения"; // Используйте пароль для внешних приложений
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;
Профиль.ИспользоватьSSLSMTP = Истина;
// 2. Создание почтового сообщения
Письмо = Новый ИнтернетПочтовоеСообщение;
Письмо.Отправитель = "my_email@mail.ru"; // Строго адрес электронной почты
Письмо.ИмяОтправителя = "Наша Организация";
Письмо.Тема = ЗаголовокПисьма;
// Проверяем и добавляем получателя
Если ЗначениеЗаполнено(ЭлектроннаяПочтаПолучателя) Тогда
Письмо.Получатели.Добавить(СокрЛП(ЭлектроннаяПочтаПолучателя));
Иначе
Сообщить("У контрагента не заполнен e-mail!");
Возврат;
КонецЕсли;
// 3. Добавление вложений
Для Каждого ПутьКФайлу Из МассивПутейКФайлам Цикл
Если ФайлСуществует(ПутьКФайлу) Тогда
Письмо.Вложения.Добавить(ПутьКФайлу);
КонецЕсли;
КонецЦикла;
// 4. Подключение и отправка
Почта = Новый ИнтернетПочта;
Попытка
Почта.Подключиться(Профиль);
Почта.Послать(Письмо);
Почта.Отключиться();
Сообщить("Письмо успешно отправлено на адрес: " + ЭлектроннаяПочтаПолучателя);
Исключение
Сообщить("Ошибка при отправке почты: " + ОписаниеОшибки());
Попытка
Почта.Отключиться();
Исключение
КонецПопытки;
КонецПопытки;
КонецПроцедуры
СокрЛП() и проверяйте наличие символа @.УдалитьФайлы(ПутьКФайлу), чтобы не засорять каталог временных файлов сервера.