Приветствуем, уважаемые коллеги! При интеграции систем на платформе 1С:Предприятие с внешними почтовыми сервисами разработчики часто сталкиваются с неочевидными проблемами. Одна из самых распространенных и коварных неполадок — некорректное отображение кириллицы в списке писем почтового клиента, в то время как при открытии самого сообщения текст выглядит абсолютно нормально. Особенно часто эта проблема проявляется при отправке писем из 1С на почтовые ящики Gmail.
В этой статье мы подробно разберем, почему возникает этот эффект, проанализируем поведение почтовых серверов и стандартов MIME, а также рассмотрим практические способы решения этой проблемы на уровне программного кода 1С.
Для того чтобы понять природу ошибки, нам необходимо погрузиться в устройство почтового стандарта MIME (Multipurpose Internet Mail Extensions). Когда мы отправляем электронное письмо из 1С, оно представляет собой сложную древовидную структуру. Сообщение состоит из заголовков (тема, отправитель, получатель) и нескольких частей тела (например, текстовая версия и HTML-версия).
Почтовые клиенты, такие как Gmail, Yandex или Mail.ru, обрабатывают входящие письма по определенным алгоритмам. Давайте рассмотрим, как формируется список входящих писем в интерфейсе почтового ящика. В этом списке для каждого письма отображается так называемый сниппет (snippet) — краткий предпросмотр первых строк сообщения.
Процесс генерации сниппета выглядит следующим образом:
multipart/alternative (когда внутри есть и обычный текст, и HTML) или multipart/mixed (с вложениями).text/plain.Теперь проанализируем, где именно происходит сбой. Когда мы пишем код отправки почты в 1С, мы часто задаем кодировку для всего сообщения в целом, используя свойство Сообщение.Кодировка = "utf-8";. Однако это свойство влияет преимущественно на заголовки письма (тему, имя отправителя). Каждая отдельная текстовая часть в коллекции Сообщение.Тексты является самостоятельным объектом. Если мы явно не укажем кодировку для каждого добавленного текста, платформа 1С сформирует почтовый пакет, в котором для текстовой части кодировка будет отсутствовать либо будет выставлена по умолчанию как US-ASCII.
В этот момент в игру вступают различия между почтовыми сервисами:
US-ASCII, но внутри содержится кириллица, сервер Яндекса проанализирует байты и автоматически перекодирует их в читаемый вид. Поэтому на Яндексе сниппеты выглядят нормально.US-ASCII (или кодировка не указана вовсе), Gmail не будет пытаться угадать кодировку. Он честно декодирует байты по таблице ASCII. Поскольку в таблице ASCII нет русских букв, все русские символы превращаются в пустоту, знаки вопроса или нечитаемые спецсимволы. При этом, когда пользователь открывает само письмо, Gmail отображает HTML-версию, в которой кодировка UTF-8 прописана явно внутри тега <meta>, поэтому текст внутри письма выглядит нормально.Давайте разберем типичный пример кода, который приводит к описываемой проблеме. Очень часто разработчики пишут код следующим образом:
// ПРИМЕР КОДА С ОШИБКОЙ
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тема = "Уведомление об отгрузке";
Сообщение.Отправитель = "sales@company.com";
Сообщение.Получатели.Добавить("client@gmail.com");
// Установка кодировки для всего сообщения
Сообщение.Кодировка = "utf-8";
// Добавление текста письма
ТекстПисьма = "Уважаемый клиент, ваш заказ готов к отгрузке!";
НовыйТекст = Сообщение.Тексты.Добавить(ТекстПисьма);
НовыйТекст.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// Отправка сообщения...
В данном примере разработчик установил свойство Сообщение.Кодировка, надеясь, что этого достаточно. Но объект НовыйТекст, добавленный в коллекцию Сообщение.Тексты, остался без явно заданной кодировки. В результате почтовый клиент Gmail не смог корректно отобразить предпросмотр этого письма в списке сообщений.
Чтобы гарантировать корректное отображение кириллицы во всех почтовых клиентах (включая строгий Gmail), мы должны явно задавать кодировку для каждой текстовой части сообщения. Рассмотрим правильный и надежный шаблон кода для отправки почты.
// ПРАВИЛЬНЫЙ ШАБЛОН ОТПРАВКИ ПОЧТЫ ИЗ 1С
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Тема = "Уведомление об отгрузке";
Сообщение.Отправитель.Адрес = "sales@company.com";
Сообщение.Получатели.Добавить("client@gmail.com");
// Задаем общую кодировку для заголовков сообщения
Сообщение.Кодировка = "utf-8";
// 1. Создаем и настраиваем простую текстовую часть (для сниппетов)
ТекстПростой = Сообщение.Тексты.Добавить();
ТекстПростой.Текст = "Уважаемый клиент, ваш заказ готов к отгрузке! Подробности во вложении.";
ТекстПростой.ТипТекста = ТипТекстаПочтовогоСообщения.ПростойТекст;
// КРИТИЧЕСКИ ВАЖНО: Явно указываем UTF-8 для простого текста!
ТекстПростой.Кодировка = "utf-8";
// 2. Если мы используем красивое HTML-оформление, добавляем HTML-часть
ТекстHTML = Сообщение.Тексты.Добавить();
ТекстHTML.Текст = "<html><head><meta charset='utf-8'></head><body><p>Уважаемый клиент, ваш заказ <strong>готов к отгрузке</strong>!</p></body></html>";
ТекстHTML.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
// КРИТИЧЕСКИ ВАЖНО: Явно указываем UTF-8 для HTML-текста!
ТекстHTML.Кодировка = "utf-8";
В этом примере мы явно разделили письмо на две части и для каждой из них установили свойство Кодировка = "utf-8". Теперь Gmail получит четкие инструкции по декодированию каждой части сообщения. Предпросмотр письма в списке входящих будет отображаться красивым русским текстом.
Проблема с кодировкой в почте 1С не ограничивается только телом письма. Очень часто разработчики сталкиваются с тем, что имена прикрепленных файлов (вложений) также превращаются в нечитаемый набор символов. Это происходит по схожей причине — из-за неверной кодировки заголовков вложений.
Давайте посмотрим, как правильно прикреплять файлы к письму, чтобы их названия отображались корректно на любых почтовых серверах:
// ДОБАВЛЕНИЕ ВЛОЖЕНИЯ С НАСТРОЙКОЙ КОДИРОВКИ ИМЕНИ ФАЙЛА
ПутьКФайлу = "C:\Docs\Накладная_123.pdf";
Вложение = Сообщение.Вложения.Добавить(ПутьКФайлу);
// Задаем имя вложения, которое увидит получатель
Вложение.Имя = "Накладная_№123.pdf";
// Указываем кодировку для имени вложения
Вложение.Кодировка = "utf-8";
Использование свойства Кодировка для объекта вложения гарантирует, что имя файла будет правильно закодировано по стандарту RFC 2047, и получатель сможет скачать файл с исходным русским названием.
Если в вашей конфигурации используется Библиотека Стандартных Подсистем (БСП), ручное создание объектов ИнтернетПочтовоеСообщение обычно заменяется вызовом процедур общего модуля РаботаСПочтовымиСообщениями.
Проанализируем, как правильно передавать параметры кодировки при использовании БСП. Для этого обычно подготавливается структура параметров письма. Пример формирования параметров представлен ниже:
// ФОРМИРОВАНИЕ ПИСЬМА ЧЕРЕЗ БСП
ПараметрыПисьма = Новый Структура;
ПараметрыПисьма.Вставить("Кому", "client@gmail.com");
ПараметрыПисьма.Вставить("Тема", "Уведомление от компании");
ПараметрыПисьма.Вставить("Тело", "Приветствуем! Это текст сообщения.");
ПараметрыПисьма.Вставить("ТипТекста", "HTML"); // или "ПростойТекст"
// Передаем кодировку в параметрах
ПараметрыПисьма.Вставить("Кодировка", "utf-8");
// Вызываем отправку почты через БСП
РаботаСПочтовымиСообщениями.ОтправитьПочтовоеСообщение(СистемнаяУчетнаяЗапись, ПараметрыПисьма);
В актуальных версиях БСП разработчики фирмы «1С» уже учли особенности работы различных почтовых сервисов, и при явном указании кодировки utf-8 в структуре параметров библиотека автоматически пропишет нужные заголовки для всех создаваемых MIME-частей. Однако, если ваша конфигурация давно не обновлялась, рекомендуется проверить код общего модуля БСП, отвечающий за заполнение почтового сообщения, и убедиться, что свойство Кодировка присваивается элементам коллекции Тексты.
В процессе обсуждения на форумах часто можно встретить советы использовать устаревшие кодировки, такие как windows-1251, koi8-r или cp866. Давайте выясним, почему в современных реалиях этого делать не стоит.
Сегодня стандартом де-факто во всем мире является UTF-8 (Юникод). Использование UTF-8 имеет целый ряд неоспоримых преимуществ:
Поэтому мы настоятельно рекомендуем всегда использовать кодировку utf-8 в качестве основной для всех почтовых интеграций в 1С.
Для того чтобы ваши письма всегда выглядели презентабельно, а их предпросмотр в списке писем не пугал клиентов непонятными символами, следуйте простому правилу при написании кода отправки почты из 1С:
Сообщение.Кодировка = "utf-8";.ПростойТекст, так и HTML) и явно прописывайте для них кодировку: ТекстЧасть.Кодировка = "utf-8";.Вложение.Кодировка = "utf-8";.Кодировка в параметрах отправки писем.Соблюдение этих простых стандартов MIME позволит вам создавать надежные интеграции, которые будут стабильно работать с любыми почтовыми сервисами по всему миру!