Как исправить ошибку SMTP error code 501 и настроить отправку почты с вложениями в 1С

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

При программном формировании печатных форм и их отправке по электронной почте из 1С разработчики часто сталкиваются с двумя популярными проблемами: некорректным формированием путей к файлам вложений на сервере и ошибкой отправки сообщения SMTP error code 501 (Неверный синтаксис команды). Разберем подробно, почему возникают эти ошибки и как правильно написать код для отправки писем через объекты ИнтернетПочта и ИнтернетПочтовыйПрофиль.

Выясним причину ошибки SMTP error code 501

Код ошибки 501 в протоколе SMTP означает неверный синтаксис параметров команды. При вызове метода Почта.Послать(Письмо) платформа формирует заголовки письма и передает их почтовому серверу. Ошибка возникает в следующих случаях:

  1. Передача имени компании вместо адреса e-mail в поле отправителя. В свойство Письмо.Отправитель необходимо передавать исключительно адрес электронной почты (например, info@domain.ru). Если присвоить этому полю ссылку на справочник или наименование организации (например, ООО "Ромашка"), почтовый сервер отклонит отправку.
  2. Ошибки в поле получателей или теме. В коллекцию Письмо.Получатели должны добавляться корректные строки с e-mail адресами. Если туда попадает пустая строка, кавычки или некорректный объект, сервер также вернет код 501.
  3. Имя компьютера на кириллице. При инициализации подключения почтовый сервер считывает сетевое имя ПК. Если имя сервера или клиентского компьютера содержит кириллические символы, SMTP-сервер может отвергнуть команду приветствия EHLO/HELO.

Проанализируем некорректную запись в коде:


// НЕПРАВИЛЬНО: В поле Отправитель передается наименование или ссылка на объект
Письмо.Отправитель = Объект.Организация; 

Чтобы исправить проблему, необходимо разделить адрес электронной почты и отображаемое имя отправителя:


// ПРАВИЛЬНО: В Отправитель передаем 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. Подключение и отправка
    Почта = Новый ИнтернетПочта;
    
    Попытка
        Почта.Подключиться(Профиль);
        Почта.Послать(Письмо);
        Почта.Отключиться();
        Сообщить("Письмо успешно отправлено на адрес: " + ЭлектроннаяПочтаПолучателя);
    Исключение
        Сообщить("Ошибка при отправке почты: " + ОписаниеОшибки());
        Попытка
            Почта.Отключиться();
        Исключение
        КонецПопытки;
    КонецПопытки;

КонецПроцедуры

Рекомендации по надежной отправке почты из 1С

  1. Проверяйте заполнение e-mail адресов: перед отправкой очищайте строку от лишних пробелов с помощью СокрЛП() и проверяйте наличие символа @.
  2. Используйте пароли приложений: современные почтовые сервисы (Mail.ru, Yandex, Gmail) запрещают авторизацию по основному паролю учетной записи. В настройках безопасности почты необходимо сгенерировать отдельный пароль для внешних приложений.
  3. Удаляйте временные файлы: после завершения работы с файлами вложений удаляйте их с диска с помощью команды УдалитьФайлы(ПутьКФайлу), чтобы не засорять каталог временных файлов сервера.
← На главную