При настройке регламентных заданий для автоматической рассылки писем из 1С (например, в конфигурации «Управление торговлей 10.3») разработчики часто сталкиваются с проблемой, когда в почтовом клиенте получателя поле «От кого» отображается в виде непонятного набора символов, похожего на =?UTF-8?B?...?=. Это происходит из-за особенностей кодирования заголовков по стандарту RFC 2047 и того, как 1С формирует MIME-сообщение.
В этой статье мы подробно разберем, почему возникает такая ситуация, и проанализируем несколько способов решения проблемы, чтобы ваши письма выглядели профессионально и корректно распознавались любыми почтовыми сервисами.
Выясним причину, по которой почтовые клиенты (Outlook, Gmail, Mail.ru) иногда не могут расшифровать имя отправителя. Когда мы передаем в поле Отправитель строку с русскими символами, платформа 1С автоматически кодирует её в формат Base64 или Quoted-Printable, добавляя служебную информацию о кодировке (например, UTF-8). Если структура заголовка сформирована не совсем стандартно или почтовый сервер принудительно меняет часть данных, клиент видит «сырой» код вместо нормального имени.
Рассмотрим типовой фрагмент кода, который часто приводит к ошибке:
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Отправитель = Профиль.Пользователь; // Здесь часто передается просто строка-логин
Сообщение.Тема = ТемаСообщения;
Сообщение.Получатели.Добавить(Мыло);
Сообщение.Тексты.Добавить(ТекстПисьма);
Проблема здесь заключается в том, что свойству Отправитель присваивается просто строка, хотя объектная модель 1С предполагает использование специального типа данных.
Наиболее правильный и надежный способ — это использование объекта ИнтернетПочтовыйАдрес. Он позволяет четко разделить собственно адрес электронной почты и отображаемое имя отправителя. Проанализируем, как изменить код для достижения этой цели.
Вместо прямой передачи строки, выполним следующие шаги:
ИнтернетПочтовыйАдрес.Адрес (само «мыло»).ОтображаемоеИмя (то, что увидит пользователь в поле «От»).Отправитель сообщения.Разберем это на примере обновленного кода:
Сообщение = Новый ИнтернетПочтовоеСообщение;
// Формируем объект адреса отправителя правильно
АдресОтправителя = Новый ИнтернетПочтовыйАдрес;
АдресОтправителя.Адрес = УчетнаяЗапись.АдресЭлектроннойПочты; // Например, info@company.ru
АдресОтправителя.ОтображаемоеИмя = "Отдел продаж ООО 'Ромашка'";
Сообщение.Отправитель = АдресОтправителя;
Сообщение.Тема = ТемаСообщения;
Сообщение.Получатели.Добавить(Мыло);
Сообщение.Тексты.Добавить(ТекстПисьма);
Такой подход гарантирует, что 1С сформирует заголовок From в строгом соответствии со стандартами почтовых систем.
Иногда система по умолчанию выбирает кодировку, которая конфликтует с настройками конкретного почтового сервера. Чтобы исключить неоднозначность, рекомендуется явно указывать кодировку для всего сообщения. Проанализируем ситуацию: если ваша база данных работает в режиме Unicode, то и сообщения лучше отправлять в UTF-8.
Добавим в наш код установку кодировки:
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Кодировка = "UTF-8"; // Или "Windows-1251", если работаете со старыми системами
// ... остальной код заполнения сообщения
Важно помнить, что свойство Кодировка влияет не только на тело письма, но и на то, как платформа будет упаковывать заголовки (тему и имена отправителей/получателей).
Посмотрим на пример заполнения профиля почты. Часто разработчики путают логин для авторизации и адрес отправителя. Современные почтовые сервисы (Yandex, Gmail, Mail.ru) из соображений безопасности требуют, чтобы адрес в поле From полностью совпадал с логином, под которым произошла авторизация в ИнтернетПочтовыйПрофиль.
Разберем типичную настройку профиля для регламентного задания:
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = УчетнаяЗапись.SMTPСервер;
Профиль.ПортSMTP = УчетнаяЗапись.ПортSMTP;
Профиль.ПользовательSMTP = УчетнаяЗапись.Логин; // Логин для входа
Профиль.ПарольSMTP = УчетнаяЗапись.Пароль;
Профиль.АутентификацияSMTP = СпособSMTPАутентификации.ПоУмолчанию;
Профиль.ИспользоватьSSLSMTP = Истина;
// Критически важно: адрес отправителя в сообщении должен быть
// тем же самым, что и Профиль.ПользовательSMTP (если это email)
Если в настройках вашей учетной записи в 1С в поле «Имя пользователя» вписано что-то вроде "Иван Иванов <ivan@mail.ru>", это может сбить систему с толку. Попробуйте оставить в логине только чистый адрес, а «красивое имя» задавать исключительно через ОтображаемоеИмя объекта ИнтернетПочтовыйАдрес, как мы рассмотрели в первом решении.
Поскольку наша задача выполняется в фоновом режиме (через регламентное задание), нужно учитывать специфику серверного контекста. Рассмотрим важные моменты:
Сообщение перед методом Отправить().Для того чтобы минимизировать риск попадания письма в спам и обеспечить корректный ответ от клиента, полезно заполнять поле АдресОтвета. Проанализируем пример:
АдресОтвета = Новый ИнтернетПочтовыйАдрес;
АдресОтвета.Адрес = "support@company.ru";
АдресОтвета.ОтображаемоеИмя = "Техподдержка";
Сообщение.ОтветныеАдреса.Добавить(АдресОтвета);
Это гарантирует, что даже если с основным заголовком From возникнут трудности при отображении, почтовый клиент при нажатии кнопки «Ответить» подставит правильный и чистый адрес.
Подведем итог: для решения проблемы с некорректным текстом в поле отправителя необходимо отказаться от передачи простой строки в пользу объекта ИнтернетПочтовыйАдрес, явно установить кодировку сообщения UTF-8 и убедиться, что логин авторизации SMTP совпадает с адресом отправителя.