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

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

При автоматизации бизнес-процессов в 1С:Бухгалтерия 3.0 разработчики часто сталкиваются с задачей массовой рассылки документов (счетов, актов сверки, счетов-фактур) контрагентам. Однако стандартная отправка писем по протоколу SMTP таит в себе две классические проблемы: отсутствие писем в папке «Отправленные» на почтовом сервере и игнорирование серверами запросов на уведомления о доставке и прочтении. Для этой задачи можно использовать готовую обработку для групповой отправки документов по электронной почте.

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

Часть 1. Настройка уведомлений о доставке и прочтении в коде 1С

Для начала проанализируем, как правильно инициализировать запрос уведомлений на уровне кода 1С. Объект платформы ИнтернетПочтовоеСообщение обладает штатными свойствами для управления этими параметрами. Рассмотрим пример правильного заполнения свойств электронного письма:


ПочтовоеСообщение = Новый ИнтернетПочтовоеСообщение;
ПочтовоеСообщение.Тема = "Счет на оплату №125";
ПочтовоеСообщение.Тело.Добавить("Добрый день! Во вложении к письму находится счет на оплату.");

// Включаем флаги необходимости уведомления
ПочтовоеСообщение.УведомитьОДоставке = Истина;
ПочтовоеСообщение.УведомитьОПрочтении = Истина;

// Явно указываем адреса, на которые сервер должен вернуть квитанции
ПочтовоеСообщение.АдресаУведомленияОДоставке.Добавить(ПочтовоеСообщение.Отправитель.Адрес);
ПочтовоеСообщение.АдресаУведомленияОПрочтении.Добавить(ПочтовоеСообщение.Отправитель.Адрес);

Важный нюанс: свойства АдресаУведомленияОДоставке и АдресаУведомленияОПрочтении представляют собой коллекции типа АдресаЭлектроннойПочты. Простое присвоение им строкового значения вызовет ошибку выполнения, поэтому мы обязательно используем метод Добавить().

Часть 2. Почему уведомления о доставке «не приходят» и как это исправить

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

Когда 1С отправляет письмо с установленными флагами уведомлений, в заголовок письма (RFC-заголовки) добавляются специальные теги, такие как Disposition-Notification-To и Return-Receipt-To. Дальнейшая судьба этих тегов зависит от внешних факторов:

  1. Политика почтовых серверов (Уведомление о доставке): Крупные публичные почтовые сервисы (такие как Mail.ru, Yandex, Gmail) в целях борьбы со спамом и снижения паразитной нагрузки часто полностью игнорируют служебные заголовки запросов о доставке, приходящие от внешних SMTP-клиентов. Данный функционал стабильно работает преимущественно в локальных корпоративных сетях (например, под управлением MS Exchange).
  2. Решение получателя (Уведомление о прочтении): Когда письмо открывается получателем, его почтовый клиент (например, MS Outlook или Thunderbird) видит запрос на прочтение и выводит интерактивное окно с вопросом: «Отправитель запросил подтверждение о прочтении. Отправить подтверждение?». Если пользователь нажмет «Нет» или у него в настройках почты по умолчанию стоит запрет на отправку таких уведомлений, вы ничего не узнаете.

Альтернативное решение (Метод трекинг-пикселя):

Если вам критически важно отслеживать факт открытия писем клиентами, мы рекомендуем отказаться от ненадежных стандартных уведомлений SMTP и использовать веб-технологии. Разберем этот алгоритм:

  1. Формируем текст письма в формате HTML.
  2. Встраиваем в тело письма скрытое изображение размером 1х1 пиксель, ссылающееся на ваш внешний веб-сервер с уникальным идентификатором отправки.
  3. При открытии письма клиентское приложение автоматически загрузит картинку, обратившись к вашему серверу, который зафиксирует факт прочтения в базе 1С.

Посмотрим на пример формирования HTML-тела письма с трекинг-пикселем:


ИдентификаторПисьма = НовыйУникальныйИдентификатор();
ТекстHTML = "<html><body>"
          + "<p>Уважаемый клиент, во вложении ваш счет.</p>"
          + "<img src='https://ваш-сайт.ru/track.php?id=" + Строка(ИдентификаторПисьма) + "' width='1' height='1' />"
          + "</body></html>";

ПочтовоеСообщение.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);

Часть 3. Три способа сохранить отправленные письма на сервере

По умолчанию протокол SMTP предназначен исключительно для транспортировки почты. Он не умеет сохранять копии писем в вашем почтовом ящике. Чтобы отправленные из 1С письма появлялись в папке «Отправленные» (Sent), необходимо применить один из трех подходов.

Способ А. Использование протокола IMAP для принудительного копирования

Этот способ является наиболее технологичным и правильным. После успешной отправки письма получателю через SMTP, программа устанавливает второе соединение с сервером — по протоколу IMAP, находит нужную папку и записывает туда отправленное сообщение.

Рассмотрим по шагам программную реализацию этой схемы:


// Сначала отправляем письмо по SMTP
ПрофильSMTP = Новый ИнтернетПочтовыйПрофиль;
// ... (заполнение параметров SMTP) ...
ПочтаSMTP = Новый ИнтернетПочта;
ПочтаSMTP.Подключиться(ПрофильSMTP, ПротоколИнтернетПочты.SMTP);
ПочтаSMTP.Послать(ПочтовоеСообщение);
ПочтаSMTP.Отключиться();

// Теперь подключаемся по IMAP для сохранения копии
ПрофильIMAP = Новый ИнтернетПочтовыйПрофиль;
ПрофильIMAP.АдресСервераIMAP = "imap.yandex.ru"; // укажите ваш сервер
ПрофильIMAP.ПортIMAP = 993;
ПрофильIMAP.ИспользованиеSSLIMAP = Истина;
ПрофильIMAP.ПользовательIMAP = "sender@yandex.ru";
ПрофильIMAP.ПарольIMAP = "ваш_пароль_приложения";

ПочтаIMAP = Новый ИнтернетПочта;
Попытка
    ПочтаIMAP.Подключиться(ПрофильIMAP, ПротоколИнтернетПочты.IMAP);
    
    // В зависимости от локализации почтового сервера папка может называться "Отправленные" или "Sent"
    ПочтаIMAP.ТекущийПочтовыйЯщик = "Отправленные"; 
    
    // Копируем отправленное письмо в текущий почтовый ящик на сервере
    ПочтаIMAP.Послать(ПочтовоеСообщение, , ПротоколИнтернетПочты.IMAP);
    ПочтаIMAP.Отключиться();
Исключение
    ЗаписьЖурналаРегистрации("Почта.ОшибкаСохраненияКопии", 
        УровеньЖурналаРегистрации.Ошибка, , , 
        "Не удалось сохранить копию письма по IMAP: " + ОписаниеОшибки());
КонецПопытки;

Способ Б. Метод скрытой копии (BCC) и правила почтового ящика

Если вы не хотите усложнять программный код дополнительными подключениями по протоколу IMAP, можно использовать простой обходной путь. Добавим адрес отправителя в скрытые копии:


// Добавляем адрес отправителя в скрытую копию (BCC)
ПочтовоеСообщение.СкрытыеПолучатели.Добавить("sender@yandex.ru");

При такой отправке письмо уйдет клиенту, а копия мгновенно упадет в ваш собственный ящик во «Входящие». Чтобы навести порядок в ящике, перейдем в веб-интерфейс вашей почты (например, Яндекс.Почта или Mail.ru) и настроим простое правило фильтрации:

«Если Получатель содержит "sender@yandex.ru" И Отправитель равен "sender@yandex.ru", то переместить письмо в папку "Отправленные" и отметить как прочитанное».

Способ В. Настройка типового функционала БСП (Библиотеки Стандартных Подсистем)

Если вы работаете в современной конфигурации 1С:Бухгалтерия 3.0, в ней уже присутствует готовый почтовый клиент от БСП. Выполним следующие настройки в пользовательском режиме:

  1. Перейдем в раздел Администрирование — Органайзер — Учетные записи электронной почты.
  2. Создадим новую или откроем существующую учетную запись.
  3. Обязательно настроим параметры входящей почты по протоколу IMAP.
  4. В карточке настройки учетной записи установим флаг «Сохранять копии отправленных писем в папке "Отправленные"» (эта опция доступна только при активном IMAP-подключении).

При использовании встроенных функций БСП для отправки (например, через справочник УчетныеЗаписиЭлектроннойПочты и механизмы интеграции взаимодействий), система будет автоматически синхронизировать и сохранять ваши письма средствами платформы.

Часть 4. Создание архива писем в 1С при конфигурации на поддержке

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

Проанализируем эту ситуацию. Начиная с версии платформы 1С:Предприятие 8.3, механизм Расширений конфигурации позволяет гибко кастомизировать систему без снятия с поддержки. Вы можете добавить любой новый объект метаданных в расширение, сохранив при этом возможность полностью автоматического обновления основной конфигурации.

Выполним это по шагам:

  1. Откроем базу в режиме Конфигуратор.
  2. Перейдем в меню Конфигурация — Расширения конфигурации.
  3. Добавим новое расширение (например, с именем Расш_Почта).
  4. Внутри дерева объектов расширения перейдем в ветку Справочники, нажмем правую кнопку мыши и выберем Добавить.
  5. Назовем новый справочник Расш_ИсторияПисем. Создадим в нем реквизиты: Получатель (Строка), Тема (Строка), ДатаОтправки (Дата), ТелоПисьма (Строка) и табличную часть для хранения вложенных файлов.

Теперь при успешной отправке письма из вашего кода мы можем легко записывать историю отправки в этот справочник:


ИсторияОтправки = Справочники.Расш_ИсторияПисем.СоздатьЭлемент();
ИсторияОтправки.Наименование = "Письмо для " + АдресПолучателя;
ИсторияОтправки.Получатель = АдресПолучателя;
ИсторияОтправки.Тема = ТемаПисьма;
ИсторияОтправки.ДатаОтправки = ТекущаяДата();
ИсторияОтправки.ТелоПисьма = ТекстПисьма;
Попытка
    ИсторияОтправки.Записать();
Исключение
    ВызватьИсключение "Ошибка записи истории почты: " + ОписаниеОшибки();
КонецПопытки;

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

← На главную