Как сделать, чтобы письма, отправленные из 1С, сохранялись в папке «Отправленные»?

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

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

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

Причина проблемы: разница между протоколами SMTP и IMAP

Чтобы понять корень проблемы, нужно разобраться в том, как 1С работает с почтой. Для отправки писем используется протокол SMTP (Simple Mail Transfer Protocol). Его единственная задача — передать сообщение от клиента на сервер и далее до получателя. SMTP — это протокол «одностороннего действия», он ничего не знает о структуре папок на почтовом сервере (таких как «Входящие», «Отправленные», «Черновики») и не умеет с ними взаимодействовать.

Для работы с папками и содержимым почтового ящика предназначен другой протокол — IMAP (Internet Message Access Protocol). Именно он позволяет создавать, удалять, перемещать письма между папками и синхронизировать их состояние с сервером.

Таким образом, когда 1С просто отправляет письмо через SMTP, оно уходит адресату, но сервер не получает команду сохранить копию этого письма в папку «Отправленные». Чтобы это произошло, нужно после отправки дополнительно подключиться к серверу по IMAP и явно поместить копию письма в нужную папку. В качестве готовой альтернативы программированию можно воспользоваться почтовым клиентом для 1С с поддержкой IMAP и SMTP.

Решение: комбинированный подход с использованием IMAP

Штатный механизм в большинстве типовых конфигураций (особенно в старых редакциях, как УТ 11.1) не выполняет эту операцию автоматически. Поэтому решение заключается в программной доработке. Алгоритм действий следующий:

  1. Сформировать объект письма (ИнтернетПочтовоеСообщение).
  2. Отправить его получателю с помощью метода Послать(), который использует SMTP.
  3. Сразу после успешной отправки установить соединение с почтовым сервером по протоколу IMAP.
  4. Найти на сервере папку для отправленных писем (ее название может быть разным: "Отправленные", "Sent", "INBOX.Sent").
  5. Поместить копию отправленного письма в эту папку с помощью метода ДобавитьСообщение().
  6. Завершить соединение.

Примеры кода и пошаговая реализация

Рассмотрим, как это можно реализовать на языке 1С. Для начала нам понадобится процедура для определения правильного имени папки «Отправленные», так как у разных почтовых сервисов оно может отличаться.

Шаг 1. Процедура для поиска папки «Отправленные»

Создадим вспомогательную процедуру, которая подключается к серверу и перебирает почтовые ящики (папки), чтобы найти нужную. Это удобно вынести в отдельную функцию для переиспользования.


Процедура ОпределитьПапкуОтправленные(Соединение)

    // Получаем список всех папок (почтовых ящиков) на сервере
    ПочтовыеЯщики = Соединение.ПолучитьПочтовыеЯщики();

    // Перебираем папки в цикле
    Для Каждого ПочтовыйЯщик Из ПочтовыеЯщики Цикл
        // Приводим имя папки к нижнему регистру для удобства сравнения
        ИмяПапки = НРег(ПочтовыйЯщик);

        // Проверяем на распространенные названия папки для отправленных писем
        Если ИмяПапки = "отправленные" 
            Или ИмяПапки = "inbox.sent" 
            Или ИмяПапки = "sent" Тогда

            // Если нашли, устанавливаем эту папку как текущую для соединения
            Соединение.ТекущийПочтовыйЯщик = ПочтовыйЯщик;
            // Прерываем цикл, так как папка найдена
            Прервать;
        КонецЕсли;
    КонецЦикла;

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

Шаг 2. Основной код отправки и сохранения письма

Теперь встроим вызов этой процедуры в основной механизм отправки. Ниже приведен обобщенный пример кода, который объединяет логику из обсуждения на форуме и правильный алгоритм действий.

Предположим, у вас уже есть сформированный объект Письмо типа ИнтернетПочтовоеСообщение и объект УчетнаяЗапись со всеми настройками (серверы, порты, логин, пароль).


// Сначала отправляем письмо стандартным способом через SMTP
ИнтернетПочта = Новый ИнтернетПочта;
ПрофильSMTP = Новый ИнтернетПочтовыйПрофиль;
// ... здесь происходит заполнение ПрофильSMTP из УчетнаяЗапись ...
ПрофильSMTP.ПользовательSMTP = УчетнаяЗапись.Пользователь;
ПрофильSMTP.ПарольSMTP = УчетнаяЗапись.Пароль;
// и т.д.

ИнтернетПочта.Подключиться(ПрофильSMTP);
ИнтернетПочта.Послать(Письмо);
ИнтернетПочта.Отключиться();

// --- ЭТАП СОХРАНЕНИЯ В "ОТПРАВЛЕННЫЕ" ---

// Теперь нужно подключиться по IMAP, чтобы сохранить копию
// Создаем новый профиль специально для IMAP
ПрофильIMAP = Новый ИнтернетПочтовыйПрофиль;
ПрофильIMAP.АдресСервераIMAP = УчетнаяЗапись.СерверВходящейПочты; // Часто сервер IMAP совпадает с сервером входящей почты
ПрофильIMAP.ПортIMAP = УчетнаяЗапись.ПортСервераВходящейПочты;
ПрофильIMAP.ПользовательIMAP = УчетнаяЗапись.Пользователь;
ПрофильIMAP.ПарольIMAP = УчетнаяЗапись.Пароль;
ПрофильIMAP.ИспользоватьSSLIMAP = УчетнаяЗапись.ИспользоватьSSLДляВходящейПочты;

// Создаем новое соединение для работы с папками
СоединениеIMAP = Новый ИнтернетПочта;

Попытка
    // Подключаемся по IMAP
    СоединениеIMAP.Подключиться(ПрофильIMAP, ПротоколИнтернетПочты.IMAP);

    // Вызываем нашу процедуру для поиска и установки папки "Отправленные"
    ОпределитьПапкуОтправленные(СоединениеIMAP);

    // Помещаем наше письмо в текущую (т.е. в "Отправленные") папку
    // ВАЖНО: метод ДобавитьСообщение является ключевым в этом решении
    СоединениеIMAP.ДобавитьСообщение(Письмо);

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

Возможные ошибки и как их избежать

При реализации этого механизма можно столкнуться с ошибкой: "Данная операция не может быть выполнена, не установлено соединение IMAP". Эта ошибка возникает, когда вы пытаетесь вызвать метод, требующий IMAP-соединения (например, ПолучитьПочтовыеЯщики), до того, как было установлено само соединение.

Ключевой момент: метод Соединение.Подключиться(Профиль, ПротоколИнтернетПочты.IMAP) должен быть выполнен успешно. Убедитесь, что:

Как решить проблему с вложениями при ответе на письмо?

Второй вопрос, который был задан в теме, — это пропадание вложений при создании ответа на входящее письмо в 1С. Это поведение является штатным для многих систем.

Причина: Когда вы нажимаете кнопку "Ответить", система создает новое письмо. В него копируются тема (с добавлением "Re:"), получатель и, возможно, цитируется текст исходного сообщения. Однако вложения из оригинального письма не переносятся автоматически. Это сделано для экономии трафика и места, так как в большинстве случаев при ответе пересылать все вложения заново не требуется.

Решение: Если вам необходимо, чтобы вложения сохранялись, это также требует программной доработки. В обработчике команды "Ответить" нужно добавить код, который будет делать следующее:

  1. Получить доступ к исходному письму-основанию.
  2. Создать новый объект письма для ответа.
  3. Перебрать коллекцию Вложения исходного письма в цикле.
  4. Для каждого вложения из исходного письма добавить его копию в коллекцию Вложения нового письма-ответа.

Это обеспечит перенос всех файлов из входящего сообщения в ваш ответ. Для работы с почтой и вложениями без изменения основной конфигурации можно использовать расширение для отправки и получения почтовых сообщений.

← На главную