Как правильно отправить письмо из 1С со вложением и почему объект Почта часто не работает?

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

Отправка электронных писем — одна из самых частых задач в 1С:Предприятии. Казалось бы, в платформе есть встроенные механизмы, но на практике разработчики часто сталкиваются с ситуацией, когда код выполняется без ошибок, а письмо со вложением просто «исчезает»: его нет ни в отправленных, ни у получателя. Разберем детально, почему это происходит и как реализовать гарантированную отправку через ИнтернетПочта.

В чем разница между объектами Почта и ИнтернетПочта?

Для начала проанализируем ситуацию, с которой столкнулся автор темы. Изначально использовался объект Почта. Важно понимать, что этот объект работает через протокол MAPI. Это означает, что 1С не отправляет письмо сама, а «просит» установленный в операционной системе почтовый клиент (например, Microsoft Outlook или Mozilla Thunderbird) выполнить это действие.

Почему этот метод часто подводит:

  1. Конфликт разрядности: Если ваша 1С 64-битная, а почтовый клиент 32-битный (или наоборот), интеграция может молча завершиться неудачей.
  2. Зависимость от настроек клиента: Если почтовая программа по умолчанию не настроена или требует подтверждения при отправке из сторонних приложений, письмо будет заблокировано.
  3. Проблемы со вложениями: Протокол MAPI часто накладывает ограничения на передачу путей к файлам, особенно в режиме Тонкого клиента.

Рассмотрим альтернативу. Объект ИнтернетПочта работает напрямую с почтовым сервером (Yandex, Mail.ru, Gmail или ваш корпоративный сервер) по протоколам SMTP, POP3 или IMAP. Это гораздо более надежный путь, так как он полностью независим от стороннего софта на компьютере пользователя.

Пошаговая реализация отправки через ИнтернетПочта

Выясним, как правильно написать код для отправки сообщения. Нам потребуется создать два объекта: ИнтернетПочтовоеСообщение для формирования самого письма и ИнтернетПочта для соединения с сервером и отправки.

Рассмотрим пример кода:


&НаСервере
Процедура ОтправитьПисьмоНаСервере(ПутьКФайлу, АдресПолучателя)
    
    // Создаем объект сообщения
    Сообщение = Новый ИнтернетПочтовоеСообщение;
    Сообщение.Тема = "Отчет от " + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
    Сообщение.Текст.Добавить("Добрый день! Во вложении файл с данными.");
    
    // Добавляем получателя
    Получатель = Сообщение.Получатели.Добавить(АдресПолучателя);
    
    // Работаем со вложением
    // Рекомендуется использовать двоичные данные для стабильности
    Попытка
        ФайлВложения = Новый Файл(ПутьКФайлу);
        Если ФайлВложения.Существует() Тогда
            ДанныеФайла = Новый ДвоичныеДанные(ПутьКФайлу);
            Сообщение.Вложения.Добавить(ДанныеФайла, ФайлВложения.Имя);
        Иначе
            Сообщить("Файл не найден по пути: " + ПутьКФайлу);
            Возврат;
        КонецЕсли;
    Исключение
        Сообщить("Ошибка при чтении файла: " + ОписаниеОшибки());
        Возврат;
    КонецПопытки;

    // Настраиваем профиль подключения
    Профиль = Новый ИнтернетПочтовыйПрофиль;
    Профиль.АдресСервераSMTP = "smtp.yandex.ru"; // Пример для Яндекса
    Профиль.ПортSMTP = 465;
    Профиль.ИспользоватьSSLSMTP = Истина;
    Профиль.ПользовательSMTP = "login@yandex.ru";
    Профиль.ПарольSMTP = "ваш_пароль_приложения"; // Важно: используйте пароль приложения!
    Профиль.АутентификацияSMTP = СпособSMTPАутентификации.Login;

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

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

Критически важный нюанс: Клиент или Сервер?

Проанализируем ситуацию: автор сообщения пытался отправить файл C:\test1.txt из Тонкого клиента. Если ваш код выполняется в процедуре &НаСервере, то сервер 1С (который может находиться на другом компьютере в серверной) будет искать этот файл на своем диске C:, а не на вашем. Это самая частая причина, по которой вложения «не цепляются».

Правильный алгоритм действий для управляемых форм выглядит так:

  1. На клиенте выбираем файл или получаем его путь.
  2. Помещаем файл во временное хранилище с помощью функции ПоместитьФайл() или ПоместитьФайлы().
  3. Передаем адрес временного хранилища на сервер.
  4. На сервере извлекаем данные из хранилища и добавляем во вложение сообщения.

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


// Внутри серверной процедуры
ДанныеИзХранилища = ПолучитьИзВременногоХранилища(АдресХранилища);
// Добавляем вложение: (Данные, ИмяФайлаВПисьме)
Сообщение.Вложения.Добавить(ДанныеИзХранилища, "Report.pdf");

Современные требования безопасности (SSL/TLS и пароли приложений)

Многие пользователи (как в сообщении 14) жалуются, что настройки верны, тестовое письмо уходит, а реальные письма со вложениями — нет. Рассмотрим причину в современных почтовых сервисах (Mail.ru, Yandex, Gmail).

Пароли приложений: Сейчас нельзя просто вписать в код основной пароль от почты. Сервер его заблокирует. Вам нужно зайти в настройки безопасности почтового ящика через браузер, найти раздел «Пароли для внешних приложений» и создать специальный код для 1С. Только с этим паролем отправка будет работать стабильно.

Шифрование: Обязательно используйте ИспользоватьSSLSMTP = Истина и соответствующий порт (обычно 465). Без этого сервер может принять соединение, но сбросить его при попытке передать большой объем данных (вложение).

Что проверить, если письмо всё равно не доходит?

Если код отрабатывает без ошибок, но результата нет, воспользуемся следующими советами по отладке:

Использование объекта ИнтернетПочта в сочетании с ДвоичныеДанные — это стандарт де-факто для современной разработки на платформе 1С 8.3. Этот метод обеспечивает кроссплатформенность (работает и на Windows, и на Linux) и не зависит от окружения пользователя.

← На главную