При стандартной отправке почты из конфигураций 1С пользователи часто сталкиваются с проблемой: отправленное письмо доходит до адресата, но его копия не появляется в папке «Отправленные» почтового ящика. Это создает неудобства, так как невозможно отследить историю переписки непосредственно в почтовом клиенте. Разберем, почему так происходит и как доработать систему, чтобы письма сохранялись где нужно.
Также рассмотрим связанный вопрос: почему при ответе на письмо из 1С могут пропадать вложения из исходного сообщения и как это исправить.
Чтобы понять корень проблемы, нужно разобраться в том, как 1С работает с почтой. Для отправки писем используется протокол SMTP (Simple Mail Transfer Protocol). Его единственная задача — передать сообщение от клиента на сервер и далее до получателя. SMTP — это протокол «одностороннего действия», он ничего не знает о структуре папок на почтовом сервере (таких как «Входящие», «Отправленные», «Черновики») и не умеет с ними взаимодействовать.
Для работы с папками и содержимым почтового ящика предназначен другой протокол — IMAP (Internet Message Access Protocol). Именно он позволяет создавать, удалять, перемещать письма между папками и синхронизировать их состояние с сервером.
Таким образом, когда 1С просто отправляет письмо через SMTP, оно уходит адресату, но сервер не получает команду сохранить копию этого письма в папку «Отправленные». Чтобы это произошло, нужно после отправки дополнительно подключиться к серверу по IMAP и явно поместить копию письма в нужную папку. В качестве готовой альтернативы программированию можно воспользоваться почтовым клиентом для 1С с поддержкой IMAP и SMTP.
Штатный механизм в большинстве типовых конфигураций (особенно в старых редакциях, как УТ 11.1) не выполняет эту операцию автоматически. Поэтому решение заключается в программной доработке. Алгоритм действий следующий:
ИнтернетПочтовоеСообщение).Послать(), который использует SMTP.ДобавитьСообщение().Рассмотрим, как это можно реализовать на языке 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:"), получатель и, возможно, цитируется текст исходного сообщения. Однако вложения из оригинального письма не переносятся автоматически. Это сделано для экономии трафика и места, так как в большинстве случаев при ответе пересылать все вложения заново не требуется.
Решение: Если вам необходимо, чтобы вложения сохранялись, это также требует программной доработки. В обработчике команды "Ответить" нужно добавить код, который будет делать следующее:
Вложения исходного письма в цикле.Вложения нового письма-ответа.Это обеспечит перенос всех файлов из входящего сообщения в ваш ответ. Для работы с почтой и вложениями без изменения основной конфигурации можно использовать расширение для отправки и получения почтовых сообщений.