Как сохранить форматирование HTML-письма при рассылке?

Иногда возникает ситуация, что при выполнении рассылки (шаблон в формате html) - конечный пользователь получает письмо с сплошным текстом, без единого форматирования (которое было выполнено в шаблоне сообщения).

Такая ситуация может происходить в версиях 3.3.1 и 3.3.2.

Для начала, необходимо обновить исполняемы файлы до самых поздних (сделав запрос в службу технической поддержки).

Далее, запускаем TSAdmin.exe и находим сервис scr_OutlookUtils.

В данном сервисе нам необходимо добавить метод CreateNewOutlookMessageByCopy:

function CreateNewOutlookMessageByCopy(FileName) {
      var Message;
      if (FileName) {
            TemplateMessage = Outlook.Application.CreateItemFromTemplate(FileName);
            RemoveOutlookMessageProperties(TemplateMessage);
            Message = Outlook.Application.CreateItem(0);
            RemoveOutlookMessageProperties(Message);
            Message.Subject = TemplateMessage.Subject;
          var NewMailItemBodyFormat = GetMailItemBodyFormat(Message);
          var MessageText;

            if ((NewMailItemBodyFormat  == olFormatHTML) ||
                  (NewMailItemBodyFormat  == olFormatRichText)) {
                  MessageText = GetDecodedMessageText(TemplateMessage);
                  if (GetMailItemBodyFormat(TemplateMessage) == olFormatPlain) {
                    MessageText = PreparePlainTextForHTML(MessageText, true);
                  }
                  if (GetOutlookCodePageOut() != -1) {
                    var CodePage = GetMailItemCharsetName(Message);
                    MessageText = System.EncodeText(MessageText, CodePage);
                  }
            } else {
                  MessageText = TemplateMessage.Body;
            }

            CopyAttachments(TemplateMessage, Message, false, Log);
            SetMailItemBody(Message, MessageText);
           
            var Recipient;
            var SourceRecipient;
            for (var i = 1; i = TemplateMessage.Recipients.Count; i++) {
                  SourceRecipient = TemplateMessage.Recipients.Item(i);
                  Recipient = null;
                  if (SourceRecipient.AddressEntry.Type != 'EX') {
                Recipient = Message.Recipients.Add(SourceRecipient.Address +
                             ' ' + SourceRecipient.Name + '>');
                  } else {
                Recipient = Message.Recipients.Add(SourceRecipient.Name);
                Recipient.Resolve();
                  }
                  Recipient.Type = TemplateMessage.Recipients.Item(i).Type;
            }

            TemplateMessage.Close(0);
      } else {
            Message = Outlook.Application.CreateItem(0);
            if (Outlook.CodePageOut) {
                  Message.InternetCodepage = Outlook.CodePageOut;
            } else {
                  Message.InternetCodepage = 20866;
            }
      }
      return Message;
}

В этом же сервисе модифицировать функцию GetOutlookCodePageOut (добавить return Outlook.CodePageOut;):

function GetOutlookCodePageOut() {
      if (!Outlook.OutlookCodePageOutInitialize) {
            var MSOfficeRootKey = 'Software\\Microsoft\\Office\\';
            var OutlookCodePageOptionsKey = '\\Outlook\\Options\\MSHTML\\International';
            var Version = GetOutlookVersion();
            var OutlookSettingKey = MSOfficeRootKey + Version +
                  OutlookCodePageOptionsKey;
            Outlook.AutoDetectCodePageOut = GetRegParamValue(REG_DWORD,
                  HKEY_CURRENT_USER, OutlookSettingKey, 'Autodetect_CodePageOut');
            Outlook.CodePageOut = GetRegParamValue(REG_DWORD,
                  HKEY_CURRENT_USER, OutlookSettingKey, 'Default_CodePageOut')
                  || 20866;
            Outlook.OutlookCodePageOutInitialize = true;
      }
      return Outlook.CodePageOut;
}

А также, модифицировать метод CreateOutlookMessage
(добавить var Message = CreateNewOutlookMessageByCopy(Params.Template ?
Params.Template.FileName : null
):

function CreateOutlookMessage(Params) {
      var Message = CreateNewOutlookMessageByCopy(Params.Template ?
            Params.Template.FileName : null);

      if (Params.Address) {
            if (typeof(Params.Address) == 'string') {
                  Params.Address = [Params.Address];
            } else {
                  Params.Address = RemoveDublicates(Params.Address);
            }
            for (var i = 0; i Params.Address.length; i++) {
                  AddRecipient(Message, Params.Address[i], olTo);
            }
      }
      if (Params.CopyAddress) {
            if (typeof(Params.CopyAddress) == 'string') {
                  Params.CopyAddress = [Params.CopyAddress];
            }
            for (var i = 0; i Params.CopyAddress.length; i++) {
                  AddRecipient(Message, Params.CopyAddress[i], olCC);
            }
      }
}

Для версии 3.3.1, необходимо выполнить еще одно изменение.
В сервисе scr_MailUtils найтифукцию CreateNewMessage(Params) и добавить ByCopy в строчке var Message = CreateNewOutlookMessage(Params.Template ? Params.Template.FileName : null);
:

function CreateNewMessage(Params) {
         if (!GetCanCreateMessage(true)) {
                   return;
         }
         
         if (!InitMailUtils()) {
                   return;
         }
         
         if (!Params) {
                   Params = new Object();
         }
         
         var Message = CreateNewOutlookMessageByCopy(Params.Template ?
                   Params.Template.FileName : null);

Сохраняем сервис и проверяем рассылку!

С уважением
Белецкий Арсений
Группа компаний Terrasoft

Нравится

Поделиться

10 комментариев

Добрый день.
Такая ситуация так же может происходить и в версии 3.3.0 :) Но в ней я не нашел ни скрипта scr_OutlookUtils ни функций GetOutlookCodePageOut, CreateOutlookMessage.
Не подскажите, что можно сделать в данном случае?

Павел, дело в том, что данный функционал был реализован в ядре, а не в сервисах, именно поэтому Вы и не смогли найти данных скриптов :wink:

Если шаблон письма формируется некорректно, прошу обновить исполняемые файлы до более поздних.
На данный момент, это 3.3.0.83.
Данные файлы Вы можете запросить у Службы технической поддержки support@terrasoft.ru

С уважением
Белецкий Арсений
Группа компаний Terrasoft

Дело в том, что мы уже используем версию 3.3.0.83 :sad:

Добрый день!

Прошу предоставить скриншот шаблона, который Вы формируете и скриншот уже полученного письма.

С уважением
Белецкий Арсений
Группа компаний Terrasoft

Скриншот и полученное письмо во вложении

Причем было замечено, что письма из TS уходят без форматирования только на одной машине, на других все ок. Windows 7 x32, MS Outlook 2010 x32

Павел, а Вы проверяли настройки самого Outlook?
Возможно формат принимаемых и отправляемых писем стоит - текст, а не в html?

Если данная проблема только на одной рабочей машине, то логично предположит, что проблема именно в настройках Office.

mail

Формат отправляемых писем уже установлен в html. Возможно, есть еще какие-нибудь настройки?

Нужно проверить, что бы и шаблон был создан в формате html.

сделал данные настройки но при этом картинки приходят вложениями(( не подскажите что можно сделать? и какую информацию нужно показать?

Показать все комментарии