При программной отправке электронных писем через механизм ИнтернетПочта разработчики часто сталкиваются с ситуацией, когда свойству Отправитель объекта ИнтернетПочтовоеСообщение пытаются присвоить обычную строку, но в отладчике тип данных остается ИнтернетПочтовыйАдрес. Кроме того, нередко возникает задача передать произвольное отображаемое имя (Display Name), чтобы получатель в почтовой программе видел, например, название организации, а не голый email-адрес.
Разберем по шагам, как устроена типизация объекта ИнтернетПочтовоеСообщение, как корректно заполнять реквизиты отправителя и почему почтовые клиенты (в частности, Microsoft Outlook) или почтовые серверы могут подменять переданное имя.
В синтакс-помощнике платформы указано, что свойство Отправитель может принимать значения типа Строка или ИнтернетПочтовыйАдрес. Однако на практике платформа выполняет автоматическое неявное приведение типов:
Отправитель обычную строку, платформа 1С автоматически инициализирует объект ИнтернетПочтовыйАдрес и записывает переданный текст в его свойство Адрес.Отправитель всегда сохраняет тип ИнтернетПочтовыйАдрес. Преобразовать этот реквизит в примитивный строковый тип невозможно, так как это внутренняя особенность реализации почтового механизма платформы.Следовательно, прямое обращение к свойству через точку или присвоение строки являются эквивалентными операциями:
// Вариант 1: Прямое присвоение строки (платформа сама заполнит Адрес)
Письмо.Отправитель = "sales@company.ru";
// Вариант 2: Явное заполнение свойства объекта ИнтернетПочтовыйАдрес
Письмо.Отправитель.Адрес = "sales@company.ru";
Чтобы письмо приходило с понятным человекочитаемым именем (например, «ООО Ромашка <sales@company.ru>»), в объекте ИнтернетПочтовоеСообщение предусмотрено специальное строковое свойство ИмяОтправителя. Также у самого объекта ИнтернетПочтовыйАдрес доступно свойство ОтображаемоеИмя.
Проанализируем приоритеты, по которым платформа формирует заголовок письма From:
ИнтернетПочтовоеСообщение.ИмяОтправителя. Если оно заполнено, платформа использует именно его в качестве Display Name.ИмяОтправителя не заполнено, платформа берет значение из ИнтернетПочтовоеСообщение.Отправитель.ОтображаемоеИмя.Письмо.Отправитель.Адрес.Посмотрим на пример комплексного формирования и заполнения почтового сообщения:
Письмо = Новый ИнтернетПочтовоеСообщение;
// Заполнение текста и типа содержимого
Текст = Письмо.Тексты.Добавить(ТаблицаЗаказа);
Текст.ТипТекста = ТипТекстаПочтовогоСообщения.HTML;
// Тема сообщения
Письмо.Тема = СокрЛП(Строка(Объект.Поставщик)) + ", " + СокрЛП(Строка(Объект.Ссылка));
// Явное указание кодировки для корректного отображения кириллицы
Письмо.Кодировка = "UTF-8";
// Установка адреса и отображаемого имени отправителя
Письмо.Отправитель.Адрес = СокрЛП(Строка(ЭлектроннаяПочта.ИмяПользователя));
Письмо.ИмяОтправителя = СокрЛП(Строка(НаименованиеОрганизации)) + ", " + СокрЛП(Строка(ЮридическийАдрес));
// Добавление получателей
Письмо.Получатели.Добавить(СокрЛП(Объект.Поставщик.Сотрудник.ЭлектроннаяПочта));
Если в коде 1С все свойства заполнены корректно, но получатель в Outlook видит только логин или адрес до знака @, выясним причины такого поведения:
ИмяОтправителя передается кириллица, а кодировка письма не определена явно, почтовый клиент может не распарсить заголовок MIME и отобразить только безопасную ASCII-часть — адрес электронной почты. Рекомендуется явно указывать Письмо.Кодировка = "UTF-8";.Если SMTP-сервер жестко блокирует подмену имени отправителя или требуется более тесная интеграция с локальным почтовым клиентом, можно рассмотреть альтернативные варианты:
Новый COMОбъект("Outlook.Application"), где управление заголовками и учетными записями выполняется средствами локального профиля MS Outlook.